public void TryConstrain_WithUniqueValuesInRows_Succeeds()
        {
            var puzzle = new Puzzle(new int?[][] {
                new int?[] { null, null, null, null },
                new int?[] { null, null, null, 4 },
                new int?[] { null, null, 3, 4 },
                new int?[] { 1, 2, 3, 4 },
            });
            var graph      = ExactCoverGraph.Create(puzzle);
            var constraint = new RowUniquenessConstraint();

            Assert.True(constraint.TryConstrain(puzzle, graph));

            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(0, 0), new int[] { 1, 2, 3, 4 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(0, 1), new int[] { 1, 2, 3, 4 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(0, 2), new int[] { 1, 2, 3, 4 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(0, 3), new int[] { 1, 2, 3, 4 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(1, 0), new int[] { 1, 2, 3 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(1, 1), new int[] { 1, 2, 3 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(1, 2), new int[] { 1, 2, 3 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(2, 0), new int[] { 1, 2 }, graph);
            ExactCoverGraphs.AssertPossibleValuesAtSquare(new(2, 1), new int[] { 1, 2 }, graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(1, 3), graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(2, 2), graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(2, 3), graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(3, 0), graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(3, 1), graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(3, 2), graph);
            ExactCoverGraphs.AssertNoPossibleValuesAtSquare(new(3, 3), graph);
        }
        public void TryConstrain_WithNonUniqueValuesInRows_Fails()
        {
            var puzzle = new Puzzle(new int?[][] {
                new int?[] { null, 1, null, null },
                new int?[] { null, 2, null, 2 },
                new int?[] { null, 3, null, null },
                new int?[] { null, 4, null, null },
            });
            var graph      = ExactCoverGraph.Create(puzzle);
            var constraint = new RowUniquenessConstraint();

            Assert.False(constraint.TryConstrain(puzzle, graph));
        }