def test_accepts_both_optional_paths(self): machine = StateMachine(states=[ State(START_STATE, [Edge('a', 'b'), Edge('a', 'c')]), State('b', Edge('b', FINAL_STATE)), State('c', Edge('c', FINAL_STATE)), State(FINAL_STATE) ]) self.assertTrue(machine.accepts('ab')[0]) machine.reset() self.assertTrue(machine.accepts('ac')[0])
def test_accepts_repeated_symbols(self): machine = StateMachine(states=[ State(START_STATE, Edge('a', FINAL_STATE)), State(FINAL_STATE, Edge('', START_STATE)) ]) self.assertTrue(machine.accepts('a')[0]) machine.reset() self.assertTrue(machine.accepts('aa')[0]) machine.reset() self.assertTrue(machine.accepts('aaa')[0])
def test_accepts_optional_symbols(self): machine = StateMachine(states=[ State(START_STATE, [Edge('a', FINAL_STATE), Edge('a', 'b')]), State('b', Edge('b', FINAL_STATE)), State(FINAL_STATE) ]) self.assertTrue(machine.accepts('a')[0]) machine.reset() self.assertTrue(machine.accepts('ab')[0]) machine.reset() self.assertFalse(machine.accepts('b')[0])
def test_accepts_repeated_alpha(self): machine = StateMachine(states=[ State(START_STATE, Edge('ALPHA', FINAL_STATE, True)), State(FINAL_STATE, Edge('', START_STATE)) ]) self.assertTrue(machine.accepts('a')[0]) machine.reset() self.assertTrue(machine.accepts('ab')[0]) machine.reset() self.assertTrue(machine.accepts('abc')[0]) machine.reset() self.assertFalse(machine.accepts('a2c')[0])
def test_accepts_repeated_digit(self): machine = StateMachine(states=[ State(START_STATE, Edge('DIGIT', FINAL_STATE, True)), State(FINAL_STATE, Edge('', START_STATE)) ]) self.assertTrue(machine.accepts('1')[0]) machine.reset() self.assertTrue(machine.accepts('12')[0]) machine.reset() self.assertTrue(machine.accepts('123')[0]) machine.reset() self.assertFalse(machine.accepts('1a3')[0])
def test_accepts_single_alpha(self): machine = StateMachine(states=[ State(START_STATE, Edge('ALPHA', FINAL_STATE, True)), State(FINAL_STATE) ]) self.assertTrue(machine.accepts('a')[0]) machine.reset() self.assertTrue(machine.accepts('A')[0]) machine.reset() self.assertTrue(machine.accepts('z')[0]) machine.reset() self.assertTrue(machine.accepts('Z')[0]) machine.reset() self.assertFalse(machine.accepts('0')[0])
def test_accepts_single_digit(self): machine = StateMachine(states=[ State(START_STATE, Edge('DIGIT', FINAL_STATE, True)), State(FINAL_STATE) ]) self.assertTrue(machine.accepts('1')[0]) machine.reset() self.assertTrue(machine.accepts('2')[0]) machine.reset() self.assertTrue(machine.accepts('3')[0]) machine.reset() self.assertFalse(machine.accepts('A')[0]) machine.reset() self.assertFalse(machine.accepts('a')[0])
def test_accepts_N_star_repeated_symbols(self): machine = StateMachine(states=[ State(START_STATE, Edge('a', 'a1')), State('a1', Edge('a', 'a2')), State('a2', [Edge('a', FINAL_STATE), Edge('a', 'a2')]), State(FINAL_STATE), ]) self.assertFalse(machine.accepts('a')[0]) machine.reset() self.assertFalse(machine.accepts('aa')[0]) machine.reset() self.assertTrue(machine.accepts('aaa')[0]) machine.reset() self.assertTrue(machine.accepts('aaaa')[0])
def test_accepts_repeated_char(self): machine = StateMachine(states=[ State(START_STATE, Edge('CHAR', FINAL_STATE, True)), State(FINAL_STATE, Edge('', START_STATE)) ]) self.assertTrue(machine.accepts('a')[0]) machine.reset() self.assertTrue(machine.accepts('ab')[0]) machine.reset() self.assertTrue(machine.accepts('abc')[0]) machine.reset() self.assertTrue(machine.accepts('1')[0]) machine.reset() self.assertTrue(machine.accepts('12')[0]) machine.reset() self.assertTrue(machine.accepts('123')[0]) machine.reset() self.assertTrue(machine.accepts('1a3')[0]) machine.reset() self.assertTrue(machine.accepts('a2c')[0])
def test_accepts_mixed_character_classes(self): machine = StateMachine(states=[ State(START_STATE, Edge('ALPHA', '1', True)), State('1', Edge('DIGIT', '2', True)), State('2', Edge('CHAR', FINAL_STATE, True)), State(FINAL_STATE, Edge('', START_STATE)) ]) self.assertTrue(machine.accepts('a1a')[0]) machine.reset() self.assertTrue(machine.accepts('b22')[0]) machine.reset() self.assertTrue(machine.accepts('Z0&')[0]) machine.reset() self.assertTrue(machine.accepts('p0)m3<')[0]) machine.reset() self.assertTrue(machine.accepts('a1!b2@c3#d4$e5%')[0]) machine.reset() self.assertFalse(machine.accepts('1a&')[0]) machine.reset() self.assertFalse(machine.accepts('aaa')[0]) machine.reset() self.assertFalse(machine.accepts('111')[0]) machine.reset() self.assertFalse(machine.accepts('a1')[0])
def test_accepts_single_char(self): machine = StateMachine(states=[ State(START_STATE, Edge('CHAR', FINAL_STATE, True)), State(FINAL_STATE) ]) self.assertTrue(machine.accepts('a')[0]) machine.reset() self.assertTrue(machine.accepts('A')[0]) machine.reset() self.assertTrue(machine.accepts('1')[0]) machine.reset() self.assertTrue(machine.accepts('.')[0]) machine.reset() self.assertTrue(machine.accepts('*')[0]) machine.reset() self.assertTrue(machine.accepts('[')[0]) machine.reset() self.assertFalse(machine.accepts('aa')[0])
class AorBCorDEFFiveTimesStateMachineTestCase(unittest.TestCase): def setUp(self): # Build a machine for 5("a" / "bc" / "def") gen_edges = lambda i: [ Edge('a', f'a{i}'), Edge('bc', f'bc{i}'), Edge('def', f'def{i}') ] states = [State(START_STATE, gen_edges(0))] for i in range(4): states += [ State(f'a{i}', gen_edges(i + 1)), State(f'bc{i}', gen_edges(i + 1)), State(f'def{i}', gen_edges(i + 1)), ] states += [ State(f'a4', Edge('', FINAL_STATE)), State(f'bc4', Edge('', FINAL_STATE)), State(f'def4', Edge('', FINAL_STATE)), State(f'FINAL') ] self.machine = StateMachine(states=states) def test_does_not_accept_empty_string(self): self.assertFalse(self.machine.accepts("")[0]) def test_does_not_accept_a(self): self.assertFalse(self.machine.accepts("a")[0]) def test_does_not_accept_b(self): self.assertFalse(self.machine.accepts("b")[0]) def test_does_not_accept_bc(self): self.assertFalse(self.machine.accepts("bc")[0]) def test_does_not_accept_c(self): self.assertFalse(self.machine.accepts("c")[0]) def test_does_not_accept_cd(self): self.assertFalse(self.machine.accepts("cd")[0]) def test_does_not_accept_cde(self): self.assertFalse(self.machine.accepts("cde")[0]) def test_accepts_abcdefabc(self): self.assertTrue(self.machine.accepts("abcdefabc")[0]) def test_does_not_accept_aaaa(self): self.assertFalse(self.machine.accepts("aaaa")[0]) def test_accepts_aaaaa(self): self.assertTrue(self.machine.accepts("aaaaa")[0]) def test_does_not_accept_aaaaaa(self): self.assertFalse(self.machine.accepts("aaaaaa")[0]) def test_does_not_accept_cdecdecdecde(self): self.assertFalse(self.machine.accepts("cdecdecdecde")[0]) def test_accepts_cdecdecdecdecde(self): self.assertFalse(self.machine.accepts("cdecdecdecdecde")[0]) def test_does_not_accept_cdecdecdecde(self): self.assertFalse(self.machine.accepts("cdecdecdecdecdecde")[0]) def test_accepts_defabcaa(self): self.assertTrue(self.machine.accepts("defabcaa")[0])
class AStarBRepeatedStateMachineTestCase(unittest.TestCase): def setUp(self): # Build a machine for (a+b)* state_0 = State(START_STATE, [Edge('a', "a*"), Edge('', FINAL_STATE)]) state_1 = State("a*", [Edge("a", "a*"), Edge("b", FINAL_STATE)]) state_2 = State(FINAL_STATE, [Edge('', START_STATE)]) self.machine = StateMachine(states=[state_0, state_1, state_2]) def test_accepts_empty_string(self): self.assertTrue(self.machine.accepts("")[0]) def test_does_not_accept_a(self): self.assertFalse(self.machine.accepts("a")[0]) def test_does_not_accept_b(self): self.assertFalse(self.machine.accepts("b")[0]) def test_does_not_accept_c(self): self.assertFalse(self.machine.accepts("c")[0]) def test_accepts_ab(self): self.assertTrue(self.machine.accepts("ab")[0]) def test_does_not_accept_ba(self): self.assertFalse(self.machine.accepts("ba")[0]) def test_does_not_accept_abc(self): self.assertFalse(self.machine.accepts("abc")[0]) def test_does_not_accept_aaa(self): self.assertFalse(self.machine.accepts("aaa")[0]) def test_does_not_accept_bbb(self): self.assertFalse(self.machine.accepts("bbb")[0]) def test_accepts_aaabaaab(self): self.assertTrue(self.machine.accepts("aaaaaaab")[0]) def test_accepts_aaabaaab(self): self.assertTrue(self.machine.accepts("aaabaaab")[0]) def test_does_not_accept_aaabbaaab(self): self.assertFalse(self.machine.accepts("aaabbaaab")[0])
def test_accepts_single_symbol(self): machine = StateMachine(states=[ State(START_STATE, Edge('abc', FINAL_STATE)), State(FINAL_STATE) ]) self.assertTrue(machine.accepts('abc')[0])