test_rules_call.py 22 KB

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