public void TrySet_WithInvalidValue_FailsAndLeavesUnchanged()
        {
            var puzzle = new PuzzleWithPossibleValues(new int?[][] {
                new int?[] { 1, null /* 4 */, null /* 3 */, 2 },
                new int?[] { null /* 2 */, null /* 3 */, 1, null /* 4 */ },
                new int?[] { null /* 4 */, null /* 1 */, null /* 2 */, null /* 3 */ },
                new int?[] { 3, 2, 4, 1 }
            });
            var rules = new IRule[]
            {
                new RowUniquenessRule(),
                new ColumnUniquenessRule(),
                new BoxUniquenessRule()
            };
            var ruleKeeper = new DynamicRuleKeeper(rules);

            Assert.True(ruleKeeper.TryInit(puzzle));
            IDictionary <Coordinate, BitVector> initialPossibleValues = _RetrieveAllUnsetPossibleValues(puzzle);
            var coord = new Coordinate(1, 1);
            int val   = 2;

            Assert.False(ruleKeeper.TrySet(coord, val));

            foreach (Coordinate c in puzzle.GetUnsetCoords())
            {
                Assert.Equal(initialPossibleValues[c], puzzle.GetPossibleValues(in c));
            }
        }
        public void TrySet_WithValueThatCausesNoPossiblesForOtherSquare_FailsAndLeavesUnchanged()
        {
            var puzzle = new Puzzle(new int?[, ] {
                { 1, null /* 4 */, null /* 3 */, 2 },
                { null /* 2 */, null /* 3 */, 1, null /* 4 */ },
                { null /* 4 */, null /* 1 */, null /* 2 */, null /* 3 */ },
                { 3, 2, 4, 1 }
            });
            var possibleValues = new PossibleValues(puzzle);
            var rules          = new List <ISudokuRule>
            {
                new RowUniquenessRule(puzzle, possibleValues.AllPossible),
                new ColumnUniquenessRule(puzzle, possibleValues.AllPossible),
                new BoxUniquenessRule(puzzle, possibleValues.AllPossible, true)
            };
            var ruleKeeper = new DynamicRuleKeeper(puzzle, possibleValues, rules);
            IDictionary <Coordinate, BitVector> initialPossibleValues = _RetrieveAllUnsetPossibleValues(puzzle, possibleValues);
            var coord = new Coordinate(1, 0);
            int val   = 4;

            Assert.False(ruleKeeper.TrySet(coord, val));

            foreach (Coordinate c in puzzle.GetUnsetCoords())
            {
                Assert.Equal(initialPossibleValues[c], possibleValues[in c]);
        public void TrySet_WithValidValue_Succeeds()
        {
            var puzzle = new PuzzleWithPossibleValues(new int?[][] {
                new int?[] { 1, null /* 4 */, null /* 3 */, 2 },
                new int?[] { null /* 2 */, null /* 3 */, 1, null /* 4 */ },
                new int?[] { null /* 4 */, null /* 1 */, null /* 2 */, null /* 3 */ },
                new int?[] { 3, 2, 4, 1 }
            });
            var rules = new IRule[]
            {
                new RowUniquenessRule(),
                new ColumnUniquenessRule(),
                new BoxUniquenessRule()
            };
            var ruleKeeper = new DynamicRuleKeeper(rules);

            Assert.True(ruleKeeper.TryInit(puzzle));
            var coord = new Coordinate(1, 1);
            int val   = 3;

            Assert.True(ruleKeeper.TrySet(coord, val));

            puzzle[coord] = val;
            Assert.Equal(new BitVector(0b10000), puzzle.GetPossibleValues(new Coordinate(0, 1)));
            Assert.Equal(new BitVector(0b10100), puzzle.GetPossibleValues(new Coordinate(1, 0)));
            Assert.Equal(new BitVector(0b10000), puzzle.GetPossibleValues(new Coordinate(1, 3)));
            Assert.Equal(new BitVector(0b10010), puzzle.GetPossibleValues(new Coordinate(2, 1)));
        }
        public void TrySet_WithValidValue_Succeeds()
        {
            var puzzle = new Puzzle(new int?[, ] {
                { 1, null /* 4 */, null /* 3 */, 2 },
                { null /* 2 */, null /* 3 */, 1, null /* 4 */ },
                { null /* 4 */, null /* 1 */, null /* 2 */, null /* 3 */ },
                { 3, 2, 4, 1 }
            });
            var possibleValues = new PossibleValues(puzzle);
            var rules          = new List <ISudokuRule>
            {
                new RowUniquenessRule(puzzle, possibleValues.AllPossible),
                new ColumnUniquenessRule(puzzle, possibleValues.AllPossible),
                new BoxUniquenessRule(puzzle, possibleValues.AllPossible, true)
            };
            var ruleKeeper = new DynamicRuleKeeper(puzzle, possibleValues, rules);
            var coord      = new Coordinate(1, 1);
            int val        = 3;

            Assert.True(ruleKeeper.TrySet(coord, val));
            puzzle[coord] = val;
            Assert.Equal(new BitVector(0b10000), possibleValues[new Coordinate(0, 1)]);
            Assert.Equal(new BitVector(0b10100), possibleValues[new Coordinate(1, 0)]);
            Assert.Equal(new BitVector(0b10000), possibleValues[new Coordinate(1, 3)]);
            Assert.Equal(new BitVector(0b10010), possibleValues[new Coordinate(2, 1)]);
        }