def test_transition_doesnt_exist(self): error = None sm = StateMachine("test_state_machine", ["exit", "__preempted__"]) state1 = TestState("test1", ["s2"]) sm.add_state(self.state1, {}, initial=True) try: sm._run() except TransitionError as e: error = e print(error) assert error is not None
class TestLoopStateMachine(unittest.TestCase): def setUp(self): self.sm = StateMachine("test_state_machine", ["exit", "__preempted__"]) self.state1 = TestStateLoop("test1", ["s2", "s3"]) self.state2 = TestStateLoop("test2", ["s1", "s1"]) self.state3 = TestStateLoop("test3", ["s1", "exit"]) self.sm.add_state(self.state1, {"s2": "test2", "s3": "test3"}, initial=True) self.sm.add_state(self.state2, {"s1": "test1"}) self.sm.add_state(self.state3, {"s1": "test1"}) def test_basic(self): start_time = time.time() self.sm._run() execution_time = time.time() - start_time print("execution_time ", execution_time) print(self.state1, "\n") print(self.state2, "\n") print(self.state3, "\n")
class TestMonitoredStateMachine(unittest.TestCase): def setUp(self): self.mock = Mock() self.iterations_num = 3 self.sm = StateMachine("test_state_machine", ["exit"]) self.state1 = TestMonitoredState( "test1", outcomes=["s2"], event_cb=self.mock, execute_iterations=self.iterations_num ) self.state2 = TestMonitoredState( "test2", outcomes=["s3"], event_cb=self.mock, execute_iterations=self.iterations_num ) self.state3 = TestMonitoredState( "test3", outcomes=["exit"], event_cb=self.mock, execute_iterations=self.iterations_num ) self.sm.add_state(self.state1, {"s2": "test2"}, initial=True) self.sm.add_state(self.state2, {"s3": "test3"}) self.sm.add_state(self.state3, {}) self.mock.reset_mock() def test_basic(self): print("_____run______") self.sm._run() time.sleep(0.04) assert self.mock.call_count == (self.iterations_num + 2) * 3 self.mock.assert_any_call("on_begin") self.mock.assert_any_call("on_execute") self.mock.assert_any_call("on_end") def test_pause(self): print("_____pause______") execution = Thread(target=self.sm._run) execution.start() time.sleep(0.02) PauseThread(self.sm, 0.03).start() execution.join() time.sleep(0.02) assert self.mock.call_count == (self.iterations_num + 2) * 3 + 2 # check cb called with pause_in and pause_out once and only once self.mock.assert_any_call("on_pause_in") self.mock.assert_any_call("on_pause_out") self.mock.assert_any_call("on_begin") self.mock.assert_any_call("on_execute") self.mock.assert_any_call("on_end") def test_preempt(self): print("_____preempt______") execution = Thread(target=self.sm._run) execution.start() PreemptThread(self.sm).start() execution.join() time.sleep(0.04) self.mock.assert_any_call("on_begin") self.mock.assert_called_with("on_preempt") def test_abort(self): print("_____abort______") sm = StateMachine("test_state_machine", ["exit", "__preempted__"]) state = AbortingState("test1", self.mock, ["exit"]) sm.add_state(state, {}, initial=True) execution = Thread(target=sm._run) execution.start() execution.join() self.mock.assert_any_call("on_begin") self.mock.assert_any_call("on_execute") self.mock.assert_called_with("on_abort") assert self.mock.call_count == 3
class TestBasicStateMachine(unittest.TestCase): def setUp(self): self.iterations_num = 3 self.sm = StateMachine("test_state_machine", ["exit", "__preempted__"]) self.state1 = TestState("test1", ["s2", "s3"], execute_iterations=self.iterations_num) self.state2 = TestState("test2", ["s3", "s1"], execute_iterations=self.iterations_num) self.state3 = TestState("test3", ["exit", "s1"], execute_iterations=self.iterations_num) self.sm.add_state(self.state1, {"s2": "test2", "s3": "test3"}, initial=True) self.sm.add_state(self.state2, {"s1": "test1", "s3": "test3"}) self.sm.add_state(self.state3, {"s2": "test2", "s1": "test1"}) def test_basic(self): start_time = time.time() self.sm._run() execution_time = time.time() - start_time print("execution_time ", execution_time) self.state1.mock.begin.assert_called() assert self.state1.mock.begin.call_count == 1 self.state1.mock.execute.assert_called() assert self.state1.mock.execute.call_count == self.iterations_num self.state1.mock.end.assert_called() assert self.state1.mock.end.call_count == 1 self.state2.mock.begin.assert_called() assert self.state2.mock.begin.call_count == 1 self.state2.mock.execute.assert_called() assert self.state2.mock.execute.call_count == self.iterations_num self.state2.mock.end.assert_called() assert self.state2.mock.end.call_count == 1 self.state3.mock.begin.assert_called() assert self.state3.mock.begin.call_count == 1 self.state3.mock.execute.assert_called() assert self.state3.mock.execute.call_count == self.iterations_num self.state3.mock.end.assert_called() assert self.state3.mock.end.call_count == 1 def test_pause(self): execution = Thread(target=self.sm._run) execution.start() time.sleep(0.02) PauseThread(self.sm, 0.03).start() execution.join() self.state1.mock.begin.assert_called() assert self.state1.mock.begin.call_count == 1 self.state1.mock.pause_in.assert_called() assert self.state1.mock.pause_in.call_count == 1 self.state1.mock.pause_out.assert_called() assert self.state1.mock.pause_out.call_count == 1 self.state1.mock.execute.assert_called() assert self.state1.mock.execute.call_count == self.iterations_num self.state1.mock.end.assert_called() assert self.state1.mock.end.call_count == 1 self.state2.mock.begin.assert_called() assert self.state2.mock.begin.call_count == 1 self.state2.mock.execute.assert_called() assert self.state2.mock.execute.call_count == self.iterations_num self.state2.mock.end.assert_called() assert self.state2.mock.end.call_count == 1 self.state3.mock.begin.assert_called() assert self.state3.mock.begin.call_count == 1 self.state3.mock.execute.assert_called() assert self.state3.mock.execute.call_count == self.iterations_num self.state3.mock.end.assert_called() assert self.state3.mock.end.call_count == 1 def test_pause_twice(self): execution = Thread(target=self.sm._run) execution.start() time.sleep(0.03) PauseThread(self.sm, 0.03).start() time.sleep(0.03) PauseThread(self.sm, 0.03).start() execution.join() self.state1.mock.begin.assert_called() assert self.state1.mock.begin.call_count == 1 self.state1.mock.pause_in.assert_called() assert self.state1.mock.pause_in.call_count == 2 self.state1.mock.pause_out.assert_called() assert self.state1.mock.pause_out.call_count == 2 self.state1.mock.execute.assert_called() assert self.state1.mock.execute.call_count == self.iterations_num self.state1.mock.end.assert_called() assert self.state1.mock.end.call_count == 1 self.state2.mock.begin.assert_called() assert self.state2.mock.begin.call_count == 1 self.state2.mock.execute.assert_called() assert self.state2.mock.execute.call_count == self.iterations_num self.state2.mock.end.assert_called() assert self.state2.mock.end.call_count == 1 self.state3.mock.begin.assert_called() assert self.state3.mock.begin.call_count == 1 self.state3.mock.execute.assert_called() assert self.state3.mock.execute.call_count == self.iterations_num self.state3.mock.end.assert_called() assert self.state3.mock.end.call_count == 1 def test_preempt(self): execution = Thread(target=self.sm._run, args=()) execution.start() time.sleep(0.03) PreemptThread(self.sm).start() execution.join() self.state1.mock.begin.assert_called() assert self.state1.mock.begin.call_count == 1 self.state1.mock.execute.assert_called() assert self.state1.mock.execute.call_count <= self.iterations_num self.state1.mock.end.assert_not_called() self.state2.mock.begin.assert_not_called() self.state2.mock.execute.assert_not_called() self.state2.mock.end.assert_not_called() self.state3.mock.begin.assert_not_called() self.state3.mock.execute.assert_not_called() self.state3.mock.end.assert_not_called() def test_restart_after_preempt(self): execution = Thread(target=self.sm._run, args=()) execution.start() time.sleep(0.04) PreemptThread(self.sm).start() execution.join() time.sleep(0.01) execution2 = Thread(target=self.sm._run, args=()) execution2.start() execution2.join() self.state1.mock.begin.assert_called() assert self.state1.mock.begin.call_count == 2 self.state1.mock.execute.assert_called() assert self.state1.mock.execute.call_count >= self.iterations_num self.state1.mock.end.assert_called() assert self.state1.mock.end.call_count == 1 self.state2.mock.begin.assert_called() assert self.state2.mock.begin.call_count == 1 self.state2.mock.execute.assert_called() assert self.state2.mock.execute.call_count == self.iterations_num self.state2.mock.end.assert_called() assert self.state2.mock.end.call_count == 1 self.state3.mock.begin.assert_called() assert self.state3.mock.begin.call_count == 1 self.state3.mock.execute.assert_called() assert self.state3.mock.execute.call_count == self.iterations_num self.state3.mock.end.assert_called() assert self.state3.mock.end.call_count == 1 def test_preempt_while_paused(self): print("test_preempt_while_paused") execution = Thread(target=self.sm._run) execution.start() time.sleep(0.02) PauseThread(self.sm, 0.03).start() PreemptThread(self.sm).start() time.sleep(0.03) Thread(target=self.sm._pause_out, args=()).start() execution.join() assert self.state1.mock.pause_in.call_count == 1 self.state1.mock.end.assert_not_called() self.state2.mock.begin.assert_not_called() self.state2.mock.execute.assert_not_called() self.state2.mock.end.assert_not_called() self.state3.mock.begin.assert_not_called() self.state3.mock.execute.assert_not_called() self.state3.mock.end.assert_not_called()