public void TrySelect_DropsConstraintConnectedSquareValues() { var puzzle = new Puzzle(4); var matrix = new ExactCoverMatrix(puzzle); new RowUniquenessConstraint().Constrain(puzzle, matrix); new ColumnUniquenessConstraint().Constrain(puzzle, matrix); int valueIndex = 0; PossibleValue possibleValue = matrix.GetSquare(new Coordinate(0, 1)).GetPossibleValue(valueIndex); Assert.True(possibleValue.TrySelect()); ConstraintHeader constraintA = possibleValue.FirstLink.Constraint; ConstraintHeader constraintB = possibleValue.FirstLink.Right.Constraint; Assert.Equal(4, constraintA.GetLinks().Count()); Assert.Equal(4, constraintB.GetLinks().Count()); foreach (Link link in constraintA.GetLinks()) { if (link.PossibleSquare == possibleValue) { continue; } Assert.Equal(PossibleSquareState.DROPPED, link.PossibleSquare.State); } foreach (Link link in constraintB.GetLinks()) { if (link.PossibleSquare == possibleValue) { continue; } Assert.Equal(PossibleSquareState.DROPPED, link.PossibleSquare.State); } }
public void TrySelect_SelectsSquare() { var puzzle = new Puzzle(4); var matrix = new ExactCoverMatrix(puzzle); new RowUniquenessConstraint().Constrain(puzzle, matrix); new ColumnUniquenessConstraint().Constrain(puzzle, matrix); int valueIndex = 0; Square square = matrix.GetSquare(new Coordinate(0, 1)); PossibleValue possibleValue = square.GetPossibleValue(valueIndex); Assert.True(possibleValue.TrySelect()); Assert.Equal(PossibleSquareState.SELECTED, possibleValue.State); }
public void Deselect_WithSelectedValue_SetsStateAndSquareCountCorrectly() { var puzzle = new Puzzle(4); var matrix = new ExactCoverMatrix(puzzle); new RowUniquenessConstraint().Constrain(puzzle, matrix); new ColumnUniquenessConstraint().Constrain(puzzle, matrix); int valueIndex = 0; Square square = matrix.GetSquare(new Coordinate(0, 1)); PossibleValue possibleValue = square.GetPossibleValue(valueIndex); Assert.True(possibleValue.TrySelect()); possibleValue.Deselect(); Assert.Equal(PossibleSquareState.UNKNOWN, possibleValue.State); Assert.Equal(4, square.NumPossibleValues); }
public void Deselect_WithSelectedValue_ReturnsDroppedRows() { var puzzle = new Puzzle(4); var matrix = new ExactCoverMatrix(puzzle); new RowUniquenessConstraint().Constrain(puzzle, matrix); new ColumnUniquenessConstraint().Constrain(puzzle, matrix); int valueIndex = 0; Square square = matrix.GetSquare(new Coordinate(0, 1)); PossibleValue possibleValue = square.GetPossibleValue(valueIndex); Assert.True(possibleValue.TrySelect()); possibleValue.Deselect(); Link linkA = possibleValue.FirstLink; Link linkB = linkA.Right; ConstraintHeader constraintA = linkA.Constraint; ConstraintHeader constraintB = linkB.Constraint; Assert.False(constraintA.IsSatisfied); Assert.False(constraintB.IsSatisfied); Assert.Equal(4, constraintA.Count); Assert.Equal(4, constraintB.Count); foreach (Link link in constraintA.GetLinks()) { if (link != linkA) { Assert.Equal(PossibleSquareState.UNKNOWN, link.PossibleSquare.State); } } foreach (Link link in constraintB.GetLinks()) { if (link != linkB) { Assert.Equal(PossibleSquareState.UNKNOWN, link.PossibleSquare.State); } } }
public void TrySelect_SatisfiesConstraints() { var puzzle = new Puzzle(4); var matrix = new ExactCoverMatrix(puzzle); new RowUniquenessConstraint().Constrain(puzzle, matrix); new ColumnUniquenessConstraint().Constrain(puzzle, matrix); int valueIndex = 0; PossibleValue possibleValue = matrix.GetSquare(new Coordinate(0, 1)).GetPossibleValue(valueIndex); Assert.True(possibleValue.TrySelect()); ConstraintHeader constraintA = possibleValue.FirstLink.Constraint; ConstraintHeader constraintB = possibleValue.FirstLink.Right.Constraint; Assert.True(constraintA.IsSatisfied); Assert.True(constraintB.IsSatisfied); Assert.Equal(4, constraintA.Count); Assert.Equal(4, constraintB.Count); Assert.DoesNotContain(constraintA, matrix.GetUnsatisfiedConstraintHeaders()); Assert.DoesNotContain(constraintB, matrix.GetUnsatisfiedConstraintHeaders()); }