run_tests.py 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import sys
  2. sys.path.append("..")
  3. import os
  4. import importlib
  5. import unittest
  6. from python_runtime.statecharts_core import *
  7. class PyTestCase(unittest.TestCase):
  8. def __init__(self, file_name):
  9. unittest.TestCase.__init__(self)
  10. self.file_name = file_name
  11. self.name = os.path.splitext(self.file_name)[0]
  12. self.module = importlib.import_module(self.name.replace(os.path.sep, "."))
  13. def __str__(self):
  14. return self.file_name
  15. def runTest(self):
  16. inputs = self.module.Test.input_events
  17. expected = self.module.Test.expected_events
  18. controller = self.module.Controller(False)
  19. if inputs:
  20. for i in inputs:
  21. controller.addInput(Event(i.name, i.port, i.parameters), i.time_offset)
  22. if not expected:
  23. controller.start()
  24. return
  25. output_ports = set()
  26. expected_result = []
  27. for s in expected:
  28. slot = []
  29. for event in s:
  30. slot.append(event)
  31. output_ports.add(event.port)
  32. if slot:
  33. expected_result.append(slot)
  34. output_listener = controller.addOutputListener(list(output_ports))
  35. def check_output():
  36. # check output
  37. for (slot_index, slot) in enumerate(expected_result, start=1) :
  38. for entry in slot:
  39. output_event = output_listener.fetch(0)
  40. self.assertNotEqual(output_event, None, "Not enough output events on selected ports while checking for event %s" % entry)
  41. matches = True
  42. if output_event.name != entry.name :
  43. matches = False
  44. if output_event.port != entry.port :
  45. matches = False
  46. compare_parameters = output_event.getParameters()
  47. if len(entry.parameters) != len(compare_parameters) :
  48. matches = False
  49. for index in xrange(len(entry.parameters)) :
  50. if entry.parameters[index] != compare_parameters[index]:
  51. matches = False
  52. self.assertTrue(matches, self.name + ", expected results slot " + str(slot_index) + " mismatch. Expected " + str(entry) + ", but got " + str(output_event) + " instead.") # no match found in the options
  53. # check if there are no extra events
  54. next_event = output_listener.fetch(0)
  55. self.assertEqual(next_event, None, "More output events than expected on selected ports: " + str(next_event))
  56. controller.start()
  57. check_output()
  58. if __name__ == '__main__':
  59. suite = unittest.TestSuite()
  60. for d in os.listdir("target_py"):
  61. subdir = os.path.join("target_py", d)
  62. if not os.path.isdir(subdir):
  63. continue
  64. for f in os.listdir(subdir):
  65. if f.endswith(".py") and not f.startswith("_"):
  66. suite.addTest(PyTestCase(os.path.join(subdir, f)))
  67. unittest.TextTestRunner(verbosity=2).run(suite)