test_trace.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from unittest import TestCase
  2. from .._methodical import MethodicalMachine
  3. class SampleObject(object):
  4. mm = MethodicalMachine()
  5. @mm.state(initial=True)
  6. def begin(self):
  7. "initial state"
  8. @mm.state()
  9. def middle(self):
  10. "middle state"
  11. @mm.state()
  12. def end(self):
  13. "end state"
  14. @mm.input()
  15. def go1(self):
  16. "sample input"
  17. @mm.input()
  18. def go2(self):
  19. "sample input"
  20. @mm.input()
  21. def back(self):
  22. "sample input"
  23. @mm.output()
  24. def out(self):
  25. "sample output"
  26. setTrace = mm._setTrace
  27. begin.upon(go1, middle, [out])
  28. middle.upon(go2, end, [out])
  29. end.upon(back, middle, [])
  30. middle.upon(back, begin, [])
  31. class TraceTests(TestCase):
  32. def test_only_inputs(self):
  33. traces = []
  34. def tracer(old_state, input, new_state):
  35. traces.append((old_state, input, new_state))
  36. return None # "I only care about inputs, not outputs"
  37. s = SampleObject()
  38. s.setTrace(tracer)
  39. s.go1()
  40. self.assertEqual(traces, [("begin", "go1", "middle"),
  41. ])
  42. s.go2()
  43. self.assertEqual(traces, [("begin", "go1", "middle"),
  44. ("middle", "go2", "end"),
  45. ])
  46. s.setTrace(None)
  47. s.back()
  48. self.assertEqual(traces, [("begin", "go1", "middle"),
  49. ("middle", "go2", "end"),
  50. ])
  51. s.go2()
  52. self.assertEqual(traces, [("begin", "go1", "middle"),
  53. ("middle", "go2", "end"),
  54. ])
  55. def test_inputs_and_outputs(self):
  56. traces = []
  57. def tracer(old_state, input, new_state):
  58. traces.append((old_state, input, new_state, None))
  59. def trace_outputs(output):
  60. traces.append((old_state, input, new_state, output))
  61. return trace_outputs # "I care about outputs too"
  62. s = SampleObject()
  63. s.setTrace(tracer)
  64. s.go1()
  65. self.assertEqual(traces, [("begin", "go1", "middle", None),
  66. ("begin", "go1", "middle", "out"),
  67. ])
  68. s.go2()
  69. self.assertEqual(traces, [("begin", "go1", "middle", None),
  70. ("begin", "go1", "middle", "out"),
  71. ("middle", "go2", "end", None),
  72. ("middle", "go2", "end", "out"),
  73. ])
  74. s.setTrace(None)
  75. s.back()
  76. self.assertEqual(traces, [("begin", "go1", "middle", None),
  77. ("begin", "go1", "middle", "out"),
  78. ("middle", "go2", "end", None),
  79. ("middle", "go2", "end", "out"),
  80. ])
  81. s.go2()
  82. self.assertEqual(traces, [("begin", "go1", "middle", None),
  83. ("begin", "go1", "middle", "out"),
  84. ("middle", "go2", "end", None),
  85. ("middle", "go2", "end", "out"),
  86. ])