class GetTest(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_getAsArray(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.g.add_rule([Tmp1, Tmp2, Tmp3]) self.assertEqual(self.g.get_rule([Tmp1, Tmp2, Tmp3]), [Tmp1, Tmp2, Tmp3]) def test_getOne(self): class Tmp1(_R): rule = ([NFirst], ['a', 0]) self.assertEqual(self.g.rules_count(), 0) self.g.add_rule([Tmp1]) self.assertEqual(self.g.get_rule(Tmp1), Tmp1) def test_getAsArrayWithNone(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.g.add_rule([Tmp1, Tmp3]) self.assertEqual(self.g.get_rule([Tmp1, Tmp2, Tmp3]), [Tmp1, None, 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)
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)
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)
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)