test_parser.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. from sccd.parser.statechart_parser import *
  2. from sccd.model.globals import *
  3. from sccd.controller.controller import InputEvent
  4. from sccd.execution.event import Event
  5. from sccd.model.model import *
  6. @dataclass
  7. class TestVariant:
  8. name: str
  9. model: Any
  10. input: list
  11. output: list
  12. def create_test_parser(src_file, load_external = True):
  13. globals = Globals(fixed_delta=None)
  14. parse_statechart = create_statechart_parser(globals, src_file, load_external)
  15. input = []
  16. output = []
  17. def parse_test(el):
  18. def parse_input(el):
  19. def parse_input_event(el):
  20. name = el.get("name")
  21. port = el.get("port")
  22. time = el.get("time")
  23. if name is None:
  24. raise XmlError("missing attribute 'name'")
  25. if port is None:
  26. raise XmlError("missing attribute 'port'")
  27. if time is None:
  28. raise XmlError("missing attribute 'time'")
  29. duration = parse_duration(globals, time)
  30. input.append(InputEvent(name=name, port=port, parameters=[], time_offset=duration))
  31. return [("event+", parse_input_event)]
  32. def parse_output(el):
  33. def parse_big_step(el):
  34. big_step = []
  35. output.append(big_step)
  36. def parse_output_event(el):
  37. name = el.get("name")
  38. port = el.get("port")
  39. if name is None:
  40. raise XmlError("missing attribute 'name'")
  41. if port is None:
  42. raise XmlError("missing attribute 'port'")
  43. big_step.append(Event(id=0, name=name, port=port, parameters=[]))
  44. return [("event+", parse_output_event)]
  45. return [("big_step+", parse_big_step)]
  46. def when_done(statechart):
  47. globals.process_durations()
  48. variants = statechart.semantics.generate_variants()
  49. def variant_description(i, variant) -> str:
  50. if not variant:
  51. return ""
  52. text = "Semantic variant %d of %d:" % (i+1, len(variants))
  53. for f in fields(variant):
  54. text += "\n %s: %s" % (f.name, getattr(variant, f.name))
  55. return text
  56. return [TestVariant(
  57. name=variant_description(i, variant),
  58. model=SingleInstanceModel(
  59. globals,
  60. Statechart(
  61. inport_events={},
  62. event_outport={},
  63. tree=statechart.tree,
  64. scope=statechart.scope,
  65. semantics=variant)),
  66. input=input,
  67. output=output)
  68. for i, variant in enumerate(variants)]
  69. return (parse_statechart + [("input?", parse_input), ("output?", parse_output)], when_done)
  70. return [("test", parse_test)]