コード例 #1
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        public void TestCardinality2()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            BDD           cond   = solver.MkCharSetFromRegexCharClass(@"\w");
            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
                {
                    wCnt += 1;
                }
            }
            Assert.AreEqual <int>(wCnt, size);
        }
コード例 #2
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        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);
        }
コード例 #3
0
        public void GenerateMembersTest2()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            var           ranges = new char[][] {
                new char[] { 'a', 'c' },
                new char[] { '\u5555', '\u55A5' },
                new char[] { 'e', 'h' },
                new char[] { '\u55A0', '\u55AA' },
            };
            BDD s = solver.MkRangesConstraint(false, ranges);

            s.ToDot("bug.dot");

            var r  = solver.ToRanges(s);
            var s2 = solver.MkCharSetFromRanges(r);

            var members  = new List <char>(solver.GenerateAllCharacters(s2, false));
            var smallest = (char)solver.GetMin(s2);

            Assert.AreEqual <int>(93, members.Count, "wrong number of members in the range [a-ce-h\\u5555-\\u55AA]");
            Assert.AreEqual <char>('a', members[0], "the smallest character in the range must be 'a'");
            Assert.AreEqual <char>('\u55AA', members[members.Count - 1], "the largest character in the range must be '\\u55AA'");

            var membersInReverse = new List <char>(solver.GenerateAllCharacters(s, true));

            Assert.AreEqual <int>(93, membersInReverse.Count, "wrong number of members in the range [a-ce-h\\u5555-\\u55AA]");
            Assert.AreEqual <char>('\u55AA', membersInReverse[0], "the first character in the reverse enumeration must be '\\u55AA'");
            Assert.AreEqual <char>('a', membersInReverse[membersInReverse.Count - 1], "the last character in the reverse enumeration must be 'a'");
        }
コード例 #4
0
ファイル: CharSetTests.cs プロジェクト: davisjam/Automata
        public void TestRanges2b()
        {
            BitWidth      enc     = BitWidth.BV16;
            CharSetSolver solver  = new CharSetSolver(enc);
            BDD           cond    = solver.MkCharSetFromRegexCharClass(@"\w");
            var           ranges1 = solver.ToRanges(cond);
            var           cond1   = solver.MkCharSetFromRanges(ranges1);

            Tuple <uint, uint>[] ranges = solver.ToRanges(cond1);
            var cond2 = solver.MkCharSetFromRanges(ranges);

            Assert.AreSame(cond1, cond2);
            Assert.AreSame(cond, cond1);
            //cond.ToDot("cond.dot");
            Assert.AreEqual <uint>((uint)'0', ranges[0].Item1);
            Assert.AreEqual <uint>((uint)'9', ranges[0].Item2);
            Assert.AreEqual <uint>((uint)'A', ranges[1].Item1);
            Assert.AreEqual <uint>((uint)'Z', ranges[1].Item2);
            Assert.AreEqual <uint>((uint)'_', ranges[2].Item1);
            Assert.AreEqual <uint>((uint)'_', ranges[2].Item2);
            Assert.AreEqual <uint>((uint)'a', ranges[3].Item1);
            Assert.AreEqual <uint>((uint)'z', ranges[3].Item2);
        }
コード例 #5
0
ファイル: CharSetTests.cs プロジェクト: wellsoftware/Automata
        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);
        }
コード例 #6
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);
        }
コード例 #7
0
 public void TestRanges2b()
 {
     BitWidth enc = BitWidth.BV16;
     CharSetSolver solver = new CharSetSolver(enc);
     BDD cond = solver.MkCharSetFromRegexCharClass(@"\w");
     var ranges1 = solver.ToRanges(cond);
     var cond1 = solver.MkCharSetFromRanges(ranges1);
     Pair<uint, uint>[] ranges = solver.ToRanges(cond1);
     var cond2 = solver.MkCharSetFromRanges(ranges);
     Assert.AreSame(cond1, cond2);
     Assert.AreSame(cond, cond1);
     //cond.ToDot("cond.dot");
     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>(426, ranges.Length);
 }
コード例 #8
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);
 }
コード例 #9
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);
 }
コード例 #10
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);
 }
コード例 #11
0
        public void GenerateMembersTest2()
        {
            CharSetSolver solver = new CharSetSolver(BitWidth.BV16);
            var ranges = new char[][] {
                new char[] { 'a', 'c' },
                new char[] {'\u5555', '\u55A5'},
                new char[] { 'e', 'h' },
                new char[] {'\u55A0', '\u55AA'},
            };
            BDD s = solver.MkRangesConstraint(false, ranges);
            s.ToDot("bug.dot");

            var r = solver.ToRanges(s);
            var s2 = solver.MkCharSetFromRanges(r);

            var members = new List<char>(solver.GenerateAllCharacters(s2, false));
            var smallest = (char)solver.GetMin(s2);

            Assert.AreEqual<int>(93, members.Count, "wrong number of members in the range [a-ce-h\\u5555-\\u55AA]");
            Assert.AreEqual<char>('a', members[0], "the smallest character in the range must be 'a'");
            Assert.AreEqual<char>('\u55AA', members[members.Count - 1], "the largest character in the range must be '\\u55AA'");

            var membersInReverse = new List<char>(solver.GenerateAllCharacters(s, true));

            Assert.AreEqual<int>(93, membersInReverse.Count, "wrong number of members in the range [a-ce-h\\u5555-\\u55AA]");
            Assert.AreEqual<char>('\u55AA', membersInReverse[0], "the first character in the reverse enumeration must be '\\u55AA'");
            Assert.AreEqual<char>('a', membersInReverse[membersInReverse.Count-1], "the last character in the reverse enumeration must be 'a'");
        }