1
2
3 container environment [
4 recipe-errors:text
5 ]
6
7
8 def! update-recipes env:&:environment, resources:&:resources, screen:&:screen -> errors-found?:bool, env:&:environment, resources:&:resources, screen:&:screen [
9 local-scope
10 load-inputs
11 recipes:&:editor <- get *env, recipes:offset
12 in:text <- editor-contents recipes
13 resources <- dump resources, [lesson/recipes.mu], in
14 recipe-errors:text <- reload in
15 *env <- put *env, recipe-errors:offset, recipe-errors
16
17 {
18 break-unless recipe-errors
19 update-status screen, [errors found ], 1/red
20 errors-found? <- copy 1/true
21 return
22 }
23 errors-found? <- copy 0/false
24 ]
25
26 after <begin-run-sandboxes-on-F4> [
27 old-recipe-errors:text <- get *env, recipe-errors:offset
28 ]
29 before <end-run-sandboxes-on-F4> [
30
31 {
32 break-unless old-recipe-errors
33 screen <- render-recipes screen, env, render
34 }
35 screen <- render-recipe-errors env, screen
36 ]
37
38 before <end-render-recipe-components> [
39 screen <- render-recipe-errors env, screen
40 ]
41
42 def render-recipe-errors env:&:environment, screen:&:screen -> screen:&:screen [
43 local-scope
44 load-inputs
45 recipe-errors:text <- get *env, recipe-errors:offset
46 return-unless recipe-errors
47 recipes:&:editor <- get *env, recipes:offset
48 left:num <- get *recipes, left:offset
49 right:num <- get *recipes, right:offset
50 row:num <- get *recipes, bottom:offset
51 row, screen <- render-text screen, recipe-errors, left, right, 1/red, row
52
53 draw-horizontal screen, row, left, right, 9480/horizontal-dotted
54 row <- add row, 1
55 clear-screen-from screen, row, left, left, right
56 ]
57
58 container environment [
59 error-index:num
60 ]
61
62 after <programming-environment-initialization> [
63 *result <- put *result, error-index:offset, -1
64 ]
65
66 after <begin-run-sandboxes> [
67 *env <- put *env, error-index:offset, -1
68 ]
69
70 before <end-run-sandboxes> [
71 {
72 error-index:num <- get *env, error-index:offset
73 sandboxes-completed-successfully?:bool <- equal error-index, -1
74 break-if sandboxes-completed-successfully?
75 errors-found? <- copy 1/true
76 }
77 ]
78
79 before <end-run-sandboxes-on-F4> [
80 {
81 break-unless error?
82 recipe-errors:text <- get *env, recipe-errors:offset
83 break-if recipe-errors
84 error-index:num <- get *env, error-index:offset
85 sandboxes-completed-successfully?:bool <- equal error-index, -1
86 break-if sandboxes-completed-successfully?
87 error-index-text:text <- to-text error-index
88 status:text <- interpolate [errors found (_) ], error-index-text
89 update-status screen, status, 1/red
90 }
91 ]
92
93 container sandbox [
94 errors:text
95 ]
96
97 def! update-sandbox sandbox:&:sandbox, env:&:environment, idx:num -> sandbox:&:sandbox, env:&:environment [
98 local-scope
99 load-inputs
100 data:text <- get *sandbox, data:offset
101 response:text, errors:text, fake-screen:&:screen, trace:text, completed?:bool <- run-sandboxed data
102 *sandbox <- put *sandbox, response:offset, response
103 *sandbox <- put *sandbox, errors:offset, errors
104 *sandbox <- put *sandbox, screen:offset, fake-screen
105 *sandbox <- put *sandbox, trace:offset, trace
106 {
107 break-if errors
108 break-if completed?
109 errors <- new [took too long!
110 ]
111 *sandbox <- put *sandbox, errors:offset, errors
112 }
113 {
114 break-unless errors
115 error-index:num <- get *env, error-index:offset
116 error-not-set?:bool <- equal error-index, -1
117 break-unless error-not-set?
118 *env <- put *env, error-index:offset, idx
119 }
120 ]
121
122
123 after <render-sandbox-trace-done> [
124 {
125 sandbox-errors:text <- get *sandbox, errors:offset
126 break-unless sandbox-errors
127 *sandbox <- put *sandbox, response-starting-row-on-screen:offset, 0
128 row, screen <- render-text screen, sandbox-errors, left, right, 1/red, row
129
130 jump +render-sandbox-end
131 }
132 ]
133
134 scenario run-shows-errors-in-get [
135 local-scope
136 trace-until 100/app
137 assume-screen 100/width, 15/height
138 assume-resources [
139 [lesson/recipes.mu] <- [
140 |recipe foo [|
141 | get 123:num, foo:offset|
142 |]|
143 ]
144 ]
145 env:&:environment <- new-programming-environment resources, screen, [foo]
146 render-all screen, env, render
147 screen-should-contain [
148 . run (F4) .
149 .recipe foo [ ╎foo .
150 . get 123:num, foo:offset ╎─────────────────────────────────────────────────.
151 .] ╎ .
152 . ╎ .
153 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
154 . ╎ .
155 ]
156 assume-console [
157 press F4
158 ]
159 run [
160 event-loop screen, console, env, resources
161 ]
162 screen-should-contain [
163 . errors found run (F4) .
164 .recipe foo [ ╎foo .
165 . get 123:num, foo:offset ╎─────────────────────────────────────────────────.
166 .] ╎ .
167 .foo: unknown element 'foo' in container 'number' ╎ .
168 .foo: first ingredient of 'get' should be a contai↩╎ .
169 .ner, but got '123:num' ╎ .
170 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
171 . ╎ .
172 ]
173 screen-should-contain-in-color 1/red, [
174 . errors found .
175 . .
176 . .
177 . .
178 .foo: unknown element 'foo' in container 'number' .
179 .foo: first ingredient of 'get' should be a contai .
180 .ner, but got '123:num' .
181 . .
182 ]
183 ]
184
185 scenario run-updates-status-with-first-erroneous-sandbox [
186 local-scope
187 trace-until 100/app
188 assume-screen 100/width, 15/height
189 assume-resources [
190 ]
191 env:&:environment <- new-programming-environment resources, screen, []
192 render-all screen, env, render
193 assume-console [
194 left-click 3, 80
195
196 type [get foo, x:offset]
197 press F4
198
199 type [get foo, x:offset]
200 press F4
201 ]
202 run [
203 event-loop screen, console, env, resources
204 ]
205
206 screen-should-contain [
207 . errors found (0) run (F4) .
208 ]
209 ]
210
211 scenario run-updates-status-with-first-erroneous-sandbox-2 [
212 local-scope
213 trace-until 100/app
214 assume-screen 100/width, 15/height
215 assume-resources [
216 ]
217 env:&:environment <- new-programming-environment resources, screen, []
218 render-all screen, env, render
219 assume-console [
220 left-click 3, 80
221
222 type [get foo, x:offset]
223 press F4
224
225 type [get foo, x:offset]
226 press F4
227
228 type [add 2, 2]
229 press F4
230 ]
231 run [
232 event-loop screen, console, env, resources
233 ]
234
235 screen-should-contain [
236 . errors found (1) run (F4) .
237 ]
238 ]
239
240 scenario run-hides-errors-from-past-sandboxes [
241 local-scope
242 trace-until 100/app
243 assume-screen 100/width, 15/height
244 assume-resources [
245 ]
246 env:&:environment <- new-programming-environment resources, screen, [get foo, x:offset]
247 render-all screen, env, render
248 assume-console [
249 press F4
250 ]
251 event-loop screen, console, env, resources
252 assume-console [
253 left-click 3, 58
254 press ctrl-k
255 type [add 2, 2]
256 press F4
257 ]
258 run [
259 event-loop screen, console, env, resources
260 ]
261
262 screen-should-contain [
263 . run (F4) .
264 . ╎ .
265 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
266 . ╎0 edit copy to recipe delete .
267 . ╎add 2, 2 .
268 . ╎4 .
269 . ╎─────────────────────────────────────────────────.
270 . ╎ .
271 ]
272 ]
273
274 scenario run-updates-errors-for-shape-shifting-recipes [
275 local-scope
276 trace-until 100/app
277 assume-screen 100/width, 15/height
278
279 assume-resources [
280 [lesson/recipes.mu] <- [
281 |recipe foo x:_elem -> z:_elem [|
282 | local-scope|
283 | load-ingredients|
284 | y:&:num <- copy 0|
285 | z <- add x, y|
286 |]|
287 ]
288 ]
289 env:&:environment <- new-programming-environment resources, screen, [foo 2]
290 render-all screen, env, render
291 assume-console [
292 press F4
293 ]
294 event-loop screen, console, env, resources
295 screen-should-contain [
296 . errors found (0) run (F4) .
297 .recipe foo x:_elem -> z:_elem [ ╎ .
298 . local-scope ╎─────────────────────────────────────────────────.
299 . load-ingredients ╎0 edit copy to recipe delete .
300 . y:&:num <- copy 0 ╎foo 2 .
301 . z <- add x, y ╎foo_2: 'add' requires number ingredients, but go↩.
302 .] ╎t 'y' .
303 . ╎─────────────────────────────────────────────────.
304 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
305 . ╎ .
306 ]
307
308 assume-console [
309 press F4
310 ]
311 run [
312 event-loop screen, console, env, resources
313 ]
314
315 screen-should-contain [
316 . errors found (0) run (F4) .
317 .recipe foo x:_elem -> z:_elem [ ╎ .
318 . local-scope ╎─────────────────────────────────────────────────.
319 . load-ingredients ╎0 edit copy to recipe delete .
320 . y:&:num <- copy 0 ╎foo 2 .
321 . z <- add x, y ╎foo_3: 'add' requires number ingredients, but go↩.
322 .] ╎t 'y' .
323 . ╎─────────────────────────────────────────────────.
324 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
325 . ╎ .
326 ]
327 ]
328
329 scenario run-avoids-spurious-errors-on-reloading-shape-shifting-recipes [
330 local-scope
331 trace-until 100/app
332 assume-screen 100/width, 15/height
333
334 assume-resources [
335 [lesson/recipes.mu] <- [
336 |recipe length l:&:list:_elem -> n:num [|
337 |]|
338 ]
339 ]
340
341 test-sandbox:text <- new [x:&:list:num <- copy 0
342 to-text x]
343 env:&:environment <- new-programming-environment resources, screen, test-sandbox
344 render-all screen, env, render
345
346 assume-console [
347 press F4
348 ]
349 event-loop screen, console, env, resources
350
351 screen-should-contain-in-color 1/red, [
352 . .
353 . .
354 . .
355 . .
356 . <- .
357 . .
358 . .
359 . .
360 . .
361 . .
362 . .
363 . .
364 . .
365 . .
366 . .
367 ]
368
369 assume-console [
370 press F4
371 ]
372 run [
373 event-loop screen, console, env, resources
374 ]
375
376 screen-should-contain-in-color 1/red, [
377 . .
378 . .
379 . .
380 . .
381 . <- .
382 . .
383 . .
384 . .
385 . .
386 . .
387 . .
388 . .
389 . .
390 . .
391 . .
392 ]
393 ]
394
395 scenario run-shows-missing-type-errors [
396 local-scope
397 trace-until 100/app
398 assume-screen 100/width, 15/height
399 assume-resources [
400 [lesson/recipes.mu] <- [
401 |recipe foo [|
402 | x <- copy 0|
403 |]|
404 ]
405 ]
406 env:&:environment <- new-programming-environment resources, screen, [foo]
407 render-all screen, env, render
408 assume-console [
409 press F4
410 ]
411 run [
412 event-loop screen, console, env, resources
413 ]
414 screen-should-contain [
415 . errors found run (F4) .
416 .recipe foo [ ╎foo .
417 . x <- copy 0 ╎─────────────────────────────────────────────────.
418 .] ╎ .
419 .foo: missing type for 'x' in 'x <- copy 0' ╎ .
420 .foo: can't copy '0' to 'x'; types don't match ╎ .
421 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
422 . ╎ .
423 ]
424 ]
425
426 scenario run-shows-unbalanced-bracket-errors [
427 local-scope
428 trace-until 100/app
429 assume-screen 100/width, 15/height
430
431 assume-resources [
432 [lesson/recipes.mu] <- [
433 |recipe foo \\\[|
434 | x <- copy 0|
435 ]
436 ]
437 env:&:environment <- new-programming-environment resources, screen, [foo]
438 render-all screen, env, render
439 assume-console [
440 press F4
441 ]
442 run [
443 event-loop screen, console, env, resources
444 ]
445 screen-should-contain [
446 . errors found run (F4) .
447 .recipe foo \\[ ╎foo .
448 . x <- copy 0 ╎─────────────────────────────────────────────────.
449 .9: unbalanced '\\[' for recipe ╎ .
450 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
451 . ╎ .
452 ]
453 ]
454
455 scenario run-shows-get-on-non-container-errors [
456 local-scope
457 trace-until 100/app
458 assume-screen 100/width, 15/height
459 assume-resources [
460 [lesson/recipes.mu] <- [
461 |recipe foo [|
462 | local-scope|
463 | x:&:point <- new point:type|
464 | get x:&:point, 1:offset|
465 |]|
466 ]
467 ]
468 env:&:environment <- new-programming-environment resources, screen, [foo]
469 render-all screen, env, render
470 assume-console [
471 press F4
472 ]
473 run [
474 event-loop screen, console, env, resources
475 ]
476 screen-should-contain [
477 . errors found run (F4) .
478 .recipe foo [ ╎foo .
479 . local-scope ╎─────────────────────────────────────────────────.
480 . x:&:point <- new point:type ╎ .
481 . get x:&:point, 1:offset ╎ .
482 .] ╎ .
483 .foo: first ingredient of 'get' should be a contai↩╎ .
484 .ner, but got 'x:&:point' ╎ .
485 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
486 . ╎ .
487 ]
488 ]
489
490 scenario run-shows-non-literal-get-argument-errors [
491 local-scope
492 trace-until 100/app
493 assume-screen 100/width, 15/height
494 assume-resources [
495 [lesson/recipes.mu] <- [
496 |recipe foo [|
497 | local-scope|
498 | x:num <- copy 0|
499 | y:&:point <- new point:type|
500 | get *y:&:point, x:num|
501 |]|
502 ]
503 ]
504 env:&:environment <- new-programming-environment resources, screen, [foo]
505 render-all screen, env, render
506 assume-console [
507 press F4
508 ]
509 run [
510 event-loop screen, console, env, resources
511 ]
512 screen-should-contain [
513 . errors found run (F4) .
514 .recipe foo [ ╎foo .
515 . local-scope ╎─────────────────────────────────────────────────.
516 . x:num <- copy 0 ╎ .
517 . y:&:point <- new point:type ╎ .
518 . get *y:&:point, x:num ╎ .
519 .] ╎ .
520 .foo: second ingredient of 'get' should have type ↩╎ .
521 .'offset', but got 'x:num' ╎ .
522 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
523 . ╎ .
524 ]
525 ]
526
527 scenario run-shows-errors-every-time [
528 local-scope
529 trace-until 100/app
530 assume-screen 100/width, 15/height
531
532 assume-resources [
533 [lesson/recipes.mu] <- [
534 |recipe foo [|
535 | local-scope|
536 | x:num <- copy y:num|
537 |]|
538 ]
539 ]
540 env:&:environment <- new-programming-environment resources, screen, [foo]
541 render-all screen, env, render
542 assume-console [
543 press F4
544 ]
545 event-loop screen, console, env, resources
546 screen-should-contain [
547 . errors found run (F4) .
548 .recipe foo [ ╎foo .
549 . local-scope ╎─────────────────────────────────────────────────.
550 . x:num <- copy y:num ╎ .
551 .] ╎ .
552 .foo: tried to read ingredient 'y' in 'x:num <- co↩╎ .
553 .py y:num' but it hasn't been written to yet ╎ .
554 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
555 . ╎ .
556 ]
557
558 assume-console [
559 press F4
560 ]
561 run [
562 event-loop screen, console, env, resources
563 ]
564 screen-should-contain [
565 . errors found run (F4) .
566 .recipe foo [ ╎foo .
567 . local-scope ╎─────────────────────────────────────────────────.
568 . x:num <- copy y:num ╎ .
569 .] ╎ .
570 .foo: tried to read ingredient 'y' in 'x:num <- co↩╎ .
571 .py y:num' but it hasn't been written to yet ╎ .
572 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
573 . ╎ .
574 ]
575 ]
576
577 scenario run-hides-errors [
578 local-scope
579 trace-until 100/app
580 assume-screen 100/width, 15/height
581
582 assume-resources [
583 [lesson/recipes.mu] <- [
584 |recipe foo [|
585 | local-scope|
586 | x:num <- copy y:num|
587 |]|
588 ]
589 ]
590 env:&:environment <- new-programming-environment resources, screen, [foo]
591 render-all screen, env, render
592 assume-console [
593 press F4
594 ]
595 event-loop screen, console, env, resources
596 screen-should-contain [
597 . errors found run (F4) .
598 .recipe foo [ ╎foo .
599 . local-scope ╎─────────────────────────────────────────────────.
600 . x:num <- copy y:num ╎ .
601 .] ╎ .
602 .foo: tried to read ingredient 'y' in 'x:num <- co↩╎ .
603 .py y:num' but it hasn't been written to yet ╎ .
604 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
605 . ╎ .
606 ]
607
608 assume-console [
609 left-click 3, 16
610 press ctrl-k
611 type [0]
612 press F4
613 ]
614 event-loop screen, console, env, resources
615
616 screen-should-contain [
617 . run (F4) .
618 .recipe foo [ ╎ .
619 . local-scope ╎─────────────────────────────────────────────────.
620 . x:num <- copy 0 ╎0 edit copy to recipe delete .
621 .] ╎foo .
622 . ╎─────────────────────────────────────────────────.
623 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
624 . ╎ .
625 ]
626 ]
627
628 scenario scrolling-recipe-side-reveals-errors [
629 local-scope
630 trace-until 100/app
631 assume-screen 100/width, 5/height
632
633 assume-resources [
634 [lesson/recipes.mu] <- [
635 |recipe foo [|
636 | a:num <- copy 0| # padding to overflow recipe side
637 | b:num <- copy 0| # padding to overflow recipe side
638 | get 123:num, foo:offset| # line containing error
639 |]|
640 ]
641 ]
642 env:&:environment <- new-programming-environment resources, screen, [foo]
643 render-all screen, env, render
644
645 assume-console [
646 press F4
647 press page-down
648 ]
649 run [
650 event-loop screen, console, env, resources
651 ]
652
653 screen-should-contain [
654 . errors found run (F4) .
655 . get 123:num, foo:offset ╎foo .
656 .\\] ╎─────────────────────────────────────────────────.
657 .foo: unknown element 'foo' in container 'number' ╎ .
658 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
659 ]
660 ]
661
662 scenario run-instruction-and-print-errors [
663 local-scope
664 trace-until 100/app
665 assume-screen 100/width, 10/height
666 assume-resources [
667 ]
668
669 env:&:environment <- new-programming-environment resources, screen, [get 1234:num, foo:offset]
670 render-all screen, env, render
671 assume-console [
672 press F4
673 ]
674 run [
675 event-loop screen, console, env, resources
676 ]
677
678 screen-should-contain [
679 . errors found (0) run (F4) .
680 . ╎ .
681 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
682 . ╎0 edit copy to recipe delete .
683 . ╎get 1234:num, foo:offset .
684 . ╎unknown element 'foo' in container 'number' .
685 . ╎first ingredient of 'get' should be a container,↩.
686 . ╎ but got '1234:num' .
687 . ╎─────────────────────────────────────────────────.
688 . ╎ .
689 ]
690 screen-should-contain-in-color 7/white, [
691 . .
692 . .
693 . .
694 . .
695 . get 1234:num, foo:offset .
696 . .
697 . .
698 . .
699 ]
700 screen-should-contain-in-color 1/red, [
701 . errors found (0) .
702 . .
703 . .
704 . .
705 . .
706 . unknown element 'foo' in container 'number' .
707 . first ingredient of 'get' should be a container, .
708 . but got '1234:num' .
709 . .
710 ]
711 screen-should-contain-in-color 245/grey, [
712 . .
713 . ╎ .
714 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
715 . ╎ .
716 . ╎ .
717 . ╎ .
718 . ╎ ↩.
719 . ╎ .
720 . ╎─────────────────────────────────────────────────.
721 . ╎ .
722 ]
723 ]
724
725 scenario run-instruction-and-print-errors-only-once [
726 local-scope
727 trace-until 100/app
728 assume-screen 100/width, 10/height
729 assume-resources [
730 ]
731
732 env:&:environment <- new-programming-environment resources, screen, [get 1234:num, foo:offset]
733 render-all screen, env, render
734
735 assume-console [
736 press F4
737 press F4
738 ]
739 run [
740 event-loop screen, console, env, resources
741 ]
742
743 screen-should-contain [
744 . errors found (0) run (F4) .
745 . ╎ .
746 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────.
747 . ╎0 edit copy to recipe delete .
748 . ╎get 1234:num, foo:offset .
749 . ╎unknown element 'foo' in container 'number' .
750 . ╎first ingredient of 'get' should be a container,↩.
751 . ╎ but got '1234:num' .
752 . ╎─────────────────────────────────────────────────.
753 . ╎ .
754 ]
755 ]
756
757 scenario sandbox-can-handle-infinite-loop [
758 local-scope
759 trace-until 100/app
760 assume-screen 100/width, 20/height
761
762 assume-resources [
763 [lesson/recipes.mu] <- [
764 |recipe foo [|
765 | {|
766 | loop|
767 | }|
768 |]|
769 ]
770 ]
771 env:&:environment <- new-programming-environment resources, screen, [foo]
772 render-all screen, env, render
773
774 assume-console [
775 press F4
776 ]
777 run [
778 event-loop screen, console, env, resources
779 ]
780 screen-should-contain [
781 . errors found (0) run (F4) .
782 .recipe foo [ ╎ .
783 . { ╎─────────────────────────────────────────────────.
784 . loop ╎0 edit copy to recipe delete .
785 . } ╎foo .
786 .] ╎took too long! .
787 . ╎─────────────────────────────────────────────────.
788 .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ .
789 . ╎ .
790 ]
791 ]
792
793 scenario sandbox-with-errors-shows-trace [
794 local-scope
795 trace-until 100/app
796 assume-screen 100/width, 10/height
797
798 assume-resources [
799 [lesson/recipes.mu] <- [
800 |recipe foo [|
801 | local-scope|
802 | a:num <- next-ingredient|
803 | b:num <- next-ingredient|
804 | stash [dividing by], b|
805 | _, c:num <- divide-with-remainder a, b|
806 | reply b|
807 |]|
808 ]
809 ]
810 env:&:environment <- new-programming-environment resources, screen, [foo 4, 0]
811 render-all screen, env, render
812
813 assume-console [
814 press F4
815 ]
816 event-loop screen, console, env, resources
817
818 screen-should-contain [
819 . errors found (0) run (F4) .
820 .recipe foo [ ╎ .
821 . local-scope ╎─────────────────────────────────────────────────.
822 . a:num <- next-ingredient ╎0 edit copy to recipe delete .
823 . b:num <- next-ingredient ╎foo 4, 0 .
824 . stash [dividing by], b ╎foo: divide by zero in '_, c:num <- divide-with-↩.
825 . _, c:num <- divide-with-remainder a, b ╎remainder a, b' .
826 . reply b ╎─────────────────────────────────────────────────.
827 .] ╎ .
828 . ╎ .
829 ]
830
831 assume-console [
832 left-click 4, 55
833 ]
834 run [
835 event-loop screen, console, env, resources
836 ]
837
838 screen-should-contain [
839 . errors found (0) run (F4) .
840 .recipe foo [ ╎ .
841 . local-scope ╎─────────────────────────────────────────────────.
842 . a:num <- next-ingredient ╎0 edit copy to recipe delete .
843 . b:num <- next-ingredient ╎foo 4, 0 .
844 . stash [dividing by], b ╎dividing by 0 .
845 . _, c:num <- divide-with-remainder a, b ╎14 instructions run .
846 . reply b ╎foo: divide by zero in '_, c:num <- divide-with-↩.
847 .] ╎remainder a, b' .
848 . ╎─────────────────────────────────────────────────.
849 ]
850 ]