test_rules_call.py 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. import unittest
  2. from modelverse_kernel.main import ModelverseKernel
  3. from utils import execute_until_finished, MvSWrapper
  4. class Testcall(unittest.TestCase):
  5. def setUp(self):
  6. self.mvs = MvSWrapper()
  7. self.root = self.mvs.execute("RR", [])[0]
  8. self.mvk = ModelverseKernel(self.root)
  9. def test_call_resolve_none(self):
  10. root = self.root
  11. task_root = self.mvs.execute("CN", [])[0]
  12. task_frame = self.mvs.execute("CN", [])[0]
  13. phase = self.mvs.execute("CNV", ["init"])[0]
  14. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  15. evalstack = self.mvs.execute("CN", [])[0]
  16. func = self.mvs.execute("CN", [])[0]
  17. self.mvs.execute("CD", [root, "task_1", task_root])
  18. self.mvs.execute("CD", [task_root, "frame", task_frame])
  19. self.mvs.execute("CD", [task_frame, "phase", phase])
  20. self.mvs.execute("CD", [task_frame, "symbols", self.mvs.execute("CN", [])[0]])
  21. self.mvs.execute("CD", [task_frame, "IP", inst])
  22. self.mvs.execute("CD", [inst, "func", func])
  23. self.mvs.execute("CD", [task_frame, "evalstack", evalstack])
  24. # Do the invocation until it returns None
  25. execute_until_finished(self.mvk, self.mvs)
  26. # Execution of the command finished, so the MvS should be in the correct new state right now
  27. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  28. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], task_frame)
  29. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "init")
  30. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], func)
  31. new_evalstack = self.mvs.execute("RD", [task_frame, "evalstack"])[0]
  32. self.assertNotEquals(evalstack, new_evalstack)
  33. self.assertEquals(self.mvs.execute("RD", [new_evalstack, "prev"])[0], evalstack)
  34. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  35. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [evalstack, "phase"])[0]])[0], "call")
  36. def test_call_resolve_params(self):
  37. root = self.root
  38. task_root = self.mvs.execute("CN", [])[0]
  39. task_frame = self.mvs.execute("CN", [])[0]
  40. phase = self.mvs.execute("CNV", ["init"])[0]
  41. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  42. evalstack = self.mvs.execute("CN", [])[0]
  43. func = self.mvs.execute("CN", [])[0]
  44. params = self.mvs.execute("CN", [])[0]
  45. self.mvs.execute("CD", [root, "task_1", task_root])
  46. self.mvs.execute("CD", [task_root, "frame", task_frame])
  47. self.mvs.execute("CD", [task_frame, "phase", phase])
  48. self.mvs.execute("CD", [task_frame, "IP", inst])
  49. self.mvs.execute("CD", [task_frame, "symbols", self.mvs.execute("CN", [])[0]])
  50. self.mvs.execute("CD", [inst, "func", func])
  51. self.mvs.execute("CD", [task_frame, "evalstack", evalstack])
  52. self.mvs.execute("CD", [inst, "params", params])
  53. # Do the invocation until it returns None
  54. execute_until_finished(self.mvk, self.mvs)
  55. # Execution of the command finished, so the MvS should be in the correct new state right now
  56. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  57. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], task_frame)
  58. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "init")
  59. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], func)
  60. new_evalstack = self.mvs.execute("RD", [task_frame, "evalstack"])[0]
  61. self.assertNotEquals(evalstack, new_evalstack)
  62. self.assertEquals(self.mvs.execute("RD", [new_evalstack, "prev"])[0], evalstack)
  63. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  64. self.assertEquals(self.mvs.execute("RD", [evalstack, "phase"])[0], params)
  65. def test_call_execute_none(self):
  66. root = self.root
  67. task_root = self.mvs.execute("CN", [])[0]
  68. task_frame = self.mvs.execute("CN", [])[0]
  69. phase = self.mvs.execute("CNV", ["call"])[0]
  70. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  71. returnvalue = self.mvs.execute("CN", [])[0]
  72. body = self.mvs.execute("CN", [])[0]
  73. self.mvs.execute("CD", [root, "task_1", task_root])
  74. self.mvs.execute("CD", [task_root, "frame", task_frame])
  75. self.mvs.execute("CD", [task_frame, "phase", phase])
  76. self.mvs.execute("CD", [task_frame, "IP", inst])
  77. self.mvs.execute("CD", [task_frame, "symbols", self.mvs.execute("CN", [])[0]])
  78. self.mvs.execute("CD", [task_frame, "returnvalue", returnvalue])
  79. self.mvs.execute("CD", [returnvalue, "body", body])
  80. # Do the invocation until it returns None
  81. execute_until_finished(self.mvk, self.mvs)
  82. # Execution of the command finished, so the MvS should be in the correct new state right now
  83. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  84. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "finish")
  85. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], inst)
  86. new_frame = self.mvs.execute("RD", [task_root, "frame"])[0]
  87. self.assertNotEquals(new_frame, None)
  88. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], new_frame)
  89. new_evalstack = self.mvs.execute("RD", [new_frame, "evalstack"])[0]
  90. self.assertNotEquals(new_evalstack, None)
  91. new_symbols = self.mvs.execute("RD", [new_frame, "symbols"])[0]
  92. self.assertNotEquals(new_symbols, None)
  93. new_returnvalue = self.mvs.execute("RD", [new_frame, "returnvalue"])[0]
  94. self.assertNotEquals(new_returnvalue, None)
  95. new_caller = self.mvs.execute("RD", [new_frame, "caller"])[0]
  96. self.assertNotEquals(new_caller, None)
  97. new_phase = self.mvs.execute("RD", [new_frame, "phase"])[0]
  98. self.assertNotEquals(new_phase, None)
  99. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [new_frame, "phase"])[0]])[0], "init")
  100. new_IP = self.mvs.execute("RD", [new_frame, "IP"])[0]
  101. self.assertNotEquals(new_IP, None)
  102. self.assertEquals(self.mvs.execute("RD", [new_frame, "IP"])[0], body)
  103. self.assertEquals(self.mvs.execute("RD", [new_frame, "caller"])[0], inst)
  104. self.assertEquals(self.mvs.execute("RD", [new_frame, "prev"])[0], task_frame)
  105. def test_call_execute_params(self):
  106. root = self.root
  107. task_root = self.mvs.execute("CN", [])[0]
  108. task_frame = self.mvs.execute("CN", [])[0]
  109. phase = self.mvs.execute("CNV", ["call"])[0]
  110. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  111. returnvalue = self.mvs.execute("CN", [])[0]
  112. body = self.mvs.execute("CN", [])[0]
  113. new_frame = self.mvs.execute("CN", [])[0]
  114. symbols = self.mvs.execute("CN", [])[0]
  115. signature = self.mvs.execute("CN", [])[0]
  116. params = self.mvs.execute("CN", [])[0]
  117. name = self.mvs.execute("CNV", ["param_a"])[0]
  118. last_param = self.mvs.execute("CN", [])[0]
  119. formal_parameter = self.mvs.execute("CN", [])[0]
  120. self.mvs.execute("CD", [root, "task_1", task_root])
  121. self.mvs.execute("CD", [task_root, "frame", task_frame])
  122. self.mvs.execute("CD", [task_frame, "phase", phase])
  123. self.mvs.execute("CD", [task_frame, "IP", inst])
  124. self.mvs.execute("CD", [task_frame, "returnvalue", returnvalue])
  125. self.mvs.execute("CD", [new_frame, "caller", inst])
  126. self.mvs.execute("CD", [new_frame, "prev", task_frame])
  127. self.mvs.execute("CD", [new_frame, "symbols", symbols])
  128. self.mvs.execute("CD", [signature, "body", body])
  129. self.mvs.execute("CD", [signature, "params", params])
  130. self.mvs.execute("CD", [new_frame, "IP", body])
  131. self.mvs.execute("CD", [inst, "last_param", last_param])
  132. self.mvs.execute("CD", [last_param, "name", name])
  133. t1 = self.mvs.execute("CE", [params, formal_parameter])[0]
  134. self.mvs.execute("CE", [t1, name])
  135. # Do the invocation until it returns None
  136. execute_until_finished(self.mvk, self.mvs)
  137. # Execution of the command finished, so the MvS should be in the correct new state right now
  138. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  139. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], new_frame)
  140. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "finish")
  141. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], inst)
  142. new_frame = self.mvs.execute("RD", [task_root, "frame"])[0]
  143. self.assertNotEquals(new_frame, None)
  144. self.assertEquals(self.mvs.execute("RD", [new_frame, "IP"])[0], body)
  145. self.assertEquals(self.mvs.execute("RD", [new_frame, "caller"])[0], inst)
  146. self.assertEquals(self.mvs.execute("RD", [new_frame, "prev"])[0], task_frame)
  147. def test_call_param_first_multi(self):
  148. root = self.root
  149. task_root = self.mvs.execute("CN", [])[0]
  150. task_frame = self.mvs.execute("CN", [])[0]
  151. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  152. returnvalue = self.mvs.execute("CN", [])[0]
  153. body = self.mvs.execute("CN", [])[0]
  154. new_frame = self.mvs.execute("CN", [])[0]
  155. symbols = self.mvs.execute("CN", [])[0]
  156. signature = self.mvs.execute("CN", [])[0]
  157. params = self.mvs.execute("CN", [])[0]
  158. param_value = self.mvs.execute("CN", [])[0]
  159. next_param = self.mvs.execute("CN", [])[0]
  160. evalstack = self.mvs.execute("CN", [])[0]
  161. self.mvs.execute("CD", [root, "task_1", task_root])
  162. self.mvs.execute("CD", [task_root, "frame", task_frame])
  163. self.mvs.execute("CD", [task_frame, "phase", params])
  164. self.mvs.execute("CD", [task_frame, "IP", inst])
  165. self.mvs.execute("CD", [task_frame, "returnvalue", returnvalue])
  166. self.mvs.execute("CD", [signature, "body", body])
  167. self.mvs.execute("CD", [signature, "params", params])
  168. self.mvs.execute("CD", [inst, "params", params])
  169. self.mvs.execute("CD", [inst, "last_param", self.mvs.execute("CN", [])[0]])
  170. self.mvs.execute("CD", [params, "next_param", next_param])
  171. self.mvs.execute("CD", [params, "value", param_value])
  172. self.mvs.execute("CD", [returnvalue, "body", body])
  173. self.mvs.execute("CD", [task_frame, "evalstack", evalstack])
  174. # Do the invocation until it returns None
  175. execute_until_finished(self.mvk, self.mvs)
  176. # Execution of the command finished, so the MvS should be in the correct new state right now
  177. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  178. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], task_frame)
  179. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "init")
  180. new_frame = self.mvs.execute("RRD", [task_frame, "prev"])[0][0]
  181. self.assertNotEquals(new_frame, None)
  182. new_evalstack = self.mvs.execute("RD", [new_frame, "evalstack"])[0]
  183. self.assertNotEquals(new_evalstack, None)
  184. new_symbols = self.mvs.execute("RD", [new_frame, "symbols"])[0]
  185. self.assertNotEquals(new_symbols, None)
  186. new_returnvalue = self.mvs.execute("RD", [new_frame, "returnvalue"])[0]
  187. self.assertNotEquals(new_returnvalue, None)
  188. new_caller = self.mvs.execute("RD", [new_frame, "caller"])[0]
  189. self.assertNotEquals(new_caller, None)
  190. new_phase = self.mvs.execute("RD", [new_frame, "phase"])[0]
  191. self.assertNotEquals(new_phase, None)
  192. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [new_frame, "phase"])[0]])[0], "init")
  193. new_IP = self.mvs.execute("RD", [new_frame, "IP"])[0]
  194. self.assertNotEquals(new_IP, None)
  195. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], param_value)
  196. self.assertEquals(self.mvs.execute("RD", [new_frame, "caller"])[0], inst)
  197. self.assertEquals(self.mvs.execute("RD", [new_frame, "prev"])[0], task_frame)
  198. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  199. self.assertEquals(self.mvs.execute("RD", [evalstack, "phase"])[0], next_param)
  200. def test_call_param_first_single(self):
  201. root = self.root
  202. task_root = self.mvs.execute("CN", [])[0]
  203. task_frame = self.mvs.execute("CN", [])[0]
  204. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  205. returnvalue = self.mvs.execute("CN", [])[0]
  206. body = self.mvs.execute("CN", [])[0]
  207. new_frame = self.mvs.execute("CN", [])[0]
  208. symbols = self.mvs.execute("CN", [])[0]
  209. signature = self.mvs.execute("CN", [])[0]
  210. params = self.mvs.execute("CN", [])[0]
  211. param_value = self.mvs.execute("CN", [])[0]
  212. evalstack = self.mvs.execute("CN", [])[0]
  213. self.mvs.execute("CD", [root, "task_1", task_root])
  214. self.mvs.execute("CD", [task_root, "frame", task_frame])
  215. self.mvs.execute("CD", [task_frame, "phase", params])
  216. self.mvs.execute("CD", [task_frame, "IP", inst])
  217. self.mvs.execute("CD", [task_frame, "returnvalue", returnvalue])
  218. self.mvs.execute("CD", [signature, "body", body])
  219. self.mvs.execute("CD", [inst, "params", params])
  220. self.mvs.execute("CD", [inst, "last_param", params])
  221. self.mvs.execute("CD", [params, "value", param_value])
  222. self.mvs.execute("CD", [returnvalue, "body", body])
  223. self.mvs.execute("CD", [task_frame, "evalstack", evalstack])
  224. # Do the invocation until it returns None
  225. execute_until_finished(self.mvk, self.mvs)
  226. # Execution of the command finished, so the MvS should be in the correct new state right now
  227. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  228. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], task_frame)
  229. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "init")
  230. new_frame = self.mvs.execute("RRD", [task_frame, "prev"])[0][0]
  231. self.assertNotEquals(new_frame, None)
  232. new_evalstack = self.mvs.execute("RD", [new_frame, "evalstack"])[0]
  233. self.assertNotEquals(new_evalstack, None)
  234. new_symbols = self.mvs.execute("RD", [new_frame, "symbols"])[0]
  235. self.assertNotEquals(new_symbols, None)
  236. new_returnvalue = self.mvs.execute("RD", [new_frame, "returnvalue"])[0]
  237. self.assertNotEquals(new_returnvalue, None)
  238. new_caller = self.mvs.execute("RD", [new_frame, "caller"])[0]
  239. self.assertNotEquals(new_caller, None)
  240. new_phase = self.mvs.execute("RD", [new_frame, "phase"])[0]
  241. self.assertNotEquals(new_phase, None)
  242. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [new_frame, "phase"])[0]])[0], "init")
  243. new_IP = self.mvs.execute("RD", [new_frame, "IP"])[0]
  244. self.assertNotEquals(new_IP, None)
  245. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], param_value)
  246. self.assertEquals(self.mvs.execute("RD", [new_frame, "caller"])[0], inst)
  247. self.assertEquals(self.mvs.execute("RD", [new_frame, "prev"])[0], task_frame)
  248. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  249. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [evalstack, "phase"])[0]])[0], "call")
  250. new_evalstack = self.mvs.execute("RD", [task_frame, "evalstack"])[0]
  251. self.assertNotEquals(evalstack, new_evalstack)
  252. self.assertEquals(self.mvs.execute("RD", [new_evalstack, "prev"])[0], evalstack)
  253. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  254. def test_params_last(self):
  255. root = self.root
  256. task_root = self.mvs.execute("CN", [])[0]
  257. task_frame = self.mvs.execute("CN", [])[0]
  258. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  259. returnvalue = self.mvs.execute("CN", [])[0]
  260. body = self.mvs.execute("CN", [])[0]
  261. new_frame = self.mvs.execute("CN", [])[0]
  262. symbols = self.mvs.execute("CN", [])[0]
  263. signature = self.mvs.execute("CN", [])[0]
  264. params = self.mvs.execute("CN", [])[0]
  265. param_value = self.mvs.execute("CN", [])[0]
  266. evalstack = self.mvs.execute("CN", [])[0]
  267. last_param = self.mvs.execute("CN", [])[0]
  268. prev_param = self.mvs.execute("CN", [])[0]
  269. formal_parameter = self.mvs.execute("CN", [])[0]
  270. formal_parameter_name = self.mvs.execute("CNV", ["param_a"])[0]
  271. self.mvs.execute("CD", [root, "task_1", task_root])
  272. self.mvs.execute("CD", [task_root, "frame", task_frame])
  273. self.mvs.execute("CD", [task_frame, "phase", last_param])
  274. self.mvs.execute("CD", [task_frame, "IP", inst])
  275. self.mvs.execute("CD", [task_frame, "returnvalue", returnvalue])
  276. self.mvs.execute("CD", [inst, "last_param", last_param])
  277. self.mvs.execute("CD", [inst, "params", prev_param])
  278. self.mvs.execute("CD", [params, "value", param_value])
  279. self.mvs.execute("CD", [task_frame, "evalstack", evalstack])
  280. self.mvs.execute("CD", [new_frame, "caller", inst])
  281. self.mvs.execute("CD", [new_frame, "prev", task_frame])
  282. self.mvs.execute("CD", [new_frame, "symbols", symbols])
  283. self.mvs.execute("CD", [new_frame, "IP", body])
  284. self.mvs.execute("CD", [signature, "body", body])
  285. self.mvs.execute("CD", [signature, "params", params])
  286. self.mvs.execute("CD", [prev_param, "next_param", last_param])
  287. self.mvs.execute("CD", [prev_param, "name", formal_parameter_name])
  288. self.mvs.execute("CD", [last_param, "value", param_value])
  289. t1 = self.mvs.execute("CE", [params, formal_parameter])[0]
  290. self.mvs.execute("CE", [t1, formal_parameter_name])[0]
  291. # Do the invocation until it returns None
  292. execute_until_finished(self.mvk, self.mvs)
  293. # Execution of the command finished, so the MvS should be in the correct new state right now
  294. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  295. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], task_frame)
  296. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "init")
  297. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], param_value)
  298. var = self.mvs.execute("RDN", [symbols, formal_parameter])[0]
  299. self.assertNotEquals(var, None)
  300. self.assertEquals(self.mvs.execute("RD", [var, "value"])[0], returnvalue)
  301. new_evalstack = self.mvs.execute("RD", [task_frame, "evalstack"])[0]
  302. self.assertNotEquals(evalstack, new_evalstack)
  303. self.assertEquals(self.mvs.execute("RD", [new_evalstack, "prev"])[0], evalstack)
  304. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  305. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [evalstack, "phase"])[0]])[0], "call")
  306. def test_params_next(self):
  307. root = self.root
  308. task_root = self.mvs.execute("CN", [])[0]
  309. task_frame = self.mvs.execute("CN", [])[0]
  310. inst = self.mvs.execute("CNV", [{"value":"call"}])[0]
  311. returnvalue = self.mvs.execute("CN", [])[0]
  312. body = self.mvs.execute("CN", [])[0]
  313. new_frame = self.mvs.execute("CN", [])[0]
  314. symbols = self.mvs.execute("CN", [])[0]
  315. signature = self.mvs.execute("CN", [])[0]
  316. params = self.mvs.execute("CN", [])[0]
  317. param_value = self.mvs.execute("CN", [])[0]
  318. evalstack = self.mvs.execute("CN", [])[0]
  319. formal_parameter = self.mvs.execute("CN", [])[0]
  320. formal_parameter_name = self.mvs.execute("CNV", ["param_a"])[0]
  321. param_a = self.mvs.execute("CN", [])[0]
  322. param_b = self.mvs.execute("CN", [])[0]
  323. param_c = self.mvs.execute("CN", [])[0]
  324. self.mvs.execute("CD", [root, "task_1", task_root])
  325. self.mvs.execute("CD", [task_root, "frame", task_frame])
  326. self.mvs.execute("CD", [task_frame, "phase", param_b])
  327. self.mvs.execute("CD", [task_frame, "IP", inst])
  328. self.mvs.execute("CD", [inst, "params", self.mvs.execute("CN", [])[0]])
  329. self.mvs.execute("CD", [inst, "last_param", self.mvs.execute("CN", [])[0]])
  330. self.mvs.execute("CD", [task_frame, "returnvalue", returnvalue])
  331. self.mvs.execute("CD", [params, "value", param_value])
  332. self.mvs.execute("CD", [task_frame, "evalstack", evalstack])
  333. self.mvs.execute("CD", [new_frame, "caller", inst])
  334. self.mvs.execute("CD", [new_frame, "prev", task_frame])
  335. self.mvs.execute("CD", [new_frame, "symbols", symbols])
  336. self.mvs.execute("CD", [new_frame, "IP", body])
  337. self.mvs.execute("CD", [signature, "body", body])
  338. self.mvs.execute("CD", [signature, "params", params])
  339. self.mvs.execute("CD", [param_a, "name", formal_parameter_name])
  340. self.mvs.execute("CD", [param_b, "value", param_value])
  341. self.mvs.execute("CD", [param_a, "next_param", param_b])
  342. self.mvs.execute("CD", [param_b, "next_param", param_c])
  343. t1 = self.mvs.execute("CE", [params, formal_parameter])[0]
  344. self.mvs.execute("CE", [t1, formal_parameter_name])[0]
  345. # Do the invocation until it returns None
  346. execute_until_finished(self.mvk, self.mvs)
  347. # Execution of the command finished, so the MvS should be in the correct new state right now
  348. self.assertEquals(self.mvs.execute("RD", [root, "task_1"])[0], task_root)
  349. self.assertEquals(self.mvs.execute("RD", [task_root, "frame"])[0], task_frame)
  350. self.assertEquals(self.mvs.execute("RV", [self.mvs.execute("RD", [task_frame, "phase"])[0]])[0], "init")
  351. self.assertEquals(self.mvs.execute("RD", [task_frame, "IP"])[0], param_value)
  352. new_evalstack = self.mvs.execute("RD", [task_frame, "evalstack"])[0]
  353. self.assertNotEquals(evalstack, new_evalstack)
  354. self.assertEquals(self.mvs.execute("RD", [new_evalstack, "prev"])[0], evalstack)
  355. self.assertEquals(self.mvs.execute("RD", [evalstack, "inst"])[0], inst)
  356. self.assertEquals(self.mvs.execute("RD", [evalstack, "phase"])[0], param_c)
  357. var = self.mvs.execute("RDN", [symbols, formal_parameter])[0]
  358. self.assertNotEquals(var, None)
  359. self.assertEquals(self.mvs.execute("RD", [var, "value"])[0], returnvalue)