trafficlight_test.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. # Author: Joeri Exelmans
  2. from srcgen import statechart
  3. from lib.test import run_scenarios
  4. # For each test scenario, sends a sequence of timed input events to the statechart, and checks if the expected sequence of timed output events occurs.
  5. # Each timed event is a tuple (timestamp, event_name, parameter_value)
  6. # For events that don't have a parameter, the parameter value is always 'None'.
  7. # Timestamps are in nanoseconds!
  8. SCENARIOS = [
  9. {
  10. "name": "normal, 2 cycles",
  11. "input_trace": [
  12. # no input events - we just run 2 cycles in normal mode
  13. ],
  14. "output_trace": [
  15. (0, "set_red", True),
  16. (2000000000, "set_red", False),
  17. (2000000000, "set_green", True),
  18. (4000000000, "set_green", False),
  19. (4000000000, "set_yellow", True),
  20. (5000000000, "set_yellow", False),
  21. (5000000000, "set_red", True),
  22. (7000000000, "set_red", False),
  23. (7000000000, "set_green", True),
  24. (9000000000, "set_green", False),
  25. (9000000000, "set_yellow", True),
  26. (10000000000, "set_yellow", False),
  27. (10000000000, "set_red", True),
  28. ],
  29. },
  30. {
  31. "name": "reactive",
  32. "input_trace": [
  33. # a short press on the button - switches mode to 'reactive'
  34. (1833042679, "button_pressed", None),
  35. (1896566197, "button_released", None),
  36. # cars are driving by while light is green:
  37. (3240632732, "car_detected", None),
  38. (4144836187, "car_detected", None),
  39. (5032585363, "car_detected", None),
  40. (5976821597, "car_detected", None),
  41. (6888497796, "car_detected", None),
  42. ],
  43. "output_trace": [
  44. (0, "set_red", True),
  45. # LED flips on immediately after releasing the button:
  46. (1896566197, "set_led", True),
  47. (2000000000, "set_red", False),
  48. (2000000000, "set_green", True),
  49. # light stays green for longer than 2s:
  50. # however, after 5s, even though cars are still driving by, the light still goes to yellow:
  51. (7000000000, "set_green", False),
  52. (7000000000, "set_yellow", True),
  53. (8000000000, "set_yellow", False),
  54. (8000000000, "set_red", True),
  55. (10000000000, "set_red", False),
  56. (10000000000, "set_green", True),
  57. # light is green again, but this time, no cars are driving by.
  58. # therefore, light goes to yellow after 2s:
  59. (12000000000, "set_green", False),
  60. (12000000000, "set_yellow", True),
  61. (13000000000, "set_yellow", False),
  62. (13000000000, "set_red", True),
  63. ],
  64. },
  65. {
  66. "name": "police interrupt",
  67. "input_trace": [
  68. (0, "button_pressed", None),
  69. (2000000000, "button_released", None),
  70. ],
  71. "output_trace": [
  72. (0, "set_red", True),
  73. (2000000000, "set_red", False),
  74. (2000000000, "set_yellow", True),
  75. (2500000000, "set_yellow", False),
  76. (3000000000, "set_yellow", True),
  77. (3500000000, "set_yellow", False),
  78. ],
  79. }
  80. # You MUST add one extra scenario HERE!
  81. ]
  82. # The following events are safe to repeat: (with same value)
  83. # Do not change this:
  84. IDEMPOTENT = [
  85. "set_red",
  86. "set_yellow",
  87. "set_green",
  88. "set_led",
  89. ]
  90. # We pretend that initially, these events occur:
  91. # Do not change this:
  92. INITIAL = [
  93. ("set_red", False),
  94. ("set_yellow", False),
  95. ("set_green", False),
  96. ("set_led", False),
  97. ]
  98. if __name__ == "__main__":
  99. run_scenarios(statechart.Statechart, SCENARIOS, INITIAL, IDEMPOTENT)