public void MobileServiceCollectionCanContainsAndNotNotifies()
        {
            // Get the Books table
            MobileServiceTableQueryMock <Book> query = new MobileServiceTableQueryMock <Book>();

            query.EnumerableAsyncThrowsException = true;

            MobileServiceCollection <Book, Book> collection = new MobileServiceCollection <Book, Book>(query);

            List <string> properties         = new List <string>();
            List <string> expectedProperties = new List <string>()
            {
            };
            List <NotifyCollectionChangedAction> actions         = new List <NotifyCollectionChangedAction>();
            List <NotifyCollectionChangedAction> expectedActions = new List <NotifyCollectionChangedAction>()
            {
            };

            Book book = new Book();

            collection.Add(book);

            ((INotifyPropertyChanged)collection).PropertyChanged += (s, e) => properties.Add(e.PropertyName);
            collection.CollectionChanged += (s, e) => actions.Add(e.Action);

            Assert.Contains(book, collection);
            Assert.Equal(expectedProperties, properties);
            Assert.Equal(expectedActions, actions);
        }
        public async Task MobileServiceCollectionHasMoreItemsShouldBeFalseAfterRetrievingDataWhenNoPaging()
        {
            // Get the Books table
            MobileServiceTableQueryMock <Book> query = new MobileServiceTableQueryMock <Book>();

            MobileServiceCollection <Book> collection  = new MobileServiceCollection <Book>(query);
            CancellationTokenSource        tokenSource = new CancellationTokenSource();

            List <string> properties         = new List <string>();
            List <string> expectedProperties = new List <string>()
            {
                "HasMoreItems", "Count", "Item[]", "Count", "Item[]", "TotalCount"
            };
            List <NotifyCollectionChangedAction> actions         = new List <NotifyCollectionChangedAction>();
            List <NotifyCollectionChangedAction> expectedActions = new List <NotifyCollectionChangedAction>()
            {
                NotifyCollectionChangedAction.Add, NotifyCollectionChangedAction.Add
            };

            ((INotifyPropertyChanged)collection).PropertyChanged += (s, e) => properties.Add(e.PropertyName);
            collection.CollectionChanged += (s, e) => actions.Add(e.Action);
            int result = await collection.LoadMoreItemsAsync(tokenSource.Token);

            Assert.False(collection.HasMoreItems);
            Assert.Equal(expectedProperties, properties);
            Assert.Equal(expectedActions, actions);
        }
 public async Task MobileServiceCollectionMultipleLoadItemsAsyncShouldThrow()
 {
     await Assert.ThrowsAsync <InvalidOperationException>(async() =>
     {
         MobileServiceTableQueryMock <Book> query  = new MobileServiceTableQueryMock <Book>();
         MobileServiceCollection <Book> collection = new MobileServiceCollection <Book>(query);
         CancellationTokenSource tokenSource       = new CancellationTokenSource();
         await Task.WhenAll(collection.LoadMoreItemsAsync(tokenSource.Token), collection.LoadMoreItemsAsync(tokenSource.Token));
     });
 }
        public void MobileServiceCollectionHasMoreItemsInitiallyTrue()
        {
            // Get the Books table
            MobileServiceTableQueryMock <Book> query = new MobileServiceTableQueryMock <Book>();

            query.EnumerableAsyncThrowsException = true;

            MobileServiceCollection <Book> collection = new MobileServiceCollection <Book>(query);

            Assert.True(collection.HasMoreItems);
        }
        public async Task MobileServiceCollectionLoadMoreItemsAsyncFiresLoadingCompleteEventAfterReadingData()
        {
            // Get the Books table
            MobileServiceTableQueryMock <Book> query = new MobileServiceTableQueryMock <Book>();

            MobileServiceCollection <Book, Book> collection = new MobileServiceCollection <Book, Book>(query);
            CancellationTokenSource tokenSource             = new CancellationTokenSource();

            int loadedEventArgsManyItemsLoaded = 0;

            collection.LoadingComplete += (s, e) => loadedEventArgsManyItemsLoaded = e.TotalItemsLoaded;
            _ = await collection.LoadMoreItemsAsync(tokenSource.Token);

            Assert.Equal(2, loadedEventArgsManyItemsLoaded);
        }
        public async Task MobileServiceCollectionLoadMoreItemsAsyncFiresLoadingItemsEventBeforeReadingData()
        {
            // Get the Books table
            MobileServiceTableQueryMock <Book> query = new MobileServiceTableQueryMock <Book>();

            MobileServiceCollection <Book, Book> collection = new MobileServiceCollection <Book, Book>(query);
            CancellationTokenSource tokenSource             = new CancellationTokenSource();

            bool firedLoading = false;

            collection.LoadingItems += (s, e) => firedLoading = true;
            _ = await collection.LoadMoreItemsAsync(tokenSource.Token);

            Assert.True(firedLoading);
        }
        public async Task MobileServiceCollectionMultipleLoadItemsAsyncShouldThrow()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            Exception ex = null;

            try
            {
                await TaskEx.WhenAll(collection.LoadMoreItemsAsync(tokenSource.Token), collection.LoadMoreItemsAsync(tokenSource.Token));
            }
            catch (InvalidOperationException e)
            {
                ex = e;
            }

            Assert.IsNotNull(ex);
        } 
        public async Task MobileServiceCollectionLoadMoreItemsAsyncExceptionsCanBeHandled()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();
            query.EnumerableAsyncThrowsException = true;

            MobileServiceIncrementalLoadingCollection<Book, Book> collection = new MobileServiceIncrementalLoadingCollection<Book, Book>(query);
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            Exception ex = null;

            try
            {
                await ((ISupportIncrementalLoading)collection).LoadMoreItemsAsync(10);
            }
            catch (Exception e)
            {
                ex = e;
            }

            Assert.IsNotNull(ex);
        }        
        public void MobileServiceCollectionCanClearAndNotifies()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();
            query.EnumerableAsyncThrowsException = true;

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);

            List<string> properties = new List<string>();
            List<string> expectedProperties = new List<string>() { "Count", "Item[]" };
            List<NotifyCollectionChangedAction> actions = new List<NotifyCollectionChangedAction>();
            List<NotifyCollectionChangedAction> expectedActions = new List<NotifyCollectionChangedAction>() { NotifyCollectionChangedAction.Reset };

            Book book = new Book();
            collection.Add(book);

            ((INotifyPropertyChanged)collection).PropertyChanged += (s, e) => properties.Add(e.PropertyName);
            collection.CollectionChanged += (s, e) => actions.Add(e.Action);
            collection.Clear();

            Assert.AreEqual(0, collection.Count);
            Assert.IsTrue(properties.SequenceEqual(expectedProperties));
            Assert.IsTrue(actions.SequenceEqual(expectedActions));
        }
        public async Task MobileServiceCollectionHasMoreItemsShouldBeFalseAfterRetrievingDataWhenNoPaging()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            List<string> properties = new List<string>();
            List<string> expectedProperties = new List<string>() { "HasMoreItems", "Count", "Item[]", "Count", "Item[]", "TotalCount" };
            List<NotifyCollectionChangedAction> actions = new List<NotifyCollectionChangedAction>();
            List<NotifyCollectionChangedAction> expectedActions = new List<NotifyCollectionChangedAction>() { NotifyCollectionChangedAction.Add, NotifyCollectionChangedAction.Add };

            ((INotifyPropertyChanged)collection).PropertyChanged += (s, e) => properties.Add(e.PropertyName);
            collection.CollectionChanged += (s, e) => actions.Add(e.Action);
            int result = await collection.LoadMoreItemsAsync(tokenSource.Token);

            Assert.IsFalse(collection.HasMoreItems);
            Assert.IsTrue(properties.SequenceEqual(expectedProperties));
            Assert.IsTrue(actions.SequenceEqual(expectedActions));
        }
        public void MobileServiceCollectionHasMoreItemsInitiallyTrue()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();
            query.EnumerableAsyncThrowsException = true;

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);
            
            Assert.IsTrue(collection.HasMoreItems);
        }
        public void MobileServiceCollectionCanCopyToAndNotNotifies()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();
            query.EnumerableAsyncThrowsException = true;

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);

            List<string> properties = new List<string>();
            List<string> expectedProperties = new List<string>() {  };
            List<NotifyCollectionChangedAction> actions = new List<NotifyCollectionChangedAction>();
            List<NotifyCollectionChangedAction> expectedActions = new List<NotifyCollectionChangedAction>() {  };

            Book book = new Book();
            collection.Add(book);
            Book[] books = new Book[1];

            ((INotifyPropertyChanged)collection).PropertyChanged += (s, e) => properties.Add(e.PropertyName);
            collection.CollectionChanged += (s, e) => actions.Add(e.Action);
            collection.CopyTo(books, 0);

            Assert.AreEqual(1, collection.Count);
            Assert.AreEqual(1, books.Count());
            Assert.AreEqual(collection[0], books[0]);
            Assert.IsTrue(properties.SequenceEqual(expectedProperties));
            Assert.IsTrue(actions.SequenceEqual(expectedActions));
        }
        public async Task MobileServiceCollectionLoadMoreItemsAsyncFiresLoadingCompleteEventAfterReadingData()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            Exception ex = null;

            int loadedEventArgsManyItemsLoaded = 0;
            collection.LoadingComplete += (s, e) => loadedEventArgsManyItemsLoaded = e.TotalItemsLoaded;

            try
            {
                int result = await collection.LoadMoreItemsAsync(tokenSource.Token);
            }
            catch (Exception e)
            {
                ex = e;
            }

            Assert.AreEqual(loadedEventArgsManyItemsLoaded, 2);
            Assert.IsNull(ex);

        }    
        public async Task MobileServiceCollectionLoadMoreItemsAsyncFiresLoadingItemsEventBeforeReadingData()
        {
            // Get the Books table
            MobileServiceTableQueryMock<Book> query = new MobileServiceTableQueryMock<Book>();

            MobileServiceCollection<Book, Book> collection = new MobileServiceCollection<Book, Book>(query);
            CancellationTokenSource tokenSource = new CancellationTokenSource();

            Exception ex = null;

            bool firedLoading = false;

            collection.LoadingItems += (s, e) => firedLoading = true;

            try
            {
                int result = await collection.LoadMoreItemsAsync(tokenSource.Token);
            }
            catch (Exception e)
            {
                ex = e;
            }

            Assert.IsTrue(firedLoading);
            Assert.IsNull(ex);

        }