def test_run_invalid_std(self):
     nfa = NfaRegex('(a|b)*abb')
     nfa.build()
     dfa = DfaNfa(nfa.nfa)
     dfa.build()
     dfa.minimize()
     result = dfa.run('ababaab')
     self.assertEqual(result, False)
 def test_build_basic(self):
     nfa = NfaRegex('a')
     sm = nfa._build_basic_sm('a')
     self.assertEqual(sm.states, [0, 1])
     self.assertEqual(sm.init_state, 0)
     self.assertEqual(sm.finish_states, [1])
     self.assertEqual(sm.catch_state, 1)
     self.assertEqual(sm.language, ['a'])
     self.assertEqual(sm.transitions, [[0, 1, 'a']])
def check_chain(regex, chain):
    nfa = NfaRegex(regex)
    nfa.build()
    nfa.nfa.draw()
    dfa = DfaNfa(nfa.nfa)
    dfa.build()
    dfa.dfa.draw()
    dfa.minimize()
    dfa.run(chain)
 def test_build_and(self):
     nfa = NfaRegex('a&b')
     sm1 = nfa._build_basic_sm('a')
     sm2 = nfa._build_basic_sm('b')
     sm = nfa._build_and_sm(sm1, sm2)
     self.assertEqual(sm.states, [0, 1, 2])
     self.assertEqual(sm.init_state, 0)
     self.assertEqual(sm.finish_states, [2])
     self.assertEqual(sm.catch_state, 2)
     self.assertEqual(sm.language, ['a', 'b'])
     self.assertEqual(sm.transitions, [[0, 1, 'a'], [1, 2, 'b']])
 def test_build_one_or_more(self):
     nfa = NfaRegex('a?')
     sm1 = nfa._build_basic_sm('a')
     sm = nfa._build_one_or_more_sm(sm1)
     self.assertEqual(sm.states, [0, 1, 2, 4, 3])
     self.assertEqual(sm.init_state, 0)
     self.assertEqual(sm.finish_states, [4])
     self.assertEqual(sm.catch_state, 4)
     self.assertEqual(sm.language, ['a'])
     self.assertEqual(sm.transitions,
                      [[0, 1, 'a'], [1, 2, 'ε'], [1, 4, 'ε'], [2, 3, 'a'],
                       [3, 2, 'ε'], [3, 4, 'ε']])
 def test_build_correct_std(self):
     nfa = NfaRegex('(a|b)*abb')
     nfa.build()
     dfa = DfaNfa(nfa.nfa)
     dfa.build()
     self.assertEqual(dfa.dfa.states, [0, 1, 2, 4, 5])
     self.assertEqual(dfa.dfa.init_state, 0)
     self.assertEqual(dfa.dfa.finish_states, [5])
     self.assertEqual(dfa.dfa.language, ['a', 'b'])
     self.assertEqual(
         dfa.dfa.transitions,
         [[0, 1, 'a'], [0, 2, 'b'], [2, 1, 'a'], [2, 2, 'b'], [1, 1, 'a'],
          [1, 4, 'b'], [4, 1, 'a'], [4, 5, 'b'], [5, 1, 'a'], [5, 2, 'b']])
 def test_minimize_correct(self):
     nfa = NfaRegex('a?b?(abc)*')
     nfa.build()
     dfa = DfaNfa(nfa.nfa)
     dfa.build()
     dfa.minimize()
     self.assertEqual(dfa.dfa.states, [0, 1, 2, 3, 4, 5])
     self.assertEqual(dfa.dfa.init_state, 0)
     self.assertEqual(dfa.dfa.finish_states, [2, 5])
     self.assertEqual(dfa.dfa.language, ['a', 'b', 'c'])
     self.assertEqual(dfa.dfa.transitions,
                      [[0, 1, 'a'], [1, 1, 'a'], [1, 2, 'b'], [2, 2, 'b'],
                       [2, 3, 'a'], [3, 4, 'b'], [4, 5, 'c'], [5, 3, 'a']])
 def test_minimize_correct_std(self):
     nfa = NfaRegex('(a|b)*abb')
     nfa.build()
     dfa = DfaNfa(nfa.nfa)
     dfa.build()
     dfa.minimize()
     self.assertEqual(dfa.dfa.states, [0, 1, 2, 3])
     self.assertEqual(dfa.dfa.init_state, 0)
     self.assertEqual(dfa.dfa.finish_states, [3])
     self.assertEqual(dfa.dfa.language, ['a', 'b'])
     self.assertEqual(dfa.dfa.transitions,
                      [[0, 0, 'b'], [0, 1, 'a'], [1, 1, 'a'], [1, 2, 'b'],
                       [2, 1, 'a'], [2, 3, 'b'], [3, 0, 'b'], [3, 1, 'a']])
 def test_build_or(self):
     nfa = NfaRegex('a|b')
     sm1 = nfa._build_basic_sm('a')
     sm2 = nfa._build_basic_sm('b')
     sm = nfa._build_or_sm(sm1, sm2)
     self.assertEqual(sm.states, [0, 1, 2, 3, 4, 5])
     self.assertEqual(sm.init_state, 0)
     self.assertEqual(sm.finish_states, [5])
     self.assertEqual(sm.catch_state, 5)
     self.assertEqual(sm.language, ['a', 'b'])
     self.assertEqual(sm.transitions,
                      [[0, 1, 'ε'], [0, 3, 'ε'], [1, 2, 'a'], [3, 4, 'b'],
                       [2, 5, 'ε'], [4, 5, 'ε']])