public void Test_Dictionary_Not_Updates_After_Assignment()
        {
            var a = new Assignment <int, int>();
            var d = a.AsReadOnlyDictionary();

            var newA = a.Assign(v1, 2);
            var newD = newA.AsReadOnlyDictionary();

            Assert.AreEqual(2, newD[v1]);
            Assert.IsFalse(d.ContainsKey(v1));
        }
        public void Test_Constructor_With_Values()
        {
            IDictionary <Variable <int, int>, int> d = new Dictionary <Variable <int, int>, int>
            {
                { v1, 1 },
                { v2, 3 }
            };
            var a = new Assignment <int, int>(d);

            var assignmentDictionary = a.AsReadOnlyDictionary();

            Assert.AreEqual(1, assignmentDictionary[v1]);
            Assert.AreEqual(3, assignmentDictionary[v2]);
        }
        public void Demo()
        {
            const int n = 8;
            IReadOnlyCollection <int> values = Enumerable.Range(1, n).ToList();
            IReadOnlyCollection <Variable <string, int> > variables = Enumerable.Range(1, n).Select(i => new Variable <string, int>(i.ToString(), values)).ToList();

            IConstraint <string, int>[] constraints = new[] { new AllDifferentConstraint <string, int>(variables) };
            Problem <string, int>       problem     = new Problem <string, int>(variables, constraints);

            ISolver <string, int>    solver   = new RecursiveBacktrackSolver <string, int>();
            Assignment <string, int> solution = solver.Solve(problem, CancellationToken.None);
            IReadOnlyDictionary <Variable <string, int>, int> solutionDictionary = solution.AsReadOnlyDictionary();

            var expectedDictionary = Enumerable.Range(1, n).ToDictionary(i => i.ToString(), i => i);
            var actualDictionary   = solutionDictionary.OrderBy(kv => kv.Key.UserObject).ToDictionary(kv => kv.Key.UserObject, kv => kv.Value);

            CollectionAssert.AreEqual(expectedDictionary, actualDictionary);
        }