Example #1
0
        public void UndoMove_With_Not_Executed_Move_Should_Not_Alter_PuzzleState()
        {
            SudokuPuzzle sudokuPuzzle = new SudokuGenerator().Generate();
            SudokuMove   sudokuMove   = new SudokuMove(1, 1, 9);

            Assert.IsFalse(sudokuPuzzle.ExecuteMove(sudokuMove));
        }
Example #2
0
        public ActionResult SolveSudoku(string sudokuToProcess)
        {
            var stopWatch = Stopwatch.StartNew();

            SortedList <string, string> extendedGridValues         = SudokuGenerator.PopulateGridWithPossibleValues(sudokuToProcess);
            SortedList <string, string> oneDimensionalSudokuResult = SudokuGenerator.Search(extendedGridValues);

            string[,] SudokuArrayOutput = null;
            if (oneDimensionalSudokuResult != null && oneDimensionalSudokuResult.Count > 0)
            {
                SudokuArrayOutput = new string[9, 9];
                int elementPosition = 0;
                for (int row = 0; row < 9; row++)
                {
                    for (int cell = 0; cell < 9; cell++)
                    {
                        SudokuArrayOutput[row, cell] = oneDimensionalSudokuResult.Values.ToArray()[elementPosition];
                        elementPosition++;
                    }
                }
            }

            stopWatch.Stop();

            var returnObject = new { timeTakenToProcess = Convert.ToInt32(stopWatch.Elapsed.TotalMilliseconds), sudokuOutput = SudokuArrayOutput };

            return(Json(returnObject));
        }
        public void TestAddNumbers()
        {
            SudokuPuzzle sudoku = SudokuGenerator.AddNumbers(SudokuPuzzleTest.Size, SudokuPuzzleTest.Difficulty);

            Assert.ThrowsException <ArgumentNullException>(() => SudokuGenerator.AddNumbers(null));
            Assert.ThrowsException <ArgumentException>(() => SudokuGenerator.AddNumbers(SudokuPuzzle.MaximumSupportedSize, SudokuDifficulty.None));

            if (SudokuPuzzle.MaximumSupportedSize > 1)
            {
                Assert.ThrowsException <ArgumentException>(() => SudokuGenerator.AddNumbers(2, SudokuDifficulty.Easy));
            }

            Assert.ThrowsException <ArgumentOutOfRangeException>(() => SudokuGenerator.AddNumbers(SudokuPuzzle.MaximumSupportedSize + 1, SudokuDifficulty.Easy));
            Assert.ThrowsException <ArgumentOutOfRangeException>(() => SudokuGenerator.AddNumbers(-1, SudokuDifficulty.Easy));

            for (int i = 0; i < sudoku.Size; i++)
            {
                for (int j = 0; j < sudoku.Size; j++)
                {
                    int number = sudoku[i, j];
                    Assert.IsFalse(sudoku.RowContains(i, j, number, true));
                    Assert.IsFalse(sudoku.ColumnContains(i, j, number, true));
                    Assert.IsFalse(sudoku.BlockContains(i, j, number, true));
                }
            }
        }
Example #4
0
        public void Puzzle_Of_Type_SudokuPuzzle_Property_Name_Should_Return_SudokuPuzzle()
        {
            const string expected     = "SudokuPuzzle";
            Puzzle       sudokuPuzzle = new SudokuGenerator().Generate();

            Assert.AreEqual(expected, sudokuPuzzle.Name);
        }
Example #5
0
        public void Validate_Sudoku_Input_String()
        {
            var  sudoku = "85...24..72......9..4.........1.7..23.5...9...4...........8..7..17..........36.4.";
            bool actual = SudokuGenerator.IsInputSudokuValid(sudoku);

            Assert.IsTrue(actual, "Valid sudoku - Length and allowed degits/characters [0-9.]");
        }
Example #6
0
        private static int Generate(int size, SudokuDifficulty difficulty, String outfile)
        {
            SudokuPuzzle sudoku = SudokuGenerator.Generate(size, difficulty);

            if (outfile is null)
            {
                Console.WriteLine(sudoku);
            }

            else
            {
                if (Program.WriteToFile(sudoku.ToString(), outfile))
                {
                    Console.WriteLine($"Generated sudoku written to {outfile}");
                }

                else
                {
                    Console.WriteLine(Program.FileOutputErrorMessage);
                    return(Program.FileOutputError);
                }
            }

            return(0);
        }
Example #7
0
        public void When_Invalid_Sudoku_Do_Not_Populate_Grid_With_Possible_Values()
        {
            var invalidSudoku = "A5...24..72......9..4.........1.7..23.5...9...4...........8..7..17..........36.4.";
            SortedList <string, string> sortedList = SudokuGenerator.PopulateGridWithPossibleValues(invalidSudoku);

            Assert.AreEqual(0, sortedList == null ? 0 : 1, "Invalid sudoku.");
        }
        public void Should_return_completed_board_when_difficulty_is_none()
        {
            var board = SudokuGenerator.NewSudoku(SudokuDifficulty.None);

            Assert.That(board.EmptyCells.Count(), Is.EqualTo(0));
            Assert.That(board.IsCompleted, Is.True);
        }
        private void OnSingleButtonFragmentClick(Object sender, EventArgs e)
        {
            SingleButtonFragment singleButtonFragment = this.FragmentManager.FindFragmentByTag("button_fragment") as SingleButtonFragment;
            SudokuView           sudokuView           = this.View.FindViewById <SudokuView>(Resource.Id.sudoku_view);
            String addText    = this.Resources.GetString(Resource.String.add_button_text);
            String removeText = this.Resources.GetString(Resource.String.remove_button_text);
            String playText   = this.Resources.GetString(Resource.String.play_button_text);

            if (singleButtonFragment.Text == addText)
            {
                SudokuGenerator.AddNumbers(this.ViewModel.Sudoku);
                sudokuView.Update();
                this.ViewModel.ButtonText = singleButtonFragment.Text = removeText;
            }

            else if (singleButtonFragment.Text == removeText)
            {
                SudokuGenerator.RemoveNumbers(this.ViewModel.Sudoku);
                sudokuView.Update();
                this.ViewModel.ButtonText = singleButtonFragment.Text = playText;
            }

            else if (singleButtonFragment.Text == playText)
            {
                this.Stop();
                FragmentTransaction ft = this.FragmentManager.BeginTransaction();
                ft.Remove(singleButtonFragment);
                ft.Commit();
                this.Activity.Intent.PutExtra("action", (int)ActionType.Play);
                this.Activity.Intent.Extras.PutInt("action", (int)ActionType.Play);
                ActionType action = (ActionType)this.Activity.Intent.Extras.GetInt("action", (int)ActionType.None);
                this.ViewModel.ButtonText = null;
                this.Start();
            }
        }
        public void TestGetIncorrect()
        {
            SudokuGenerator.AddNumbers(this.Sudoku);
            Random random = new Random();

            for (int i = 0; i < SudokuPuzzle.MaximumSupportedSize * 2; i++)
            {
                int row = random.Next(this.Sudoku.Size), column = random.Next(this.Sudoku.Size);
                int number;

                do
                {
                    number = random.Next(0, this.Sudoku.Size + 1);
                } while (this.Sudoku[row, column] == number);
            }

            IEnumerable <Tuple <int, int> > incorrect = this.Sudoku.GetIncorrect();

            for (int i = 0; i < this.Sudoku.Size; i++)
            {
                for (int j = 0; j < this.Sudoku.Size; j++)
                {
                    if (!this.Sudoku.IsCorrect(i, j))
                    {
                        Assert.IsTrue(incorrect.Contains(new Tuple <int, int>(i, j)));
                    }
                }
            }
        }
        public void TestEquals()
        {
            SudokuDifficulty newDifficulty = SudokuPuzzleTest.Difficulty == SudokuDifficulty.None ? SudokuDifficulty.Easy : SudokuDifficulty.None;
            SudokuPuzzle     puzzle        = new SudokuPuzzle(this.Sudoku.Size, newDifficulty);

            SudokuGenerator.AddNumbers(puzzle);

            for (int i = 0; i < this.Sudoku.Size; i++)
            {
                for (int j = 0; j < this.Sudoku.Size; j++)
                {
                    this.Sudoku[i, j] = puzzle[i, j];
                }
            }

            Assert.AreEqual(this.Sudoku, puzzle);
            Assert.IsTrue(this.Sudoku.Equals(puzzle));
            Assert.IsTrue(this.Sudoku == puzzle);
            Assert.IsFalse(this.Sudoku != puzzle);
            Assert.IsFalse(this.Sudoku == null);
            Assert.IsFalse(null == this.Sudoku);
            SudokuPuzzle nullPuzzle = null;

            Assert.IsTrue(null == nullPuzzle);
            this.Sudoku[0, 0] = 0;
            Assert.AreNotEqual(this.Sudoku, puzzle);
        }
Example #12
0
        public static void Initialize(TestContext testContext)
        {
            PuzzleGenerator <SudokuPuzzle> sudokuGenerator = new SudokuGenerator();
            PuzzlePrinter <SudokuPuzzle>   sudokuPrinter   = new SudokuPrinter();

            _sudokuPuzzleService = new SudokuPuzzleService(sudokuGenerator, sudokuPrinter);
        }
Example #13
0
 public bool SetCellValue(int value, int row, int column)
 {
     if (SudokuGenerator.SetValue(value, row, column))
     {
         return(true);
     }
     return(false);
 }
Example #14
0
 public GameVM(GameDifficulty difficulty)
 {
     this.difficulty = difficulty;
     Board           = new Board();
     Timer           = new GameTimer();
     Generator       = new SudokuGenerator(Board, difficulty);
     Manager         = new SudokuManager(Board, Generator.SolvedSudokuValues);
 }
Example #15
0
        public void SudokuPuzzle_Description_Equals_Expected()
        {
            const string expected = "A puzzle in which missing numbers are to be filled into a 9 by 9 grid " +
                                    "of squares which are subdivided into 3 by 3 boxes so that every row, every column, " +
                                    "and every box contains the numbers 1 through 9.";
            Puzzle sudokuPuzzle = new SudokuGenerator().Generate();

            Assert.AreEqual(expected, sudokuPuzzle.Description);
        }
        public ActionResult Generate()
        {
            var sudoku    = new SudokuModel();
            var generator = new SudokuGenerator();

            sudoku.board = generator.board;

            return(View(sudoku));
        }
Example #17
0
        static void testSudokuGenerator()
        {
            SudokuGenerator sudokuGenerator0 = new SudokuGenerator(1, Level.All);

            sudokuGenerator0.Execute();

            SudokuGenerator sudokuGenerator1 = new SudokuGenerator(2);

            sudokuGenerator1.ExecuteAll();
        }
        public void GeneratorTest()
        {
            var grid = SudokuGenerator.GenerateGrid(GameType.Sudoku);

            var solvedGrid = SudokuSolver.Solve(grid);

            solvedGrid.Solvable.ShouldBe(true);
            solvedGrid.Unique.ShouldBe(true);
            SudokuSolver.IsSolved(solvedGrid.SolvedGrid).ShouldBe(true);
        }
Example #19
0
        public void Solve_On_A_Solved_SudokuPuzzle_Should_Return_True()
        {
            SudokuPuzzle sudokuPuzzle = new SudokuGenerator().Generate();

            using (SudokuSolver sudokuSolver = new SudokuSolver(sudokuPuzzle))
            {
                sudokuSolver.Solve();
                Assert.IsTrue(sudokuSolver.Solve());
            }
        }
        public void TestRemoveNumbers()
        {
            Assert.ThrowsException <ArgumentNullException>(() => SudokuGenerator.RemoveNumbers(null));
            SudokuPuzzle sudoku = SudokuGenerator.AddNumbers(SudokuPuzzleTest.Size, SudokuPuzzleTest.Difficulty);

            Console.WriteLine(sudoku);
            SudokuPuzzle original = (SudokuPuzzle)sudoku.Clone();

            SudokuGenerator.RemoveNumbers(sudoku);
            Console.WriteLine(sudoku);
            SudokuSolver.RecursiveSolve(sudoku);
            Assert.AreEqual(original, sudoku);
        }
Example #21
0
        public ActionResult <SudokuPuzzleDTO> Generate(SudokuDifficulty difficulty, int?seed)
        {
            ISudokuGenerator generator = new SudokuGenerator();
            ISudokuPuzzle    puzzle    = generator.Generate(difficulty, seed);

            SudokuPuzzleDTO puzzleDTO = new SudokuPuzzleDTO()
            {
                Puzzle = puzzle.ToString(),
                Seed   = puzzle.Id
            };

            return(puzzleDTO);
        }
Example #22
0
    private void CreateSeedFile()
    {
        //Creates 4 seeds of each difficulty
        //Should only be used to create the base data, and not to add new seeds

        List <Sudoku> seeds_ = new List <Sudoku>();

        foreach (Sudoku sudoku in sudokus_)
        {
            seeds_.Add(SudokuGenerator.GenerateSeed(sudoku));
        }
        SaveLoad.SaveSeeds(seeds_);
    }
Example #23
0
        public void TestInitializer()
        {
            WebSocketConnectionManager     webSocketConnectionManager = new WebSocketConnectionManager();
            PuzzleGenerator <SudokuPuzzle> sudokuGenerator            = new SudokuGenerator();
            PuzzlePrinter <SudokuPuzzle>   sudokuPrinter       = new SudokuPrinter();
            IPuzzleService <SudokuPuzzle>  sudokuPuzzleService = new SudokuPuzzleService(sudokuGenerator, sudokuPrinter);

            _httpHandler = new HttpClientHandlerMock();
            IRestServiceConnector restServiceConnector = new RestServiceConnector(_httpHandler);
            IPuzzleStorageService puzzleStorageService = new PuzzleStorageService(restServiceConnector);

            _puzzleHandler = new PuzzleHandler(webSocketConnectionManager, sudokuPuzzleService, puzzleStorageService);
        }
Example #24
0
        internal static int Main(String[] args)
        {
            if (!Console.IsInputRedirected)
            {
                Console.Title = "Sudoku";
            }

            if (args.Length == 0)
            {
                if (Console.IsInputRedirected || Console.IsOutputRedirected)
                {
                    Console.WriteLine(Program.IOErrorMessage);
                    return(Program.IOError);
                }

                Window window = new Window(SudokuGenerator.Generate(Program.DefaultSize, Program.DefaultDifficulty));
                window.Init();
                return(0);
            }

            if (!Program.ParseArguments(args, out int command, out int size, out SudokuDifficulty difficulty, out String filename, out String outfile))
            {
                Console.WriteLine(Program.UsageMessage);
                return(Program.UsageMessageWarning);
            }

            switch (command)
            {
            case Program.CompareCommand:
                return(Program.Compare(filename, outfile));

            case Program.EnumerateCommand:
                return(Program.Enumerate(filename));

            case Program.GenerateCommand:
                return(Program.Generate(size, difficulty, outfile));

            case Program.InteractiveCommand:
                return(Program.Interactive(size, filename));

            case Program.PrintCommand:
                return(Program.Print(filename));

            case Program.SolveCommand:
                return(Program.Solve(filename, outfile));

            default:
                Console.WriteLine(Program.UsageMessage);
                return(Program.UsageMessageWarning);
            }
        }
Example #25
0
        public void TestSudokuGenerator()
        {
            try
            {
                #region samurai level
                {
                    var generator     = SudokuGenerator.GetGenerator(9, Common.Difficulty.Samurai);
                    var unsolvedBoard = generator.Generate();
                    Assert.IsNotNull(unsolvedBoard);
                    var solvedBoard = SudokuSolver.GetSolver(unsolvedBoard).Solve();
                    Assert.AreEqual(generator.BaseBoard, solvedBoard);
                }
                #endregion

                #region hard level
                {
                    var generator     = SudokuGenerator.GetGenerator(9, Common.Difficulty.Hard);
                    var unsolvedBoard = generator.Generate();
                    Assert.IsNotNull(unsolvedBoard);
                    var solvedBoard = SudokuSolver.GetSolver(unsolvedBoard).Solve();
                    Assert.AreEqual(generator.BaseBoard, solvedBoard);
                }
                #endregion

                #region medium level
                {
                    var generator     = SudokuGenerator.GetGenerator(9, Common.Difficulty.Medium);
                    var unsolvedBoard = generator.Generate();
                    Assert.IsNotNull(unsolvedBoard);
                    var solvedBoard = SudokuSolver.GetSolver(unsolvedBoard).Solve();
                    Assert.AreEqual(generator.BaseBoard, solvedBoard);
                }
                #endregion

                #region easy level
                {
                    var generator     = SudokuGenerator.GetGenerator(9, Common.Difficulty.Easy);
                    var unsolvedBoard = generator.Generate();
                    Assert.IsNotNull(unsolvedBoard);
                    var solvedBoard = SudokuSolver.GetSolver(unsolvedBoard).Solve();
                    Assert.AreEqual(generator.BaseBoard, solvedBoard);
                }
                #endregion
            }
            catch (Exception ex)
            {
                Assert.Fail(ex.Message);
            }
        }
Example #26
0
        /// <summary>
        /// Run generation with ability to cancel
        /// </summary>
        private async Task Generate()
        {
            using (var generationTokenSource = new CancellationTokenSource())
            {
                var generationSettings = new GenerationSettings
                {
                    Difficulty       = _model.SudokuDifficulty,
                    Symmetry         = _model.SudokuSymmetry,
                    DifficultyPoints = _model.DifficultyPoints
                };

                var generationTask = Task.Run(() =>
                {
                    _model.CurrentSudoku = SudokuGenerator.Generate(generationSettings, generationTokenSource.Token);
                }, generationTokenSource.Token);

                while (true)
                {
                    using (var delayToken = CancellationTokenSource.CreateLinkedTokenSource(generationTokenSource.Token))
                    {
                        var delayTask    = Task.Delay(5_000, delayToken.Token);
                        var finishedTask = await Task.WhenAny(generationTask, delayTask);

                        if (finishedTask != generationTask)
                        {
                            if (AskToWait())
                            {
                                continue;
                            }

                            generationTokenSource.Cancel();

                            await generationTask.ContinueWith(task => Console.WriteLine(@"Generation task cancelled"),
                                                              TaskContinuationOptions.OnlyOnCanceled);

                            break;
                        }

                        delayToken.Cancel();

                        await delayTask.ContinueWith(task => Console.WriteLine(@"Delay task cancelled"),
                                                     TaskContinuationOptions.OnlyOnCanceled);

                        break;
                    }
                }
            }
        }
        public void TestOperators()
        {
            SudokuGenerator.AddNumbers(this.Sudoku);
            SudokuPuzzle clone = (SudokuPuzzle)this.Sudoku.Clone();

            Assert.AreEqual(this.Sudoku, clone);
            Assert.IsTrue(this.Sudoku.Equals(clone));
            Assert.IsTrue(this.Sudoku == clone);
            int row = 0, column = 0;

            clone[row, column] = 0;
            Assert.AreNotEqual(this.Sudoku, clone);
            Assert.IsFalse(this.Sudoku.Equals(clone));
            Assert.IsFalse(this.Sudoku == clone);
            Assert.IsTrue(this.Sudoku != clone);
        }
Example #28
0
        public void When_Invalid_Sudoku_Search_To_Fail()
        {
            var  sudokuWithInvalidPositions = "44....8.5.3..........7......2.....6.....8.4......1.......6.3.7.5..2.....1.4......";
            bool actual = SudokuGenerator.IsInputSudokuValid(sudokuWithInvalidPositions);

            Assert.IsTrue(actual, "Valid length, degits in sudoku");

            //Populate list will be called once
            var sortedList = SudokuGenerator.PopulateGridWithPossibleValues(sudokuWithInvalidPositions);

            Assert.AreEqual(1, sortedList == null ? 0 : 1, "Populating grid with possible values successfull");

            //Search will be called and will retun null as result
            sortedList = SudokuGenerator.Search(sortedList);
            Assert.AreEqual(0, sortedList == null ? 0 : 1, "Search fails as only choice fails for the second degit and retuns null as output");
        }
Example #29
0
 /**
  * Generates random puzzle with unique solution.
  *
  * @see SudokuGenerator
  * @see SudokuGenerator#PARAM_GEN_RND_BOARD
  * @see SudokuGenerator#generate()
  */
 private void generateRandomPuzzle()
 {
     generator = new SudokuGenerator(SudokuGenerator.PARAM_GEN_RND_BOARD);
     setGeneratorOptions();
     int[,] generated = generator.generate();
     if (generator.getGeneratorState() == SudokuGenerator.GENERATOR_GEN_FINISHED)
     {
         trackPuzzleUndo();
         puzzle = generated;
     }
     else
     {
         JanetConsole.println(">>> !!! Error while generating random puzzle !!! <<<");
         JanetConsole.println(generator.getMessages());
     }
 }
Example #30
0
 /**
  * Generates puzzle based on current puzzle
  * (different puzzle, same solution).
  *
  * @see SudokuGenerator
  * @see SudokuGenerator#PARAM_DO_NOT_TRANSFORM
  * @see SudokuGenerator#generate()
  */
 private void generateFromCurrentPuzzle()
 {
     generator = new SudokuGenerator(puzzle, SudokuGenerator.PARAM_DO_NOT_TRANSFORM);
     setGeneratorOptions();
     int[,] generated = generator.generate();
     if (generator.getGeneratorState() == SudokuGenerator.GENERATOR_GEN_FINISHED)
     {
         trackPuzzleUndo();
         puzzle = generated;
     }
     else
     {
         JanetConsole.println(">>> !!! Error while generating puzzle !!! <<<");
         JanetConsole.println(generator.getMessages());
     }
 }
		/**
		 * Test scenario implementation.
		 * @param testId        Test id.
		 * @param threadId      Thread id.
		 * @return              True is test successful, otherwise false.
		 */
		static bool runTest(int testId, int threadId) {
			bool testResult = true;
			String testDesc = "", resultDesc = "";
			int[,] a = {
					{0,0,0,8,0,0,0,0,0},
					{4,0,0,0,1,5,0,3,0},
					{0,2,9,0,4,0,5,1,8},
					{0,4,0,0,0,0,1,2,0},
					{0,0,0,6,0,2,0,0,0},
					{0,3,2,0,0,0,0,9,0},
					{6,9,3,0,5,0,8,7,0},
					{0,5,0,4,8,0,0,0,1},
					{0,0,0,0,0,3,0,0,0}
				};
			switch(testId) {
			case 0:
				testDesc = "SudokuSolver.setCell(int, int, int)";
				{
					SudokuSolver s = new SudokuSolver();
					s.setCell(0,0,0);
					s.setCell(1,0,4);
					s.setCell(2,0,0);
					s.setCell(3,0,0);
					s.setCell(4,0,0);
					s.setCell(5,0,0);
					s.setCell(6,0,6);
					s.setCell(7,0,0);
					s.setCell(8,0,0);
					s.setCell(0,1,0);
					s.setCell(1,1,0);
					s.setCell(2,1,2);
					s.setCell(3,1,4);
					s.setCell(4,1,0);
					s.setCell(5,1,3);
					s.setCell(6,1,9);
					s.setCell(7,1,5);
					s.setCell(8,1,0);
					s.setCell(0,2,0);
					s.setCell(1,2,0);
					s.setCell(2,2,9);
					s.setCell(3,2,0);
					s.setCell(4,2,0);
					s.setCell(5,2,2);
					s.setCell(6,2,3);
					s.setCell(7,2,0);
					s.setCell(8,2,0);
					s.setCell(0,3,8);
					s.setCell(1,3,0);
					s.setCell(2,3,0);
					s.setCell(3,3,0);
					s.setCell(4,3,6);
					s.setCell(5,3,0);
					s.setCell(6,3,0);
					s.setCell(7,3,4);
					s.setCell(8,3,0);
					s.setCell(0,4,0);
					s.setCell(1,4,1);
					s.setCell(2,4,4);
					s.setCell(3,4,0);
					s.setCell(4,4,0);
					s.setCell(5,4,0);
					s.setCell(6,4,5);
					s.setCell(7,4,8);
					s.setCell(8,4,0);
					s.setCell(0,5,0);
					s.setCell(1,5,5);
					s.setCell(2,5,0);
					s.setCell(3,5,0);
					s.setCell(4,5,2);
					s.setCell(5,5,0);
					s.setCell(6,5,0);
					s.setCell(7,5,0);
					s.setCell(8,5,3);
					s.setCell(0,6,0);
					s.setCell(1,6,0);
					s.setCell(2,6,5);
					s.setCell(3,6,1);
					s.setCell(4,6,0);
					s.setCell(5,6,0);
					s.setCell(6,6,8);
					s.setCell(7,6,0);
					s.setCell(8,6,0);
					s.setCell(0,7,0);
					s.setCell(1,7,3);
					s.setCell(2,7,1);
					s.setCell(3,7,2);
					s.setCell(4,7,0);
					s.setCell(5,7,9);
					s.setCell(6,7,7);
					s.setCell(7,7,0);
					s.setCell(8,7,0);
					s.setCell(0,8,0);
					s.setCell(1,8,0);
					s.setCell(2,8,8);
					s.setCell(3,8,0);
					s.setCell(4,8,0);
					s.setCell(5,8,0);
					s.setCell(6,8,0);
					s.setCell(7,8,1);
					s.setCell(8,8,0);
					int[,] b = s.getBoard();

					if ( (SudokuStore.boardsAreEqual(a, b) == true) ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
						testResult = false;
						SudokuStore.consolePrintln(s.getMessages());
					}
				}
				break;
			case 1:
				testDesc = "SudokuSolver.getCellDigit(int, int)";
				{
					SudokuSolver s1 = new SudokuSolver(a);
					SudokuSolver s2 = new SudokuSolver();
					for (int i = 0; i < SudokuBoard.BOARD_SIZE; i++)
						for (int j = 0; j < SudokuBoard.BOARD_SIZE; j++) {
							int d = s1.getCellDigit(i, j);
							s2.setCell(i, j, d);
						}
					int[,] b = s2.getBoard();
					if ( (SudokuStore.boardsAreEqual(a, b) == true) ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
						testResult = false;
					}
				}
				break;
			case 2:
				testDesc = "SudokuSolver.getBoardCopy()";
				{
					SudokuSolver s = new SudokuSolver(a);
					int[,] b = s.getBoard();
					int[,] c = s.getBoardCopy();
					if ( (SudokuStore.boardsAreEqual(b, c) == true) ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
						testResult = false;
					}
				}
				break;
			case 3:
				testDesc = "SudokuSolver.getSolutionBoardCells()";
				{
					SudokuSolver s = new SudokuSolver(a);
					s.solve();
					int[,] b = s.getSolvedBoard();
					int[,] c = SudokuStore.boardCopy(a);
					BoardCell[] sol = s.getSolutionBoardCells();
					foreach (BoardCell bc in sol)
						c[bc.rowIndex, bc.colIndex] = bc.digit;

					if ( (SudokuStore.boardsAreEqual(b, c) == true) ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
						testResult = false;
					}
				}
				break;
			case 4:
				testDesc = "SudokuSolver.getAllBoardCells()";
				{
					SudokuSolver s = new SudokuSolver(a);
					int[,] b = s.getBoardCopy();
					int[,] c = new int[SudokuBoard.BOARD_SIZE, SudokuBoard.BOARD_SIZE];
					BoardCell[] bc = s.getAllBoardCells();
					foreach (BoardCell cell in bc) {
						c[cell.rowIndex, cell.colIndex] = cell.digit;
					}
					if ( (SudokuStore.boardsAreEqual(b, c) == true) ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
						testResult = false;
					}
				}
				break;
			case 5:
				testDesc = "SudokuSolver.getAllSolutionsList()";
				{
					SudokuSolver s = new SudokuSolver( SudokuPuzzles.PUZZLE_NON_UNIQUE_SOLUTION );
					s.findAllSolutions();
					List<SudokuBoard> solList;
					solList = s.getAllSolutionsList();
					foreach (SudokuBoard sb in solList) {
						if (SudokuStore.checkSolvedBoard( sb.board ) == false) {
							testResult = false;
							break;
						}
					}
					if ( testResult == true ) {
						resultDesc = "Expecting each solution valid - each is valid.";
					} else {
						resultDesc = "Expecting each solution valid - found not valid.";
					}
				}
				break;
			case 6:
				testDesc = "SudokuGenerator -> generate -> save -> load -> compare";
				{
					String filePath = FileX.getTmpDir() + FileX.genRndFileName(20, "txt");
					SudokuGenerator g = new SudokuGenerator(SudokuGenerator.PARAM_GEN_RND_BOARD);
					int[,] generated = g.generate();
					g.saveBoard(filePath, "generated", "saved");
					int[,] loaded = SudokuStore.loadBoard(filePath);
					FileX.removeFile(filePath);
					if (SudokuStore.boardsAreEqual(generated, loaded) == false)
						testResult = false;
					if ( testResult == true ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
					}
				}
				break;
			case 7:
				testDesc = "SudokuSolver -> solve -> save -> load -> compare";
				{
					String filePath = FileX.getTmpDir() + FileX.genRndFileName(20, "txt");
					SudokuSolver s = new SudokuSolver(SudokuStore.getPuzzleExample());
					s.solve();
					int[,] solved = s.getSolvedBoard();
					s.saveSolvedBoard(filePath, "solved", "saved");
					int[,] loaded = SudokuStore.loadBoard(filePath);
					FileX.removeFile(filePath);
					if (SudokuStore.boardsAreEqual(solved, loaded) == false)
						testResult = false;
					if ( testResult == true ) {
						resultDesc = "Expecting equal - are equal.";
					} else {
						resultDesc = "Expecting equal - are not equal.";
					}
				}
				break;
			}
			if (testResult == true)
				SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + " " + testDesc + " " + resultDesc + " >>> ApiTests, result: OK");
			else
				SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + " " + testDesc + " " + resultDesc + " >>> ApiTests, result: ERROR");
			return testResult;
		}
		/**
		 * Test scenario implementation.
		 * @param testId        Test id.
		 * @param threadId      Thread id.
		 * @return              True is test successful, otherwise false.
		 */
		static bool runTest(int testId, int threadId) {
			SudokuSolver solverGen, solverInit;
			SudokuGenerator g;
			int solUnq;
			int[,] genPuzzle;
			int[,] solvedGen, solvedInit, initBoard;
			bool testResult = true;
			switch(testId) {
			case 0:
				for (int example = 0; example < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES; example++) {
					g = new SudokuGenerator(example, SudokuGenerator.PARAM_DO_NOT_TRANSFORM);
					genPuzzle = g.generate();
					solverGen = new SudokuSolver(genPuzzle);
					ErrorCodes.consolePrintlnIfError(solverGen.solve());
					solverInit = new SudokuSolver(example);
					ErrorCodes.consolePrintlnIfError(solverInit.solve());
					solUnq = solverGen.checkIfUniqueSolution();
					ErrorCodes.consolePrintlnIfError(solUnq);
					solvedGen = solverGen.getSolvedBoard();
					solvedInit = solverInit.getSolvedBoard();
					if ( (solUnq == SudokuSolver.SOLUTION_UNIQUE) && ( SudokuStore.boardsAreEqual(solvedGen, solvedInit) == true ) ) {
						//SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example number, example: " + example + ", solution unique and correct: YES, time (g, s1, s2): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., " + solverInit.getComputingTime() + " s.");
					} else {
						testResult = false;
						SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example number, example: " + example + ", solution unique and correct: NO, time (g, s1, s2): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., " + solverInit.getComputingTime() + " s.");
						Console.WriteLine("Initial board");
						SudokuStore.consolePrintBoard(SudokuStore.getPuzzleExample(example));
						Console.WriteLine("Generated puzzle");
						SudokuStore.consolePrintBoard(genPuzzle);
						Console.WriteLine("Solved initial board");
						SudokuStore.consolePrintBoard(solvedInit);
						Console.WriteLine("Solved generated puzzle");
						SudokuStore.consolePrintBoard(solvedGen);
					}
				}
				break;
			case 1:
				for (int example = 0; example < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES; example++) {
					initBoard = SudokuStore.getPuzzleExample(example);
					g = new SudokuGenerator(initBoard, SudokuGenerator.PARAM_DO_NOT_TRANSFORM, SudokuGenerator.PARAM_DO_NOT_SOLVE);
					genPuzzle = g.generate();
					solverGen = new SudokuSolver(genPuzzle);
					ErrorCodes.consolePrintlnIfError(solverGen.solve());
					solverInit = new SudokuSolver(initBoard);
					ErrorCodes.consolePrintlnIfError(solverInit.solve());
					solUnq = solverGen.checkIfUniqueSolution();
					ErrorCodes.consolePrintlnIfError(solUnq);
					solvedGen = solverGen.getSolvedBoard();
					solvedInit = solverInit.getSolvedBoard();
					if ( (solUnq == SudokuSolver.SOLUTION_UNIQUE) && ( SudokuStore.boardsAreEqual(solvedGen, solvedInit) == true ) ) {
						//SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example board, example: " + example + ", solution unique and correct: YES, time (g, s1, s2): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., " + solverInit.getComputingTime() + " s.");
					} else {
						testResult = false;
						SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example board, example: " + example + ", solution unique and correct: NO, time (g, s1, s2): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., " + solverInit.getComputingTime() + " s.");
						Console.WriteLine("Initial board");
						SudokuStore.consolePrintBoard(initBoard);
						Console.WriteLine("Generated puzzle");
						SudokuStore.consolePrintBoard(genPuzzle);
						Console.WriteLine("Solved initial board");
						SudokuStore.consolePrintBoard(solvedInit);
						Console.WriteLine("Solved generated puzzle");
						SudokuStore.consolePrintBoard(solvedGen);
					}
				}
				break;
			case 2:
				for (int example = 0; example < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES; example++) {
					g = new SudokuGenerator(example);
					genPuzzle = g.generate();
					solverGen = new SudokuSolver(genPuzzle);
					ErrorCodes.consolePrintlnIfError(solverGen.solve());
					solUnq = solverGen.checkIfUniqueSolution();
					ErrorCodes.consolePrintlnIfError(solUnq);
					solvedGen = solverGen.getSolvedBoard();
					if ( (solUnq == SudokuSolver.SOLUTION_UNIQUE) && ( SudokuStore.checkPuzzle(genPuzzle) == true ) ) {
						//SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example number, example: " + example + ", solution unique and correct: YES, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
					} else {
						testResult = false;
						SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example number, example: " + example + ", solution unique and correct: NO, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
						Console.WriteLine("Generated puzzle");
						SudokuStore.consolePrintBoard(genPuzzle);
						Console.WriteLine("Solved generated puzzle");
						SudokuStore.consolePrintBoard(solvedGen);
					}
				}
				break;
			case 3:
				for (int example = 0; example < SudokuPuzzles.NUMBER_OF_PUZZLE_EXAMPLES; example++) {
					initBoard = SudokuStore.getPuzzleExample(example);
					g = new SudokuGenerator(initBoard, SudokuGenerator.PARAM_DO_NOT_SOLVE);
					genPuzzle = g.generate();
					solverGen = new SudokuSolver(genPuzzle);
					ErrorCodes.consolePrintlnIfError(solverGen.solve());
					solUnq = solverGen.checkIfUniqueSolution();
					ErrorCodes.consolePrintlnIfError(solUnq);
					solvedGen = solverGen.getSolvedBoard();
					if ( (solUnq == SudokuSolver.SOLUTION_UNIQUE) && ( SudokuStore.checkPuzzle(genPuzzle) == true ) ) {
						//SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example board, example: " + example + ", solution unique and correct: YES, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
					} else {
						testResult = false;
						SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by example board, example: " + example + ", solution unique and correct: NO, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
						Console.WriteLine("Generated puzzle");
						SudokuStore.consolePrintBoard(genPuzzle);
						Console.WriteLine("Solved initial board");
						SudokuStore.consolePrintBoard(solvedGen);
					}
				}
				break;
			case 5:
				initBoard = SudokuPuzzles.PUZZLE_EMPTY;
				g = new SudokuGenerator(initBoard);
				genPuzzle = g.generate();
				solverGen = new SudokuSolver(genPuzzle);
				ErrorCodes.consolePrintlnIfError(solverGen.solve());
				solUnq = solverGen.checkIfUniqueSolution();
				ErrorCodes.consolePrintlnIfError(solUnq);
				solvedGen = solverGen.getSolvedBoard();
				if ( (solUnq == SudokuSolver.SOLUTION_UNIQUE) && ( SudokuStore.checkPuzzle(genPuzzle) == true ) ) {
					//SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by empty board, solution unique and correct: YES, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
				} else {
					testResult = false;
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by empty board, solution unique and correct: NO, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
					Console.WriteLine("Generated puzzle");
					SudokuStore.consolePrintBoard(genPuzzle);
					Console.WriteLine("Solved initial board");
					SudokuStore.consolePrintBoard(solvedGen);
				}
				break;
			case 6:
				initBoard = SudokuPuzzles.PUZZLE_EMPTY;
				g = new SudokuGenerator(initBoard, SudokuGenerator.PARAM_DO_NOT_SOLVE);
				if ( g.getGeneratorState() == SudokuGenerator.GENERATOR_INIT_FAILED ) {
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by empty board, solution unique and correct: YES, time (g, s): ");
				} else {
					testResult = false;
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by empty board, solution unique and correct: NO, time (g, s): ");
					SudokuStore.consolePrintln("Generator state: " + g.getGeneratorState());
					Console.WriteLine(g.getMessages());
				}
				break;
			case 7:
				initBoard = SudokuPuzzles.PUZZLE_ERROR;
				g = new SudokuGenerator(initBoard, SudokuGenerator.PARAM_DO_NOT_SOLVE);
				if ( g.getGeneratorState() == SudokuGenerator.GENERATOR_INIT_FAILED ) {
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by PUZZLE_ERROR + PARAM_DO_NOT_SOLVE, init failed: YES.");
				} else {
					testResult = false;
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by PUZZLE_ERROR + PARAM_DO_NOT_SOLVE, init failed: NO.");
					SudokuStore.consolePrintln("Generator state: " + g.getGeneratorState());
					Console.WriteLine(g.getMessages());
				}
				break;
			case 8:
				initBoard = SudokuPuzzles.PUZZLE_NON_UNIQUE_SOLUTION;
				g = new SudokuGenerator(initBoard);
				genPuzzle = g.generate();
				solverGen = new SudokuSolver(genPuzzle);
				ErrorCodes.consolePrintlnIfError(solverGen.solve());
				solUnq = solverGen.checkIfUniqueSolution();
				ErrorCodes.consolePrintlnIfError(solUnq);
				solvedGen = solverGen.getSolvedBoard();
				if ( (solUnq == SudokuSolver.SOLUTION_UNIQUE) && ( SudokuStore.checkPuzzle(genPuzzle) == true ) ) {
					//SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by empty board, solution unique and correct: YES, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
				} else {
					testResult = false;
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by empty board, solution unique and correct: NO, time (g, s): " + g.getComputingTime() + " s., " + solverGen.getComputingTime() + " s., ");
					Console.WriteLine("Generated puzzle");
					SudokuStore.consolePrintBoard(genPuzzle);
					Console.WriteLine("Solved initial board");
					SudokuStore.consolePrintBoard(solvedGen);
				}
				break;
			case 9:
				initBoard = SudokuPuzzles.PUZZLE_NON_UNIQUE_SOLUTION;
				g = new SudokuGenerator(initBoard, SudokuGenerator.PARAM_DO_NOT_SOLVE);
				if ( g.getGeneratorState() == SudokuGenerator.GENERATOR_INIT_FAILED ) {
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by PUZZLE_NON_UNIQUE_SOLUTION + PARAM_DO_NOT_SOLVE, init failed: YES.");
				} else {
					testResult = false;
					SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + ", generate by PUZZLE_NON_UNIQUE_SOLUTION + PARAM_DO_NOT_SOLVE, init failed: NO.");
					SudokuStore.consolePrintln("Generator state: " + g.getGeneratorState());
					Console.WriteLine(g.getMessages());
				}
				break;
			}
			if (testResult == true)
				SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + " >>>>>>>>>>>>>>>>>>>>>> SudokuGenerator, result: OK");
			else
				SudokuStore.consolePrintln("(Thread: " + threadId + ") " + "Test: " + testId + " >>>>>>>>>>>>>>>>>>>>>> SudokuGenerator, result: ERROR");
			return testResult;
		}
Example #33
0
		/**
		 * Start the Janet-Sudoku Tutorial code.
		 * @param args    No arguments are considered.
		 */
		public static void Start() {
			String tmpDir = FileX.getTmpDir();
			{
				/*
				 * Simple sudoku generation.
				 */
				SudokuStore.consolePrintln("");
				SudokuStore.consolePrintln("Simple sudoku generation.");
				SudokuGenerator sg = new SudokuGenerator();
				int[,] puzzle = sg.generate();
				SudokuStore.consolePrintBoard(puzzle);
			}
			{
				/*
				 * Simple sudoku generation + parameters.
				 */
				SudokuStore.consolePrintln("");
				SudokuStore.consolePrintln("Simple sudoku generation + parameters.");
				SudokuGenerator sg = new SudokuGenerator(SudokuGenerator.PARAM_GEN_RND_BOARD);
				int[,] puzzle = sg.generate();
				SudokuStore.consolePrintBoard(puzzle);
			}
			{
				/*
				 * Simple sudoku generation + puzzle rating.
				 */
				SudokuStore.consolePrintln("");
				SudokuStore.consolePrintln("Simple sudoku generation + puzzle rating.");
				SudokuGenerator sg = new SudokuGenerator();
				int[,] puzzle = sg.generate();
				int rating = SudokuStore.calculatePuzzleRating(puzzle);
				SudokuStore.consolePrintBoard(puzzle);
				SudokuStore.consolePrintln("Puzzle rating: " + rating);
			}
			{
				/*
				 * Solving sudoku example.
				 */
				SudokuStore.consolePrintln("");
				SudokuStore.consolePrintln("Solving sudoku example.");
				SudokuSolver ss = new SudokuSolver(SudokuPuzzles.PUZZLE_EXAMPLE_001);
				SudokuStore.consolePrintBoard(ss.getBoard());
				ss.solve();
				SudokuStore.consolePrintBoard(ss.getSolvedBoard());
			}
			{
				/*
				 * Saving board examples
				 */
				SudokuStore.consolePrintln("");
				SudokuStore.consolePrintln("Saving board examples " + tmpDir);
				SudokuStore.saveBoard(SudokuPuzzles.PUZZLE_EXAMPLE_001, tmpDir + "sudoku-board-ex-1.txt");
				SudokuStore.saveBoard(SudokuPuzzles.PUZZLE_EXAMPLE_001, tmpDir + "sudoku-board-ex-2.txt", "This is a head comment");
				SudokuStore.saveBoard(SudokuPuzzles.PUZZLE_EXAMPLE_001, tmpDir + "sudoku-board-ex-3.txt", "This is a head comment", "And a tail comment");
				SudokuSolver ss = new SudokuSolver(1);
				ss.solve();
				ss.saveSolvedBoard(tmpDir + "sudoku-board-ex-sol.txt", "Solution for the PUZZLE_EXAMPLE_001");
			}
			{
				/*
				 * Puzzle modification - i.e. rotation
				 */
				SudokuStore.consolePrintln("----------------------------------------------------");
				SudokuStore.consolePrintln(">>>>>>>> Puzzle modification");
				int[,] puzzle = SudokuStore.getPuzzleExample(0);
				int[,] puzzleRotated = SudokuStore.rotateClockWise(puzzle);
				SudokuStore.consolePrintBoard(puzzle);
				SudokuStore.consolePrintBoard(puzzleRotated);
			}
			/*
			 * And many other staff provided by the library :-)
			 */
		}
		/**
		 * Generates random puzzle with unique solution.
		 * Evaluates puzzle difficulty rating.
		 *
		 * @see SudokuGenerator
		 * @see SudokuGenerator#PARAM_GEN_RND_BOARD
		 * @see SudokuGenerator#generate()
		 * @see SudokuStore#calculatePuzzleRating(int[,])
		 */
		private void generateAndRateRandomPuzzle() {
			generator = new SudokuGenerator(SudokuGenerator.PARAM_GEN_RND_BOARD);
			setGeneratorOptions();
			int[,] generated = generator.generate();
			if (generator.getGeneratorState() == SudokuGenerator.GENERATOR_GEN_FINISHED) {
				trackPuzzleUndo();
				puzzle = generated;
				ratePuzzleDifficulty();
			} else {
				JanetConsole.println(">>> !!! Error while generating random puzzle !!! <<<");
				JanetConsole.println(generator.getMessages());
			}
		}
		/**
		 * Generates puzzle based on current puzzle
		 * (different puzzle, same solution).
		 *
		 * @see SudokuGenerator
		 * @see SudokuGenerator#PARAM_DO_NOT_TRANSFORM
		 * @see SudokuGenerator#generate()
		 */
		private void generateFromCurrentPuzzle() {
			generator = new SudokuGenerator(puzzle, SudokuGenerator.PARAM_DO_NOT_TRANSFORM);
			setGeneratorOptions();
			int[,] generated = generator.generate();
			if (generator.getGeneratorState() == SudokuGenerator.GENERATOR_GEN_FINISHED) {
				trackPuzzleUndo();
				puzzle = generated;
			} else {
				JanetConsole.println(">>> !!! Error while generating puzzle !!! <<<");
				JanetConsole.println(generator.getMessages());
			}
		}