Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
        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);
        }
Example #5
0
        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);
        }
Example #6
0
        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);
        }
Example #7
0
        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);
        }
Example #8
0
        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);
        }
Example #10
0
        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);
        }
Example #11
0
        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);
        }
Example #12
0
        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);
        }
Example #13
0
        /// <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,
                }
            });
        }