xml.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from sccd.test.static.syntax import *
  2. _empty_scope = Scope("test", parent=None)
  3. def test_parser_rules(statechart_parser_rules):
  4. globals = Globals()
  5. text_parser = TextParser(globals)
  6. input = []
  7. output = []
  8. def parse_test(el):
  9. def parse_input(el):
  10. def param_parser_rules():
  11. params = []
  12. def parse_param(el):
  13. text = require_attribute(el, "expr")
  14. expr = text_parser.parse_expr(text)
  15. expr.init_expr(scope=_empty_scope)
  16. params.append(expr.eval(memory=None))
  17. return (params, parse_param)
  18. def parse_time(time: str) -> Expression:
  19. expr = text_parser.parse_expr(time)
  20. type = expr.init_expr(scope=_empty_scope)
  21. check_duration_type(type)
  22. return expr
  23. def make_input_event(name: str, params):
  24. event_id = globals.events.get_id(name)
  25. return InternalEvent(id=event_id, name=name, params=params)
  26. def parse_input_event(el):
  27. # port = require_attribute(el, "port")
  28. name = require_attribute(el, "name")
  29. time = require_attribute(el, "time")
  30. time_expr = parse_time(time)
  31. params, params_parser = param_parser_rules()
  32. input.append(TestInputBag(
  33. events=[make_input_event(name, params)],
  34. timestamp=time_expr))
  35. return {"param": params_parser}
  36. def parse_bag(el):
  37. # bag of (simultaneous) input events
  38. time = require_attribute(el, "time")
  39. time_expr = parse_time(time)
  40. events = []
  41. input.append(TestInputBag(events, time_expr))
  42. def parse_bag_event(el):
  43. # port = require_attribute(el, "port")
  44. name = require_attribute(el, "name")
  45. params, params_parser = param_parser_rules()
  46. events.append(make_input_event(name, params))
  47. return {"param": params_parser}
  48. return {"event": parse_bag_event}
  49. return {"event": parse_input_event, "bag": parse_bag}
  50. def parse_output(el):
  51. def parse_big_step(el):
  52. big_step = []
  53. output.append(big_step)
  54. def parse_output_event(el):
  55. name = require_attribute(el, "name")
  56. port = require_attribute(el, "port")
  57. params = []
  58. big_step.append(OutputEvent(name=name, port=port, params=params))
  59. def parse_param(el):
  60. val_text = require_attribute(el, "val")
  61. val_expr = text_parser.parse_expr(val_text)
  62. val_expr.init_expr(scope=_empty_scope)
  63. val = val_expr.eval(memory=None)
  64. params.append(val)
  65. return [("param*", parse_param)]
  66. return [("event+", parse_output_event)]
  67. return [("big_step+", parse_big_step)]
  68. def finish_test(statechart):
  69. globals.init_durations(delta=None)
  70. variants = statechart.generate_semantic_variants()
  71. def variant_description(i, variant) -> str:
  72. if not variant:
  73. return ""
  74. text = "Semantic variant %d of %d:" % (i+1, len(variants))
  75. text += str(variant)
  76. return text
  77. return Test(variants=[TestVariant(
  78. name=variant_description(i, variant.semantics),
  79. cd=SingleInstanceCD(globals=globals, statechart=variant),
  80. input=input,
  81. output=output)
  82. for i, variant in enumerate(variants)])
  83. sc_rules = statechart_parser_rules(globals, text_parser=text_parser)
  84. return ([("statechart", sc_rules), ("input?", parse_input), ("output?", parse_output)], finish_test)
  85. return parse_test