test_mvc.py 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466
  1. import unittest
  2. from utils import *
  3. import sys
  4. sys.path.append("wrappers")
  5. from modelverse import *
  6. model_hierarchy = \
  7. {"formalisms/": {"SimpleClassDiagrams": {},
  8. "TypeMapping": {},
  9. "Tracability": {},
  10. "ProcessModel": {},
  11. "ActionLanguage": {},
  12. "ManualOperation": {},
  13. "Bottom": {},
  14. },
  15. "models/": {"conformance_mv": {},
  16. },
  17. "administration/": {"core": {},
  18. "CoreFormalism": {},
  19. },
  20. "users/": {"admin/": {}
  21. },
  22. "type mappings/": {"formalisms/": {"SimpleClassDiagrams": {},
  23. "TypeMapping": {},
  24. "Tracability": {},
  25. "ProcessModel": {},
  26. "ActionLanguage": {},
  27. "ManualOperation": {},
  28. "Bottom": {},
  29. },
  30. "models/": {"conformance_mv": {},
  31. },
  32. "administration/": {"core": {},
  33. "CoreFormalism": {},
  34. },
  35. "users/": {"admin/": {}
  36. },
  37. },
  38. }
  39. def get_model_list(location):
  40. try:
  41. location_parts = location.split("/")
  42. current = model_hierarchy
  43. while location_parts:
  44. l = location_parts.pop(0)
  45. if l != "":
  46. current = current[l + "/"]
  47. return set(current.keys())
  48. except:
  49. return set([])
  50. def compare_locations(location, extra_to_default):
  51. assert model_list(location) == get_model_list(location) | set(extra_to_default)
  52. def compare_unordered_lists(got, expected):
  53. assert len(got) == len(expected)
  54. for i in got:
  55. assert i in expected
  56. for i in expected:
  57. assert i in got
  58. class TestModelverseCore(unittest.TestCase):
  59. def setUp(self):
  60. self.proc, self.address = start_mvc()
  61. init(self.address)
  62. login("admin", "admin")
  63. def tearDown(self):
  64. try:
  65. kill(self.proc)
  66. except:
  67. print("Got exception during teardown.")
  68. def test_list(self):
  69. compare_locations("", set())
  70. compare_locations("formalisms", set())
  71. compare_locations("models", set())
  72. compare_locations("administration", set())
  73. compare_locations("type mappings", set())
  74. compare_locations("type mappings/formalisms", set())
  75. compare_locations("type mappings/administration", set())
  76. compare_locations("type mappings/models", set())
  77. def test_list_full(self):
  78. assert model_list_full("") == set([("formalisms/", "admin", "admin", "221"),
  79. ("models/", "admin", "admin", "221"),
  80. ("administration/", "admin", "admin", "110"),
  81. ("type mappings/", "admin", "admin", "221"),
  82. ("users/", "admin", "admin", "221"),
  83. ])
  84. def test_model_add_empty(self):
  85. model_add("formalisms/Empty", "formalisms/SimpleClassDiagrams")
  86. compare_locations("formalisms", set(["Empty"]))
  87. compare_locations("type mappings/formalisms", set(["Empty"]))
  88. assert model_list_full("formalisms") == set([(name, "admin", "admin", "221") for name in get_model_list("formalisms")]) | \
  89. set([("Empty", "admin", "nobody", "200")])
  90. assert model_list_full("type mappings/formalisms") == set([(name, "admin", "admin", "221") for name in get_model_list("type mappings/formalisms")]) | \
  91. set([("Empty", "admin", "nobody", "200")])
  92. def test_model_verify(self):
  93. assert verify("formalisms/SimpleClassDiagrams", "formalisms/SimpleClassDiagrams") == "OK"
  94. def test_model_empty_instantiate(self):
  95. model_add("formalisms/Empty", "formalisms/SimpleClassDiagrams")
  96. instantiate("formalisms/Empty", "Class", ID="A")
  97. assert element_list("formalisms/Empty") == set([("A", "Class")])
  98. compare_locations("formalisms", set(["Empty"]))
  99. compare_locations("type mappings/formalisms", set(["Empty"]))
  100. def test_model_overwrite(self):
  101. model_add("formalisms/Empty", "formalisms/SimpleClassDiagrams")
  102. assert element_list("formalisms/Empty") == set([])
  103. instantiate("formalisms/Empty", "Class", ID="A")
  104. assert element_list("formalisms/Empty") == set([("A", "Class")])
  105. model_overwrite("formalisms/Empty")
  106. assert element_list("formalisms/Empty") == set([])
  107. compare_locations("formalisms", set(["Empty"]))
  108. compare_locations("type mappings/formalisms", set(["Empty"]))
  109. assert element_list("formalisms/Empty") == set([])
  110. instantiate("formalisms/Empty", "Class", ID="B")
  111. compare_locations("formalisms", set(["Empty"]))
  112. compare_locations("type mappings/formalisms", set(["Empty"]))
  113. def test_transform_add_MT(self):
  114. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/petrinets.mvc", "r").read())
  115. compare_locations("formalisms", set(["PetriNet"]))
  116. compare_locations("type mappings/formalisms", set(["PetriNet"]))
  117. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {}, "models/print_pn", open("integration/code/pn_print.mvc").read())
  118. compare_locations("formalisms", set(["PetriNet"]))
  119. compare_locations("models", set(["print_pn"]))
  120. compare_locations("RAMified/models", set(["print_pn"]))
  121. compare_locations("merged/models", set(["print_pn"]))
  122. compare_locations("type mappings/formalisms", set(["PetriNet"]))
  123. compare_locations("type mappings/models", set(["print_pn"]))
  124. compare_locations("type mappings/RAMified/models", set(["print_pn"]))
  125. compare_locations("type mappings/merged/models", set(["print_pn"]))
  126. def test_transform_add_MT_pn_print_exec(self):
  127. log = []
  128. def callback(value):
  129. log.append(value)
  130. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_runtime.mvc", "r").read())
  131. model_add("models/my_pn", "formalisms/PetriNet", open("integration/code/pn_runtime_model.mvc", "r").read())
  132. compare_locations("models", set(["my_pn"]))
  133. compare_locations("type mappings/models", set(["my_pn"]))
  134. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {}, "models/print_pn", open("integration/code/pn_print.mvc").read())
  135. compare_locations("models", set(["my_pn", "print_pn"]))
  136. compare_locations("type mappings/models", set(["my_pn", "print_pn"]))
  137. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  138. assert set(log) == set(['"p1" --> 1',
  139. '"p2" --> 2',
  140. '"p3" --> 3'])
  141. def test_transform_add_MT_pn_simulate(self):
  142. """
  143. This method tests the execution of a somewhat realistic use of the Modelverse and its core functions, through the use of a simple Petri nets example.
  144. First, Petri net metamodels are created for both the design language and the runtime language.
  145. Both languages only differ marginally from each other, with the runtime language only adding information on the currently selected transition for execution.
  146. Afterwards, a trivial Petri net model is created in the design language.
  147. This part tests the domain-specific and meta-modelling concepts of the Modelverse.
  148. After all models are created, transformations are defined to map between both languages: from design to runtime, and vice versa.
  149. Additional transformations are created for in-place model simulation and the printing of a Petri net model.
  150. This tests the modification of models, through the use of model transformations.
  151. Due to the use of a separate design and runtime language, we test exogenous transformations.
  152. The simulation transformation takes a single step in the Petri net model, by firing one of the applicable transitions, and therefore tests endogenous transformations.
  153. """
  154. log = []
  155. def callback(value):
  156. log.append(value)
  157. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  158. model_add("formalisms/PetriNet_Runtime", "formalisms/SimpleClassDiagrams", open("integration/code/pn_runtime.mvc", "r").read())
  159. model_add("models/my_pn", "formalisms/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
  160. def add_tracability_D2R():
  161. instantiate(None, "Association", ("PetriNet/Place", "PetriNet_Runtime/Place"), ID="D2R_PlaceLink")
  162. instantiate(None, "Association", ("PetriNet/Transition", "PetriNet_Runtime/Transition"), ID="D2R_TransitionLink")
  163. def add_tracability_R2D():
  164. instantiate(None, "Association", ("PetriNet_Runtime/Place", "PetriNet/Place"), ID="R2D_PlaceLink")
  165. instantiate(None, "Association", ("PetriNet_Runtime/Transition", "PetriNet/Transition"), ID="R2D_TransitionLink")
  166. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {}, "models/print_pn", open("integration/code/pn_print.mvc").read())
  167. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, "models/pn_design_to_runtime", open("integration/code/pn_design_to_runtime.mvc").read(), add_tracability_D2R)
  168. transformation_add_MT({"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, {"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, "models/pn_simulate", open("integration/code/pn_simulate.mvc").read())
  169. transformation_add_MT({"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, {"PetriNet": "formalisms/PetriNet"}, "models/pn_runtime_to_design", open("integration/code/pn_runtime_to_design.mvc").read(), add_tracability_R2D)
  170. log = []
  171. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  172. assert set(log) == set(['"p1" --> 1',
  173. '"p2" --> 2',
  174. '"p3" --> 3'])
  175. assert transformation_execute_MT("models/pn_design_to_runtime", {"PetriNet": "models/my_pn"}, {"PetriNet_Runtime": "models/my_pn_RT"}) == True
  176. assert transformation_execute_MT("models/pn_simulate", {"PetriNet_Runtime": "models/my_pn_RT"}, {"PetriNet_Runtime": "models/my_pn_RT"}) == True
  177. assert transformation_execute_MT("models/pn_runtime_to_design", {"PetriNet_Runtime": "models/my_pn_RT"}, {"PetriNet": "models/my_pn"}) == True
  178. log = []
  179. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  180. assert set(log) == set(['"p1" --> 0',
  181. '"p2" --> 1',
  182. '"p3" --> 5'])
  183. def test_transform_add_AL_pn_simulate(self):
  184. log = []
  185. def callback(value):
  186. log.append(value)
  187. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  188. model_add("formalisms/PetriNet_Runtime", "formalisms/SimpleClassDiagrams", open("integration/code/pn_runtime.mvc", "r").read())
  189. model_add("models/my_pn", "formalisms/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
  190. def add_tracability_D2R():
  191. instantiate(None, "Association", ("PetriNet/Place", "PetriNet_Runtime/Place"), ID="D2R_PlaceLink")
  192. instantiate(None, "Association", ("PetriNet/Transition", "PetriNet_Runtime/Transition"), ID="D2R_TransitionLink")
  193. def add_tracability_R2D():
  194. instantiate(None, "Association", ("PetriNet_Runtime/Place", "PetriNet/Place"), ID="R2D_PlaceLink")
  195. instantiate(None, "Association", ("PetriNet_Runtime/Transition", "PetriNet/Transition"), ID="R2D_TransitionLink")
  196. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {}, "models/print_pn", open("integration/code/pn_print.mvc").read())
  197. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, "models/pn_design_to_runtime", open("integration/code/pn_design_to_runtime.mvc").read(), add_tracability_D2R)
  198. transformation_add_AL({"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, {"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, "models/pn_simulate", open("integration/code/pn_simulate.alc").read())
  199. transformation_add_MT({"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, {"PetriNet": "formalisms/PetriNet"}, "models/pn_runtime_to_design", open("integration/code/pn_runtime_to_design.mvc").read(), add_tracability_R2D)
  200. log = []
  201. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  202. assert set(log) == set(['"p1" --> 1',
  203. '"p2" --> 2',
  204. '"p3" --> 3'])
  205. assert transformation_execute_MT("models/pn_design_to_runtime", {"PetriNet": "models/my_pn"}, {"PetriNet_Runtime": "models/my_pn_RT"}) == True
  206. assert transformation_execute_AL("models/pn_simulate", {"PetriNet_Runtime": "models/my_pn_RT"}, {"PetriNet_Runtime": "models/my_pn_RT"}) == True
  207. assert transformation_execute_MT("models/pn_runtime_to_design", {"PetriNet_Runtime": "models/my_pn_RT"}, {"PetriNet": "models/my_pn"}) == True
  208. log = []
  209. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  210. assert set(log) == set(['"p1" --> 0',
  211. '"p2" --> 1',
  212. '"p3" --> 5'])
  213. def test_transform_add_MANUAL_pn_simulate(self):
  214. log = []
  215. def callback(value):
  216. log.append(value)
  217. def manual_callback():
  218. p1 = instantiate(None, "PetriNet_Runtime/Place")
  219. attr_assign(None, p1, "tokens", 1)
  220. attr_assign(None, p1, "name", "p1")
  221. p2 = instantiate(None, "PetriNet_Runtime/Place")
  222. attr_assign(None, p2, "tokens", 2)
  223. attr_assign(None, p2, "name", "p2")
  224. p3 = instantiate(None, "PetriNet_Runtime/Place")
  225. attr_assign(None, p3, "tokens", 3)
  226. attr_assign(None, p3, "name", "p3")
  227. t1 = instantiate(None, "PetriNet_Runtime/Transition")
  228. attr_assign(None, t1, "name", "t1")
  229. attr_assign(None, t1, "executing", False)
  230. p2t1 = instantiate(None, "PetriNet_Runtime/P2T", (p1, t1))
  231. attr_assign(None, p2t1, "weight", 1)
  232. p2t2 = instantiate(None, "PetriNet_Runtime/P2T", (p2, t1))
  233. attr_assign(None, p2t2, "weight", 1)
  234. t2p1 = instantiate(None, "PetriNet_Runtime/T2P", (t1, p3))
  235. attr_assign(None, t2p1, "weight", 2)
  236. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  237. model_add("formalisms/PetriNet_Runtime", "formalisms/SimpleClassDiagrams", open("integration/code/pn_runtime.mvc", "r").read())
  238. model_add("models/my_pn", "formalisms/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
  239. def add_tracability_D2R():
  240. instantiate(None, "Association", ("PetriNet/Place", "PetriNet_Runtime/Place"), ID="D2R_PlaceLink")
  241. instantiate(None, "Association", ("PetriNet/Transition", "PetriNet_Runtime/Transition"), ID="D2R_TransitionLink")
  242. def add_tracability_R2D():
  243. instantiate(None, "Association", ("PetriNet_Runtime/Place", "PetriNet/Place"), ID="R2D_PlaceLink")
  244. instantiate(None, "Association", ("PetriNet_Runtime/Transition", "PetriNet/Transition"), ID="R2D_TransitionLink")
  245. transformation_add_MT({"PetriNet": "formalisms/PetriNet"}, {}, "models/print_pn", open("integration/code/pn_print.mvc").read())
  246. transformation_add_MANUAL({"PetriNet": "formalisms/PetriNet"}, {"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, "models/pn_design_to_runtime", add_tracability_D2R)
  247. transformation_add_AL({"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, {"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, "models/pn_simulate", open("integration/code/pn_simulate.alc").read())
  248. transformation_add_MT({"PetriNet_Runtime": "formalisms/PetriNet_Runtime"}, {"PetriNet": "formalisms/PetriNet"}, "models/pn_runtime_to_design", open("integration/code/pn_runtime_to_design.mvc").read(), add_tracability_R2D)
  249. log = []
  250. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  251. assert set(log) == set(['"p1" --> 1',
  252. '"p2" --> 2',
  253. '"p3" --> 3'])
  254. assert transformation_execute_MANUAL("models/pn_design_to_runtime", {"PetriNet": "models/my_pn"}, {"PetriNet_Runtime": "models/my_pn_RT"}, manual_callback) == True
  255. assert transformation_execute_AL("models/pn_simulate", {"PetriNet_Runtime": "models/my_pn_RT"}, {"PetriNet_Runtime": "models/my_pn_RT"}) == True
  256. assert transformation_execute_MT("models/pn_runtime_to_design", {"PetriNet_Runtime": "models/my_pn_RT"}, {"PetriNet": "models/my_pn"}) == True
  257. log = []
  258. assert transformation_execute_MT("models/print_pn", {"PetriNet": "models/my_pn"}, {}, callback) == True
  259. assert set(log) == set(['"p1" --> 0',
  260. '"p2" --> 1',
  261. '"p3" --> 5'])
  262. def test_process_model_trivial_pn_bigmain(self):
  263. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  264. model_add("formalisms/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("integration/code/reachability_graph.mvc", "r").read())
  265. model_add("models/pn_reachability", "formalisms/ProcessModel", open("integration/code/pm_pn_reachability.mvc", "r").read())
  266. transformation_add_MT({}, {"PetriNet": "formalisms/PetriNet"}, "models/initialize_PN", open("integration/code/initialize_PN.mvc", "r").read())
  267. transformation_add_MANUAL({"PetriNet": "formalisms/PetriNet"}, {"PetriNet": "formalisms/PetriNet"}, "models/refine_PN")
  268. transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/reachability", open("integration/code/reachability.alc", "r").read())
  269. transformation_add_MT({"ReachabilityGraph": "formalisms/ReachabilityGraph"}, {}, "models/reachability_print", open("integration/code/reachabilitygraph_print.mvc", 'r').read())
  270. def callback_refine_PN():
  271. p1 = instantiate(None, "PetriNet/Place")
  272. attr_assign(None, p1, "name", "p1")
  273. attr_assign(None, p1, "tokens", 1)
  274. t1 = instantiate(None, "PetriNet/Transition")
  275. attr_assign(None, t1, "name", "t1")
  276. p2t = instantiate(None, "PetriNet/P2T", (p1, t1))
  277. attr_assign(None, p2t, "weight", 1)
  278. log = set([])
  279. def callback_print(value):
  280. log.add(value)
  281. process_execute("models/pn_reachability", "my_", {"models/refine_PN": callback_refine_PN, "models/reachability_print": callback_print})
  282. assert log == set(['"0": {"p1": 1, }',
  283. '"1": {"p1": 0, }',
  284. '"0" --["t1"]--> "1"'])
  285. def test_process_model_trivial_pn_subfunction(self):
  286. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  287. model_add("formalisms/ReachabilityGraph", "formalisms/SimpleClassDiagrams", open("integration/code/reachability_graph.mvc", "r").read())
  288. model_add("models/pn_reachability", "formalisms/ProcessModel", open("integration/code/pm_pn_reachability.mvc", "r").read())
  289. transformation_add_MT({}, {"PetriNet": "formalisms/PetriNet"}, "models/initialize_PN", open("integration/code/initialize_PN.mvc", "r").read())
  290. transformation_add_MANUAL({"PetriNet": "formalisms/PetriNet"}, {"PetriNet": "formalisms/PetriNet"}, "models/refine_PN")
  291. transformation_add_AL({"PetriNet": "formalisms/PetriNet"}, {"ReachabilityGraph": "formalisms/ReachabilityGraph"}, "models/reachability", open("integration/code/reachability_subfunction.alc", "r").read())
  292. transformation_add_MT({"ReachabilityGraph": "formalisms/ReachabilityGraph"}, {}, "models/reachability_print", open("integration/code/reachabilitygraph_print.mvc", 'r').read())
  293. def callback_refine_PN():
  294. p1 = instantiate(None, "PetriNet/Place")
  295. attr_assign(None, p1, "name", "p1")
  296. attr_assign(None, p1, "tokens", 1)
  297. t1 = instantiate(None, "PetriNet/Transition")
  298. attr_assign(None, t1, "name", "t1")
  299. p2t = instantiate(None, "PetriNet/P2T", (p1, t1))
  300. attr_assign(None, p2t, "weight", 1)
  301. log = set([])
  302. def callback_print(value):
  303. log.add(value)
  304. process_execute("models/pn_reachability", "my_", {"models/refine_PN": callback_refine_PN, "models/reachability_print": callback_print})
  305. assert log == set(['"0": {"p1": 1, }',
  306. '"1": {"p1": 0, }',
  307. '"0" --["t1"]--> "1"'])
  308. def test_render(self):
  309. model_add("formalisms/CausalBlockDiagrams", "formalisms/SimpleClassDiagrams", open("integration/code/cbd_design.mvc", 'r').read())
  310. model_add("formalisms/MM_rendered_graphical", "formalisms/SimpleClassDiagrams", open("models/MM_rendered_graphical.mvc", 'r').read())
  311. model_add("models/my_CBD", "formalisms/CausalBlockDiagrams", open("integration/code/my_cbd.mvc", 'r').read())
  312. def add_tracability():
  313. instantiate(None, "Association", ("abstract/Block", "rendered/Group"), ID="TracabilityLink")
  314. transformation_add_MT({"abstract": "formalisms/CausalBlockDiagrams", "rendered": "formalisms/MM_rendered_graphical"}, {"abstract": "formalisms/CausalBlockDiagrams", "rendered": "formalisms/MM_rendered_graphical"}, "models/render_graphical_CBD", open("models/CBD_mapper.mvc", 'r').read(), add_tracability)
  315. result = model_render("models/my_CBD", "models/render_graphical_CBD")
  316. assert len(result) == 23
  317. def test_switch_MM(self):
  318. model_add("formalisms/PetriNet", "formalisms/SimpleClassDiagrams", open("integration/code/pn_design.mvc", "r").read())
  319. model_add("models/my_pn", "formalisms/PetriNet", open("integration/code/pn_design_model.mvc", "r").read())
  320. alter_context("formalisms/PetriNet", "formalisms/SimpleClassDiagrams")
  321. alter_context("models/my_pn", "formalisms/PetriNet")
  322. got = element_list_nice("formalisms/PetriNet")
  323. expected = \
  324. [{'id': 'Natural', 'type': 'SimpleAttribute', 'constraint': None},
  325. {'id': 'String', 'type': 'SimpleAttribute', 'constraint': None},
  326. {'id': 'Place', 'type': 'Class', 'lower_cardinality': None, 'upper_cardinality': None, 'constraint': None},
  327. {'id': 'Place_tokens', 'type': 'AttributeLink', '__source': 'Place', '__target': 'Natural', 'name': 'tokens', 'optional': False, 'constraint': None},
  328. {'id': 'Place_name', 'type': 'AttributeLink', '__source': 'Place', '__target': 'String', 'name': 'name', 'optional': False, 'constraint': None},
  329. {'id': 'Transition', 'type': 'Class', 'lower_cardinality': None, 'upper_cardinality': None, 'constraint': None},
  330. {'id': 'Transition_name', 'type': 'AttributeLink', '__source': 'Transition', '__target': 'String', 'name': 'name', 'optional': False, 'constraint': None},
  331. {'id': 'P2T', 'type': 'Association', '__source': 'Place', '__target': 'Transition', 'source_lower_cardinality': None, 'target_lower_cardinality': None, 'source_upper_cardinality': None, 'target_upper_cardinality': None, 'constraint': None},
  332. {'id': 'P2T_weight', 'type': 'AttributeLink', '__source': 'P2T', '__target': 'Natural', 'name': 'weight', 'optional': False, 'constraint': None},
  333. {'id': 'T2P', 'type': 'Association', '__source': 'Transition', '__target': 'Place', 'source_lower_cardinality': None, 'target_lower_cardinality': None, 'source_upper_cardinality': None, 'target_upper_cardinality': None, 'constraint': None},
  334. {'id': 'T2P_weight', 'type': 'AttributeLink', '__source': 'T2P', '__target': 'Natural', 'name': 'weight', 'optional': False, 'constraint': None}
  335. ]
  336. compare_unordered_lists(got, expected)
  337. got = element_list_nice("models/my_pn")
  338. expected = \
  339. [{'id': 'p1', 'type': 'Place', 'tokens': 1, 'name': 'p1'},
  340. {'id': 'p2', 'type': 'Place', 'tokens': 2, 'name': 'p2'},
  341. {'id': 'p3', 'type': 'Place', 'tokens': 3, 'name': 'p3'},
  342. {'id': 't1', 'type': 'Transition', 'name': 't1'},
  343. {'id': '__0', 'type': 'P2T', '__source': 'p1', '__target': 't1', 'weight': 1},
  344. {'id': '__1', 'type': 'P2T', '__source': 'p2', '__target': 't1', 'weight': 1},
  345. {'id': '__2', 'type': 'T2P', '__source': 't1', '__target': 'p3', 'weight': 2}
  346. ]
  347. compare_unordered_lists(got, expected)
  348. alter_context("formalisms/PetriNet", "formalisms/Bottom")
  349. alter_context("models/my_pn", "formalisms/Bottom")
  350. count_nodes = 0
  351. count_edges = 0
  352. for entry in element_list_nice("formalisms/PetriNet"):
  353. assert entry["type"] in ["Node", "Edge"]
  354. if entry["type"] == "Node":
  355. assert len(entry) == 2
  356. count_nodes += 1
  357. else:
  358. assert len(entry) == 4
  359. count_edges += 1
  360. assert count_nodes == 14
  361. assert count_edges == 17
  362. count_nodes = 0
  363. count_edges = 0
  364. for entry in element_list_nice("models/my_pn"):
  365. assert entry["type"] in ["Node", "Edge"]
  366. if entry["type"] == "Node":
  367. assert len(entry) == 2
  368. count_nodes += 1
  369. else:
  370. assert len(entry) == 4
  371. count_edges += 1
  372. assert count_nodes == 14
  373. assert count_edges == 13
  374. alter_context("formalisms/PetriNet", "formalisms/PetriNet")
  375. alter_context("models/my_pn", "formalisms/SimpleClassDiagrams")
  376. try:
  377. element_list_nice("formalisms/PetriNet")
  378. self.fail()
  379. except:
  380. pass
  381. try:
  382. element_list_nice("models/my_pn")
  383. self.fail()
  384. except:
  385. pass