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);
        }
        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 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));
                }
            }
        }
        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 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);
        }
        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);
        }
        public void TestGetHashCode()
        {
            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];
                }
            }

            int hashCode = puzzle.GetHashCode();

            Assert.AreEqual(this.Sudoku, puzzle);
            Assert.AreEqual(this.Sudoku.GetHashCode(), hashCode);
            this.Sudoku[0, 0] = 0;
            Assert.AreNotEqual(this.Sudoku, puzzle);
            Assert.AreNotEqual(this.Sudoku.GetHashCode(), hashCode);
        }
        public void TestCheck()
        {
            SudokuGenerator.AddNumbers(this.Sudoku);
            Assert.IsTrue(this.Sudoku.Check());
            SudokuGenerator.RemoveNumbers(this.Sudoku);
            Assert.IsFalse(this.Sudoku.Check());
            SudokuSolver.RecursiveSolve(this.Sudoku);
            Assert.IsTrue(this.Sudoku.Check());
            Random random = new Random();
            int    row, column;

            do
            {
                row    = random.Next(this.Sudoku.Size);
                column = random.Next(this.Sudoku.Size);
            } while (this.Sudoku.CheckReadOnly(row, column));

            int number = this.Sudoku[row, column];

            this.Sudoku[row, column] = 0;
            Assert.IsFalse(this.Sudoku.Check());
            this.Sudoku[row, column] = number;
            Assert.IsTrue(this.Sudoku.Check());
        }