xml.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. return InternalEvent(name=name, params=params)
  25. def parse_input_event(el):
  26. # port = require_attribute(el, "port")
  27. name = require_attribute(el, "name")
  28. time = require_attribute(el, "time")
  29. time_expr = parse_time(time)
  30. params, params_parser = param_parser_rules()
  31. input.append(TestInputBag(
  32. events=[make_input_event(name, params)],
  33. timestamp=time_expr))
  34. return {"param": params_parser}
  35. def parse_bag(el):
  36. # bag of (simultaneous) input events
  37. time = require_attribute(el, "time")
  38. time_expr = parse_time(time)
  39. events = []
  40. input.append(TestInputBag(events, time_expr))
  41. def parse_bag_event(el):
  42. # port = require_attribute(el, "port")
  43. name = require_attribute(el, "name")
  44. params, params_parser = param_parser_rules()
  45. events.append(make_input_event(name, params))
  46. return {"param": params_parser}
  47. return {"event": parse_bag_event}
  48. return {"event": parse_input_event, "bag": parse_bag}
  49. def parse_output(el):
  50. def parse_big_step(el):
  51. big_step = []
  52. output.append(big_step)
  53. def parse_output_event(el):
  54. name = require_attribute(el, "name")
  55. # port = require_attribute(el, "port")
  56. params = []
  57. big_step.append(OutputEvent(name=name, params=params))
  58. def parse_param(el):
  59. val_text = require_attribute(el, "val")
  60. val_expr = text_parser.parse_expr(val_text)
  61. val_expr.init_expr(scope=_empty_scope)
  62. val = val_expr.eval(memory=None)
  63. params.append(val)
  64. return [("param*", parse_param)]
  65. return [("event+", parse_output_event)]
  66. return [("big_step+", parse_big_step)]
  67. def finish_test(statechart):
  68. globals.init_durations(delta=None)
  69. for bag in input:
  70. for event in bag.events:
  71. if event.name not in statechart.in_events:
  72. raise XmlError("No such input event: %s" % event)
  73. for big_step in output:
  74. for event in big_step:
  75. if event.name not in statechart.out_events:
  76. raise XmlError("No such output event: %s" % event)
  77. variants = statechart.generate_semantic_variants()
  78. def variant_description(i, variant) -> str:
  79. if not variant:
  80. return ""
  81. text = "Semantic variant %d of %d:" % (i+1, len(variants))
  82. text += str(variant)
  83. return text
  84. return Test(variants=[TestVariant(
  85. name=variant_description(i, variant.semantics),
  86. cd=SingleInstanceCD(globals=globals, statechart=variant),
  87. input=input,
  88. output=output)
  89. for i, variant in enumerate(variants)])
  90. sc_rules = statechart_parser_rules(globals, text_parser=text_parser)
  91. return ([("statechart", sc_rules), ("input?", parse_input), ("output?", parse_output)], finish_test)
  92. return parse_test