test_parser.py 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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(create_statechart_parser):
  13. globals = Globals(fixed_delta=None)
  14. statechart_parser = create_statechart_parser(globals)
  15. input = []
  16. output = []
  17. def parse_test(el):
  18. def parse_input(el):
  19. def parse_input_event(el):
  20. name = require_attribute(el, "name")
  21. port = require_attribute(el, "port")
  22. time = require_attribute(el, "time")
  23. duration = parse_duration(globals, time)
  24. input.append(InputEvent(name=name, port=port, params=[], time_offset=duration))
  25. return [("event+", parse_input_event)]
  26. def parse_output(el):
  27. def parse_big_step(el):
  28. big_step = []
  29. output.append(big_step)
  30. def parse_output_event(el):
  31. name = require_attribute(el, "name")
  32. port = require_attribute(el, "port")
  33. params = []
  34. big_step.append(Event(id=0, name=name, port=port, params=params))
  35. def parse_param(el):
  36. val_text = require_attribute(el, "val")
  37. val_expr = parse_expression(globals, val_text)
  38. val = val_expr.eval(EvalContext(current_state=None, events=[], memory=None))
  39. params.append(val)
  40. return [("param*", parse_param)]
  41. return [("event+", parse_output_event)]
  42. return [("big_step+", parse_big_step)]
  43. def when_done(statechart):
  44. globals.process_durations()
  45. variants = statechart.semantics.generate_variants()
  46. def variant_description(i, variant) -> str:
  47. if not variant:
  48. return ""
  49. text = "Semantic variant %d of %d:" % (i+1, len(variants))
  50. for f in fields(variant):
  51. text += "\n %s: %s" % (f.name, getattr(variant, f.name))
  52. return text
  53. return [TestVariant(
  54. name=variant_description(i, variant),
  55. model=SingleInstanceModel(
  56. globals,
  57. Statechart(
  58. inport_events={},
  59. event_outport={},
  60. tree=statechart.tree,
  61. scope=statechart.scope,
  62. semantics=variant)),
  63. input=input,
  64. output=output)
  65. for i, variant in enumerate(variants)]
  66. return (statechart_parser + [("input?", parse_input), ("output?", parse_output)], when_done)
  67. return [("test", parse_test)]