public async Task NextPage_ShouldThrowIfAlreadyCompletedAsync()
        {
            // arrange
            var iterator = new MultiLevelCursorIterator <long, IUserIdentifier, string>(_getPageFunc, _getUserIdentifiersFunc);

            // act
            await iterator.NextPageAsync();

            await iterator.NextPageAsync();

            await iterator.NextPageAsync();

            // act assert
            await Assert.ThrowsAsync <TwitterIteratorAlreadyCompletedException>(() => iterator.NextPageAsync());
        }
        public async Task NextPage_ShouldIterateBothAtParentChildLevelAsync()
        {
            // arrange
            var iterator = new MultiLevelCursorIterator <long, IUserIdentifier, string>(_getPageFunc, _getUserIdentifiersFunc);

            // act
            var firstPage = await iterator.NextPageAsync();

            var secondPage = await iterator.NextPageAsync();

            var thirdPage = await iterator.NextPageAsync();

            // assert
            Assert.Equal(firstPage.Items, _page1ProcessingResult.Items);
            Assert.False(firstPage.IsLastPage);

            Assert.Equal(secondPage.Items, _page2FirstProcessingResult.Items);
            Assert.False(secondPage.IsLastPage);

            Assert.Equal(thirdPage.Items, _page2SecondProcessingResult.Items);
            Assert.True(thirdPage.IsLastPage);

            Assert.True(iterator.Completed);
        }