Exemple #1
0
class InvalidAddTest(TestCase):
    def __init__(self, *args):
        super().__init__(*args)
        self.g = Grammar()

    def setUp(self):
        g = Grammar()
        g.add_term([0, 1, 2, 'a', 'b', 'c'])
        g.add_nonterm([NFirst, NSecond, NThird, NFourth])
        self.g = g

    def test_invalidSelf(self):
        class Tmp(_R):
            def validate(*args):
                raise RuleSyntaxException(None, None)

        self.assertEqual(self.g.rules_count(), 0)
        with self.assertRaises(RuleSyntaxException):
            self.g.have_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.get_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.add_rule(Tmp)
        self.assertEqual(self.g.rules_count(), 0)
        with self.assertRaises(RuleSyntaxException):
            self.g.have_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.get_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.rule(Tmp)

    def test_invalidFirstInArray(self):
        class Tmp(_R):
            def validate(*args):
                raise RuleSyntaxException(None, None)

        class Valid(_R):
            rule = ([NFirst], ['a', 0])

        self.assertEqual(self.g.rules_count(), 0)
        with self.assertRaises(RuleSyntaxException):
            self.g.have_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.get_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.add_rule([Tmp, Valid])
        self.assertEqual(self.g.rules_count(), 0)
        with self.assertRaises(RuleSyntaxException):
            self.g.have_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.get_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.rule(Tmp)
        self.assertFalse(self.g.have_rule(Valid))
        self.assertIsNone(self.g.get_rule(Valid))
        self.assertIsNone(self.g.rule(Valid))

    def test_invalidSecondInArray(self):
        class Tmp(_R):
            def validate(*args):
                raise RuleSyntaxException(None, None)

        class Valid(_R):
            rule = ([NFirst], ['a', 0])

        self.assertEqual(self.g.rules_count(), 0)
        with self.assertRaises(RuleSyntaxException):
            self.g.have_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.get_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.add_rule([Valid, Tmp])
        self.assertEqual(self.g.rules_count(), 0)
        with self.assertRaises(RuleSyntaxException):
            self.g.have_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.get_rule(Tmp)
        with self.assertRaises(RuleSyntaxException):
            self.g.rule(Tmp)
        self.assertFalse(self.g.have_rule(Valid))
        self.assertIsNone(self.g.get_rule(Valid))
        self.assertIsNone(self.g.rule(Valid))

    def test_addNonRule(self):
        with self.assertRaises(NotRuleException):
            self.g.add_rule('asdf')
        with self.assertRaises(NotRuleException):
            self.g.add_rule(0)

        class Tmp:
            pass

        with self.assertRaises(NotRuleException):
            self.g.add_rule(Tmp)

        class PseudoNon(Nonterminal):
            pass

        with self.assertRaises(NotRuleException):
            self.g.add_rule(PseudoNon)
Exemple #2
0
class RulesTest(TestCase):
    def setUp(self):
        self.g = Grammar(
            terminals=[
                0, 1, 2, 'a', 'b', 'c', TFirst, TSecond, TThird, TInstFirst,
                TInstSecond, TInstThird
            ],
            nonterminals=[NFirst, NSecond, NThird, NFourth, NFifth])

    def test_oneInRules(self):
        class Tmp1(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        self.assertEqual([x.rule for x in self.g.add_rule(Tmp1)], Tmp1.rules)
        self.assertEqual(self.g.rules_count(), 3)
        self.assertTrue(self.g.have_rule(Tmp1))

    def test_oneInRulesIteration(self):
        class Tmp1(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        self.assertEqual([x.rule for x in self.g.add_rule(Tmp1)], Tmp1.rules)
        for rule in self.g.rule():
            self.assertIn(rule.rule, Tmp1.rules)

    def test_hashes(self):
        class Tmp1(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        class Tmp2(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        hash1 = hash(Tmp1)
        hash2 = hash(Tmp2)
        self.assertEqual(Tmp1, Tmp2)
        self.assertEqual(hash1, hash2)

    def test_haveMultiple(self):
        class Tmp1(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        class Tmp2(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        class Tmp3(Rule):
            rules = [([NFirst], [NSecond, 0])]

        class Tmp4(Rule):
            rules = [([NThird], [0, 1])]

        class Tmp5(Rule):
            rule = ([NFifth], [EPS])

        self.assertEqual([x.rule for x in self.g.add_rule(Tmp1)], Tmp1.rules)
        self.assertTrue(self.g.have_rule(Tmp2))
        self.assertTrue(self.g.have_rule(Tmp3))
        self.assertTrue(self.g.have_rule([Tmp3, Tmp4]))
        self.assertFalse(self.g.have_rule([Tmp3, Tmp5]))

    def test_shouldReturnArray(self):
        class Tmp1(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        self.assertEqual([x.rule for x in self.g.add_rule(Tmp1)], Tmp1.rules)
        r = self.g.get_rule(Tmp1)
        self.assertIsInstance(r, list)
        self.assertEqual(len(r), 3)
        for rule in r:
            self.assertIn(rule.rule, Tmp1.rules)

    def test_shouldProcessInConstructor(self):
        class Tmp1(Rule):
            rules = [([NFirst], [NSecond, 0]), ([NThird], [0, 1]),
                     ([NSecond], [NSecond, 'a'])]

        self.g = Grammar(
            terminals=[
                0, 1, 2, 'a', 'b', 'c', TFirst, TSecond, TThird, TInstFirst,
                TInstSecond, TInstThird
            ],
            nonterminals=[NFirst, NSecond, NThird, NFourth, NFifth],
            rules=[Tmp1])
        r = self.g.get_rule(Tmp1)
        self.assertIsInstance(r, list)
        self.assertEqual(len(r), 3)
        for rule in r:
            self.assertIn(rule.rule, Tmp1.rules)

    def test_unidefinedRules(self):
        class Tmp1(Rule):
            pass

        class Tmp2(Rule):
            pass

        h1 = hash(Tmp1)
        h2 = hash(Tmp2)
        self.assertNotEqual(h1, h2)
        self.assertNotEqual(Tmp1, Tmp2)
        Tmp1.rule = ([0], [0])
        Tmp2.rule = ([0], [0])
        h1 = hash(Tmp1)
        h2 = hash(Tmp2)
        self.assertEqual(h1, h2)
        self.assertEqual(Tmp1, Tmp2)
Exemple #3
0
class ValidAddTest(TestCase):
    def __init__(self, *args):
        super().__init__(*args)
        self.g = Grammar()

    def setUp(self):
        g = Grammar()
        g.add_term([0, 1, 2, 'a', 'b', 'c'])
        g.add_nonterm([NFirst, NSecond, NThird, NFourth])
        self.g = g

    def test_addOne(self):
        class Tmp(_R):
            rule = ([NFirst], ['a', 0])

        self.assertEqual(self.g.rules_count(), 0)
        self.assertFalse(self.g.have_rule(Tmp))
        self.assertIsNone(self.g.get_rule(Tmp))
        self.assertIsNone(self.g.rule(Tmp))
        self.assertEqual(self.g.add_rule(Tmp)[0].rule, Tmp.rule)
        self.assertEqual(self.g.rules_count(), 1)
        self.assertTrue(self.g.have_rule(Tmp))
        self.assertEqual(self.g.get_rule(Tmp), Tmp)
        self.assertEqual(self.g.rule(Tmp), Tmp)

    def test_addOneInArray(self):
        class Tmp(_R):
            rule = ([NFirst], ['a', 0])

        self.assertEqual(self.g.rules_count(), 0)
        self.assertFalse(self.g.have_rule(Tmp))
        self.assertIsNone(self.g.get_rule(Tmp))
        self.assertIsNone(self.g.rule(Tmp))
        self.assertEqual(self.g.add_rule([Tmp])[0].rule, ([NFirst], ['a', 0]))
        self.assertEqual(self.g.rules_count(), 1)
        self.assertTrue(self.g.have_rule(Tmp))
        self.assertEqual(self.g.get_rule(Tmp), Tmp)
        self.assertEqual(self.g.rule(Tmp), Tmp)

    def test_addOneInTuple(self):
        class Tmp(_R):
            rule = ([NFirst], ['a', 0])

        self.assertEqual(self.g.rules_count(), 0)
        self.assertFalse(self.g.have_rule(Tmp))
        self.assertIsNone(self.g.get_rule(Tmp))
        self.assertIsNone(self.g.rule(Tmp))
        self.assertEqual(self.g.add_rule((Tmp, ))[0].rule, Tmp.rule)
        self.assertEqual(self.g.rules_count(), 1)
        self.assertTrue(self.g.have_rule(Tmp))
        self.assertEqual(self.g.get_rule(Tmp), Tmp)
        self.assertEqual(self.g.rule(Tmp), Tmp)

    def test_addThree(self):
        class Tmp1(_R):
            rule = ([NFirst], ['a', 0])

        class Tmp2(_R):
            rule = ([NSecond], ['a', 0, NFourth])

        class Tmp3(_R):
            rule = ([NThird], [0])

        self.assertEqual(self.g.rules_count(), 0)
        self.assertFalse(self.g.have_rule(Tmp1))
        self.assertIsNone(self.g.get_rule(Tmp1))
        self.assertIsNone(self.g.rule(Tmp1))
        self.assertFalse(self.g.have_rule(Tmp2))
        self.assertIsNone(self.g.get_rule(Tmp2))
        self.assertIsNone(self.g.rule(Tmp2))
        self.assertFalse(self.g.have_rule(Tmp3))
        self.assertIsNone(self.g.get_rule(Tmp3))
        self.assertIsNone(self.g.rule(Tmp3))
        self.assertEqual(self.g.add_rule(Tmp1)[0].rule, Tmp1.rule)
        self.assertEqual(self.g.rules_count(), 1)
        self.assertTrue(self.g.have_rule(Tmp1))
        self.assertEqual(self.g.get_rule(Tmp1), Tmp1)
        self.assertEqual(self.g.rule(Tmp1), Tmp1)
        self.assertFalse(self.g.have_rule(Tmp2))
        self.assertIsNone(self.g.get_rule(Tmp2))
        self.assertIsNone(self.g.rule(Tmp2))
        self.assertFalse(self.g.have_rule(Tmp3))
        self.assertIsNone(self.g.get_rule(Tmp3))
        self.assertIsNone(self.g.rule(Tmp3))
        self.assertEqual(self.g.add_rule(Tmp2)[0].rule, Tmp2.rule)
        self.assertEqual(self.g.rules_count(), 2)
        self.assertTrue(self.g.have_rule(Tmp1))
        self.assertEqual(self.g.get_rule(Tmp1), Tmp1)
        self.assertEqual(self.g.rule(Tmp1), Tmp1)
        self.assertTrue(self.g.have_rule(Tmp2))
        self.assertEqual(self.g.get_rule(Tmp2), Tmp2)
        self.assertEqual(self.g.rule(Tmp2), Tmp2)
        self.assertFalse(self.g.have_rule(Tmp3))
        self.assertIsNone(self.g.get_rule(Tmp3))
        self.assertIsNone(self.g.rule(Tmp3))
        self.assertEqual(self.g.add_rule(Tmp3)[0].rule, Tmp3.rule)
        self.assertEqual(self.g.rules_count(), 3)
        self.assertTrue(self.g.have_rule(Tmp1))
        self.assertEqual(self.g.get_rule(Tmp1), Tmp1)
        self.assertEqual(self.g.rule(Tmp1), Tmp1)
        self.assertTrue(self.g.have_rule(Tmp2))
        self.assertEqual(self.g.get_rule(Tmp2), Tmp2)
        self.assertEqual(self.g.rule(Tmp2), Tmp2)
        self.assertTrue(self.g.have_rule(Tmp3))
        self.assertEqual(self.g.get_rule(Tmp3), Tmp3)
        self.assertEqual(self.g.rule(Tmp3), Tmp3)

    def test_addThreeInArray(self):
        class Tmp1(_R):
            rule = ([NFirst], ['a', 0])

        class Tmp2(_R):
            rule = ([NSecond], ['a', 0, NFourth])

        class Tmp3(_R):
            rule = ([NThird], [0])

        self.assertEqual(self.g.rules_count(), 0)
        add = self.g.add_rule([Tmp1, Tmp2, Tmp3])
        self.assertEqual(add[0].rule, Tmp1.rule)
        self.assertEqual(add[1].rule, Tmp2.rule)
        self.assertEqual(add[2].rule, Tmp3.rule)
        self.assertEqual(self.g.rules_count(), 3)
        self.assertTrue(self.g.have_rule(Tmp1))
        self.assertEqual(self.g.get_rule(Tmp1), Tmp1)
        self.assertEqual(self.g.rule(Tmp1), Tmp1)
        self.assertTrue(self.g.have_rule(Tmp2))
        self.assertEqual(self.g.get_rule(Tmp2), Tmp2)
        self.assertEqual(self.g.rule(Tmp2), Tmp2)
        self.assertTrue(self.g.have_rule(Tmp3))
        self.assertEqual(self.g.get_rule(Tmp3), Tmp3)
        self.assertEqual(self.g.rule(Tmp3), Tmp3)

    def test_addThreeInTuple(self):
        class Tmp1(_R):
            rule = ([NFirst], ['a', 0])

        class Tmp2(_R):
            rule = ([NSecond], ['a', 0, NFourth])

        class Tmp3(_R):
            rule = ([NThird], [0])

        self.assertEqual(self.g.rules_count(), 0)
        add = self.g.add_rule((Tmp1, Tmp2, Tmp3))
        self.assertEqual(add[0].rule, Tmp1.rule)
        self.assertEqual(add[1].rule, Tmp2.rule)
        self.assertEqual(add[2].rule, Tmp3.rule)
        self.assertEqual(self.g.rules_count(), 3)
        self.assertTrue(self.g.have_rule(Tmp1))
        self.assertEqual(self.g.get_rule(Tmp1), Tmp1)
        self.assertEqual(self.g.rule(Tmp1), Tmp1)
        self.assertTrue(self.g.have_rule(Tmp2))
        self.assertEqual(self.g.get_rule(Tmp2), Tmp2)
        self.assertEqual(self.g.rule(Tmp2), Tmp2)
        self.assertTrue(self.g.have_rule(Tmp3))
        self.assertEqual(self.g.get_rule(Tmp3), Tmp3)
        self.assertEqual(self.g.rule(Tmp3), Tmp3)

    def test_shouldAddIntoGrammar(self):
        class Tmp1(_R):
            rule = ([NFirst], ['a', 0])

        g = Grammar(terminals=['a', 0], nonterminals=[NFirst], rules=[Tmp1])
        g.add_rule(Tmp1)
        self.assertEqual(g.get_rule(Tmp1), Tmp1)