예제 #1
0
        public void TileRightClickedCommand_ShouldMarkOneFlag_AndThenUnmark()
        {
            //Arrange
            var minefieldFactory  = new MinefieldFactory(new RandomBooleansGenerator());
            var dialogService     = Substitute.For <IDialogService>();
            var navigationService = Substitute.For <INavigationService>();

            dialogService.Show(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <MessageBoxButton>(), Arg.Any <MessageBoxImage>());

            MainWindowViewModel vm = new MainWindowViewModel(minefieldFactory, dialogService, navigationService);
            Tile firstTile         = vm.Minefield.Tiles.First().First();

            vm.Minefield.TilesFlagged.ShouldBe(0);
            firstTile.State.ShouldNotBe(Tile.TileState.Flagged);
            firstTile.State.ShouldBe(Tile.TileState.Covered);

            //Act
            vm.TileRightClickedCommand.Execute(firstTile);

            //Assert
            vm.Minefield.TilesFlagged.ShouldBe(1);
            firstTile.State.ShouldBe(Tile.TileState.Flagged);
            firstTile.State.ShouldNotBe(Tile.TileState.Covered);

            //Act
            vm.TileRightClickedCommand.Execute(firstTile);

            //Assert
            vm.Minefield.TilesFlagged.ShouldBe(0);
            firstTile.State.ShouldNotBe(Tile.TileState.Flagged);
            firstTile.State.ShouldBe(Tile.TileState.Covered);
        }
예제 #2
0
        public void OneMineMinefield_PropagationShouldUncoverAllButOne()
        {
            //Arrange
            IBooleansGenerator booleansGenerator = Substitute.For <IBooleansGenerator>();

            booleansGenerator.GenerateBooleans(Arg.Any <int>(), Arg.Any <int>())
            .Returns(x =>
            {
                var r = new bool[(int)x[0]];
                r[0]  = true;     //Only the first item will be set to true.
                return(r);
            });

            int horizontalTilesCount  = 5;
            int verticalTilesCount    = 5;
            IMinefieldFactory factory = new MinefieldFactory(booleansGenerator);
            var minefield             = factory.CreateNew(horizontalTilesCount, verticalTilesCount, 1);
            var someTile = minefield.Tiles[3][3];

            //Act
            minefield.TilesCovered.ShouldBe(horizontalTilesCount * verticalTilesCount);
            someTile.UncoverTile();

            //Assert
            minefield.TilesCovered.ShouldBe(1);
        }
예제 #3
0
        public void CreateNew_ShouldThrowArgumentException_WhenMoreMinesThanTiles(int rows, int columns, int bombsCount)
        {
            IBooleansGenerator booleansGenerator = new RandomBooleansGenerator();
            IMinefieldFactory  factory           = new MinefieldFactory(booleansGenerator);

            Should.Throw <ArgumentException>(() => factory.CreateNew(rows, columns, bombsCount));
        }
예제 #4
0
        /// <summary>
        /// Generates the output
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public string GenerateOutput(string input)
        {
            List <Minefield> minefields = new List <Minefield>();
            Minefield        minefield  = null;
            StringBuilder    output     = new StringBuilder();

            string[] delimiter = { Environment.NewLine };
            string[] words     = input.Split(delimiter, StringSplitOptions.None);

            foreach (string s in words)
            {
                if (MinefieldValidator.IsHeader(s))
                {
                    minefield = MinefieldFactory.Create(minefields.Count + 1, s);
                    minefields.Add(minefield);
                }
                else if (MinefieldValidator.isFooter(s))
                {
                    break;
                }
                else
                {
                    foreach (char c in s.ToCharArray())
                    {
                        if (CellValidator.isMineOrSafe(c.ToString()))
                        {
                            minefield.Cells.Add(CellFactory.Create(c));
                        }
                        else
                        {
                            ErroMessage = "Your input data is not valid.";
                            return(output.ToString());
                        }
                    }
                }
            }
            try
            {
                foreach (Minefield field in minefields)
                {
                    MinesweeperConverter converter = new MinesweeperConverter();
                    converter.ConvertMinefield(field);
                    //header
                    output.Append(String.Format(MinefieldValidator.headerOutput, field.Id));
                    output.Append(Environment.NewLine);
                    //result
                    output.Append(converter.output);
                    output.Append(Environment.NewLine);
                }
            }
            catch
            {
                ErroMessage = "Your input data is not valid.";
                return(output.ToString());
            }

            return(output.ToString());
        }
예제 #5
0
        public void CreateNew_ShouldReturn_ValidMinefield(int rows, int columns, int bombsCount)
        {
            IBooleansGenerator booleansGenerator = new RandomBooleansGenerator();
            IMinefieldFactory  factory           = new MinefieldFactory(booleansGenerator);
            var result = factory.CreateNew(rows, columns, bombsCount);

            result.Tiles.SelectMany(t => t).Count().ShouldBe(rows * columns);
            result.BombsInMinefiled.ShouldBe(bombsCount);
            result.Tiles.SelectMany(t => t).All(t => t.Neighbours.Count() >= 3 && t.Neighbours.Count() <= 8).ShouldBeTrue();
        }
예제 #6
0
        public void DummyCommand_ShouldShowMessage()
        {
            //Arrange
            var minefieldFactory   = new MinefieldFactory(new RandomBooleansGenerator());
            var dialogService      = Substitute.For <IDialogService>();
            var navigationService  = Substitute.For <INavigationService>();
            MainWindowViewModel vm = new MainWindowViewModel(minefieldFactory, dialogService, navigationService);

            //Act
            vm.DummyTileClickedCommand.Execute(null);

            //Assert
            dialogService.ReceivedWithAnyArgs(1).Show(null, null, 0, 0);
        }
예제 #7
0
        public void ToggleFlag_ShouldToggle()
        {
            IBooleansGenerator booleansGenerator = new RandomBooleansGenerator();
            IMinefieldFactory  factory           = new MinefieldFactory(booleansGenerator);
            var minefield = factory.CreateNew(5, 5, 10);

            var firstTile = minefield.Tiles[0][0];

            firstTile.State.ShouldBe(Tile.TileState.Covered);
            firstTile.ToggleFlag();
            firstTile.State.ShouldBe(Tile.TileState.Flagged);
            firstTile.ToggleFlag();
            firstTile.State.ShouldBe(Tile.TileState.Covered);
        }
예제 #8
0
        public void NewGameCommand_ShouldSetShowNewGameDialog()
        {
            //Arrange
            var minefieldFactory  = new MinefieldFactory(new RandomBooleansGenerator());
            var dialogService     = Substitute.For <IDialogService>();
            var navigationService = Substitute.For <INavigationService>();

            dialogService.Show(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <MessageBoxButton>(), Arg.Any <MessageBoxImage>());

            MainWindowViewModel vm = new MainWindowViewModel(minefieldFactory, dialogService, navigationService);

            //Act
            vm.NewGameCommand.Execute(null);

            //Assert
            navigationService.Received(1).ShowGameConfigDialog(Arg.Any <Window>());
        }
예제 #9
0
        public void RestartGameCommand_ShouldSetNewGame()
        {
            //Arrange
            var minefieldFactory  = new MinefieldFactory(new RandomBooleansGenerator());
            var dialogService     = Substitute.For <IDialogService>();
            var navigationService = Substitute.For <INavigationService>();

            dialogService.Show(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <MessageBoxButton>(), Arg.Any <MessageBoxImage>());

            MainWindowViewModel vm = new MainWindowViewModel(minefieldFactory, dialogService, navigationService);
            int gameHashCode       = vm.Minefield.GetHashCode();

            //Act
            vm.RestartGameCommand.Execute(null);

            //Assert
            int newGameHashCode = vm.Minefield.GetHashCode();

            newGameHashCode.ShouldNotBe(gameHashCode);
        }
예제 #10
0
 public bool ParseInput(string input)
 {
     if (MinefieldValidator.IsHeader(input))
     {
         //Validate cells count of the current minefield
         if (minefield != null && !MinefieldValidator.isValidCellCount(minefield.Cells.Count, minefield.RowsCount, minefield.ColumnsCount))
         {
             this.Renderer.ClearCurrentLine();
             return(true);
         }
         //create a new minefield and add to a list of minefields
         minefield = MinefieldFactory.Create(minefields.Count + 1, input);
         minefields.Add(minefield);
     }
     //Check for end of user input
     else if (MinefieldValidator.isFooter(input))
     {
         //Validate cells count of the current minefield
         if (minefield != null && !MinefieldValidator.isValidCellCount(minefield.Cells.Count, minefield.RowsCount, minefield.ColumnsCount))
         {
             this.Renderer.ClearCurrentLine();
             return(true);
         }
         else
         {
             //end of user's input
             return(false);
         }
     }
     else
     {
         //validate that the signs is equal to columns
         if (minefield != null && minefield.ColumnsCount != input.Length)
         {
             this.Renderer.ClearCurrentLine();
             return(true);
         }
         CreateCells(minefield, input);
     }
     return(true);
 }