public void SingleAssignmentTest()
        {
            var s = new SearchState();

            var idx = (3, 3);

            s[idx] = 4;

            var fc = new ForwardChecking();

            var result     = fc.Solve(s.Copy());
            var neighbours = Sets.ContainingSets(idx).SelectMany(x => x).Distinct().ToHashSet();

            foreach (var x in Sets.All)
            {
                if (x == idx)
                {
                    Assert.AreEqual(4, result[x]);
                }
                else if (neighbours.Contains(x))
                {
                    Assert.AreNotEqual(s.BitDomain(x), result.BitDomain(x));
                    Assert.IsFalse(result.CanBe(x, 4));
                }
                else
                {
                    Assert.AreEqual(s.BitDomain(x), result.BitDomain(x));
                }
            }
        }
        public void EmptyStateDoesNothingTest()
        {
            var s  = new SearchState();
            var fc = new ForwardChecking();

            var result = fc.Solve(s.Copy());

            foreach (var(x, y) in Sets.All)
            {
                Assert.AreEqual(s.BitDomain(x, y), result.BitDomain(x, y));
            }
        }
        public void TwoAssignmentTest()
        {
            var s = new SearchState();

            var idx1 = (3, 3);
            var idx2 = (2, 2);

            s[idx1] = 4;
            s[idx2] = 7;

            var fc = new ForwardChecking();

            var result      = fc.Solve(s.Copy());
            var neighbours1 = Sets.ContainingSets(idx1).SelectMany(x => x).Distinct().ToHashSet();
            var neighbours2 = Sets.ContainingSets(idx2).SelectMany(x => x).Distinct().ToHashSet();
            var intersect   = neighbours1.Where(neighbours2.Contains).ToHashSet();

            foreach (var x in Sets.All)
            {
                if (x == idx1)
                {
                    Assert.AreEqual(4, result[x]);
                }
                else if (x == idx2)
                {
                    Assert.AreEqual(7, result[x]);
                }
                else if (intersect.Contains(x))
                {
                    Assert.AreNotEqual(s.BitDomain(x), result.BitDomain(x));
                    Assert.IsFalse(result.CanBe(x, 4));
                    Assert.IsFalse(result.CanBe(x, 7));
                }
                else if (neighbours1.Contains(x))
                {
                    Assert.AreNotEqual(s.BitDomain(x), result.BitDomain(x));
                    Assert.IsFalse(result.CanBe(x, 4));
                }
                else if (neighbours2.Contains(x))
                {
                    Assert.AreNotEqual(s.BitDomain(x), result.BitDomain(x));
                    Assert.IsFalse(result.CanBe(x, 7));
                }
                else
                {
                    Assert.AreEqual(s.BitDomain(x), result.BitDomain(x));
                }
            }
        }