public async Task TestSelectionItemChangedMatchesPairs()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);

            vm.SelectedTile = vm.PairsTileItems[0];
            await vm.SelectionItemChangedAsync();

            Tile secondTile = null;

            for (int i = 1; i < vm.PairsTileItems.Count; i++)
            {
                if (String.Equals(vm.PairsTileItems[0].TileFront, vm.PairsTileItems[i].TileFront))
                {
                    secondTile = vm.PairsTileItems[i];
                    break;
                }
            }
            vm.SelectedTile = secondTile;
            await vm.SelectionItemChangedAsync();

            foreach (var currTile in vm.PairsTileItems)
            {
                if (currTile == vm.PairsTileItems[0] || currTile == secondTile)
                {
                    Assert.IsTrue(currTile.FrontShown);
                }
                else
                {
                    Assert.IsFalse(currTile.FrontShown);
                }
            }
        }
        public async Task TestSelectionItemChangedDoesntMatchMismatchedPair()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);

            vm.SelectedTile = vm.PairsTileItems[0];
            await vm.SelectionItemChangedAsync();

            Tile secondTile;

            if (String.Equals(vm.PairsTileItems[0].TileFront, vm.PairsTileItems[1].TileFront))
            {
                secondTile = vm.PairsTileItems[2];
            }
            else
            {
                secondTile = vm.PairsTileItems[1];
            }
            vm.SelectedTile = secondTile;
            await vm.SelectionItemChangedAsync();

            foreach (var currTile in vm.PairsTileItems)
            {
                Assert.IsFalse(currTile.FrontShown);
            }
        }
        public void TestHideTilesAndShuffleRandomiseTilesWithoutAddingOrRemoving()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);
            int tilesCount        = vm.PairsTileItems.Count;

            vm.HideExistingTilesAndShuffle();

            Assert.AreEqual(tilesCount, vm.PairsTileItems.Count);
        }
        public async Task TestSelectionItemChangedClearsSelectedTile()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);

            vm.SelectedTile = vm.PairsTileItems[0];
            await vm.SelectionItemChangedAsync();


            Assert.IsNull(vm.SelectedTile);
        }
        public async Task TestSelectionItemChangedShowsTileWhenSelected()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);

            vm.SelectedTile = vm.PairsTileItems[0];
            await vm.SelectionItemChangedAsync();


            Assert.IsTrue(vm.PairsTileItems[0].FrontShown);
        }
        public void TestHideTilesAndShuffleHidesTiles()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);

            vm.PairsTileItems[5].FrontShown = true;
            vm.RandomNumberGenerator        = x => 0; //change the random generator to not move tiles.


            vm.HideExistingTilesAndShuffle();

            Assert.IsFalse(vm.PairsTileItems[5].FrontShown);
        }
        public void TestFillGridWithTiles()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);
            var imageNames        = new List <string> {
                "image1.jpg", "image2.jpg", "image3.jpg", "image4.jpg"
            };

            vm.FillTilesCollectionWithTiles(4, imageNames);


            Assert.IsNotNull(vm.PairsTileItems);
            Assert.AreEqual(8, vm.PairsTileItems.Count);
        }
        public async Task TestSelectionItemChangedDoesNothingWhenCalledWithNull()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService)
            {
                SelectedTile = null
            };
            await vm.SelectionItemChangedAsync();

            foreach (var currTile in vm.PairsTileItems)
            {
                Assert.IsFalse(currTile.FrontShown);
            }
            Assert.AreEqual(null, vm.SelectedTile);
            Assert.AreEqual(false, vm.IsBusy);
        }
        public async Task TestSelectionItemChangedDoesNothingWhenCalledSecondTimeSameTile()
        {
            PairsGameViewModel vm = new PairsGameViewModel(dependencyService);

            vm.SelectedTile = vm.PairsTileItems[0];
            await vm.SelectionItemChangedAsync();

            vm.SelectedTile = vm.PairsTileItems[0];
            await vm.SelectionItemChangedAsync();


            Assert.IsTrue(vm.PairsTileItems[0].FrontShown);
            for (int i = 1; i < vm.PairsTileItems.Count; i++)
            {
                Assert.IsFalse(vm.PairsTileItems[i].FrontShown);
            }
        }