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)]); }