Exemplo n.º 1
0
        public async Task LoadItemsAsync_LoadingStatusIndicator_InItemsCollectionIfEmptySearch(
            IPackageSearchMetadata[] searchItems,
            int expectedItems)
        {
            var loaderMock = new Mock <IPackageItemLoader>(MockBehavior.Strict);
            var stateMock  = new Mock <IItemLoaderState>();
            var searchTask = Task.FromResult(SearchResult.FromItems(searchItems));
            var testLogger = new TestNuGetUILogger(_output);
            var tcs        = new TaskCompletionSource <int>();
            var list       = new InfiniteScrollList(new Lazy <JoinableTaskFactory>(() => _joinableTaskContext.Factory));

            var currentStatus = LoadingStatus.Loading;

            stateMock.Setup(x => x.LoadingStatus)
            .Returns(() => currentStatus);
            stateMock.Setup(x => x.ItemsCount)
            .Returns(() => searchItems.Length);
            loaderMock.SetupGet(x => x.State)
            .Returns(stateMock.Object);
            loaderMock.SetupGet(x => x.IsMultiSource)
            .Returns(false);
            loaderMock.Setup(x => x.UpdateStateAndReportAsync(
                                 It.IsNotNull <SearchResult <IPackageSearchMetadata> >(),
                                 It.IsNotNull <IProgress <IItemLoaderState> >(),
                                 It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0))
            .Callback(() =>
            {
                currentStatus = searchItems.Length > 0 ? LoadingStatus.Ready : LoadingStatus.NoItemsFound;
            });
            loaderMock.Setup(x => x.UpdateStateAsync(
                                 It.IsNotNull <IProgress <IItemLoaderState> >(),
                                 It.IsAny <CancellationToken>()))
            .Returns(() => Task.FromResult(0));
            loaderMock.Setup(x => x.GetCurrent())
            .Returns(() => searchItems.Select(x => new PackageItemListViewModel()));

            list.LoadItemsCompleted += (sender, args) =>
            {
                var lst = (InfiniteScrollList)sender;
                tcs.TrySetResult(lst.Items.Count);
                _output.WriteLine("3. After assert");
            };

            _output.WriteLine("1. Init act");
            await list.LoadItemsAsync(
                loader : loaderMock.Object,
                loadingMessage : "Test loading",
                logger : testLogger,
                searchResultTask : searchTask,
                token : CancellationToken.None);

            _output.WriteLine("2. End act");

            var finished = await tcs.Task;

            Assert.Equal(expectedItems, finished);
            _output.WriteLine("4. End of test");
        }
Exemplo n.º 2
0
        public void LoadItems_IfCancelled_Throws()
        {
            var list = new InfiniteScrollList();

            Assert.Throws <OperationCanceledException>(
                () => list.LoadItems(
                    Mock.Of <IPackageItemLoader>(),
                    loadingMessage: "a",
                    logger: null,
                    searchResultTask: Task.FromResult <SearchResult <IPackageSearchMetadata> >(null),
                    token: new CancellationToken(canceled: true)));
        }
Exemplo n.º 3
0
        public void LoadItems_LoadingMessageIsNullOrEmpty_Throws(string loadingMessage)
        {
            var list = new InfiniteScrollList();

            var exception = Assert.Throws <ArgumentException>(
                () => list.LoadItems(
                    Mock.Of <IPackageItemLoader>(),
                    loadingMessage,
                    logger: null,
                    searchResultTask: Task.FromResult <SearchResult <IPackageSearchMetadata> >(null),
                    token: CancellationToken.None));

            Assert.Equal("loadingMessage", exception.ParamName);
        }
Exemplo n.º 4
0
        public void LoadItems_LoaderIsNull_Throws()
        {
            var list = new InfiniteScrollList();

            var exception = Assert.Throws <ArgumentNullException>(
                () => list.LoadItems(
                    loader: null,
                    loadingMessage: "a",
                    logger: null,
                    searchResultTask: Task.FromResult <SearchResult <IPackageSearchMetadata> >(null),
                    token: CancellationToken.None));

            Assert.Equal("loader", exception.ParamName);
        }
Exemplo n.º 5
0
        public void LoadItems_SearchResultTaskIsNull_Throws()
        {
            var list = new InfiniteScrollList();

            var exception = Assert.Throws <ArgumentNullException>(
                () => list.LoadItems(
                    Mock.Of <IPackageItemLoader>(),
                    loadingMessage: "a",
                    logger: null,
                    searchResultTask: null,
                    token: CancellationToken.None));

            Assert.Equal("searchResultTask", exception.ParamName);
        }
        public async Task LoadItems_IfCancelled_Throws()
        {
            var list = new InfiniteScrollList();

            await Assert.ThrowsAsync <OperationCanceledException>(
                async() =>
            {
                await list.LoadItemsAsync(
                    Mock.Of <IPackageItemLoader>(),
                    loadingMessage: "a",
                    logger: null,
                    searchResultTask: Task.FromResult <SearchResultContextInfo>(null),
                    token: new CancellationToken(canceled: true));
            });
        }
        public async Task LoadItems_LoaderIsNull_Throws()
        {
            var list = new InfiniteScrollList();

            var exception = await Assert.ThrowsAsync <ArgumentNullException>(
                async() =>
            {
                await list.LoadItemsAsync(
                    loader: null,
                    loadingMessage: "a",
                    logger: null,
                    searchResultTask: Task.FromResult <SearchResultContextInfo>(null),
                    token: CancellationToken.None);
            });

            Assert.Equal("loader", exception.ParamName);
        }
        public async Task LoadItems_LoadingMessageIsNullOrEmpty_Throws(string loadingMessage)
        {
            var list = new InfiniteScrollList();

            var exception = await Assert.ThrowsAsync <ArgumentException>(
                async() =>
            {
                await list.LoadItemsAsync(
                    Mock.Of <IPackageItemLoader>(),
                    loadingMessage,
                    logger: null,
                    searchResultTask: Task.FromResult <SearchResultContextInfo>(null),
                    token: CancellationToken.None);
            });

            Assert.Equal("loadingMessage", exception.ParamName);
        }
Exemplo n.º 9
0
        public async Task LoadData(string filter = "")
        {
            using (UserDialogs.Instance.Loading("Loading"))
            {
                Items = new InfiniteScrollList <T>(PageSize)
                {
                    OnLoadMore = async() =>
                    {
                        var page  = Items.Count == 0 ? 0 : (Items.Count / PageSize) + 1;
                        var items = await LoadingFunction(filter, page, PageSize);

                        return(items);
                    }
                };
                await Items.LoadMoreAsync();

                ListView.ItemsSource = Items;
            }
        }
Exemplo n.º 10
0
        public void SelectedPackageItem_Initialized_DefaultIsNull()
        {
            var list = new InfiniteScrollList();

            Assert.Null(list.SelectedPackageItem);
        }
Exemplo n.º 11
0
        public void PackageItems_Initialized_DefaultIsEmpty()
        {
            var list = new InfiniteScrollList();

            Assert.Empty(list.PackageItems);
        }
Exemplo n.º 12
0
        public void IsSolution_Initialized_DefaultIsFalse()
        {
            var list = new InfiniteScrollList();

            Assert.False(list.IsSolution);
        }
Exemplo n.º 13
0
        public void DataContext_Initialized_DefaultIsItems()
        {
            var list = new InfiniteScrollList();

            Assert.Same(list.DataContext, list.Items);
        }
Exemplo n.º 14
0
        public void CheckBoxesEnabled_Initialized_DefaultIsFalse()
        {
            var list = new InfiniteScrollList();

            Assert.False(list.CheckBoxesEnabled);
        }
Exemplo n.º 15
0
        public async Task LoadItems_BeforeGettingCurrent_WaitsForInitialResults()
        {
            var loader    = new Mock <IPackageItemLoader>(MockBehavior.Strict);
            var state     = new Mock <IItemLoaderState>();
            var hasWaited = false;

            loader.SetupGet(x => x.IsMultiSource)
            .Returns(true);
            loader.SetupGet(x => x.State)
            .Returns(state.Object);
            loader.Setup(x => x.UpdateStateAndReportAsync(
                             It.IsNotNull <SearchResult <IPackageSearchMetadata> >(),
                             It.IsNotNull <IProgress <IItemLoaderState> >(),
                             It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0));

            var loadingStatus          = LoadingStatus.Loading;
            var loadingStatusCallCount = 0;

            state.Setup(x => x.LoadingStatus)
            .Returns(() => loadingStatus)
            .Callback(() =>
            {
                ++loadingStatusCallCount;

                if (loadingStatusCallCount >= 2)
                {
                    loadingStatus = LoadingStatus.NoItemsFound;
                    hasWaited     = true;
                }
            });

            var itemsCount          = 0;
            var itemsCountCallCount = 0;

            state.Setup(x => x.ItemsCount)
            .Returns(() => itemsCount)
            .Callback(() =>
            {
                ++itemsCountCallCount;

                if (itemsCountCallCount >= 2)
                {
                    itemsCount = 1;
                    hasWaited  = true;
                }
            });

            loader.Setup(x => x.UpdateStateAsync(
                             It.IsNotNull <IProgress <IItemLoaderState> >(),
                             It.IsAny <CancellationToken>()))
            .Returns(() => Task.FromResult(0));

            var logger           = new Mock <INuGetUILogger>();
            var searchResultTask = Task.FromResult(new SearchResult <IPackageSearchMetadata>());

#pragma warning disable VSSDK005 // Avoid instantiating JoinableTaskContext
            using (var joinableTaskContext = new JoinableTaskContext(Thread.CurrentThread, SynchronizationContext.Current))
#pragma warning restore VSSDK005 // Avoid instantiating JoinableTaskContext
            {
                var list = new InfiniteScrollList(new Lazy <JoinableTaskFactory>(() => joinableTaskContext.Factory));
                var taskCompletionSource = new TaskCompletionSource <string>();

                // Despite LoadItems(...) being a synchronous method, the method internally fires an asynchronous task.
                // We'll know when that task completes successfully when the LoadItemsCompleted event fires,
                // and to avoid infinite waits in exceptional cases, we'll interpret a call to reset as a failure.
                list.LoadItemsCompleted += (sender, args) => taskCompletionSource.TrySetResult(null);

                loader.Setup(x => x.Reset());
                logger.Setup(x => x.Log(
                                 It.Is <MessageLevel>(m => m == MessageLevel.Error),
                                 It.IsNotNull <string>(),
                                 It.IsAny <object[]>()))
                .Callback <MessageLevel, string, object[]>(
                    (messageLevel, message, args) =>
                {
                    taskCompletionSource.TrySetResult(message);
                });
                loader.Setup(x => x.GetCurrent())
                .Returns(() =>
                {
                    if (!hasWaited)
                    {
                        taskCompletionSource.TrySetResult("GetCurrent() was called before waiting for initial results.");
                    }

                    return(Enumerable.Empty <PackageItemListViewModel>());
                });

                await list.LoadItemsAsync(
                    loader.Object,
                    loadingMessage : "a",
                    logger : logger.Object,
                    searchResultTask : searchResultTask,
                    token : CancellationToken.None);

                var errorMessage = await taskCompletionSource.Task;

                Assert.Null(errorMessage);

                loader.Verify();
            }
        }
        public async Task LoadItems_BeforeGettingCurrent_WaitsForInitialResults()
        {
            await NuGetUIThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync();

            var loader    = new Mock <IPackageItemLoader>(MockBehavior.Strict);
            var state     = new Mock <IItemLoaderState>();
            var hasWaited = false;

            loader.SetupGet(x => x.IsMultiSource)
            .Returns(true);
            loader.SetupGet(x => x.State)
            .Returns(state.Object);
            loader.Setup(x => x.UpdateStateAndReportAsync(
                             It.IsNotNull <SearchResultContextInfo>(),
                             It.IsNotNull <IProgress <IItemLoaderState> >(),
                             It.IsAny <CancellationToken>()))
            .Returns(Task.FromResult(0));

            var loadingStatus          = LoadingStatus.Loading;
            var loadingStatusCallCount = 0;

            state.Setup(x => x.LoadingStatus)
            .Returns(() => loadingStatus)
            .Callback(() =>
            {
                ++loadingStatusCallCount;

                if (loadingStatusCallCount >= 2)
                {
                    loadingStatus = LoadingStatus.NoItemsFound;
                    hasWaited     = true;
                }
            });

            var itemsCount          = 0;
            var itemsCountCallCount = 0;

            state.Setup(x => x.ItemsCount)
            .Returns(() => itemsCount)
            .Callback(() =>
            {
                ++itemsCountCallCount;

                if (itemsCountCallCount >= 2)
                {
                    itemsCount = 1;
                    hasWaited  = true;
                }
            });

            loader.Setup(x => x.UpdateStateAsync(
                             It.IsNotNull <IProgress <IItemLoaderState> >(),
                             It.IsAny <CancellationToken>()))
            .Returns(() => Task.FromResult(0));

            var logger           = new Mock <INuGetUILogger>();
            var searchResultTask = Task.FromResult(new SearchResultContextInfo());

            var list = new InfiniteScrollList();
            var taskCompletionSource = new TaskCompletionSource <string>();

            // Despite LoadItems(...) being a synchronous method, the method internally fires an asynchronous task.
            // We'll know when that task completes successfully when the LoadItemsCompleted event fires,
            // and to avoid infinite waits in exceptional cases, we'll interpret a call to reset as a failure.
            list.LoadItemsCompleted += (sender, args) => taskCompletionSource.TrySetResult(null);

            loader.Setup(x => x.Reset());
            logger.Setup(x => x.Log(It.Is <ILogMessage>(lm => lm.Level == LogLevel.Error && lm.Message != null)))
            .Callback <ILogMessage>(
                (logMessage) =>
            {
                taskCompletionSource.TrySetResult(logMessage.Message);
            });
            loader.Setup(x => x.GetCurrent())
            .Returns(() =>
            {
                if (!hasWaited)
                {
                    taskCompletionSource.TrySetResult("GetCurrent() was called before waiting for initial results.");
                }

                return(Enumerable.Empty <PackageItemListViewModel>());
            });

            await list.LoadItemsAsync(
                loader.Object,
                loadingMessage : "a",
                logger : logger.Object,
                searchResultTask : searchResultTask,
                token : CancellationToken.None);

            var errorMessage = await taskCompletionSource.Task;

            Assert.Null(errorMessage);

            loader.Verify();
        }