test_pn_interface.py 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  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. "--fast",
  25. ]
  26. greeting = ["Welcome to the Model Management Interface, running live on the Modelverse!",
  27. "Use 'help' command for a list of possible commands"]
  28. new = ["Metamodel to instantiate?",
  29. "Name of model?"]
  30. prompt = ["Please give your command."]
  31. loaded = ["Model loaded, ready for commands!",
  32. "Use 'help' command for a list of possible commands"] + prompt
  33. load = ["Model to load?"]
  34. instantiate = ["Type to instantiate?"]
  35. instantiate_name = ["Name of new element?"]
  36. instantiate_ok = ["Instantiation successful!"]
  37. instantiate_source= ["Source name?"]
  38. instantiate_destination = ["Destination name?"]
  39. def list_menu(defined):
  40. defined.append(("PetriNets", "SimpleClassDiagrams"))
  41. defined.append(("SimpleClassDiagrams", "SimpleClassDiagrams"))
  42. defined.append(("LTM_bottom", "LTM_bottom"))
  43. return ["Found models:",
  44. set([" %s : %s" % (m, mm) for m, mm in defined])]
  45. def list_model(defined):
  46. return ["List of all elements:",
  47. set([" %s : %s" % (m, mm) for m, mm in defined])]
  48. def read_node(name, t, defs, attrs):
  49. return ["Element to read?",
  50. "Name: %s" % name,
  51. "Type: %s" % t,
  52. "Defines attributes:"] + \
  53. ([set([" %s : %s" % (m, mm) for m, mm in defs])] if defs else []) + \
  54. ["Attributes:"] + \
  55. ([set([' "%s" : "%s" = %s' % (m, mm, v) for m, mm, v in attrs])] if attrs else [])
  56. def read_edge(name, t, src, dst, defs, attrs):
  57. return ["Element to read?",
  58. "Name: %s" % name,
  59. "Type: %s" % t,
  60. "Source: %s" % src,
  61. "Destination: %s" % dst,
  62. "Defines attributes:"] + \
  63. ([set([" %s : %s" % (m, mm) for m, mm in defs])] if defs else []) + \
  64. ["Attributes:"] + \
  65. ([set([' "%s" : "%s" = %s' % (m, mm, v) for m, mm, v in attrs])] if attrs else [])
  66. def enabled(enableds):
  67. return ["Enabled transitions:"] + \
  68. [set(enableds)]
  69. def fire(fired):
  70. return ["Transition to fire?"] + \
  71. [set([" %s: %s" % (p, v) for p, v in fired])] + \
  72. ["Transition fired!"]
  73. delete = ["Model to delete?", "Deleted!"]
  74. rename = ["Old name?", "New name?", "Rename complete!"]
  75. attr_add = ["Which model do you want to assign an attribute to?",
  76. "Which attribute do you wish to assign?",
  77. "Value of attribute?",
  78. "Added attribute!"]
  79. help_root = ["Currently no model is loaded, so your operations are limited to:",
  80. " new -- Create a new model and save it for future use"
  81. " load -- Load a previously made model",
  82. " rename -- Rename a previously made model",
  83. " delete -- Delete a previously made model",
  84. " list -- Show a list of all stored models",
  85. " help -- Show a list of possible commands"]
  86. verify_fail_weight= ["Negative weight in arc p2t"]
  87. verify_fail_tokens= ["Negative number of tokens in Place p1"]
  88. verify_fail_structure = ["Source of model edge not typed by source of type: p2t"]
  89. init = greeting + prompt
  90. did_instantiate_simple = init + \
  91. new + \
  92. loaded +\
  93. instantiate_node + \
  94. prompt + \
  95. instantiate_node + \
  96. prompt + \
  97. attr_add + \
  98. prompt + \
  99. instantiate_node + \
  100. prompt + \
  101. attr_add + \
  102. prompt + \
  103. instantiate_edge + \
  104. prompt + \
  105. attr_add + \
  106. prompt + \
  107. instantiate_edge + \
  108. prompt + \
  109. attr_add + \
  110. prompt
  111. def list_types(t):
  112. return ["List of types:"] + \
  113. [set([" %s : %s" % (m, mm) for m, mm in t])]
  114. modify = ["Element to modify?",
  115. "Attribute to modify?",
  116. "New value?",
  117. "Modified!",]
  118. class TestPetrinetInterface(unittest.TestCase):
  119. def test_po_pn_interface_manage(self):
  120. self.pn_interface_manage("PO")
  121. def test_co_pn_interface_manage(self):
  122. self.pn_interface_manage("CO")
  123. def pn_interface_manage(self, mode):
  124. self.assertTrue(run_file(all_files,
  125. ["list",
  126. "new", "PetriNets", "abc", "exit",
  127. "list",
  128. "new", "PetriNets", "def", "exit",
  129. "list",
  130. "delete", "def",
  131. "list",
  132. "rename", "abc", "a",
  133. "list",
  134. "delete", "a",
  135. "list",
  136. ],
  137. init + \
  138. list_menu([]) + prompt + \
  139. new + loaded + prompt + list_menu([("abc", "PetriNets")]) + prompt + \
  140. new + loaded + prompt + list_menu([("abc", "PetriNets"), ("def", "PetriNets")]) + prompt + \
  141. delete + prompt + list_menu([("abc", "PetriNets")]) + prompt + \
  142. rename + prompt + list_menu([("a", "PetriNets")]) + prompt + \
  143. delete + prompt + list_menu([]) + prompt,
  144. mode))
  145. def test_po_pn_interface_new_reload(self):
  146. self.pn_interface_new_reload("PO")
  147. def test_co_pn_interface_new_reload(self):
  148. self.pn_interface_new_reload("CO")
  149. def pn_interface_new_reload(self, mode):
  150. self.assertTrue(run_file(all_files,
  151. ["new", "PetriNets", "abc", "exit", "load", "abc"],
  152. init + new + loaded + prompt + load + loaded,
  153. mode))
  154. def test_po_pn_interface_instantiate_place(self):
  155. self.pn_interface_instantiate_place("PO")
  156. def test_co_pn_interface_instantiate_place(self):
  157. self.pn_interface_instantiate_place("CO")
  158. def pn_interface_instantiate_place(self, mode):
  159. self.assertTrue(run_file(all_files,
  160. ["new", "PetriNets", "abc",
  161. "instantiate", "Place", "p1",
  162. "attr_add", "p1", "tokens", 5,
  163. "list",
  164. "read", "p1",
  165. "instantiate", "Transition", "t1",
  166. "list",
  167. "read", "t1"],
  168. init + new + loaded + \
  169. instantiate_node + prompt + \
  170. attr_add + prompt + \
  171. list_model([("p1", "Place")]) + prompt + \
  172. read_node("p1", "Place", [], [("tokens", "Integer", 5)]) + prompt + \
  173. instantiate_node + prompt + \
  174. list_model([("p1", "Place"), ("t1", "Transition")]) + prompt + \
  175. read_node("t1", "Transition", [], []) + prompt,
  176. mode))
  177. def test_po_pn_interface_instantiate_arcs(self):
  178. self.pn_interface_instantiate_arcs("PO")
  179. def test_co_pn_interface_instantiate_arcs(self):
  180. self.pn_interface_instantiate_arcs("CO")
  181. def pn_interface_instantiate_arcs(self, mode):
  182. self.assertTrue(run_file(all_files,
  183. do_instantiate_simple + [
  184. "read", "p1",
  185. "read", "p2",
  186. "read", "t1",
  187. "read", "p2t",
  188. "read", "t2p",
  189. ],
  190. did_instantiate_simple + \
  191. read_node("p1", "Place", [], [("tokens", "Integer", 5)]) + prompt + \
  192. read_node("p2", "Place", [], [("tokens", "Integer", 0)]) + prompt + \
  193. read_node("t1", "Transition", [], []) + prompt + \
  194. read_edge("p2t", "P2T", "p1", "t1", [], [("weight", "Integer", 2)]) + prompt + \
  195. read_edge("t2p", "T2P", "t1", "p2", [], [("weight", "Integer", 1)]) + prompt,
  196. mode))
  197. def test_po_pn_interface_enabled(self):
  198. self.pn_interface_enabled("PO")
  199. def test_co_pn_interface_enabled(self):
  200. self.pn_interface_enabled("CO")
  201. def pn_interface_enabled(self, mode):
  202. self.assertTrue(run_file(all_files,
  203. do_instantiate_simple + ["enabled"],
  204. did_instantiate_simple + enabled(["t1"]) + prompt,
  205. mode))
  206. def test_po_pn_interface_fire(self):
  207. self.pn_interface_fire("PO")
  208. def test_co_pn_interface_fire(self):
  209. self.pn_interface_fire("CO")
  210. def pn_interface_fire(self, mode):
  211. self.assertTrue(run_file(all_files,
  212. do_instantiate_simple + ["fire", "t1"],
  213. did_instantiate_simple + fire([("p1", 3), ("p2", 1)]) + prompt,
  214. mode))
  215. def test_po_pn_interface_verify_OK(self):
  216. self.pn_interface_verify_OK("PO")
  217. def test_co_pn_interface_verify_OK(self):
  218. self.pn_interface_verify_OK("CO")
  219. def pn_interface_verify_OK(self, mode):
  220. self.assertTrue(run_file(all_files,
  221. do_instantiate_simple + ["verify"],
  222. did_instantiate_simple + ["OK"], mode))
  223. def test_po_pn_interface_verify_fail_tokens(self):
  224. self.pn_interface_verify_fail_tokens("PO")
  225. def test_co_pn_interface_verify_fail_tokens(self):
  226. self.pn_interface_verify_fail_tokens("CO")
  227. def pn_interface_verify_fail_tokens(self, mode):
  228. self.assertTrue(run_file(all_files,
  229. do_instantiate_simple + ["modify", "p1", "tokens", -5, "verify"],
  230. did_instantiate_simple + modify + prompt + verify_fail_tokens + prompt, mode))
  231. def test_po_pn_interface_verify_fail_weight(self):
  232. self.pn_interface_verify_fail_weight("PO")
  233. def test_co_pn_interface_verify_fail_weight(self):
  234. self.pn_interface_verify_fail_weight("CO")
  235. def pn_interface_verify_fail_weight(self, mode):
  236. self.assertTrue(run_file(all_files,
  237. do_instantiate_simple + ["modify", "p2t", "weight", -2, "verify"],
  238. did_instantiate_simple + modify + prompt + verify_fail_weight + prompt, mode))
  239. def test_po_pn_interface_verify_fail_structure(self):
  240. self.pn_interface_verify_fail_structure("PO")
  241. def test_co_pn_interface_verify_fail_structure(self):
  242. self.pn_interface_verify_fail_structure("CO")
  243. def pn_interface_verify_fail_structure(self, mode):
  244. self.assertTrue(run_file(all_files,
  245. ["new", "PetriNets", "abc",
  246. "instantiate", "Transition", "t1",
  247. "instantiate", "Place", "p1", "attr_add", "p1", "tokens", 5,
  248. "instantiate", "P2T", "p2t", "t1", "p1", "attr_add", "p2t", "weight", 2, "verify"],
  249. init + new + loaded + \
  250. instantiate_node + prompt + \
  251. instantiate_node + prompt + attr_add + prompt + \
  252. instantiate_edge + prompt + attr_add + prompt + \
  253. verify_fail_structure,
  254. mode))
  255. def test_po_pn_interface_types(self):
  256. self.pn_interface_types("PO")
  257. def test_co_pn_interface_types(self):
  258. self.pn_interface_types("CO")
  259. def pn_interface_types(self, mode):
  260. self.assertTrue(run_file(all_files,
  261. ["new", "PetriNets", "abc", "types"],
  262. init + new + loaded + list_types([("Place", "Class"), ("Transition", "Class"), ("P2T", "Association"), ("T2P", "Association"), ("Integer", "Type")]),
  263. mode))
  264. def test_po_pn_interface_modify_place(self):
  265. self.pn_interface_modify_place("PO")
  266. def test_co_pn_interface_modify_place(self):
  267. self.pn_interface_modify_place("CO")
  268. def pn_interface_modify_place(self, mode):
  269. self.assertTrue(run_file(all_files,
  270. ["new", "PetriNets", "abc",
  271. "instantiate", "Place", "p1", "attr_add", "p1", "tokens", 5,
  272. "read", "p1",
  273. "modify", "p1", "tokens", 1, "read", "p1"],
  274. init + new + loaded + \
  275. instantiate_node + prompt + attr_add + prompt + \
  276. read_node("p1", "Place", [], [("tokens", "Integer", 5)]) + prompt + \
  277. modify + prompt + \
  278. read_node("p1", "Place", [], [("tokens", "Integer", 1)]) + prompt,
  279. mode))