test_parser.py 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from sccd.statechart.parser.parser import *
  2. from sccd.model.globals import *
  3. from sccd.controller.controller import InputEvent
  4. from sccd.statechart.dynamic.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. time_expr = parse_expression(globals, time)
  24. time_type = time_expr.init_expr(scope=None)
  25. check_duration_type(time_type)
  26. time_val = time_expr.eval(memory=None)
  27. input.append(InputEvent(name=name, port=port, params=[], time_offset=time_val))
  28. return [("event+", parse_input_event)]
  29. def parse_output(el):
  30. def parse_big_step(el):
  31. big_step = []
  32. output.append(big_step)
  33. def parse_output_event(el):
  34. name = require_attribute(el, "name")
  35. port = require_attribute(el, "port")
  36. params = []
  37. big_step.append(Event(id=0, name=name, port=port, params=params))
  38. def parse_param(el):
  39. val_text = require_attribute(el, "val")
  40. val_expr = parse_expression(globals, val_text)
  41. val = val_expr.eval(memory=None)
  42. params.append(val)
  43. return [("param*", parse_param)]
  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. semantics=variant,
  62. scope=statechart.scope,
  63. datamodel=statechart.datamodel,
  64. inport_events=statechart.inport_events,
  65. event_outport=statechart.event_outport,
  66. tree=statechart.tree)),
  67. input=input,
  68. output=output)
  69. for i, variant in enumerate(variants)]
  70. return (statechart_parser + [("input?", parse_input), ("output?", parse_output)], when_done)
  71. return [("test", parse_test)]