From fadb576efca5586fc67bdc3f69fc32e86fc3bb01 Mon Sep 17 00:00:00 2001 From: "Kartik K. Agaram" Date: Tue, 14 Mar 2017 11:21:22 -0700 Subject: 3796 Standardize the order of some common blocks in `render`, `render-text` and `render-code`. This is preparation for trying to reorganize them to reduce duplicate code. --- html/edit/005-sandbox.mu.html | 1763 ++++++++++++++++++------------------ html/edit/009-sandbox-test.mu.html | 2 +- html/edit/011-errors.mu.html | 2 +- 3 files changed, 893 insertions(+), 874 deletions(-) (limited to 'html') diff --git a/html/edit/005-sandbox.mu.html b/html/edit/005-sandbox.mu.html index 99df1990..c50eb279 100644 --- a/html/edit/005-sandbox.mu.html +++ b/html/edit/005-sandbox.mu.html @@ -74,7 +74,7 @@ if ('onhashchange' in window) { 11 local-scope 12 open-console 13 env:&:environment <- new-programming-environment 0/filesystem, 0/screen - 14 env <- restore-sandboxes env + 14 env <- restore-sandboxes env 15 render-all 0/screen, env, render 16 event-loop 0/screen, 0/console, env, 0/filesystem 17 # never gets here @@ -212,7 +212,7 @@ if ('onhashchange' in window) { 149 <run-sandboxes-begin> 150 current-sandbox:&:editor <- get *env, current-sandbox:offset 151 { - 152 ¦ sandbox-contents:text <- editor-contents current-sandbox + 152 ¦ sandbox-contents:text <- editor-contents current-sandbox 153 ¦ break-unless sandbox-contents 154 ¦ # if contents exist, first save them 155 ¦ # run them and turn them into a new sandbox @@ -257,7 +257,7 @@ if ('onhashchange' in window) { 194 local-scope 195 load-ingredients 196 recipes:&:editor <- get *env, recipes:offset - 197 in:text <- editor-contents recipes + 197 in:text <- editor-contents recipes 198 resources <- dump resources, [lesson/recipes.mu], in 199 reload in 200 errors-found? <- copy 0/false @@ -344,7 +344,7 @@ if ('onhashchange' in window) { 281 ¦ row <- add row, 1 282 ¦ screen <- move-cursor screen, row, left 283 ¦ sandbox-data:text <- get *sandbox, data:offset - 284 ¦ row, screen <- render-code screen, sandbox-data, left, right, row + 284 ¦ row, screen <- render-code screen, sandbox-data, left, right, row 285 ¦ *sandbox <- put *sandbox, code-ending-row-on-screen:offset, row 286 ¦ # render sandbox warnings, screen or response, in that order 287 ¦ sandbox-response:text <- get *sandbox, response:offset @@ -353,7 +353,7 @@ if ('onhashchange' in window) { 290 ¦ ¦ sandbox-screen:&:screen <- get *sandbox, screen:offset 291 ¦ ¦ empty-screen?:bool <- fake-screen-is-empty? sandbox-screen 292 ¦ ¦ break-if empty-screen? - 293 ¦ ¦ row, screen <- render-screen screen, sandbox-screen, left, right, row + 293 ¦ ¦ row, screen <- render-screen screen, sandbox-screen, left, right, row 294 ¦ } 295 ¦ { 296 ¦ ¦ break-unless empty-screen? @@ -438,910 +438,929 @@ if ('onhashchange' in window) { 375 ¦ break-if done? 376 ¦ c:char <- index *s, i 377 ¦ { - 378 ¦ ¦ # at right? wrap. - 379 ¦ ¦ at-right?:bool <- equal column, right - 380 ¦ ¦ break-unless at-right? - 381 ¦ ¦ # print wrap icon - 382 ¦ ¦ wrap-icon:char <- copy 8617/loop-back-to-left - 383 ¦ ¦ print screen, wrap-icon, 245/grey - 384 ¦ ¦ column <- copy left - 385 ¦ ¦ row <- add row, 1 - 386 ¦ ¦ screen <- move-cursor screen, row, column - 387 ¦ ¦ loop +next-character # retry i - 388 ¦ } - 389 ¦ i <- add i, 1 - 390 ¦ { - 391 ¦ ¦ # newline? move to left rather than 0 - 392 ¦ ¦ newline?:bool <- equal c, 10/newline - 393 ¦ ¦ break-unless newline? - 394 ¦ ¦ # clear rest of line in this window - 395 ¦ ¦ { - 396 ¦ ¦ ¦ done?:bool <- greater-than column, right - 397 ¦ ¦ ¦ break-if done? - 398 ¦ ¦ ¦ space:char <- copy 32/space - 399 ¦ ¦ ¦ print screen, space - 400 ¦ ¦ ¦ column <- add column, 1 - 401 ¦ ¦ ¦ loop - 402 ¦ ¦ } - 403 ¦ ¦ row <- add row, 1 - 404 ¦ ¦ column <- copy left + 378 ¦ ¦ # newline? move to left rather than 0 + 379 ¦ ¦ newline?:bool <- equal c, 10/newline + 380 ¦ ¦ break-unless newline? + 381 ¦ ¦ # clear rest of line in this window + 382 ¦ ¦ { + 383 ¦ ¦ ¦ done?:bool <- greater-than column, right + 384 ¦ ¦ ¦ break-if done? + 385 ¦ ¦ ¦ space:char <- copy 32/space + 386 ¦ ¦ ¦ print screen, space + 387 ¦ ¦ ¦ column <- add column, 1 + 388 ¦ ¦ ¦ loop + 389 ¦ ¦ } + 390 ¦ ¦ row <- add row, 1 + 391 ¦ ¦ column <- copy left + 392 ¦ ¦ screen <- move-cursor screen, row, column + 393 ¦ ¦ i <- add i, 1 + 394 ¦ ¦ loop +next-character + 395 ¦ } + 396 ¦ { + 397 ¦ ¦ # at right? wrap. + 398 ¦ ¦ at-right?:bool <- equal column, right + 399 ¦ ¦ break-unless at-right? + 400 ¦ ¦ # print wrap icon + 401 ¦ ¦ wrap-icon:char <- copy 8617/loop-back-to-left + 402 ¦ ¦ print screen, wrap-icon, 245/grey + 403 ¦ ¦ column <- copy left + 404 ¦ ¦ row <- add row, 1 405 ¦ ¦ screen <- move-cursor screen, row, column - 406 ¦ ¦ loop +next-character - 407 ¦ } - 408 ¦ print screen, c, color - 409 ¦ column <- add column, 1 - 410 ¦ loop - 411 } - 412 was-at-left?:bool <- equal column, left - 413 clear-line-until screen, right - 414 { - 415 ¦ break-if was-at-left? - 416 ¦ row <- add row, 1 - 417 } - 418 move-cursor screen, row, left - 419 ] - 420 - 421 # like 'render-text', but with colorization for comments like in the editor - 422 def render-code screen:&:screen, s:text, left:num, right:num, row:num -> row:num, screen:&:screen [ - 423 local-scope - 424 load-ingredients - 425 return-unless s - 426 color:num <- copy 7/white - 427 column:num <- copy left - 428 screen <- move-cursor screen, row, column - 429 screen-height:num <- screen-height screen - 430 i:num <- copy 0 - 431 len:num <- length *s - 432 { - 433 ¦ +next-character - 434 ¦ done?:bool <- greater-or-equal i, len - 435 ¦ break-if done? - 436 ¦ done? <- greater-or-equal row, screen-height - 437 ¦ break-if done? - 438 ¦ c:char <- index *s, i - 439 ¦ <character-c-received> # only line different from 'render-text' - 440 ¦ { - 441 ¦ ¦ # at right? wrap. - 442 ¦ ¦ at-right?:bool <- equal column, right - 443 ¦ ¦ break-unless at-right? - 444 ¦ ¦ # print wrap icon - 445 ¦ ¦ wrap-icon:char <- copy 8617/loop-back-to-left - 446 ¦ ¦ print screen, wrap-icon, 245/grey - 447 ¦ ¦ column <- copy left - 448 ¦ ¦ row <- add row, 1 - 449 ¦ ¦ screen <- move-cursor screen, row, column - 450 ¦ ¦ loop +next-character # retry i - 451 ¦ } - 452 ¦ i <- add i, 1 - 453 ¦ { - 454 ¦ ¦ # newline? move to left rather than 0 - 455 ¦ ¦ newline?:bool <- equal c, 10/newline - 456 ¦ ¦ break-unless newline? - 457 ¦ ¦ # clear rest of line in this window - 458 ¦ ¦ { - 459 ¦ ¦ ¦ done?:bool <- greater-than column, right - 460 ¦ ¦ ¦ break-if done? - 461 ¦ ¦ ¦ space:char <- copy 32/space - 462 ¦ ¦ ¦ print screen, space - 463 ¦ ¦ ¦ column <- add column, 1 - 464 ¦ ¦ ¦ loop - 465 ¦ ¦ } - 466 ¦ ¦ row <- add row, 1 - 467 ¦ ¦ column <- copy left - 468 ¦ ¦ screen <- move-cursor screen, row, column - 469 ¦ ¦ loop +next-character - 470 ¦ } - 471 ¦ print screen, c, color - 472 ¦ column <- add column, 1 - 473 ¦ loop - 474 } - 475 was-at-left?:bool <- equal column, left - 476 clear-line-until screen, right - 477 { - 478 ¦ break-if was-at-left? - 479 ¦ row <- add row, 1 - 480 } - 481 move-cursor screen, row, left - 482 ] - 483 - 484 # assumes programming environment has no sandboxes; restores them from previous session - 485 def restore-sandboxes env:&:environment, resources:&:resources -> env:&:environment [ - 486 local-scope - 487 load-ingredients - 488 # read all scenarios, pushing them to end of a list of scenarios - 489 idx:num <- copy 0 - 490 curr:&:sandbox <- copy 0 - 491 prev:&:sandbox <- copy 0 - 492 { - 493 ¦ filename:text <- append [lesson/], idx - 494 ¦ contents:text <- slurp resources, filename - 495 ¦ break-unless contents # stop at first error; assuming file didn't exist - 496 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ # todo: handle empty sandbox - 497 ¦ # create new sandbox for file - 498 ¦ curr <- new sandbox:type - 499 ¦ *curr <- put *curr, data:offset, contents - 500 ¦ <end-restore-sandbox> - 501 ¦ { - 502 ¦ ¦ break-if idx - 503 ¦ ¦ *env <- put *env, sandbox:offset, curr - 504 ¦ } - 505 ¦ { - 506 ¦ ¦ break-unless idx - 507 ¦ ¦ *prev <- put *prev, next-sandbox:offset, curr - 508 ¦ } - 509 ¦ idx <- add idx, 1 - 510 ¦ prev <- copy curr - 511 ¦ loop - 512 } - 513 # update sandbox count - 514 *env <- put *env, number-of-sandboxes:offset, idx - 515 ] - 516 - 517 # print the fake sandbox screen to 'screen' with appropriate delimiters - 518 # leave cursor at start of next line - 519 def render-screen screen:&:screen, sandbox-screen:&:screen, left:num, right:num, row:num -> row:num, screen:&:screen [ - 520 local-scope - 521 load-ingredients - 522 return-unless sandbox-screen - 523 # print 'screen:' - 524 row <- render-text screen, [screen:], left, right, 245/grey, row - 525 screen <- move-cursor screen, row, left - 526 # start printing sandbox-screen - 527 column:num <- copy left - 528 s-width:num <- screen-width sandbox-screen - 529 s-height:num <- screen-height sandbox-screen - 530 buf:&:@:screen-cell <- get *sandbox-screen, data:offset - 531 stop-printing:num <- add left, s-width, 3 - 532 max-column:num <- min stop-printing, right - 533 i:num <- copy 0 - 534 len:num <- length *buf - 535 screen-height:num <- screen-height screen - 536 { - 537 ¦ done?:bool <- greater-or-equal i, len - 538 ¦ break-if done? - 539 ¦ done? <- greater-or-equal row, screen-height - 540 ¦ break-if done? - 541 ¦ column <- copy left - 542 ¦ screen <- move-cursor screen, row, column - 543 ¦ # initial leader for each row: two spaces and a '.' - 544 ¦ space:char <- copy 32/space - 545 ¦ print screen, space, 245/grey - 546 ¦ print screen, space, 245/grey - 547 ¦ full-stop:char <- copy 46/period - 548 ¦ print screen, full-stop, 245/grey - 549 ¦ column <- add left, 3 - 550 ¦ { - 551 ¦ ¦ # print row - 552 ¦ ¦ row-done?:bool <- greater-or-equal column, max-column - 553 ¦ ¦ break-if row-done? - 554 ¦ ¦ curr:screen-cell <- index *buf, i - 555 ¦ ¦ c:char <- get curr, contents:offset - 556 ¦ ¦ color:num <- get curr, color:offset - 557 ¦ ¦ { - 558 ¦ ¦ ¦ # damp whites down to grey - 559 ¦ ¦ ¦ white?:bool <- equal color, 7/white - 560 ¦ ¦ ¦ break-unless white? - 561 ¦ ¦ ¦ color <- copy 245/grey - 562 ¦ ¦ } - 563 ¦ ¦ print screen, c, color - 564 ¦ ¦ column <- add column, 1 - 565 ¦ ¦ i <- add i, 1 - 566 ¦ ¦ loop - 567 ¦ } - 568 ¦ # print final '.' - 569 ¦ print screen, full-stop, 245/grey - 570 ¦ column <- add column, 1 - 571 ¦ { - 572 ¦ ¦ # clear rest of current line - 573 ¦ ¦ line-done?:bool <- greater-than column, right - 574 ¦ ¦ break-if line-done? - 575 ¦ ¦ print screen, space - 576 ¦ ¦ column <- add column, 1 - 577 ¦ ¦ loop - 578 ¦ } - 579 ¦ row <- add row, 1 - 580 ¦ loop - 581 } - 582 ] - 583 - 584 scenario run-updates-results [ - 585 local-scope - 586 trace-until 100/app # trace too long - 587 assume-screen 100/width, 12/height - 588 # define a recipe (no indent for the 'add' line below so column numbers are more obvious) - 589 assume-resources [ - 590 ¦ [lesson/recipes.mu] <- [ - 591 ¦ ¦ || - 592 ¦ ¦ |recipe foo [| - 593 ¦ ¦ | local-scope| - 594 ¦ ¦ | z:num <- add 2, 2| - 595 ¦ ¦ | reply z| - 596 ¦ ¦ |]| - 597 ¦ ] - 598 ] - 599 # sandbox editor contains an instruction without storing outputs - 600 env:&:environment <- new-programming-environment resources, screen, [foo] # contents of sandbox editor - 601 # run the code in the editors - 602 assume-console [ - 603 ¦ press F4 - 604 ] - 605 event-loop screen, console, env, resources - 606 screen-should-contain [ - 607 ¦ . run (F4) . - 608 ¦ . ╎ . - 609 ¦ .recipe foo [ ╎─────────────────────────────────────────────────. - 610 ¦ . local-scope ╎0 edit copy delete . - 611 ¦ . z:num <- add 2, 2 ╎foo . - 612 ¦ . reply z ╎4 . - 613 ¦ .] ╎─────────────────────────────────────────────────. - 614 ¦ . ╎ . - 615 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . - 616 ¦ . ╎ . + 406 ¦ ¦ # don't increment i + 407 ¦ ¦ loop +next-character + 408 ¦ } + 409 ¦ i <- add i, 1 + 410 ¦ print screen, c, color + 411 ¦ column <- add column, 1 + 412 ¦ loop + 413 } + 414 was-at-left?:bool <- equal column, left + 415 clear-line-until screen, right + 416 { + 417 ¦ break-if was-at-left? + 418 ¦ row <- add row, 1 + 419 } + 420 move-cursor screen, row, left + 421 ] + 422 + 423 scenario read-text-wraps-barely-long-lines [ + 424 local-scope + 425 assume-screen 5/width, 5/height + 426 s:text <- new [abcde] + 427 run [ + 428 ¦ render-text screen, s, 0/left, 4/right, 7/white, 1/row + 429 ] + 430 screen-should-contain [ + 431 ¦ . . + 432 ¦ .abcd↩. + 433 ¦ .e . + 434 ¦ . . + 435 ] + 436 ] + 437 + 438 # like 'render-text', but with colorization for comments like in the editor + 439 def render-code screen:&:screen, s:text, left:num, right:num, row:num -> row:num, screen:&:screen [ + 440 local-scope + 441 load-ingredients + 442 return-unless s + 443 color:num <- copy 7/white + 444 column:num <- copy left + 445 screen <- move-cursor screen, row, column + 446 screen-height:num <- screen-height screen + 447 i:num <- copy 0 + 448 len:num <- length *s + 449 { + 450 ¦ +next-character + 451 ¦ done?:bool <- greater-or-equal i, len + 452 ¦ break-if done? + 453 ¦ done? <- greater-or-equal row, screen-height + 454 ¦ break-if done? + 455 ¦ c:char <- index *s, i + 456 ¦ <character-c-received> # only line different from 'render-text' + 457 ¦ { + 458 ¦ ¦ # newline? move to left rather than 0 + 459 ¦ ¦ newline?:bool <- equal c, 10/newline + 460 ¦ ¦ break-unless newline? + 461 ¦ ¦ # clear rest of line in this window + 462 ¦ ¦ { + 463 ¦ ¦ ¦ done?:bool <- greater-than column, right + 464 ¦ ¦ ¦ break-if done? + 465 ¦ ¦ ¦ space:char <- copy 32/space + 466 ¦ ¦ ¦ print screen, space + 467 ¦ ¦ ¦ column <- add column, 1 + 468 ¦ ¦ ¦ loop + 469 ¦ ¦ } + 470 ¦ ¦ row <- add row, 1 + 471 ¦ ¦ column <- copy left + 472 ¦ ¦ screen <- move-cursor screen, row, column + 473 ¦ ¦ i <- add i, 1 + 474 ¦ ¦ loop +next-character + 475 ¦ } + 476 ¦ { + 477 ¦ ¦ # at right? wrap. + 478 ¦ ¦ at-right?:bool <- equal column, right + 479 ¦ ¦ break-unless at-right? + 480 ¦ ¦ # print wrap icon + 481 ¦ ¦ wrap-icon:char <- copy 8617/loop-back-to-left + 482 ¦ ¦ print screen, wrap-icon, 245/grey + 483 ¦ ¦ column <- copy left + 484 ¦ ¦ row <- add row, 1 + 485 ¦ ¦ screen <- move-cursor screen, row, column + 486 ¦ ¦ # don't increment i + 487 ¦ ¦ loop +next-character + 488 ¦ } + 489 ¦ i <- add i, 1 + 490 ¦ print screen, c, color + 491 ¦ column <- add column, 1 + 492 ¦ loop + 493 } + 494 was-at-left?:bool <- equal column, left + 495 clear-line-until screen, right + 496 { + 497 ¦ break-if was-at-left? + 498 ¦ row <- add row, 1 + 499 } + 500 move-cursor screen, row, left + 501 ] + 502 + 503 # assumes programming environment has no sandboxes; restores them from previous session + 504 def restore-sandboxes env:&:environment, resources:&:resources -> env:&:environment [ + 505 local-scope + 506 load-ingredients + 507 # read all scenarios, pushing them to end of a list of scenarios + 508 idx:num <- copy 0 + 509 curr:&:sandbox <- copy 0 + 510 prev:&:sandbox <- copy 0 + 511 { + 512 ¦ filename:text <- append [lesson/], idx + 513 ¦ contents:text <- slurp resources, filename + 514 ¦ break-unless contents # stop at first error; assuming file didn't exist + 515 ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦ # todo: handle empty sandbox + 516 ¦ # create new sandbox for file + 517 ¦ curr <- new sandbox:type + 518 ¦ *curr <- put *curr, data:offset, contents + 519 ¦ <end-restore-sandbox> + 520 ¦ { + 521 ¦ ¦ break-if idx + 522 ¦ ¦ *env <- put *env, sandbox:offset, curr + 523 ¦ } + 524 ¦ { + 525 ¦ ¦ break-unless idx + 526 ¦ ¦ *prev <- put *prev, next-sandbox:offset, curr + 527 ¦ } + 528 ¦ idx <- add idx, 1 + 529 ¦ prev <- copy curr + 530 ¦ loop + 531 } + 532 # update sandbox count + 533 *env <- put *env, number-of-sandboxes:offset, idx + 534 ] + 535 + 536 # print the fake sandbox screen to 'screen' with appropriate delimiters + 537 # leave cursor at start of next line + 538 def render-screen screen:&:screen, sandbox-screen:&:screen, left:num, right:num, row:num -> row:num, screen:&:screen [ + 539 local-scope + 540 load-ingredients + 541 return-unless sandbox-screen + 542 # print 'screen:' + 543 row <- render-text screen, [screen:], left, right, 245/grey, row + 544 screen <- move-cursor screen, row, left + 545 # start printing sandbox-screen + 546 column:num <- copy left + 547 s-width:num <- screen-width sandbox-screen + 548 s-height:num <- screen-height sandbox-screen + 549 buf:&:@:screen-cell <- get *sandbox-screen, data:offset + 550 stop-printing:num <- add left, s-width, 3 + 551 max-column:num <- min stop-printing, right + 552 i:num <- copy 0 + 553 len:num <- length *buf + 554 screen-height:num <- screen-height screen + 555 { + 556 ¦ done?:bool <- greater-or-equal i, len + 557 ¦ break-if done? + 558 ¦ done? <- greater-or-equal row, screen-height + 559 ¦ break-if done? + 560 ¦ column <- copy left + 561 ¦ screen <- move-cursor screen, row, column + 562 ¦ # initial leader for each row: two spaces and a '.' + 563 ¦ space:char <- copy 32/space + 564 ¦ print screen, space, 245/grey + 565 ¦ print screen, space, 245/grey + 566 ¦ full-stop:char <- copy 46/period + 567 ¦ print screen, full-stop, 245/grey + 568 ¦ column <- add left, 3 + 569 ¦ { + 570 ¦ ¦ # print row + 571 ¦ ¦ row-done?:bool <- greater-or-equal column, max-column + 572 ¦ ¦ break-if row-done? + 573 ¦ ¦ curr:screen-cell <- index *buf, i + 574 ¦ ¦ c:char <- get curr, contents:offset + 575 ¦ ¦ color:num <- get curr, color:offset + 576 ¦ ¦ { + 577 ¦ ¦ ¦ # damp whites down to grey + 578 ¦ ¦ ¦ white?:bool <- equal color, 7/white + 579 ¦ ¦ ¦ break-unless white? + 580 ¦ ¦ ¦ color <- copy 245/grey + 581 ¦ ¦ } + 582 ¦ ¦ print screen, c, color + 583 ¦ ¦ column <- add column, 1 + 584 ¦ ¦ i <- add i, 1 + 585 ¦ ¦ loop + 586 ¦ } + 587 ¦ # print final '.' + 588 ¦ print screen, full-stop, 245/grey + 589 ¦ column <- add column, 1 + 590 ¦ { + 591 ¦ ¦ # clear rest of current line + 592 ¦ ¦ line-done?:bool <- greater-than column, right + 593 ¦ ¦ break-if line-done? + 594 ¦ ¦ print screen, space + 595 ¦ ¦ column <- add column, 1 + 596 ¦ ¦ loop + 597 ¦ } + 598 ¦ row <- add row, 1 + 599 ¦ loop + 600 } + 601 ] + 602 + 603 scenario run-updates-results [ + 604 local-scope + 605 trace-until 100/app # trace too long + 606 assume-screen 100/width, 12/height + 607 # define a recipe (no indent for the 'add' line below so column numbers are more obvious) + 608 assume-resources [ + 609 ¦ [lesson/recipes.mu] <- [ + 610 ¦ ¦ || + 611 ¦ ¦ |recipe foo [| + 612 ¦ ¦ | local-scope| + 613 ¦ ¦ | z:num <- add 2, 2| + 614 ¦ ¦ | reply z| + 615 ¦ ¦ |]| + 616 ¦ ] 617 ] - 618 # make a change (incrementing one of the args to 'add'), then rerun - 619 assume-console [ - 620 ¦ left-click 4, 28 # one past the value of the second arg - 621 ¦ press backspace - 622 ¦ type [3] - 623 ¦ press F4 - 624 ] - 625 run [ - 626 ¦ event-loop screen, console, env, resources - 627 ] - 628 # check that screen updates the result on the right - 629 screen-should-contain [ - 630 ¦ . run (F4) . - 631 ¦ . ╎ . - 632 ¦ .recipe foo [ ╎─────────────────────────────────────────────────. - 633 ¦ . local-scope ╎0 edit copy delete . - 634 ¦ . z:num <- add 2, 3 ╎foo . - 635 ¦ . reply z ╎5 . - 636 ¦ .] ╎─────────────────────────────────────────────────. - 637 ¦ . ╎ . - 638 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . - 639 ¦ . ╎ . - 640 ] - 641 ] - 642 - 643 scenario run-instruction-manages-screen-per-sandbox [ - 644 local-scope - 645 trace-until 100/app # trace too long - 646 assume-screen 100/width, 20/height - 647 # empty recipes - 648 assume-resources [ - 649 ] - 650 # sandbox editor contains an instruction - 651 env:&:environment <- new-programming-environment resources, screen, [print screen, 4] # contents of sandbox editor - 652 # run the code in the editor - 653 assume-console [ - 654 ¦ press F4 - 655 ] - 656 run [ - 657 ¦ event-loop screen, console, env, resources - 658 ] - 659 # check that it prints a little toy screen - 660 screen-should-contain [ - 661 ¦ . run (F4) . - 662 ¦ . ╎ . - 663 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. - 664 ¦ . ╎0 edit copy delete . - 665 ¦ . ╎print screen, 4 . - 666 ¦ . ╎screen: . - 667 ¦ . ╎ .4 . . - 668 ¦ . ╎ . . . - 669 ¦ . ╎ . . . - 670 ¦ . ╎ . . . - 671 ¦ . ╎ . . . - 672 ¦ . ╎─────────────────────────────────────────────────. - 673 ¦ . ╎ . + 618 # sandbox editor contains an instruction without storing outputs + 619 env:&:environment <- new-programming-environment resources, screen, [foo] # contents of sandbox editor + 620 # run the code in the editors + 621 assume-console [ + 622 ¦ press F4 + 623 ] + 624 event-loop screen, console, env, resources + 625 screen-should-contain [ + 626 ¦ . run (F4) . + 627 ¦ . ╎ . + 628 ¦ .recipe foo [ ╎─────────────────────────────────────────────────. + 629 ¦ . local-scope ╎0 edit copy delete . + 630 ¦ . z:num <- add 2, 2 ╎foo . + 631 ¦ . reply z ╎4 . + 632 ¦ .] ╎─────────────────────────────────────────────────. + 633 ¦ . ╎ . + 634 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . + 635 ¦ . ╎ . + 636 ] + 637 # make a change (incrementing one of the args to 'add'), then rerun + 638 assume-console [ + 639 ¦ left-click 4, 28 # one past the value of the second arg + 640 ¦ press backspace + 641 ¦ type [3] + 642 ¦ press F4 + 643 ] + 644 run [ + 645 ¦ event-loop screen, console, env, resources + 646 ] + 647 # check that screen updates the result on the right + 648 screen-should-contain [ + 649 ¦ . run (F4) . + 650 ¦ . ╎ . + 651 ¦ .recipe foo [ ╎─────────────────────────────────────────────────. + 652 ¦ . local-scope ╎0 edit copy delete . + 653 ¦ . z:num <- add 2, 3 ╎foo . + 654 ¦ . reply z ╎5 . + 655 ¦ .] ╎─────────────────────────────────────────────────. + 656 ¦ . ╎ . + 657 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . + 658 ¦ . ╎ . + 659 ] + 660 ] + 661 + 662 scenario run-instruction-manages-screen-per-sandbox [ + 663 local-scope + 664 trace-until 100/app # trace too long + 665 assume-screen 100/width, 20/height + 666 # empty recipes + 667 assume-resources [ + 668 ] + 669 # sandbox editor contains an instruction + 670 env:&:environment <- new-programming-environment resources, screen, [print screen, 4] # contents of sandbox editor + 671 # run the code in the editor + 672 assume-console [ + 673 ¦ press F4 674 ] - 675 ] - 676 - 677 def editor-contents editor:&:editor -> result:text [ - 678 local-scope - 679 load-ingredients - 680 buf:&:buffer <- new-buffer 80 - 681 curr:&:duplex-list:char <- get *editor, data:offset - 682 # skip § sentinel - 683 assert curr, [editor without data is illegal; must have at least a sentinel] - 684 curr <- next curr - 685 return-unless curr, 0 - 686 { - 687 ¦ break-unless curr - 688 ¦ c:char <- get *curr, value:offset - 689 ¦ buf <- append buf, c - 690 ¦ curr <- next curr - 691 ¦ loop - 692 } - 693 result <- buffer-to-array buf + 675 run [ + 676 ¦ event-loop screen, console, env, resources + 677 ] + 678 # check that it prints a little toy screen + 679 screen-should-contain [ + 680 ¦ . run (F4) . + 681 ¦ . ╎ . + 682 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. + 683 ¦ . ╎0 edit copy delete . + 684 ¦ . ╎print screen, 4 . + 685 ¦ . ╎screen: . + 686 ¦ . ╎ .4 . . + 687 ¦ . ╎ . . . + 688 ¦ . ╎ . . . + 689 ¦ . ╎ . . . + 690 ¦ . ╎ . . . + 691 ¦ . ╎─────────────────────────────────────────────────. + 692 ¦ . ╎ . + 693 ] 694 ] 695 - 696 scenario editor-provides-edited-contents [ + 696 def editor-contents editor:&:editor -> result:text [ 697 local-scope - 698 assume-screen 10/width, 5/height - 699 e:&:editor <- new-editor [abc], 0/left, 10/right - 700 assume-console [ - 701 ¦ left-click 1, 2 - 702 ¦ type [def] - 703 ] - 704 run [ - 705 ¦ editor-event-loop screen, console, e - 706 ¦ s:text <- editor-contents e - 707 ¦ 1:@:char/raw <- copy *s - 708 ] - 709 memory-should-contain [ - 710 ¦ 1:array:character <- [abdefc] - 711 ] - 712 ] - 713 - 714 # keep the bottom of recipes from scrolling off the screen - 715 - 716 scenario scrolling-down-past-bottom-of-recipe-editor [ - 717 local-scope - 718 trace-until 100/app - 719 assume-screen 100/width, 10/height - 720 assume-resources [ - 721 ] - 722 env:&:environment <- new-programming-environment resources, screen, [] - 723 render-all screen, env, render - 724 assume-console [ - 725 ¦ press enter - 726 ¦ press down-arrow + 698 load-ingredients + 699 buf:&:buffer <- new-buffer 80 + 700 curr:&:duplex-list:char <- get *editor, data:offset + 701 # skip § sentinel + 702 assert curr, [editor without data is illegal; must have at least a sentinel] + 703 curr <- next curr + 704 return-unless curr, 0 + 705 { + 706 ¦ break-unless curr + 707 ¦ c:char <- get *curr, value:offset + 708 ¦ buf <- append buf, c + 709 ¦ curr <- next curr + 710 ¦ loop + 711 } + 712 result <- buffer-to-array buf + 713 ] + 714 + 715 scenario editor-provides-edited-contents [ + 716 local-scope + 717 assume-screen 10/width, 5/height + 718 e:&:editor <- new-editor [abc], 0/left, 10/right + 719 assume-console [ + 720 ¦ left-click 1, 2 + 721 ¦ type [def] + 722 ] + 723 run [ + 724 ¦ editor-event-loop screen, console, e + 725 ¦ s:text <- editor-contents e + 726 ¦ 1:@:char/raw <- copy *s 727 ] - 728 event-loop screen, console, env, resources - 729 # no scroll - 730 screen-should-contain [ - 731 ¦ . run (F4) . - 732 ¦ . ╎ . - 733 ¦ . ╎─────────────────────────────────────────────────. - 734 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . - 735 ¦ . ╎ . - 736 ] - 737 ] - 738 - 739 scenario cursor-down-in-recipe-editor [ - 740 local-scope - 741 trace-until 100/app - 742 assume-screen 100/width, 10/height - 743 assume-resources [ - 744 ] - 745 env:&:environment <- new-programming-environment resources, screen, [] - 746 render-all screen, env, render - 747 assume-console [ - 748 ¦ press enter - 749 ¦ press up-arrow - 750 ¦ press down-arrow # while cursor isn't at bottom - 751 ] - 752 event-loop screen, console, env, resources - 753 cursor:char <- copy 9251/␣ - 754 print screen, cursor - 755 # cursor moves back to bottom - 756 screen-should-contain [ - 757 ¦ . run (F4) . - 758 ¦ . ╎ . - 759 ¦ .␣ ╎─────────────────────────────────────────────────. - 760 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . - 761 ¦ . ╎ . - 762 ] - 763 ] - 764 - 765 # we'll not use the recipe-editor's 'bottom' element directly, because later - 766 # layers will add other stuff to the left side below the editor (error messages) - 767 - 768 container environment [ - 769 recipe-bottom:num - 770 ] - 771 - 772 after <render-recipe-components-end> [ - 773 *env <- put *env, recipe-bottom:offset, row - 774 ] - 775 - 776 after <global-keypress> [ - 777 { - 778 ¦ break-if sandbox-in-focus? - 779 ¦ down-arrow?:bool <- equal k, 65516/down-arrow - 780 ¦ break-unless down-arrow? - 781 ¦ recipe-editor:&:editor <- get *env, recipes:offset - 782 ¦ recipe-cursor-row:num <- get *recipe-editor, cursor-row:offset - 783 ¦ recipe-editor-bottom:num <- get *recipe-editor, bottom:offset - 784 ¦ at-bottom-of-editor?:bool <- greater-or-equal recipe-cursor-row, recipe-editor-bottom - 785 ¦ break-unless at-bottom-of-editor? - 786 ¦ more-to-scroll?:bool <- more-to-scroll? env, screen - 787 ¦ break-if more-to-scroll? - 788 ¦ loop +next-event - 789 } - 790 { - 791 ¦ break-if sandbox-in-focus? - 792 ¦ page-down?:bool <- equal k, 65518/page-down - 793 ¦ break-unless page-down? - 794 ¦ more-to-scroll?:bool <- more-to-scroll? env, screen - 795 ¦ break-if more-to-scroll? - 796 ¦ loop +next-event - 797 } - 798 ] - 799 - 800 after <global-type> [ - 801 { - 802 ¦ break-if sandbox-in-focus? - 803 ¦ page-down?:bool <- equal k, 6/ctrl-f - 804 ¦ break-unless page-down? - 805 ¦ more-to-scroll?:bool <- more-to-scroll? env, screen - 806 ¦ break-if more-to-scroll? + 728 memory-should-contain [ + 729 ¦ 1:array:character <- [abdefc] + 730 ] + 731 ] + 732 + 733 # keep the bottom of recipes from scrolling off the screen + 734 + 735 scenario scrolling-down-past-bottom-of-recipe-editor [ + 736 local-scope + 737 trace-until 100/app + 738 assume-screen 100/width, 10/height + 739 assume-resources [ + 740 ] + 741 env:&:environment <- new-programming-environment resources, screen, [] + 742 render-all screen, env, render + 743 assume-console [ + 744 ¦ press enter + 745 ¦ press down-arrow + 746 ] + 747 event-loop screen, console, env, resources + 748 # no scroll + 749 screen-should-contain [ + 750 ¦ . run (F4) . + 751 ¦ . ╎ . + 752 ¦ . ╎─────────────────────────────────────────────────. + 753 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . + 754 ¦ . ╎ . + 755 ] + 756 ] + 757 + 758 scenario cursor-down-in-recipe-editor [ + 759 local-scope + 760 trace-until 100/app + 761 assume-screen 100/width, 10/height + 762 assume-resources [ + 763 ] + 764 env:&:environment <- new-programming-environment resources, screen, [] + 765 render-all screen, env, render + 766 assume-console [ + 767 ¦ press enter + 768 ¦ press up-arrow + 769 ¦ press down-arrow # while cursor isn't at bottom + 770 ] + 771 event-loop screen, console, env, resources + 772 cursor:char <- copy 9251/␣ + 773 print screen, cursor + 774 # cursor moves back to bottom + 775 screen-should-contain [ + 776 ¦ . run (F4) . + 777 ¦ . ╎ . + 778 ¦ .␣ ╎─────────────────────────────────────────────────. + 779 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . + 780 ¦ . ╎ . + 781 ] + 782 ] + 783 + 784 # we'll not use the recipe-editor's 'bottom' element directly, because later + 785 # layers will add other stuff to the left side below the editor (error messages) + 786 + 787 container environment [ + 788 recipe-bottom:num + 789 ] + 790 + 791 after <render-recipe-components-end> [ + 792 *env <- put *env, recipe-bottom:offset, row + 793 ] + 794 + 795 after <global-keypress> [ + 796 { + 797 ¦ break-if sandbox-in-focus? + 798 ¦ down-arrow?:bool <- equal k, 65516/down-arrow + 799 ¦ break-unless down-arrow? + 800 ¦ recipe-editor:&:editor <- get *env, recipes:offset + 801 ¦ recipe-cursor-row:num <- get *recipe-editor, cursor-row:offset + 802 ¦ recipe-editor-bottom:num <- get *recipe-editor, bottom:offset + 803 ¦ at-bottom-of-editor?:bool <- greater-or-equal recipe-cursor-row, recipe-editor-bottom + 804 ¦ break-unless at-bottom-of-editor? + 805 ¦ more-to-scroll?:bool <- more-to-scroll? env, screen + 806 ¦ break-if more-to-scroll? 807 ¦ loop +next-event 808 } - 809 ] - 810 - 811 def more-to-scroll? env:&:environment, screen:&:screen -> result:bool [ - 812 local-scope - 813 load-ingredients - 814 recipe-bottom:num <- get *env, recipe-bottom:offset - 815 height:num <- screen-height screen - 816 result <- greater-or-equal recipe-bottom, height + 809 { + 810 ¦ break-if sandbox-in-focus? + 811 ¦ page-down?:bool <- equal k, 65518/page-down + 812 ¦ break-unless page-down? + 813 ¦ more-to-scroll?:bool <- more-to-scroll? env, screen + 814 ¦ break-if more-to-scroll? + 815 ¦ loop +next-event + 816 } 817 ] 818 - 819 scenario scrolling-down-past-bottom-of-recipe-editor-2 [ - 820 local-scope - 821 trace-until 100/app - 822 assume-screen 100/width, 10/height - 823 assume-resources [ - 824 ] - 825 env:&:environment <- new-programming-environment resources, screen, [] - 826 render-all screen, env, render - 827 assume-console [ - 828 ¦ # add a line - 829 ¦ press enter - 830 ¦ # cursor back to top line - 831 ¦ press up-arrow - 832 ¦ # try to scroll - 833 ¦ press page-down # or ctrl-f - 834 ] - 835 event-loop screen, console, env, resources - 836 # no scroll, and cursor remains at top line - 837 screen-should-contain [ - 838 ¦ . run (F4) . - 839 ¦ . ╎ . - 840 ¦ . ╎─────────────────────────────────────────────────. - 841 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . - 842 ¦ . ╎ . + 819 after <global-type> [ + 820 { + 821 ¦ break-if sandbox-in-focus? + 822 ¦ page-down?:bool <- equal k, 6/ctrl-f + 823 ¦ break-unless page-down? + 824 ¦ more-to-scroll?:bool <- more-to-scroll? env, screen + 825 ¦ break-if more-to-scroll? + 826 ¦ loop +next-event + 827 } + 828 ] + 829 + 830 def more-to-scroll? env:&:environment, screen:&:screen -> result:bool [ + 831 local-scope + 832 load-ingredients + 833 recipe-bottom:num <- get *env, recipe-bottom:offset + 834 height:num <- screen-height screen + 835 result <- greater-or-equal recipe-bottom, height + 836 ] + 837 + 838 scenario scrolling-down-past-bottom-of-recipe-editor-2 [ + 839 local-scope + 840 trace-until 100/app + 841 assume-screen 100/width, 10/height + 842 assume-resources [ 843 ] - 844 ] - 845 - 846 scenario scrolling-down-past-bottom-of-recipe-editor-3 [ - 847 local-scope - 848 trace-until 100/app - 849 assume-screen 100/width, 10/height - 850 assume-resources [ - 851 ] - 852 env:&:environment <- new-programming-environment resources, screen, [ab - 853 cd] - 854 render-all screen, env, render - 855 assume-console [ - 856 ¦ # add a line - 857 ¦ press enter - 858 ¦ # switch to sandbox - 859 ¦ press ctrl-n - 860 ¦ # move cursor - 861 ¦ press down-arrow + 844 env:&:environment <- new-programming-environment resources, screen, [] + 845 render-all screen, env, render + 846 assume-console [ + 847 ¦ # add a line + 848 ¦ press enter + 849 ¦ # cursor back to top line + 850 ¦ press up-arrow + 851 ¦ # try to scroll + 852 ¦ press page-down # or ctrl-f + 853 ] + 854 event-loop screen, console, env, resources + 855 # no scroll, and cursor remains at top line + 856 screen-should-contain [ + 857 ¦ . run (F4) . + 858 ¦ . ╎ . + 859 ¦ . ╎─────────────────────────────────────────────────. + 860 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎ . + 861 ¦ . ╎ . 862 ] - 863 event-loop screen, console, env, resources - 864 cursor:char <- copy 9251/␣ - 865 print screen, cursor - 866 # no scroll on recipe side, cursor moves on sandbox side - 867 screen-should-contain [ - 868 ¦ . run (F4) . - 869 ¦ . ╎ab . - 870 ¦ . ╎␣d . - 871 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. - 872 ¦ . ╎ . - 873 ] - 874 ] - 875 - 876 # scrolling through sandboxes - 877 - 878 scenario scrolling-down-past-bottom-of-sandbox-editor [ - 879 local-scope - 880 trace-until 100/app # trace too long - 881 assume-screen 100/width, 10/height - 882 # initialize - 883 assume-resources [ - 884 ] - 885 env:&:environment <- new-programming-environment resources, screen, [add 2, 2] - 886 render-all screen, env, render - 887 assume-console [ - 888 ¦ # create a sandbox - 889 ¦ press F4 - 890 ] - 891 event-loop screen, console, env, resources - 892 screen-should-contain [ - 893 ¦ . run (F4) . - 894 ¦ . ╎ . - 895 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. - 896 ¦ . ╎0 edit copy delete . - 897 ¦ . ╎add 2, 2 . - 898 ] - 899 # switch to sandbox window and hit 'page-down' - 900 assume-console [ - 901 ¦ press ctrl-n - 902 ¦ press page-down + 863 ] + 864 + 865 scenario scrolling-down-past-bottom-of-recipe-editor-3 [ + 866 local-scope + 867 trace-until 100/app + 868 assume-screen 100/width, 10/height + 869 assume-resources [ + 870 ] + 871 env:&:environment <- new-programming-environment resources, screen, [ab + 872 cd] + 873 render-all screen, env, render + 874 assume-console [ + 875 ¦ # add a line + 876 ¦ press enter + 877 ¦ # switch to sandbox + 878 ¦ press ctrl-n + 879 ¦ # move cursor + 880 ¦ press down-arrow + 881 ] + 882 event-loop screen, console, env, resources + 883 cursor:char <- copy 9251/␣ + 884 print screen, cursor + 885 # no scroll on recipe side, cursor moves on sandbox side + 886 screen-should-contain [ + 887 ¦ . run (F4) . + 888 ¦ . ╎ab . + 889 ¦ . ╎␣d . + 890 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. + 891 ¦ . ╎ . + 892 ] + 893 ] + 894 + 895 # scrolling through sandboxes + 896 + 897 scenario scrolling-down-past-bottom-of-sandbox-editor [ + 898 local-scope + 899 trace-until 100/app # trace too long + 900 assume-screen 100/width, 10/height + 901 # initialize + 902 assume-resources [ 903 ] - 904 run [ - 905 ¦ event-loop screen, console, env, resources - 906 ¦ cursor:char <- copy 9251/␣ - 907 ¦ print screen, cursor - 908 ] - 909 # sandbox editor hidden; first sandbox displayed - 910 # cursor moves to first sandbox + 904 env:&:environment <- new-programming-environment resources, screen, [add 2, 2] + 905 render-all screen, env, render + 906 assume-console [ + 907 ¦ # create a sandbox + 908 ¦ press F4 + 909 ] + 910 event-loop screen, console, env, resources 911 screen-should-contain [ 912 ¦ . run (F4) . - 913 ¦ . ╎─────────────────────────────────────────────────. - 914 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣ edit copy delete . - 915 ¦ . ╎add 2, 2 . - 916 ¦ . ╎4 . + 913 ¦ . ╎ . + 914 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. + 915 ¦ . ╎0 edit copy delete . + 916 ¦ . ╎add 2, 2 . 917 ] - 918 # hit 'page-up' + 918 # switch to sandbox window and hit 'page-down' 919 assume-console [ - 920 ¦ press page-up - 921 ] - 922 run [ - 923 ¦ event-loop screen, console, env, resources - 924 ¦ cursor:char <- copy 9251/␣ - 925 ¦ print screen, cursor - 926 ] - 927 # sandbox editor displays again, cursor is in editor - 928 screen-should-contain [ - 929 ¦ . run (F4) . - 930 ¦ . ╎␣ . - 931 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. - 932 ¦ . ╎0 edit copy delete . - 933 ¦ . ╎add 2, 2 . - 934 ] - 935 ] - 936 - 937 # page-down on sandbox side updates render-from to scroll sandboxes - 938 after <global-keypress> [ - 939 { - 940 ¦ break-unless sandbox-in-focus? - 941 ¦ page-down?:bool <- equal k, 65518/page-down - 942 ¦ break-unless page-down? - 943 ¦ sandbox:&:sandbox <- get *env, sandbox:offset - 944 ¦ break-unless sandbox - 945 ¦ # slide down if possible - 946 ¦ { - 947 ¦ ¦ render-from:num <- get *env, render-from:offset - 948 ¦ ¦ number-of-sandboxes:num <- get *env, number-of-sandboxes:offset - 949 ¦ ¦ max:num <- subtract number-of-sandboxes, 1 - 950 ¦ ¦ at-end?:bool <- greater-or-equal render-from, max - 951 ¦ ¦ jump-if at-end?, +finish-event # render nothing - 952 ¦ ¦ render-from <- add render-from, 1 - 953 ¦ ¦ *env <- put *env, render-from:offset, render-from - 954 ¦ } - 955 ¦ hide-screen screen - 956 ¦ screen <- render-sandbox-side screen, env, render - 957 ¦ show-screen screen - 958 ¦ jump +finish-event - 959 } - 960 ] - 961 - 962 # update-cursor takes render-from into account - 963 after <update-cursor-special-cases> [ - 964 { - 965 ¦ break-unless sandbox-in-focus? - 966 ¦ render-from:num <- get *env, render-from:offset - 967 ¦ scrolling?:bool <- greater-or-equal render-from, 0 - 968 ¦ break-unless scrolling? - 969 ¦ cursor-column:num <- get *current-sandbox, left:offset - 970 ¦ screen <- move-cursor screen, 2/row, cursor-column # highlighted sandbox will always start at row 2 - 971 ¦ return - 972 } - 973 ] - 974 - 975 # 'page-up' on sandbox side is like 'page-down': updates render-from when necessary - 976 after <global-keypress> [ - 977 { - 978 ¦ break-unless sandbox-in-focus? - 979 ¦ page-up?:bool <- equal k, 65519/page-up - 980 ¦ break-unless page-up? - 981 ¦ render-from:num <- get *env, render-from:offset - 982 ¦ at-beginning?:bool <- equal render-from, -1 - 983 ¦ break-if at-beginning? - 984 ¦ render-from <- subtract render-from, 1 - 985 ¦ *env <- put *env, render-from:offset, render-from - 986 ¦ hide-screen screen - 987 ¦ screen <- render-sandbox-side screen, env, render - 988 ¦ show-screen screen - 989 ¦ jump +finish-event - 990 } - 991 ] - 992 - 993 # sandbox belonging to 'env' whose next-sandbox is 'in' - 994 # return 0 if there's no such sandbox, either because 'in' doesn't exist in 'env', or because it's the first sandbox - 995 def previous-sandbox env:&:environment, in:&:sandbox -> out:&:sandbox [ - 996 local-scope - 997 load-ingredients - 998 curr:&:sandbox <- get *env, sandbox:offset - 999 return-unless curr, 0/nil -1000 next:&:sandbox <- get *curr, next-sandbox:offset -1001 { -1002 ¦ return-unless next, 0/nil -1003 ¦ found?:bool <- equal next, in -1004 ¦ break-if found? -1005 ¦ curr <- copy next -1006 ¦ next <- get *curr, next-sandbox:offset -1007 ¦ loop -1008 } -1009 return curr + 920 ¦ press ctrl-n + 921 ¦ press page-down + 922 ] + 923 run [ + 924 ¦ event-loop screen, console, env, resources + 925 ¦ cursor:char <- copy 9251/␣ + 926 ¦ print screen, cursor + 927 ] + 928 # sandbox editor hidden; first sandbox displayed + 929 # cursor moves to first sandbox + 930 screen-should-contain [ + 931 ¦ . run (F4) . + 932 ¦ . ╎─────────────────────────────────────────────────. + 933 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣ edit copy delete . + 934 ¦ . ╎add 2, 2 . + 935 ¦ . ╎4 . + 936 ] + 937 # hit 'page-up' + 938 assume-console [ + 939 ¦ press page-up + 940 ] + 941 run [ + 942 ¦ event-loop screen, console, env, resources + 943 ¦ cursor:char <- copy 9251/␣ + 944 ¦ print screen, cursor + 945 ] + 946 # sandbox editor displays again, cursor is in editor + 947 screen-should-contain [ + 948 ¦ . run (F4) . + 949 ¦ . ╎␣ . + 950 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. + 951 ¦ . ╎0 edit copy delete . + 952 ¦ . ╎add 2, 2 . + 953 ] + 954 ] + 955 + 956 # page-down on sandbox side updates render-from to scroll sandboxes + 957 after <global-keypress> [ + 958 { + 959 ¦ break-unless sandbox-in-focus? + 960 ¦ page-down?:bool <- equal k, 65518/page-down + 961 ¦ break-unless page-down? + 962 ¦ sandbox:&:sandbox <- get *env, sandbox:offset + 963 ¦ break-unless sandbox + 964 ¦ # slide down if possible + 965 ¦ { + 966 ¦ ¦ render-from:num <- get *env, render-from:offset + 967 ¦ ¦ number-of-sandboxes:num <- get *env, number-of-sandboxes:offset + 968 ¦ ¦ max:num <- subtract number-of-sandboxes, 1 + 969 ¦ ¦ at-end?:bool <- greater-or-equal render-from, max + 970 ¦ ¦ jump-if at-end?, +finish-event # render nothing + 971 ¦ ¦ render-from <- add render-from, 1 + 972 ¦ ¦ *env <- put *env, render-from:offset, render-from + 973 ¦ } + 974 ¦ hide-screen screen + 975 ¦ screen <- render-sandbox-side screen, env, render + 976 ¦ show-screen screen + 977 ¦ jump +finish-event + 978 } + 979 ] + 980 + 981 # update-cursor takes render-from into account + 982 after <update-cursor-special-cases> [ + 983 { + 984 ¦ break-unless sandbox-in-focus? + 985 ¦ render-from:num <- get *env, render-from:offset + 986 ¦ scrolling?:bool <- greater-or-equal render-from, 0 + 987 ¦ break-unless scrolling? + 988 ¦ cursor-column:num <- get *current-sandbox, left:offset + 989 ¦ screen <- move-cursor screen, 2/row, cursor-column # highlighted sandbox will always start at row 2 + 990 ¦ return + 991 } + 992 ] + 993 + 994 # 'page-up' on sandbox side is like 'page-down': updates render-from when necessary + 995 after <global-keypress> [ + 996 { + 997 ¦ break-unless sandbox-in-focus? + 998 ¦ page-up?:bool <- equal k, 65519/page-up + 999 ¦ break-unless page-up? +1000 ¦ render-from:num <- get *env, render-from:offset +1001 ¦ at-beginning?:bool <- equal render-from, -1 +1002 ¦ break-if at-beginning? +1003 ¦ render-from <- subtract render-from, 1 +1004 ¦ *env <- put *env, render-from:offset, render-from +1005 ¦ hide-screen screen +1006 ¦ screen <- render-sandbox-side screen, env, render +1007 ¦ show-screen screen +1008 ¦ jump +finish-event +1009 } 1010 ] 1011 -1012 scenario scrolling-down-past-bottom-on-recipe-side [ -1013 local-scope -1014 trace-until 100/app # trace too long -1015 assume-screen 100/width, 10/height -1016 # initialize sandbox side and create a sandbox -1017 assume-resources [ -1018 ¦ [lesson/recipes.mu] <- [ -1019 ¦ ¦ || # file containing just a newline -1020 ¦ ] -1021 ] -1022 # create a sandbox -1023 env:&:environment <- new-programming-environment resources, screen, [add 2, 2] -1024 render-all screen, env, render -1025 assume-console [ -1026 ¦ press F4 -1027 ] -1028 event-loop screen, console, env, resources -1029 # hit 'down' in recipe editor -1030 assume-console [ -1031 ¦ press page-down -1032 ] -1033 run [ -1034 ¦ event-loop screen, console, env, resources -1035 ¦ cursor:char <- copy 9251/␣ -1036 ¦ print screen, cursor -1037 ] -1038 # cursor doesn't move when the end is already on-screen -1039 screen-should-contain [ -1040 ¦ . run (F4) . -1041 ¦ .␣ ╎ . -1042 ¦ . ╎─────────────────────────────────────────────────. -1043 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . -1044 ¦ . ╎add 2, 2 . -1045 ] -1046 ] -1047 -1048 scenario scrolling-through-multiple-sandboxes [ -1049 local-scope -1050 trace-until 100/app # trace too long -1051 assume-screen 100/width, 10/height -1052 # initialize environment -1053 assume-resources [ -1054 ] -1055 env:&:environment <- new-programming-environment resources, screen, [] -1056 render-all screen, env, render -1057 # create 2 sandboxes -1058 assume-console [ -1059 ¦ press ctrl-n -1060 ¦ type [add 2, 2] -1061 ¦ press F4 -1062 ¦ type [add 1, 1] -1063 ¦ press F4 +1012 # sandbox belonging to 'env' whose next-sandbox is 'in' +1013 # return 0 if there's no such sandbox, either because 'in' doesn't exist in 'env', or because it's the first sandbox +1014 def previous-sandbox env:&:environment, in:&:sandbox -> out:&:sandbox [ +1015 local-scope +1016 load-ingredients +1017 curr:&:sandbox <- get *env, sandbox:offset +1018 return-unless curr, 0/nil +1019 next:&:sandbox <- get *curr, next-sandbox:offset +1020 { +1021 ¦ return-unless next, 0/nil +1022 ¦ found?:bool <- equal next, in +1023 ¦ break-if found? +1024 ¦ curr <- copy next +1025 ¦ next <- get *curr, next-sandbox:offset +1026 ¦ loop +1027 } +1028 return curr +1029 ] +1030 +1031 scenario scrolling-down-past-bottom-on-recipe-side [ +1032 local-scope +1033 trace-until 100/app # trace too long +1034 assume-screen 100/width, 10/height +1035 # initialize sandbox side and create a sandbox +1036 assume-resources [ +1037 ¦ [lesson/recipes.mu] <- [ +1038 ¦ ¦ || # file containing just a newline +1039 ¦ ] +1040 ] +1041 # create a sandbox +1042 env:&:environment <- new-programming-environment resources, screen, [add 2, 2] +1043 render-all screen, env, render +1044 assume-console [ +1045 ¦ press F4 +1046 ] +1047 event-loop screen, console, env, resources +1048 # hit 'down' in recipe editor +1049 assume-console [ +1050 ¦ press page-down +1051 ] +1052 run [ +1053 ¦ event-loop screen, console, env, resources +1054 ¦ cursor:char <- copy 9251/␣ +1055 ¦ print screen, cursor +1056 ] +1057 # cursor doesn't move when the end is already on-screen +1058 screen-should-contain [ +1059 ¦ . run (F4) . +1060 ¦ .␣ ╎ . +1061 ¦ . ╎─────────────────────────────────────────────────. +1062 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . +1063 ¦ . ╎add 2, 2 . 1064 ] -1065 event-loop screen, console, env, resources -1066 cursor:char <- copy 9251/␣ -1067 print screen, cursor -1068 screen-should-contain [ -1069 ¦ . run (F4) . -1070 ¦ . ╎␣ . -1071 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. -1072 ¦ . ╎0 edit copy delete . -1073 ¦ . ╎add 1, 1 . -1074 ¦ . ╎2 . -1075 ¦ . ╎─────────────────────────────────────────────────. -1076 ¦ . ╎1 edit copy delete . -1077 ¦ . ╎add 2, 2 . -1078 ¦ . ╎4 . -1079 ] -1080 # hit 'page-down' -1081 assume-console [ -1082 ¦ press page-down +1065 ] +1066 +1067 scenario scrolling-through-multiple-sandboxes [ +1068 local-scope +1069 trace-until 100/app # trace too long +1070 assume-screen 100/width, 10/height +1071 # initialize environment +1072 assume-resources [ +1073 ] +1074 env:&:environment <- new-programming-environment resources, screen, [] +1075 render-all screen, env, render +1076 # create 2 sandboxes +1077 assume-console [ +1078 ¦ press ctrl-n +1079 ¦ type [add 2, 2] +1080 ¦ press F4 +1081 ¦ type [add 1, 1] +1082 ¦ press F4 1083 ] -1084 run [ -1085 ¦ event-loop screen, console, env, resources -1086 ¦ cursor:char <- copy 9251/␣ -1087 ¦ print screen, cursor -1088 ] -1089 # sandbox editor hidden; first sandbox displayed -1090 # cursor moves to first sandbox -1091 screen-should-contain [ -1092 ¦ . run (F4) . -1093 ¦ . ╎─────────────────────────────────────────────────. -1094 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣ edit copy delete . -1095 ¦ . ╎add 1, 1 . -1096 ¦ . ╎2 . -1097 ¦ . ╎─────────────────────────────────────────────────. -1098 ¦ . ╎1 edit copy delete . -1099 ¦ . ╎add 2, 2 . -1100 ¦ . ╎4 . -1101 ] -1102 # hit 'page-down' again -1103 assume-console [ -1104 ¦ press page-down -1105 ] -1106 run [ -1107 ¦ event-loop screen, console, env, resources -1108 ] -1109 # just second sandbox displayed +1084 event-loop screen, console, env, resources +1085 cursor:char <- copy 9251/␣ +1086 print screen, cursor +1087 screen-should-contain [ +1088 ¦ . run (F4) . +1089 ¦ . ╎␣ . +1090 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. +1091 ¦ . ╎0 edit copy delete . +1092 ¦ . ╎add 1, 1 . +1093 ¦ . ╎2 . +1094 ¦ . ╎─────────────────────────────────────────────────. +1095 ¦ . ╎1 edit copy delete . +1096 ¦ . ╎add 2, 2 . +1097 ¦ . ╎4 . +1098 ] +1099 # hit 'page-down' +1100 assume-console [ +1101 ¦ press page-down +1102 ] +1103 run [ +1104 ¦ event-loop screen, console, env, resources +1105 ¦ cursor:char <- copy 9251/␣ +1106 ¦ print screen, cursor +1107 ] +1108 # sandbox editor hidden; first sandbox displayed +1109 # cursor moves to first sandbox 1110 screen-should-contain [ 1111 ¦ . run (F4) . 1112 ¦ . ╎─────────────────────────────────────────────────. -1113 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1 edit copy delete . -1114 ¦ . ╎add 2, 2 . -1115 ¦ . ╎4 . +1113 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎␣ edit copy delete . +1114 ¦ . ╎add 1, 1 . +1115 ¦ . ╎2 . 1116 ¦ . ╎─────────────────────────────────────────────────. -1117 ¦ . ╎ . -1118 ] -1119 # hit 'page-down' again -1120 assume-console [ -1121 ¦ press page-down -1122 ] -1123 run [ -1124 ¦ event-loop screen, console, env, resources -1125 ] -1126 # no change -1127 screen-should-contain [ -1128 ¦ . run (F4) . -1129 ¦ . ╎─────────────────────────────────────────────────. -1130 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1 edit copy delete . -1131 ¦ . ╎add 2, 2 . -1132 ¦ . ╎4 . -1133 ¦ . ╎─────────────────────────────────────────────────. -1134 ¦ . ╎ . -1135 ] -1136 # hit 'page-up' -1137 assume-console [ -1138 ¦ press page-up -1139 ] -1140 run [ -1141 ¦ event-loop screen, console, env, resources -1142 ] -1143 # back to displaying both sandboxes without editor -1144 screen-should-contain [ -1145 ¦ . run (F4) . -1146 ¦ . ╎─────────────────────────────────────────────────. -1147 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . -1148 ¦ . ╎add 1, 1 . -1149 ¦ . ╎2 . -1150 ¦ . ╎─────────────────────────────────────────────────. -1151 ¦ . ╎1 edit copy delete . -1152 ¦ . ╎add 2, 2 . -1153 ¦ . ╎4 . +1117 ¦ . ╎1 edit copy delete . +1118 ¦ . ╎add 2, 2 . +1119 ¦ . ╎4 . +1120 ] +1121 # hit 'page-down' again +1122 assume-console [ +1123 ¦ press page-down +1124 ] +1125 run [ +1126 ¦ event-loop screen, console, env, resources +1127 ] +1128 # just second sandbox displayed +1129 screen-should-contain [ +1130 ¦ . run (F4) . +1131 ¦ . ╎─────────────────────────────────────────────────. +1132 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1 edit copy delete . +1133 ¦ . ╎add 2, 2 . +1134 ¦ . ╎4 . +1135 ¦ . ╎─────────────────────────────────────────────────. +1136 ¦ . ╎ . +1137 ] +1138 # hit 'page-down' again +1139 assume-console [ +1140 ¦ press page-down +1141 ] +1142 run [ +1143 ¦ event-loop screen, console, env, resources +1144 ] +1145 # no change +1146 screen-should-contain [ +1147 ¦ . run (F4) . +1148 ¦ . ╎─────────────────────────────────────────────────. +1149 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎1 edit copy delete . +1150 ¦ . ╎add 2, 2 . +1151 ¦ . ╎4 . +1152 ¦ . ╎─────────────────────────────────────────────────. +1153 ¦ . ╎ . 1154 ] -1155 # hit 'page-up' again +1155 # hit 'page-up' 1156 assume-console [ 1157 ¦ press page-up 1158 ] 1159 run [ 1160 ¦ event-loop screen, console, env, resources -1161 ¦ cursor:char <- copy 9251/␣ -1162 ¦ print screen, cursor -1163 ] -1164 # back to displaying both sandboxes as well as editor -1165 screen-should-contain [ -1166 ¦ . run (F4) . -1167 ¦ . ╎␣ . -1168 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. -1169 ¦ . ╎0 edit copy delete . -1170 ¦ . ╎add 1, 1 . -1171 ¦ . ╎2 . -1172 ¦ . ╎─────────────────────────────────────────────────. -1173 ¦ . ╎1 edit copy delete . -1174 ¦ . ╎add 2, 2 . -1175 ¦ . ╎4 . -1176 ] -1177 # hit 'page-up' again -1178 assume-console [ -1179 ¦ press page-up -1180 ] -1181 run [ -1182 ¦ event-loop screen, console, env, resources -1183 ¦ cursor:char <- copy 9251/␣ -1184 ¦ print screen, cursor -1185 ] -1186 # no change -1187 screen-should-contain [ -1188 ¦ . run (F4) . -1189 ¦ . ╎␣ . -1190 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. -1191 ¦ . ╎0 edit copy delete . -1192 ¦ . ╎add 1, 1 . -1193 ¦ . ╎2 . -1194 ¦ . ╎─────────────────────────────────────────────────. -1195 ¦ . ╎1 edit copy delete . -1196 ¦ . ╎add 2, 2 . -1197 ¦ . ╎4 . -1198 ] -1199 ] -1200 -1201 scenario scrolling-manages-sandbox-index-correctly [ -1202 local-scope -1203 trace-until 100/app # trace too long -1204 assume-screen 100/width, 10/height -1205 # initialize environment -1206 assume-resources [ -1207 ] -1208 env:&:environment <- new-programming-environment resources, screen, [] -1209 render-all screen, env, render -1210 # create a sandbox -1211 assume-console [ -1212 ¦ press ctrl-n -1213 ¦ type [add 1, 1] -1214 ¦ press F4 -1215 ] -1216 event-loop screen, console, env, resources -1217 screen-should-contain [ -1218 ¦ . run (F4) . -1219 ¦ . ╎ . -1220 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. -1221 ¦ . ╎0 edit copy delete . -1222 ¦ . ╎add 1, 1 . -1223 ¦ . ╎2 . -1224 ¦ . ╎─────────────────────────────────────────────────. -1225 ¦ . ╎ . +1161 ] +1162 # back to displaying both sandboxes without editor +1163 screen-should-contain [ +1164 ¦ . run (F4) . +1165 ¦ . ╎─────────────────────────────────────────────────. +1166 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . +1167 ¦ . ╎add 1, 1 . +1168 ¦ . ╎2 . +1169 ¦ . ╎─────────────────────────────────────────────────. +1170 ¦ . ╎1 edit copy delete . +1171 ¦ . ╎add 2, 2 . +1172 ¦ . ╎4 . +1173 ] +1174 # hit 'page-up' again +1175 assume-console [ +1176 ¦ press page-up +1177 ] +1178 run [ +1179 ¦ event-loop screen, console, env, resources +1180 ¦ cursor:char <- copy 9251/␣ +1181 ¦ print screen, cursor +1182 ] +1183 # back to displaying both sandboxes as well as editor +1184 screen-should-contain [ +1185 ¦ . run (F4) . +1186 ¦ . ╎␣ . +1187 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. +1188 ¦ . ╎0 edit copy delete . +1189 ¦ . ╎add 1, 1 . +1190 ¦ . ╎2 . +1191 ¦ . ╎─────────────────────────────────────────────────. +1192 ¦ . ╎1 edit copy delete . +1193 ¦ . ╎add 2, 2 . +1194 ¦ . ╎4 . +1195 ] +1196 # hit 'page-up' again +1197 assume-console [ +1198 ¦ press page-up +1199 ] +1200 run [ +1201 ¦ event-loop screen, console, env, resources +1202 ¦ cursor:char <- copy 9251/␣ +1203 ¦ print screen, cursor +1204 ] +1205 # no change +1206 screen-should-contain [ +1207 ¦ . run (F4) . +1208 ¦ . ╎␣ . +1209 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. +1210 ¦ . ╎0 edit copy delete . +1211 ¦ . ╎add 1, 1 . +1212 ¦ . ╎2 . +1213 ¦ . ╎─────────────────────────────────────────────────. +1214 ¦ . ╎1 edit copy delete . +1215 ¦ . ╎add 2, 2 . +1216 ¦ . ╎4 . +1217 ] +1218 ] +1219 +1220 scenario scrolling-manages-sandbox-index-correctly [ +1221 local-scope +1222 trace-until 100/app # trace too long +1223 assume-screen 100/width, 10/height +1224 # initialize environment +1225 assume-resources [ 1226 ] -1227 # hit 'page-down' and 'page-up' a couple of times. sandbox index should be stable -1228 assume-console [ -1229 ¦ press page-down -1230 ] -1231 run [ -1232 ¦ event-loop screen, console, env, resources -1233 ] -1234 # sandbox editor hidden; first sandbox displayed -1235 # cursor moves to first sandbox +1227 env:&:environment <- new-programming-environment resources, screen, [] +1228 render-all screen, env, render +1229 # create a sandbox +1230 assume-console [ +1231 ¦ press ctrl-n +1232 ¦ type [add 1, 1] +1233 ¦ press F4 +1234 ] +1235 event-loop screen, console, env, resources 1236 screen-should-contain [ 1237 ¦ . run (F4) . -1238 ¦ . ╎─────────────────────────────────────────────────. -1239 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . -1240 ¦ . ╎add 1, 1 . -1241 ¦ . ╎2 . -1242 ¦ . ╎─────────────────────────────────────────────────. -1243 ¦ . ╎ . -1244 ] -1245 # hit 'page-up' again -1246 assume-console [ -1247 ¦ press page-up -1248 ] -1249 run [ -1250 ¦ event-loop screen, console, env, resources -1251 ] -1252 # back to displaying both sandboxes as well as editor -1253 screen-should-contain [ -1254 ¦ . run (F4) . -1255 ¦ . ╎ . -1256 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. -1257 ¦ . ╎0 edit copy delete . -1258 ¦ . ╎add 1, 1 . -1259 ¦ . ╎2 . -1260 ¦ . ╎─────────────────────────────────────────────────. -1261 ¦ . ╎ . -1262 ] -1263 # hit 'page-down' -1264 assume-console [ -1265 ¦ press page-down -1266 ] -1267 run [ -1268 ¦ event-loop screen, console, env, resources -1269 ] -1270 # sandbox editor hidden; first sandbox displayed -1271 # cursor moves to first sandbox +1238 ¦ . ╎ . +1239 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. +1240 ¦ . ╎0 edit copy delete . +1241 ¦ . ╎add 1, 1 . +1242 ¦ . ╎2 . +1243 ¦ . ╎─────────────────────────────────────────────────. +1244 ¦ . ╎ . +1245 ] +1246 # hit 'page-down' and 'page-up' a couple of times. sandbox index should be stable +1247 assume-console [ +1248 ¦ press page-down +1249 ] +1250 run [ +1251 ¦ event-loop screen, console, env, resources +1252 ] +1253 # sandbox editor hidden; first sandbox displayed +1254 # cursor moves to first sandbox +1255 screen-should-contain [ +1256 ¦ . run (F4) . +1257 ¦ . ╎─────────────────────────────────────────────────. +1258 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . +1259 ¦ . ╎add 1, 1 . +1260 ¦ . ╎2 . +1261 ¦ . ╎─────────────────────────────────────────────────. +1262 ¦ . ╎ . +1263 ] +1264 # hit 'page-up' again +1265 assume-console [ +1266 ¦ press page-up +1267 ] +1268 run [ +1269 ¦ event-loop screen, console, env, resources +1270 ] +1271 # back to displaying both sandboxes as well as editor 1272 screen-should-contain [ 1273 ¦ . run (F4) . -1274 ¦ . ╎─────────────────────────────────────────────────. -1275 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . -1276 ¦ . ╎add 1, 1 . -1277 ¦ . ╎2 . -1278 ¦ . ╎─────────────────────────────────────────────────. -1279 ¦ . ╎ . -1280 ] -1281 ] +1274 ¦ . ╎ . +1275 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎─────────────────────────────────────────────────. +1276 ¦ . ╎0 edit copy delete . +1277 ¦ . ╎add 1, 1 . +1278 ¦ . ╎2 . +1279 ¦ . ╎─────────────────────────────────────────────────. +1280 ¦ . ╎ . +1281 ] +1282 # hit 'page-down' +1283 assume-console [ +1284 ¦ press page-down +1285 ] +1286 run [ +1287 ¦ event-loop screen, console, env, resources +1288 ] +1289 # sandbox editor hidden; first sandbox displayed +1290 # cursor moves to first sandbox +1291 screen-should-contain [ +1292 ¦ . run (F4) . +1293 ¦ . ╎─────────────────────────────────────────────────. +1294 ¦ .╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╎0 edit copy delete . +1295 ¦ . ╎add 1, 1 . +1296 ¦ . ╎2 . +1297 ¦ . ╎─────────────────────────────────────────────────. +1298 ¦ . ╎ . +1299 ] +1300 ] diff --git a/html/edit/009-sandbox-test.mu.html b/html/edit/009-sandbox-test.mu.html index 0a7ba0d1..0ccd537c 100644 --- a/html/edit/009-sandbox-test.mu.html +++ b/html/edit/009-sandbox-test.mu.html @@ -164,7 +164,7 @@ if ('onhashchange' in window) { 101 } 102 ] 103 -104 before <end-restore-sandbox> [ +104 before <end-restore-sandbox> [ 105 { 106 ¦ filename <- append filename, [.out] 107 ¦ contents <- slurp resources, filename diff --git a/html/edit/011-errors.mu.html b/html/edit/011-errors.mu.html index ece25b72..72e55626 100644 --- a/html/edit/011-errors.mu.html +++ b/html/edit/011-errors.mu.html @@ -72,7 +72,7 @@ if ('onhashchange' in window) { 9 local-scope 10 load-ingredients 11 recipes:&:editor <- get *env, recipes:offset - 12 in:text <- editor-contents recipes + 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 -- cgit 1.4.1-2-gfad0