Exemplo n.º 1
0
    def test_continuation_with_internal_repetition(self):
        machine = StateMachine(states=[
            State(START_STATE, Edge('', 'a')),
            State('a', [Edge('a', 'a'), Edge('', FINAL_STATE)]),
            State(FINAL_STATE)
        ])
        start_record = gen_test_state_record(START_STATE, 0, 0)
        a_record = gen_test_state_record('a', 0, 0)
        state_records = [start_record, a_record]
        result = (True, state_records, 0)
        self.assertEqual(machine.accepts_partial('aab'), result)

        start_record = gen_test_state_record(START_STATE, 0, 0)
        a_record = gen_test_state_record('a', 0, 1)
        a_record_2 = gen_test_state_record('a', 1, 1)
        state_records = [start_record, a_record, a_record_2]
        result = (True, state_records, 1)
        self.assertEqual(machine.accepts_partial('aab'), result)

        start_record = gen_test_state_record(START_STATE, 0, 0)
        a_record = gen_test_state_record('a', 0, 1)
        a_record_2 = gen_test_state_record('a', 1, 2)
        a_record_3 = gen_test_state_record('a', 2, 2)
        state_records = [start_record, a_record, a_record_2, a_record_3]
        result = (True, state_records, 2)
        self.assertEqual(machine.accepts_partial('aab'), result)

        self.assertEqual(machine.accepts_partial('aab'), (False, None, -1))
Exemplo n.º 2
0
    def test_edge_traversal_order(self):
        machine = StateMachine(states=[
            State(START_STATE, Edge('', 'a')),
            State('a', [Edge('a', 'a'), Edge('', FINAL_STATE)]),
            State(FINAL_STATE)
        ])
        start_record = gen_test_state_record(START_STATE, 0, 0)
        a_record = gen_test_state_record('a', 0, 0)
        end_record = gen_test_state_record(FINAL_STATE, 0, 0)
        state_records = [start_record, a_record]
        result = (True, state_records, 0)
        self.assertEqual(machine.accepts_partial('aab'), result)

        start_record = gen_test_state_record(START_STATE, 0, 0)
        a_record = gen_test_state_record('a', 0, 1)
        a_record_2 = gen_test_state_record('a', 1, 1)
        state_records = [start_record, a_record, a_record_2]
        result = (True, state_records, 1)
        self.assertEqual(machine.accepts_partial('aab'), result)

        start_record = gen_test_state_record(START_STATE, 0, 0)
        a_record = gen_test_state_record('a', 0, 1)
        a_record_2 = gen_test_state_record('a', 1, 2)
        a_record_3 = gen_test_state_record('a', 2, 2)
        state_records = [start_record, a_record, a_record_2, a_record_3]
        result = (True, state_records, 2)
        self.assertEqual(machine.accepts_partial('aab'), result)

        self.assertEqual(machine.accepts_partial('aab'), (False, None, -1))
Exemplo n.º 3
0
    def test_continuation_works(self):
        machine = StateMachine(states=[
            State(START_STATE, Edge('a', FINAL_STATE)),
            State(FINAL_STATE, Edge('', START_STATE))
        ])
        start_record = gen_test_state_record(START_STATE, 0, 1)
        state_records = [start_record]
        result = (True, state_records, 1)
        self.assertEqual(machine.accepts_partial('aaa'), result)

        end_record = gen_test_state_record(FINAL_STATE, 1, 1)
        start_record = gen_test_state_record(START_STATE, 0, 1)
        start_record2 = gen_test_state_record(START_STATE, 1, 2)
        state_records = [start_record, end_record, start_record2]
        result = (True, state_records, 2)
        self.assertEqual(machine.accepts_partial('aaa'), result)

        start_record = gen_test_state_record(START_STATE, 0, 1)
        end_record = gen_test_state_record(FINAL_STATE, 1, 1)
        start_record2 = gen_test_state_record(START_STATE, 1, 2)
        end_record2 = gen_test_state_record(FINAL_STATE, 2, 2)
        start_record3 = gen_test_state_record(START_STATE, 2, 3)
        state_records = [
            start_record, end_record, start_record2, end_record2, start_record3
        ]
        result = (True, state_records, 3)
        self.assertEqual(machine.accepts_partial('aaa'), result)

        self.assertEqual(machine.accepts_partial('aaa'), (False, None, -1))
Exemplo n.º 4
0
    def test_sub_machines(self):
        machine = StateMachine(id_='a',
                               states=[
                                   State(START_STATE, Edge('', 'b')),
                                   State('b',
                                         Edge('a', FINAL_STATE),
                                         is_automata=True),
                                   State(FINAL_STATE, Edge('', START_STATE))
                               ])
        submachine_b = StateMachine(id_='b',
                                    states=[
                                        State(START_STATE,
                                              Edge('b', FINAL_STATE)),
                                        State(FINAL_STATE,
                                              Edge('', START_STATE))
                                    ])
        machine.register_automata(submachine_b)

        start_record = StateRecord('a', START_STATE, 0, 0)
        nested_start_record = StateRecord('b', START_STATE, 0, 1)
        submachine_record = StateRecord('a', 'b_internal', 0, 1,
                                        [nested_start_record])
        b_record = StateRecord('a', 'b', 1, 2)
        state_records = [start_record, submachine_record, b_record]
        result = (True, state_records, 2)
        self.assertEqual(machine.accepts_partial('ba'), result)
Exemplo n.º 5
0
    def test_double_nested_sub_machines(self):
        machine = StateMachine(id_='c',
                               states=[
                                   State(START_STATE, Edge('', 'b')),
                                   State('b',
                                         Edge('c', FINAL_STATE),
                                         is_automata=True),
                                   State(FINAL_STATE)
                               ])
        submachine_b = StateMachine(id_='b',
                                    states=[
                                        State(START_STATE, Edge('', 'a')),
                                        State('a',
                                              Edge('b', FINAL_STATE),
                                              is_automata=True),
                                        State(FINAL_STATE)
                                    ])
        submachine_a = StateMachine(id_='a',
                                    states=[
                                        State(START_STATE,
                                              Edge('a', FINAL_STATE)),
                                        State(FINAL_STATE)
                                    ])

        submachine_b.register_automata(submachine_a)
        machine.register_automata(submachine_b)

        start_record = StateRecord('c', START_STATE, 0, 0)
        b_start_record = StateRecord('b', START_STATE, 0, 0)
        a_record = StateRecord('a', START_STATE, 0, 1)
        b_machine_record = StateRecord('b', 'a_internal', 0, 1, [a_record])
        b_record = StateRecord('b', 'a', 1, 2)
        c_machine_record = StateRecord(
            'c', 'b_internal', 0, 2,
            [b_start_record, b_machine_record, b_record])
        c_record = StateRecord('c', 'b', 2, 3)
        state_records = [start_record, c_machine_record, c_record]
        result = (True, state_records, 3)
        self.assertEqual(machine.accepts_partial('abc'), result)