test_terminals.py 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import time
  2. from synergine2.simulation import Event
  3. from synergine2.terminals import Terminal
  4. from synergine2.terminals import TerminalPackage
  5. from synergine2.terminals import TerminalManager
  6. from tests import BaseTest
  7. class ValueTerminalPackage(TerminalPackage):
  8. def __init__(self, value, *args, **kwargs):
  9. super().__init__(*args, **kwargs)
  10. self.value = value
  11. class MultiplyTerminal(Terminal):
  12. def receive(self, package: ValueTerminalPackage):
  13. self.send(ValueTerminalPackage(value=package.value * 2))
  14. self.send(ValueTerminalPackage(value=package.value * 4))
  15. class DivideTerminal(Terminal):
  16. def receive(self, package: ValueTerminalPackage):
  17. self.send(ValueTerminalPackage(value=package.value / 2))
  18. self.send(ValueTerminalPackage(value=package.value / 4))
  19. class AnEvent(Event):
  20. pass
  21. class AnOtherEvent(Event):
  22. pass
  23. class SendBackTerminal(Terminal):
  24. def receive(self, package: ValueTerminalPackage):
  25. self.send(package)
  26. class TestTerminals(BaseTest):
  27. def test_terminal_communications(self):
  28. terminals_manager = TerminalManager(
  29. terminals=[
  30. MultiplyTerminal(),
  31. ]
  32. )
  33. terminals_manager.start()
  34. terminals_manager.send(ValueTerminalPackage(value=42))
  35. # We wait max 2s (see time.sleep) to consider
  36. # process have finished. If not, it will fail
  37. packages = []
  38. for i in range(200):
  39. packages.extend(terminals_manager.receive())
  40. if len(packages) == 2:
  41. break
  42. time.sleep(0.01)
  43. assert 2 == len(packages)
  44. values = [p.value for p in packages]
  45. assert 84 in values
  46. assert 168 in values
  47. terminals_manager.stop() # pytest must execute this if have fail
  48. def test_terminals_communications(self):
  49. terminals_manager = TerminalManager(
  50. terminals=[
  51. MultiplyTerminal(),
  52. DivideTerminal(),
  53. ]
  54. )
  55. terminals_manager.start()
  56. terminals_manager.send(ValueTerminalPackage(value=42))
  57. # We wait max 2s (see time.sleep) to consider
  58. # process have finished. If not, it will fail
  59. packages = []
  60. for i in range(200):
  61. packages.extend(terminals_manager.receive())
  62. if len(packages) == 4:
  63. break
  64. time.sleep(0.01)
  65. assert 4 == len(packages)
  66. values = [p.value for p in packages]
  67. assert 84 in values
  68. assert 168 in values
  69. assert 21 in values
  70. assert 10.5 in values
  71. terminals_manager.stop() # TODO pytest must execute this if have fail
  72. def test_event_listen_everything(self):
  73. class ListenEverythingTerminal(SendBackTerminal):
  74. pass
  75. terminals_manager = TerminalManager(
  76. terminals=[ListenEverythingTerminal()]
  77. )
  78. terminals_manager.start()
  79. terminals_manager.send(ValueTerminalPackage(value=42))
  80. an_event = AnEvent(84)
  81. terminals_manager.send(TerminalPackage(events=[an_event]))
  82. # We wait max 2s (see time.sleep) to consider
  83. # process have finished. If not, it will fail
  84. packages = []
  85. for i in range(200):
  86. packages.extend(terminals_manager.receive())
  87. if len(packages) == 2:
  88. break
  89. time.sleep(0.01)
  90. assert 2 == len(packages)
  91. assert 42 == packages[0].value
  92. assert AnEvent == type(packages[1].events[0])
  93. terminals_manager.stop() # TODO pytest must execute this if have fail
  94. def test_event_listen_specified(self):
  95. class ListenAnEventTerminal(SendBackTerminal):
  96. subscribed_events = [AnOtherEvent]
  97. terminals_manager = TerminalManager(
  98. terminals=[ListenAnEventTerminal()]
  99. )
  100. terminals_manager.start()
  101. terminals_manager.send(ValueTerminalPackage(value=42))
  102. an_event = AnEvent(84)
  103. an_other_event = AnOtherEvent(168)
  104. terminals_manager.send(TerminalPackage(events=[an_event, an_other_event]))
  105. # We wait max 2s (see time.sleep) to consider
  106. # process have finished. If not, it will fail
  107. packages = []
  108. for i in range(200):
  109. packages.extend(terminals_manager.receive())
  110. if len(packages) == 1:
  111. break
  112. time.sleep(0.01)
  113. assert 2 == len(packages)
  114. assert AnOtherEvent == type(packages[1].events[0])
  115. terminals_manager.stop() # TODO pytest must execute this if have fail