public void HasPrevious_WhenStartOffsetIsGreater0_ReturnsTrue() { var list = new[] { 0, 1, 2, 3, 4, 5, 6, 7 }; var slice = ArraySliceMetrics.Create(list, 0, list.Length, after: ConnectionUtils.OffsetToCursor(0)); Assert.Equal(1, slice.StartOffset); Assert.Equal(7, slice.EndOffset); Assert.Equal(true, slice.HasPrevious); }
public void HasPrevious_WhenDataIsSliceAndStartOffsetIsGreater0_ReturnsTrue() { var list = new[] { 0, 1, 2, 3, 4, 5, 6, 7 }; var slice = ArraySliceMetrics.Create(list, 10, 20, 2, ConnectionUtils.OffsetToCursor(9)); Assert.Equal(10, slice.StartOffset); Assert.Equal(11, slice.EndOffset); Assert.Equal(true, slice.HasPrevious); }
public void HasNext_WhenDataIsSliceAndEndOffsetIsLessThanLastIndex_ReturnsTrue() { var list = new[] { 0, 1, 2, 3, 4, 5, 6, 7 }; var slice = ArraySliceMetrics.Create(list, 10, 18, last: 2, before: ConnectionUtils.OffsetToCursor(17)); Assert.Equal(15, slice.StartOffset); Assert.Equal(16, slice.EndOffset); Assert.Equal(true, slice.HasNext); }
public void HasPrevious_WhenStartOffsetIsGreater0_ReturnsTrue() { // Arrange var context = CreateContext( after: ConnectionUtils.OffsetToCursor(0) ); // Act var slice = SliceMetrics.Create(DbContext.Blogs, context); // Assert Assert.Equal(1, slice.StartIndex); Assert.True(slice.HasPrevious); }
public void HasNext_WhenDataIsSliceAndEndOffsetIsLastIndex_ReturnsFalse() { // Arrange var context = CreateContext( after: ConnectionUtils.OffsetToCursor(999) ); // Act var slice = SliceMetrics.Create(DbContext.Blogs, context); // Assert Assert.Equal(1000, slice.StartIndex); Assert.Equal(0, slice.SliceSize); Assert.False(slice.HasNext); }
public void HasNext_WhenEndOffsetIsLessThanLastIndex_ReturnsTrue() { // Arrange var context = CreateContext( first: 10, after: ConnectionUtils.OffsetToCursor(0) ); // Act var slice = SliceMetrics.Create(DbContext.Blogs, context); // Assert Assert.Equal(1, slice.StartIndex); Assert.Equal(10, slice.SliceSize); Assert.True(slice.HasNext); }
public void Create_WhenRangeArgumentsCoverSlice_ClampsRange() { var list = new[] { 0, 1, 2, 3, 4, 5, 6, 7 }; var slice = ArraySliceMetrics.Create(list, 0, list.Length, 2, ConnectionUtils.OffsetToCursor(3)); Assert.Equal(list.Length, slice.TotalCount); Assert.Equal(list.Length, slice.SliceSize); Assert.Equal(0, slice.StartIndex); Assert.Equal(4, slice.StartOffset); Assert.Equal(list.Length - 1, slice.EndIndex); Assert.Equal(5, slice.EndOffset); Assert.Equal(true, slice.HasNext); Assert.Equal(true, slice.HasPrevious); Assert.Equal(new[] { 4, 5 }, slice.Slice); }
public void Create_WhenFirstIsGreaterThanEdgeRange_DoesNotExtendRange() { var list = new[] { 0, 1, 2, 3, 4, 5, 6, 7 }; var slice = ArraySliceMetrics.Create(list, 0, list.Length, 30, ConnectionUtils.OffsetToCursor(3)); Assert.Equal(8, slice.TotalCount); Assert.Equal(8, slice.SliceSize); Assert.Equal(0, slice.StartIndex); Assert.Equal(4, slice.StartOffset); Assert.Equal(list.Length - 1, slice.EndIndex); Assert.Equal(7, slice.EndOffset); Assert.Equal(false, slice.HasNext); Assert.Equal(true, slice.HasPrevious); Assert.Equal(new[] { 4, 5, 6, 7 }, slice.Slice); }
public void HasPrevious_WhenDataIsSliceAndStartOffsetIsGreater0_ReturnsTrue() { // Arrange var context = CreateContext( first: 2, after: ConnectionUtils.OffsetToCursor(9) ); // Act var slice = SliceMetrics.Create(Blogs, context); // Assert Assert.Equal(10, slice.StartIndex); Assert.Equal(2, slice.SliceSize); Assert.True(slice.HasPrevious); }
public void CreateInNonStrictMode_WhenDataSliceEndsBeforeRange_ReturnsEmptyResult() { var list = new[] { 0, 1, 2, 3, 4, 5, 6, 7 }; var slice = ArraySliceMetrics.Create(list, 1, 20, after: ConnectionUtils.OffsetToCursor(10), strictCheck: false); Assert.True(slice.IsEmpty); Assert.Equal(8, slice.SliceSize); Assert.Equal(1, slice.StartIndex); Assert.Equal(8, slice.EndIndex); Assert.Equal(11, slice.StartOffset); Assert.Equal(10, slice.EndOffset); Assert.Equal(false, slice.HasNext); Assert.Equal(false, slice.HasPrevious); Assert.Equal(new int[] { }, slice.Slice); }
public void Create_WhenDataSliceStartsAfterEnd_ReturnsEmptyResult() { // Arrange var context = CreateContext( first: 10, after: ConnectionUtils.OffsetToCursor(999) ); // Act var slice = SliceMetrics.Create( DbContext.Blogs, context ); // Assert Assert.Equal(0, slice.SliceSize); Assert.Equal(1000, slice.StartIndex); Assert.False(slice.HasNext); Assert.True(slice.HasPrevious); }
public void Create_WhenDataDoesNotCoverRequestedRange_AdjustsStartAndEndOffsets() { // Arrange var context = CreateContext( first: 10, after: ConnectionUtils.OffsetToCursor(995) ); // Act var slice = SliceMetrics.Create( DbContext.Blogs, context ); // Assert Assert.Equal(4, slice.SliceSize); Assert.Equal(fixture.TotalCount, slice.TotalCount); Assert.Equal(996, slice.StartIndex); Assert.False(slice.HasNext); Assert.True(slice.HasPrevious); }
/// <summary> /// From the connection context, <see cref="IResolveConnectionContext"/>, /// it creates a <see cref="Connection{TSource}"/> based on the given <see cref="IEnumerable{TSource}"/> /// </summary> /// <typeparam name="TSource"></typeparam> /// <param name="context"></param> /// <param name="items"></param> /// <param name="totalCount"></param> /// <returns></returns> public static Connection <TSource> ToConnection <TSource>( this IResolveConnectionContext context, IEnumerable <TSource> items, int?totalCount = null ) { var metrics = SliceMetrics.Create( items, context, totalCount ); var edges = metrics.Slice .Select((item, i) => new Edge <TSource> { Node = item, Cursor = ConnectionUtils.OffsetToCursor(metrics.StartIndex + i) }) .ToList(); var firstEdge = edges.FirstOrDefault(); var lastEdge = edges.LastOrDefault(); return(new Connection <TSource> { Edges = edges, TotalCount = metrics.TotalCount, PageInfo = new PageInfo { StartCursor = firstEdge?.Cursor, EndCursor = lastEdge?.Cursor, HasPreviousPage = metrics.HasPrevious, HasNextPage = metrics.HasNext, } }); }