def test_partial_unnested_transition(self): self.interpreter.queue(Event('next')).queue(Event('reset')) self.interpreter.execute_once() step = self.interpreter.execute_once() self.assertEqual(self.interpreter.configuration, self.common_states + ['i1', 'i2', 'i3', 'i4']) self.assertLess(step.exited_states.index('r2'), step.exited_states.index('r4')) self.assertLess(step.exited_states.index('p1'), step.exited_states.index('p2')) self.assertLess(step.exited_states.index('r2'), step.exited_states.index('p1')) self.assertLess(step.exited_states.index('r4'), step.exited_states.index('p2')) self.assertLess(step.entered_states.index('p1'), step.entered_states.index('p2')) self.assertLess(step.entered_states.index('p1'), step.entered_states.index('r1')) self.assertLess(step.entered_states.index('p1'), step.entered_states.index('r2')) self.assertLess(step.entered_states.index('r1'), step.entered_states.index('p2')) self.assertLess(step.entered_states.index('r2'), step.entered_states.index('p2')) self.assertLess(step.entered_states.index('p2'), step.entered_states.index('r3')) self.assertLess(step.entered_states.index('p2'), step.entered_states.index('r4')) self.assertEqual([t.source for t in step.transitions], ['r2', 'r4'])
def test_name_order(self): self.interpreter.queue(Event('next')).queue(Event('click')).queue(Event('next')).queue(Event('next')) self.interpreter.execute_once() self.interpreter.execute_once() self.interpreter.execute_once() self.assertEqual(self.interpreter.configuration, self.common_states + ['k1', 'k3', 'x', 'y']) step = self.interpreter.execute_once() self.assertLess(step.exited_states.index('k1'), step.exited_states.index('k3')) self.assertLess(step.exited_states.index('k3'), step.exited_states.index('x')) self.assertLess(step.exited_states.index('x'), step.exited_states.index('y')) self.assertEqual(self.interpreter.configuration, self.common_states + ['k1', 'x', 'y', 'z']) self.assertLess(step.entered_states.index('k1'), step.entered_states.index('z')) self.assertLess(step.entered_states.index('z'), step.entered_states.index('x')) self.assertLess(step.entered_states.index('x'), step.entered_states.index('y')) self.assertEqual([t.source for t in step.transitions], ['k1', 'k3', 'x', 'y']) step = self.interpreter.queue(Event('next')).execute_once() self.assertLess(step.exited_states.index('k1'), step.exited_states.index('x')) self.assertLess(step.exited_states.index('x'), step.exited_states.index('y')) self.assertLess(step.exited_states.index('y'), step.exited_states.index('z')) self.assertEqual(self.interpreter.configuration, self.common_states + ['k1', 'x', 'y', 'z']) self.assertLess(step.entered_states.index('k1'), step.entered_states.index('x')) self.assertLess(step.entered_states.index('x'), step.entered_states.index('y')) self.assertLess(step.entered_states.index('y'), step.entered_states.index('z')) self.assertEqual([t.source for t in step.transitions], ['k1', 'x', 'y', 'z'])
def test_memory(self): self.interpreter.queue(Event('next')).execute_once() self.assertEqual(sorted(self.interpreter.configuration), ['loop', 'root', 's2']) step = self.interpreter.queue(Event('pause')).execute_once() self.assertEqual(step.exited_states, ['s2', 'loop']) self.assertEqual(sorted(self.interpreter.configuration), ['pause', 'root'])
def test_fails_on_exit(self): self.s0.sequences.append('"x == 1" -> "x == 2" -> "x == 3"') self.intp.queue(Event('e')) self.intp.execute() self.intp.queue(Event('end')) with self.assertRaises(SequentialConditionError): self.intp.execute()
def test_conflicting_transitions_2(self): self.interpreter.queue(Event('nextA')).queue(Event('nextB')).queue(Event('conflict2')) self.interpreter.execute_once() self.interpreter.execute_once() with self.assertRaises(exceptions.ConflictingTransitionsError): self.interpreter.execute_once()
def test_resume_memory(self): self.interpreter.queue(Event('next')).queue(Event('pause')).queue(Event('continue')) steps = self.interpreter.execute() step = steps[-1] self.assertEqual(step.entered_states, ['loop', 'loop.H', 's2']) self.assertEqual(step.exited_states, ['pause', 'loop.H']) self.assertEqual(sorted(self.interpreter.configuration), ['loop', 'root', 's2'])
def test_simple_entered(self): self.interpreter.queue(Event('goto s2')) self.assertEqual(self.interpreter.execute_once().entered_states, ['s2']) self.interpreter.queue(Event('goto final')) self.assertEqual(self.interpreter.execute_once().entered_states, ['s3']) self.assertEqual(self.interpreter.execute_once().entered_states, ['final']) self.assertEqual(self.interpreter.configuration, []) self.assertTrue(self.interpreter.final)
def test_storycreation(self): story = Story() story.append(Event('a')) story.append(Event('b')) story.append(Pause(10)) story.append(Event('c')) self.assertEqual(len(story), 4)
def test_run_in_background(self): with open('tests/yaml/simple.yaml') as f: sc = io.import_from_yaml(f) interpreter = Interpreter(sc) task = run_in_background(interpreter, 0.001) interpreter.queue(Event('goto s2')) interpreter.queue(Event('goto final')) task.join() self.assertTrue(interpreter.final)
def test_condition_on_event(self): self.assertTrue( self.evaluator._evaluate_code( 'event.data[\'a\'] == 1', additional_context={'event': Event('test', a=1)})) self.assertTrue( self.evaluator._evaluate_code( 'event.name == \'test\'', additional_context={'event': Event('test')}))
def test_queue(self): self.interpreter.queue(Event('e1')) self.assertEqual(self.interpreter._select_event(), Event('e1')) self.interpreter.queue(InternalEvent('e1')) self.assertEqual(self.interpreter._select_event(), InternalEvent('e1')) with self.assertRaises(ValueError): self.interpreter.queue('e1')
def test_partial_parallel_order(self): self.interpreter.queue(Event('next')).queue(Event('click')) self.interpreter.execute_once() step = self.interpreter.execute_once() self.assertEqual(self.interpreter.configuration, self.common_states + ['j1', 'j3', 'k2', 'k4']) self.assertEqual(step.exited_states, ['j2', 'j4']) self.assertEqual(step.entered_states, ['k2', 'k4']) self.assertEqual([t.source for t in step.transitions], ['j2', 'j4'])
def test_tell(self): story = Story([Event('goto s2'), Pause(5), Event('goto final')]) with open('tests/yaml/simple.yaml') as f: sc = io.import_from_yaml(f) interpreter = Interpreter(sc) trace = story.tell(interpreter) self.assertTrue(interpreter.final) self.assertEqual(interpreter.time, 5) self.assertEqual(len(trace), 4)
def test_bind_callable(self): with open('tests/yaml/simple.yaml') as f: other_sc = io.import_from_yaml(f) other_interpreter = Interpreter(other_sc) self.interpreter.bind(other_interpreter.queue) self.assertEqual(self.interpreter._bound, [other_interpreter.queue]) self.interpreter.queue(InternalEvent('test')) self.assertTrue(self.interpreter._internal_events.pop(), Event('test')) self.assertTrue(other_interpreter._external_events.pop(), Event('test'))
def test_bind(self): with open('tests/yaml/simple.yaml') as f: other_sc = io.import_from_yaml(f) other_interpreter = Interpreter(other_sc) self.interpreter.bind(other_interpreter) self.assertIn(other_interpreter.queue, self.interpreter._bound) self.interpreter.raise_event(InternalEvent('test')) self.assertTrue(self.interpreter._internal_events.pop(), Event('test')) self.assertTrue(other_interpreter._external_events.pop(), Event('test'))
def test_deep_memory(self): self.interpreter.queue(Event('next1')).queue(Event('next2')) self.interpreter.execute() self.assertEqual(sorted(self.interpreter.configuration), ['active', 'concurrent_processes', 'process_1', 'process_2', 'root', 's12', 's22']) self.interpreter.queue(Event('error1')) self.interpreter.execute() self.assertEqual(self.interpreter.configuration, ['root', 'pause']) self.assertEqual(sorted(self.interpreter._memory['active.H*']), ['concurrent_processes', 'process_1', 'process_2', 's12', 's22']) self.interpreter.queue(Event('continue')) self.interpreter.execute() self.assertEqual(sorted(self.interpreter.configuration), ['active', 'concurrent_processes', 'process_1', 'process_2', 'root', 's12', 's22'])
def test_button(self): self.assertEqual(self.elevator.context['current'], 0) self.buttons.queue(Event('button_2_pushed')) self.buttons.execute() event = self.elevator._external_events.pop() self.assertEqual(event.name, 'floorSelected') self.assertEqual(event.data['floor'], 2) self.buttons.queue(Event('button_2_pushed')) self.buttons.execute() self.elevator.execute() self.assertEqual(self.elevator.context['current'], 2)
def test_tell_by_step(self): story = Story([Event('goto s2'), Pause(5), Event('goto final')]) with open('tests/yaml/simple.yaml') as f: sc = io.import_from_yaml(f) interpreter = Interpreter(sc) teller = story.tell_by_step(interpreter) self.assertEqual(Event('goto s2'), next(teller)[0]) self.assertEqual(Pause(5), next(teller)[0]) self.assertEqual(Event('goto final'), next(teller)[0]) with self.assertRaises(StopIteration): next(teller) self.assertTrue(interpreter.final) self.assertEqual(interpreter.time, 5)
def test_transition_postcondition(self): transitions = self.sc.transitions_from('floorSelecting') transitions[0].postconditions.append('False') self.interpreter.queue(Event('floorSelected', floor=4)) with self.assertRaises(PostconditionError) as cm: self.interpreter.execute() self.assertTrue(isinstance(cm.exception.obj, Transition))
def test_simple_configuration(self): self.interpreter.execute_once() # Should do nothing! self.assertEqual(self.interpreter.configuration, ['root', 's1']) self.interpreter.queue(Event('goto s2')) self.interpreter.execute_once() self.assertEqual(self.interpreter.configuration, ['root', 's2']) self.interpreter.execute_once() self.assertEqual(self.interpreter.configuration, ['root', 's3'])
def test_floor_selection(self): self.interpreter.queue(Event('floorSelected', floor=4)).execute_once() self.assertEqual(self.interpreter.context['destination'], 4) self.interpreter.execute_once() self.assertEqual(sorted(self.interpreter.configuration), [ 'active', 'doorsClosed', 'floorListener', 'floorSelecting', 'movingElevator' ])
def test_button_0_on_groundfloor(self): self.assertEqual(self.elevator.context['current'], 0) self.buttons.queue(Event('button_0_pushed')) self.buttons.execute() self.elevator.execute() self.assertEqual(self.elevator.context['current'], 0)
def test_concurrent_transitions(self): step = self.interpreter.queue(Event('nextA')).execute_once() self.assertEqual(self.interpreter.configuration, ['root', 's1', 'p1', 'p2', 'a1', 'a2']) self.assertLess(step.exited_states.index('initial1'), step.exited_states.index('initial2')) self.assertLess(step.entered_states.index('a1'), step.entered_states.index('a2'))
def test_doorsOpen(self): self.interpreter.queue(Event('floorSelected', floor=4)) self.interpreter.execute() self.assertEqual(self.interpreter.context['current'], 4) self.interpreter.time += 10 self.interpreter.execute() self.assertTrue('doorsOpen' in self.interpreter.configuration) self.assertEqual(self.interpreter.context['current'], 0)
def test_events(self): trace = [ MacroStep(0, [MicroStep(Event('a'))]), MacroStep(0, [MicroStep(Event('b'))]), MacroStep(0, [MicroStep(Event('c'))]), MacroStep(0, [MicroStep(Event('d'))]), ] self.assertListEqual( story_from_trace(trace), [Event('a'), Event('b'), Event('c'), Event('d')])
def test_heating_on(self): self.microwave.execute_once() self.microwave.queue(Event('door_opened')) self.microwave.queue(Event('item_placed')) self.microwave.queue(Event('door_closed')) self.microwave.queue(Event('input_timer_inc')) self.microwave.execute() self.microwave.queue(Event('input_cooking_start')) step = self.microwave.execute_once() self.assertIn(Event('heating_on'), step.sent_events) self.assertIn(Event('lamp_switch_on'), step.sent_events) self.assertIn(Event('turntable_start'), step.sent_events)
def test_after_memory(self): self.interpreter.queue(Event('next')).queue(Event('pause')).queue(Event('continue')) self.interpreter.queue(Event('next')).queue(Event('next')) self.interpreter.execute() self.assertEqual(sorted(self.interpreter.configuration), ['loop', 'root', 's1']) self.interpreter.queue(Event('pause')).queue(Event('stop')) self.interpreter.execute() self.assertTrue(self.interpreter.final)
def testInternalBeforeExternal(self): self.interpreter.queue(Event('not_next')) step = self.interpreter.execute_once() self.assertEqual(step.event.name, 'next') step = self.interpreter.execute_once() self.assertEqual(step.event, None) self.assertEqual(step.entered_states, ['s2']) step = self.interpreter.execute_once() self.assertEqual(step.event.name, 'not_next')
def send_event(context, event_name, parameter=None, value=None): parameters = {} if context.table: for row in context.table: parameters[row['parameter']] = eval(row['value'], {}, {}) if parameter and value: parameters[parameter] = eval(value) event = Event(event_name, **parameters) context._interpreter.queue(event) _execute_statechart(context)
def send_event(self, event_name): if event_name == 'item_placed': self.w_weightsensor.config(text='item detected') elif event_name == 'item_removed': self.w_weightsensor.config(text='no item') elif event_name == 'door_opened': self.w_doorsensor.config(text='open') elif event_name == 'door_closed': self.w_doorsensor.config(text='closed') self.interpreter.queue(Event(event_name)) self.execute()