示例#1
0
        public void TestRanges3()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"\d");
            int           cnt    = cond.CountNodes();

            Pair <uint, uint>[] ranges = solver.ToRanges(cond);
            BDD set     = solver.MkCharSetFromRanges(ranges);
            int nodes   = set.CountNodes();
            var ranges2 = new List <Pair <uint, uint> >(ranges);

            ranges2.Reverse();
            BDD set2    = solver.MkCharSetFromRanges(ranges2);
            int nodes2  = set.CountNodes();
            var ranges3 = solver.ToRanges(set2);
            BDD set3    = solver.MkCharSetFromRanges(ranges3);

            int cnt2 = set2.CountNodes();
            int cnt3 = set3.CountNodes();

            Assert.IsTrue(set2 == set3);

            Assert.AreEqual <int>(nodes, nodes2);
            Assert.AreSame(set, set2);

            set.ToDot("digits.dot");

            //check equivalence
            bool equiv = solver.MkOr(solver.MkAnd(cond, solver.MkNot(set)), solver.MkAnd(set, solver.MkNot(cond))) == solver.False;

            Assert.AreEqual <int>(31, ranges.Length);
        }
示例#2
0
        public void TestCardinality3()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"[\w-[\d]]");
            int           cnt    = cond.CountNodes();

            Pair <uint, uint>[] ranges = solver.ToRanges(cond);
            BDD set      = solver.MkCharSetFromRanges(ranges);
            int nodes    = set.CountNodes();
            int size     = (int)solver.ComputeDomainSize(set);
            int expected = 0;

            foreach (var range in ranges)
            {
                expected += ((int)(range.Second - range.First) + 1);
            }
            Assert.AreEqual <int>(expected, size);
            int wCnt = 0;

            for (int i = 0; i <= 0xFFFF; i++)
            {
                int cat = (int)char.GetUnicodeCategory((char)i);
                if (cat == 0 || cat == 1 || cat == 2 || cat == 3 || cat == 4 || cat == 5 ||
                    cat == 8 || cat == 18)  //same as \w in regex
                {
                    if (!char.IsDigit((char)i))
                    {
                        wCnt += 1;
                    }
                }
            }
            Assert.AreEqual <int>(wCnt, size);
        }
示例#3
0
        public void TestCardinality()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"\d");
            int           cnt    = cond.CountNodes();

            Pair <uint, uint>[] ranges = solver.ToRanges(cond);
            BDD set      = solver.MkCharSetFromRanges(ranges);
            int nodes    = set.CountNodes();
            int size     = (int)solver.ComputeDomainSize(set);
            int expected = 0;

            foreach (var range in ranges)
            {
                expected += ((int)(range.Second - range.First) + 1);
            }
            Assert.AreEqual <int>(expected, size);
            int digitCnt = 0;

            for (int i = 0; i <= 0xFFFF; i++)
            {
                if (char.IsDigit(((char)i)))
                {
                    digitCnt += 1;
                }
            }
            Assert.AreEqual <int>(digitCnt, size);
        }
示例#4
0
        public void TestNodeCount()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"[\x00-\u7FFF]");
            int           cnt    = cond.CountNodes();

            Assert.AreEqual <int>(3, cnt);
        }
示例#5
0
        public void TestLargeRange()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"[\u0000-\u7FFF]");
            int           elems  = (int)solver.ComputeDomainSize(cond);
            int           nodes  = cond.CountNodes();

            Assert.AreEqual <int>(3, nodes);
            Assert.AreEqual <int>((1 << 15), elems);
        }
示例#6
0
        public void TestShiftLeft1()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftLeft", "c:/tmp/TestShiftLeftIn.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            //BvSet bvs = solver.ShiftLeft(cond, 30);
            //Assert.AreEqual<int>(5, bvs.CountNodes());
            BDD bvs2 = solver.ShiftLeft(cond, 28);

            Assert.AreEqual <int>(9, bvs2.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(bvs, "TestShiftLeft", "c:/tmp/TestShiftLeftOut.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
        }
示例#7
0
        public void TestShiftRight2()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);

            Assert.AreEqual <int>(9, cond.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftRight", "c:/tmp/TestShiftRight2.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            var sr = solver.ShiftRight(cond);

            Assert.AreEqual <int>(7, sr.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(sr, "TestShiftRight", "c:/tmp/TestShiftRight2res.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
        }
示例#8
0
        public void TestShiftRight1()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond1  = solver.MkSetFromRange(0, 7, 3);
            BDD        cond2  = solver.MkSetFromElements(new uint[] { 9, 10, 12, 15 }, 3);
            BDD        cond   = solver.MkOr(cond1, cond2);

            Assert.AreEqual <int>(8, cond.CountNodes());
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftRight", "c:/tmp/TestShiftRight1.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            BDD sr = solver.ShiftRight(cond);

            Assert.AreEqual <BDD>(solver.True, sr);
        }
示例#9
0
        public void TestShiftLeftThenRight()
        {
            BDDAlgebra solver = new BDDAlgebra();
            BDD        cond   = solver.MkSetFromElements(new uint[] { 0, 15 }, 3);
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(cond, "TestShiftLeft2_cond", "c:/tmp/TestShiftLeft2_cond.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
            BDD bvs    = solver.ShiftLeft(cond, 4);
            BDD concat = solver.MkAnd(bvs, cond);

            Assert.AreEqual <int>(16, concat.CountNodes());
            BDD cond1 = solver.ShiftRight(solver.ShiftRight(solver.ShiftRight(solver.ShiftRight(concat))));

            Assert.AreEqual <BDD>(cond1, cond);
            //Automata.Internal.DirectedGraphs.DotWriter.CharSetToDot(concat, "TestShiftLeft2_concat", "c:/tmp/TestShiftLeft2_concat.dot", Internal.DirectedGraphs.DotWriter.RANKDIR.TB, 12);
        }
示例#10
0
        public void TestLargeRange2()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"[\u0000-\u7FFF\uA000-\uA00F]");
            uint          elems  = (uint)solver.ComputeDomainSize(cond);
            int           nodes  = cond.CountNodes();

            Assert.AreEqual <int>(14, nodes);
            var ranges = solver.ToRanges(cond);

            Assert.AreEqual <int>(2, ranges.Length);
            Assert.AreEqual <uint>(ranges[0].First, 0);
            Assert.AreEqual <uint>(ranges[0].Second, 0x7FFF);
            Assert.AreEqual <uint>(ranges[1].First, 0xA000);
            Assert.AreEqual <uint>(ranges[1].Second, 0xA00F);
            Assert.AreEqual <uint>(((uint)1 << 15) + ((uint)1 << 4), elems);
        }
示例#11
0
        public void TestSurrogateRange()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            //high and low surrogate pair elements
            BDD cond = solver.MkCharSetFromRegexCharClass(@"\p{Cs}");

            cond.ToDot("surr.dot");
            int elems = (int)solver.ComputeDomainSize(cond);
            int nodes = cond.CountNodes();

            Assert.AreEqual <int>(7, nodes); //highly compact BDD representation
            var ranges = solver.ToRanges(cond);

            Assert.AreEqual <int>(1, ranges.Length);
            Assert.AreEqual <uint>(ranges[0].First, 0xd800);
            Assert.AreEqual <uint>(ranges[0].Second, 0xdFFF);
            //the total number of surrogates (there are 1024 low surrogates and 1024 high surrogates)
            Assert.AreEqual <int>(2048, elems);
        }
示例#12
0
        public void TestRanges2()
        {
            BitWidth      enc    = BitWidth.BV7;
            CharSetSolver solver = new CharSetSolver(enc);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"\w");
            int           nodes  = cond.CountNodes();

            Pair <uint, uint>[] ranges = solver.ToRanges(cond);
            BDD cond2 = solver.MkCharSetFromRanges(ranges);

            Assert.AreSame(cond, cond2);
            int nodes2 = cond2.CountNodes();

            Assert.AreEqual <uint>((uint)'0', ranges[0].First);
            Assert.AreEqual <uint>((uint)'9', ranges[0].Second);
            Assert.AreEqual <uint>((uint)'A', ranges[1].First);
            Assert.AreEqual <uint>((uint)'Z', ranges[1].Second);
            Assert.AreEqual <uint>((uint)'_', ranges[2].First);
            Assert.AreEqual <uint>((uint)'_', ranges[2].Second);
            Assert.AreEqual <uint>((uint)'a', ranges[3].First);
            Assert.AreEqual <uint>((uint)'z', ranges[3].Second);
            Assert.AreEqual <int>(4, ranges.Length);
        }