test_pn_interface.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447
  1. import unittest
  2. from utils import run_file
  3. do_instantiate_simple = [
  4. "new", "PetriNets", "abc",
  5. "instantiate", "Transition", "t1",
  6. "instantiate", "Place", "p1", "attr_add", "p1", "tokens", 5,
  7. "instantiate", "Place", "p2", "attr_add", "p2", "tokens", 0,
  8. "instantiate", "P2T", "p2t", "p1", "t1", "attr_add", "p2t", "weight", 2,
  9. "instantiate", "T2P", "t2p", "t1", "p2", "attr_add", "t2p", "weight", 1]
  10. instantiate_node = ["Type to instantiate?",
  11. "Name of new element?",
  12. "Instantiation successful!"]
  13. instantiate_edge = ["Type to instantiate?",
  14. "Name of new element?",
  15. "Source name?",
  16. "Destination name?",
  17. "Instantiation successful!"]
  18. all_files = [ "pn_interface.alc",
  19. "primitives.alc",
  20. "object_operations.alc",
  21. "conformance_scd.alc",
  22. "library.alc",
  23. "metamodels.alc",
  24. ]
  25. greeting = ["Welcome to the Model Management Interface, running live on the Modelverse!",
  26. "Use 'help' command for a list of possible commands"]
  27. new = ["Metamodel to instantiate?",
  28. "Name of model?"]
  29. prompt = ["Please give your command."]
  30. loaded = ["Model loaded, ready for commands!",
  31. "Use 'help' command for a list of possible commands"] + prompt
  32. load = ["Model to load?"]
  33. instantiate = ["Type to instantiate?"]
  34. instantiate_name = ["Name of new element?"]
  35. instantiate_ok = ["Instantiation successful!"]
  36. instantiate_source= ["Source name?"]
  37. instantiate_destination = ["Destination name?"]
  38. def list_menu(defined):
  39. defined.append(("PetriNets", "SimpleClassDiagrams"))
  40. defined.append(("SimpleClassDiagrams", "SimpleClassDiagrams"))
  41. defined.append(("LTM_bottom", "LTM_bottom"))
  42. return ["Found models:",
  43. set([" %s : %s" % (m, mm) for m, mm in defined])]
  44. def list_model(defined):
  45. return ["List of all elements:",
  46. set([" %s : %s" % (m, mm) for m, mm in defined])]
  47. def read_node(name, t, defs, attrs):
  48. return ["Element to read?",
  49. "Name: %s" % name,
  50. "Type: %s" % t,
  51. "Defines attributes:"] + \
  52. ([set([" %s : %s" % (m, mm) for m, mm in defs])] if defs else []) + \
  53. ["Attributes:"] + \
  54. ([set([' "%s" : "%s" = %s' % (m, mm, v) for m, mm, v in attrs])] if attrs else [])
  55. def read_edge(name, t, src, dst, defs, attrs):
  56. return ["Element to read?",
  57. "Name: %s" % name,
  58. "Type: %s" % t,
  59. "Source: %s" % src,
  60. "Destination: %s" % dst,
  61. "Defines attributes:"] + \
  62. ([set([" %s : %s" % (m, mm) for m, mm in defs])] if defs else []) + \
  63. ["Attributes:"] + \
  64. ([set([' "%s" : "%s" = %s' % (m, mm, v) for m, mm, v in attrs])] if attrs else [])
  65. def enabled(enableds):
  66. return ["Enabled transitions:"] + \
  67. [set(enableds)]
  68. def fire(fired):
  69. return ["Transition to fire?"] + \
  70. [set([" %s: %s" % (p, v) for p, v in fired])] + \
  71. ["Transition fired!"]
  72. delete = ["Model to delete?", "Deleted!"]
  73. rename = ["Old name?", "New name?", "Rename complete!"]
  74. attr_add = ["Which model do you want to assign an attribute to?",
  75. "Which attribute do you wish to assign?",
  76. "Value of attribute?",
  77. "Added attribute!"]
  78. attr_del = ["Which model do you want to remove an attribute of?",
  79. "Which attribute do you want to delete?",
  80. "Attribute deleted!",
  81. ]
  82. help_root = ["Currently no model is loaded, so your operations are limited to:",
  83. " new -- Create a new model and save it for future use"
  84. " load -- Load a previously made model",
  85. " rename -- Rename a previously made model",
  86. " delete -- Delete a previously made model",
  87. " list -- Show a list of all stored models",
  88. " help -- Show a list of possible commands"]
  89. verify_fail_weight= ["Natural number not larger than or equal to zero"]
  90. verify_fail_tokens= ["Natural number not larger than or equal to zero"]
  91. verify_fail_structure = ["Source of model edge not typed by source of type: p2t"]
  92. init = greeting + prompt
  93. did_instantiate_simple = init + \
  94. new + \
  95. loaded +\
  96. instantiate_node + \
  97. prompt + \
  98. instantiate_node + \
  99. prompt + \
  100. attr_add + \
  101. prompt + \
  102. instantiate_node + \
  103. prompt + \
  104. attr_add + \
  105. prompt + \
  106. instantiate_edge + \
  107. prompt + \
  108. attr_add + \
  109. prompt + \
  110. instantiate_edge + \
  111. prompt + \
  112. attr_add + \
  113. prompt
  114. def list_types(t):
  115. return ["List of types:"] + \
  116. [set([" %s : %s" % (m, mm) for m, mm in t])]
  117. modify = ["Element to modify?",
  118. "Attribute to modify?",
  119. "New value?",
  120. "Modified!",]
  121. class TestPetrinetInterface(unittest.TestCase):
  122. def test_po_pn_interface_manage(self):
  123. self.pn_interface_manage("PO")
  124. def test_co_pn_interface_manage(self):
  125. self.pn_interface_manage("CO")
  126. def pn_interface_manage(self, mode):
  127. self.assertTrue(run_file(all_files,
  128. ["list",
  129. "new", "PetriNets", "abc", "exit",
  130. "list",
  131. "new", "PetriNets", "def", "exit",
  132. "list",
  133. "delete", "def",
  134. "list",
  135. "rename", "abc", "a",
  136. "list",
  137. "delete", "a",
  138. "list",
  139. ],
  140. init + \
  141. list_menu([]) + prompt + \
  142. new + loaded + prompt + list_menu([("abc", "PetriNets")]) + prompt + \
  143. new + loaded + prompt + list_menu([("abc", "PetriNets"), ("def", "PetriNets")]) + prompt + \
  144. delete + prompt + list_menu([("abc", "PetriNets")]) + prompt + \
  145. rename + prompt + list_menu([("a", "PetriNets")]) + prompt + \
  146. delete + prompt + list_menu([]) + prompt,
  147. mode))
  148. def test_po_pn_interface_new_reload(self):
  149. self.pn_interface_new_reload("PO")
  150. def test_co_pn_interface_new_reload(self):
  151. self.pn_interface_new_reload("CO")
  152. def pn_interface_new_reload(self, mode):
  153. self.assertTrue(run_file(all_files,
  154. ["new", "PetriNets", "abc", "exit", "load", "abc"],
  155. init + new + loaded + prompt + load + loaded,
  156. mode))
  157. def test_po_pn_interface_instantiate_place(self):
  158. self.pn_interface_instantiate_place("PO")
  159. def test_co_pn_interface_instantiate_place(self):
  160. self.pn_interface_instantiate_place("CO")
  161. def pn_interface_instantiate_place(self, mode):
  162. self.assertTrue(run_file(all_files,
  163. ["new", "PetriNets", "abc",
  164. "instantiate", "Place", "p1",
  165. "attr_add", "p1", "tokens", 5,
  166. "list",
  167. "read", "p1",
  168. "instantiate", "Transition", "t1",
  169. "list",
  170. "read", "t1"],
  171. init + new + loaded + \
  172. instantiate_node + prompt + \
  173. attr_add + prompt + \
  174. list_model([("p1", "Place")]) + prompt + \
  175. read_node("p1", "Place", [], [("tokens", "Natural", 5)]) + prompt + \
  176. instantiate_node + prompt + \
  177. list_model([("p1", "Place"), ("t1", "Transition")]) + prompt + \
  178. read_node("t1", "Transition", [], []) + prompt,
  179. mode))
  180. def test_po_pn_interface_instantiate_arcs(self):
  181. self.pn_interface_instantiate_arcs("PO")
  182. def test_co_pn_interface_instantiate_arcs(self):
  183. self.pn_interface_instantiate_arcs("CO")
  184. def pn_interface_instantiate_arcs(self, mode):
  185. self.assertTrue(run_file(all_files,
  186. do_instantiate_simple + [
  187. "read", "p1",
  188. "read", "p2",
  189. "read", "t1",
  190. "read", "p2t",
  191. "read", "t2p",
  192. ],
  193. did_instantiate_simple + \
  194. read_node("p1", "Place", [], [("tokens", "Natural", 5)]) + prompt + \
  195. read_node("p2", "Place", [], [("tokens", "Natural", 0)]) + prompt + \
  196. read_node("t1", "Transition", [], []) + prompt + \
  197. read_edge("p2t", "P2T", "p1", "t1", [], [("weight", "Natural", 2)]) + prompt + \
  198. read_edge("t2p", "T2P", "t1", "p2", [], [("weight", "Natural", 1)]) + prompt,
  199. mode))
  200. def test_po_pn_interface_enabled(self):
  201. self.pn_interface_enabled("PO")
  202. def test_co_pn_interface_enabled(self):
  203. self.pn_interface_enabled("CO")
  204. def pn_interface_enabled(self, mode):
  205. self.assertTrue(run_file(all_files,
  206. do_instantiate_simple + ["enabled"],
  207. did_instantiate_simple + enabled(["t1"]) + prompt,
  208. mode))
  209. def test_po_pn_interface_fire(self):
  210. self.pn_interface_fire("PO")
  211. def test_co_pn_interface_fire(self):
  212. self.pn_interface_fire("CO")
  213. def pn_interface_fire(self, mode):
  214. self.assertTrue(run_file(all_files,
  215. do_instantiate_simple + ["fire", "t1"],
  216. did_instantiate_simple + fire([("p1", 3), ("p2", 1)]) + prompt,
  217. mode))
  218. def test_po_pn_interface_verify_OK(self):
  219. self.pn_interface_verify_OK("PO")
  220. def test_co_pn_interface_verify_OK(self):
  221. self.pn_interface_verify_OK("CO")
  222. def pn_interface_verify_OK(self, mode):
  223. self.assertTrue(run_file(all_files,
  224. do_instantiate_simple + ["verify"],
  225. did_instantiate_simple + ["OK"], mode))
  226. def test_po_pn_interface_verify_fail_tokens(self):
  227. self.pn_interface_verify_fail_tokens("PO")
  228. def test_co_pn_interface_verify_fail_tokens(self):
  229. self.pn_interface_verify_fail_tokens("CO")
  230. def pn_interface_verify_fail_tokens(self, mode):
  231. self.assertTrue(run_file(all_files,
  232. do_instantiate_simple + ["modify", "p1", "tokens", -5, "verify"],
  233. did_instantiate_simple + modify + prompt + verify_fail_tokens + prompt, mode))
  234. def test_po_pn_interface_verify_fail_weight(self):
  235. self.pn_interface_verify_fail_weight("PO")
  236. def test_co_pn_interface_verify_fail_weight(self):
  237. self.pn_interface_verify_fail_weight("CO")
  238. def pn_interface_verify_fail_weight(self, mode):
  239. self.assertTrue(run_file(all_files,
  240. do_instantiate_simple + ["modify", "p2t", "weight", -2, "verify"],
  241. did_instantiate_simple + modify + prompt + verify_fail_weight + prompt, mode))
  242. def test_po_pn_interface_verify_fail_structure(self):
  243. self.pn_interface_verify_fail_structure("PO")
  244. def test_co_pn_interface_verify_fail_structure(self):
  245. self.pn_interface_verify_fail_structure("CO")
  246. def pn_interface_verify_fail_structure(self, mode):
  247. self.assertTrue(run_file(all_files,
  248. ["new", "PetriNets", "abc",
  249. "instantiate", "Transition", "t1",
  250. "instantiate", "Place", "p1", "attr_add", "p1", "tokens", 5,
  251. "instantiate", "P2T", "p2t", "t1", "p1", "attr_add", "p2t", "weight", 2, "verify"],
  252. init + new + loaded + \
  253. instantiate_node + prompt + \
  254. instantiate_node + prompt + attr_add + prompt + \
  255. instantiate_edge + prompt + attr_add + prompt + \
  256. verify_fail_structure,
  257. mode))
  258. def test_po_pn_interface_types(self):
  259. self.pn_interface_types("PO")
  260. def test_co_pn_interface_types(self):
  261. self.pn_interface_types("CO")
  262. def pn_interface_types(self, mode):
  263. self.assertTrue(run_file(all_files,
  264. ["new", "PetriNets", "abc", "types"],
  265. init + new + loaded + list_types([("Place", "Class"), ("Transition", "Class"), ("P2T", "Association"), ("T2P", "Association"), ("Natural", "Class")]),
  266. mode))
  267. def test_po_pn_interface_modify_place(self):
  268. self.pn_interface_modify_place("PO")
  269. def test_co_pn_interface_modify_place(self):
  270. self.pn_interface_modify_place("CO")
  271. def pn_interface_modify_place(self, mode):
  272. self.assertTrue(run_file(all_files,
  273. ["new", "PetriNets", "abc",
  274. "instantiate", "Place", "p1", "attr_add", "p1", "tokens", 5,
  275. "read", "p1",
  276. "modify", "p1", "tokens", 1, "read", "p1"],
  277. init + new + loaded + \
  278. instantiate_node + prompt + attr_add + prompt + \
  279. read_node("p1", "Place", [], [("tokens", "Natural", 5)]) + prompt + \
  280. modify + prompt + \
  281. read_node("p1", "Place", [], [("tokens", "Natural", 1)]) + prompt,
  282. mode))
  283. def test_po_pn_interface_verify_fail_attr_lower_cardinality(self):
  284. self.pn_interface_verify_fail_attr_lower_cardinality("PO")
  285. def test_co_pn_interface_verify_fail_attr_lower_cardinality(self):
  286. self.pn_interface_verify_fail_attr_lower_cardinality("CO")
  287. def pn_interface_verify_fail_attr_lower_cardinality(self, mode):
  288. self.assertTrue(run_file(all_files,
  289. do_instantiate_simple + ["instantiate", "Place", "p999", "verify"],
  290. did_instantiate_simple + instantiate_node + prompt + ["Lower cardinality violation for outgoing edge at p999"] + prompt,
  291. mode))
  292. def test_po_pn_interface_verify_fail_attr_upper_cardinality(self):
  293. self.pn_interface_verify_fail_attr_upper_cardinality("PO")
  294. def test_co_pn_interface_verify_fail_attr_upper_cardinality(self):
  295. self.pn_interface_verify_fail_attr_upper_cardinality("CO")
  296. def pn_interface_verify_fail_attr_upper_cardinality(self, mode):
  297. self.assertTrue(run_file(all_files,
  298. do_instantiate_simple + ["attr_add", "p1", "tokens", 5, "verify"],
  299. did_instantiate_simple + attr_add + prompt + ["Upper cardinality violation for outgoing edge at p1"] + prompt,
  300. mode))
  301. def test_po_pn_interface_verify_natural(self):
  302. self.pn_interface_verify_natural("PO")
  303. def test_co_pn_interface_verify_natural(self):
  304. self.pn_interface_verify_natural("CO")
  305. def pn_interface_verify_natural(self, mode):
  306. self.assertTrue(run_file(all_files,
  307. ["new", "PetriNets", "abc",
  308. "instantiate", "Place", "p1",
  309. "attr_add", "p1", "tokens", -5,
  310. "attr_del", "p1", "tokens",
  311. "attr_add", "p1", "tokens", 4,
  312. "verify"],
  313. init + new + loaded + \
  314. instantiate_node + prompt + \
  315. attr_add + prompt + \
  316. attr_del + prompt + \
  317. attr_add + prompt + \
  318. ["OK"] + prompt,
  319. mode))
  320. def test_po_pn_interface_verify_PN_OK(self):
  321. self.pn_interface_verify_PN_OK("PO")
  322. def test_co_pn_interface_verify_PN_OK(self):
  323. self.pn_interface_verify_PN_OK("CO")
  324. def pn_interface_verify_PN_OK(self, mode):
  325. self.assertTrue(run_file(all_files,
  326. ["load", "PetriNets", "verify"],
  327. init + load + loaded + ["OK"], mode))
  328. def test_po_rpgame(self):
  329. self.rpgame("PO")
  330. def test_co_rpgame(self):
  331. self.rpgame("CO")
  332. def rpgame(self, mode):
  333. self.assertTrue(run_file(all_files,
  334. ["new", "SimpleClassDiagrams", "RPGame",
  335. "instantiate", "Class", "Scene",
  336. "instantiate", "Class", "Tile",
  337. "instantiate", "Class", "Item",
  338. "instantiate", "Class", "Goal",
  339. "instantiate", "Class", "Character",
  340. "instantiate", "Class", "Hero",
  341. "instantiate", "Class", "String",
  342. "instantiate", "Association", "scene_name", "Scene", "String",
  343. "instantiate", "Association", "scene_has_tiles", "Scene", "Tile",
  344. "instantiate", "Association", "tile_left", "Tile", "Tile",
  345. "instantiate", "Association", "tile_right", "Tile", "Tile",
  346. "instantiate", "Association", "tile_top", "Tile", "Tile",
  347. "instantiate", "Association", "tile_bottom", "Tile", "Tile",
  348. "instantiate", "Association", "character_on", "Character", "Tile",
  349. "instantiate", "Association", "item_on", "Item", "Tile",
  350. "instantiate", "Inheritance", "hero_is_character", "Hero", "Character",
  351. "instantiate", "Inheritance", "goal_is_item", "Goal", "Item",
  352. "attr_add", "Scene", "lower_cardinality", 1,
  353. "attr_add", "Scene", "upper_cardinality", 1,
  354. "attr_add", "Goal", "lower_cardinality", 1,
  355. "attr_add", "scene_has_tiles", "source_lower_cardinality", 1,
  356. "attr_add", "scene_has_tiles", "source_upper_cardinality", 1,
  357. "attr_add", "scene_has_tiles", "target_lower_cardinality", 1,
  358. "attr_add", "scene_name", "target_lower_cardinality", 1,
  359. "attr_add", "scene_name", "target_upper_cardinality", 1,
  360. "attr_add", "item_on", "target_lower_cardinality", 1,
  361. "attr_add", "item_on", "target_upper_cardinality", 1,
  362. "attr_add", "item_on", "source_upper_cardinality", 1,
  363. "attr_add", "character_on", "target_lower_cardinality", 1,
  364. "attr_add", "character_on", "target_upper_cardinality", 1,
  365. "attr_add", "character_on", "source_upper_cardinality", 1,
  366. "attr_add", "tile_left", "source_upper_cardinality", 1,
  367. "attr_add", "tile_left", "target_upper_cardinality", 1,
  368. "attr_add", "tile_right", "source_upper_cardinality", 1,
  369. "attr_add", "tile_right", "target_upper_cardinality", 1,
  370. "attr_add", "tile_top", "source_upper_cardinality", 1,
  371. "attr_add", "tile_top", "target_upper_cardinality", 1,
  372. "attr_add", "tile_bottom", "source_upper_cardinality", 1,
  373. "attr_add", "tile_bottom", "target_upper_cardinality", 1,
  374. "verify",
  375. ],
  376. init + new + loaded + (instantiate_node + prompt) * 7 + (instantiate_edge + prompt) * 10 + (attr_add + prompt) * 22 + ["OK"] + prompt,
  377. mode))