public void TestFind_TwoChoices()
        {
            IAtomContainer dummy = new Mock <IAtomContainer>().Object;

            int[][] g = new int[][] { new[] { 1, 5, 6 }, new[] { 0, 2, 8 }, new[] { 1, 3, 9 }, new[] { 2, 4, 7 }, new[] { 3, 5, 10 }, new[] { 0, 4, 11 }, new[] { 0, 14, 15 },
                                      new[] { 3, 20, 21 }, new[] { 1, 12, 13 }, new[] { 2, 22, 23 }, new[] { 4, 18, 19 }, new[] { 5, 16, 17 }, new[] { 8, 13 }, new[] { 8, 12 }, new[] { 6, 15 }, new[] { 14, 6 },
                                      new[] { 11, 17 }, new[] { 16, 11 }, new[] { 10, 19 }, new[] { 10, 18 }, new[] { 7, 21 }, new[] { 7, 20 }, new[] { 9, 23 }, new[] { 22, 9 } };

            // this mock the invariants
            long[] values = new long[] { 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };

            EquivalentSetFinder finder = new MinimumEquivalentCyclicSet();
            var set = finder.Find(values, dummy, g);

            Assert.AreEqual(6, set.Count);
            Assert.IsTrue(set.Contains(0));
            Assert.IsTrue(set.Contains(1));
            Assert.IsTrue(set.Contains(2));
            Assert.IsTrue(set.Contains(3));
            Assert.IsTrue(set.Contains(4));
            Assert.IsTrue(set.Contains(5));

            // invert values, we should now get the other set
            values = new long[] { 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 };

            set = finder.Find(values, dummy, g);

            Assert.AreEqual(6, set.Count);
            Assert.IsTrue(set.Contains(6));
            Assert.IsTrue(set.Contains(7));
            Assert.IsTrue(set.Contains(8));
            Assert.IsTrue(set.Contains(9));
            Assert.IsTrue(set.Contains(10));
            Assert.IsTrue(set.Contains(11));
        }
        public void TestFind_NoChoice()
        {
            IAtomContainer dummy = new Mock <IAtomContainer>().Object;

            int[][] g = new int[][] { new[] { 1, 2, 3 }, new[] { 0, 4, 9 }, new[] { 0, 5, 6 }, new[] { 0, 7, 8 }, new[] { 1 }, new[] { 2 }, new[] { 2 }, new[] { 3 }, new[] { 3 }, new[] { 1 } };

            // this mock the invariants
            long[] values = new long[] { 1, 2, 2, 2, 3, 3, 3, 3, 3, 3 };

            EquivalentSetFinder finder = new MinimumEquivalentCyclicSet();
            var set = finder.Find(values, dummy, g);

            Assert.AreEqual(0, set.Count);
        }
        public void TestFind_OneChoice()
        {
            IAtomContainer dummy = new Mock <IAtomContainer>().Object;

            int[][] g = new int[][] { new[] { 1, 5, 6 }, new[] { 0, 2 }, new[] { 1, 3 }, new[] { 2, 4, 7 }, new[] { 3, 5 }, new[] { 0, 4 }, new[] { 0 }, new[] { 3 } };

            // this mock the invariants
            long[] values = new long[] { 1, 0, 0, 1, 0, 0, 2, 2 };

            EquivalentSetFinder finder = new MinimumEquivalentCyclicSet();
            var set = finder.Find(values, dummy, g);

            Assert.AreEqual(2, set.Count);
            Assert.IsTrue(set.Contains(0));
            Assert.IsTrue(set.Contains(3));
        }