repl.mu now passing again. But still I have concerns:

a) Doubling backslashes in tests. Hard to tell how many levels to add.
b) I think the read-key interface needs to go. But then how do we handle
send-keys-to-channel and other flows like that in the chessboard app?
This commit is contained in:
Kartik K. Agaram 2015-06-22 23:32:21 -07:00
parent 2c7e84c2bc
commit 60d205aa33
3 changed files with 166 additions and 121 deletions

View File

@ -132,7 +132,7 @@ const scenario* Current_scenario = NULL;
void run_mu_scenario(const scenario& s) {
Current_scenario = &s;
bool not_already_inside_test = !Trace_stream;
//? cerr << s.name << '\n'; //? 3
//? cerr << s.name << '\n'; //? 4
if (not_already_inside_test) {
Trace_file = s.name;
Trace_stream = new trace_stream;

View File

@ -46,12 +46,12 @@ ASSUME_CONSOLE,
Recipe_number["assume-console"] = ASSUME_CONSOLE;
:(before "End Primitive Recipe Implementations")
case ASSUME_CONSOLE: {
//? cerr << "aaa: " << current_instruction().ingredients.at(0).name << '\n'; //? 1
//? cerr << "aaa: " << current_instruction().ingredients.at(0).name << '\n'; //? 2
// create a temporary recipe just for parsing; it won't contain valid instructions
istringstream in("[" + current_instruction().ingredients.at(0).name + "]");
recipe r = slurp_recipe(in);
long long int num_events = count_events(r);
//? cerr << "fff: " << num_events << '\n'; //? 1
//? cerr << "fff: " << num_events << '\n'; //? 3
// initialize the events
long long int size = num_events*size_of_event() + /*space for length*/1;
ensure_space(size);
@ -69,8 +69,10 @@ case ASSUME_CONSOLE: {
Current_routine->alloc += size_of_event();
}
else if (curr.name == "press") {
Memory[Current_routine->alloc] = /*tag for 'keycode' variant of 'event' exclusive-container*/1;
// todo: use 'keycode' tag to distinguish left-arrow from unicode U+ffeb, etc.
Memory[Current_routine->alloc] = /*tag for 'text' variant of 'event' exclusive-container*/0;
Memory[Current_routine->alloc+1] = to_integer(curr.ingredients.at(0).name);
//? cerr << "AA press: " << Memory[Current_routine->alloc+1] << '\n'; //? 3
Current_routine->alloc += size_of_event();
}
// End Event Handlers
@ -83,11 +85,11 @@ case ASSUME_CONSOLE: {
long long int curr = 0;
//? cerr << "AAA: " << num_keyboard_events << '\n'; //? 1
for (long long int i = 0; i < num_keyboard_events; ++i) {
Memory[Current_routine->alloc] = /*tag for 'keyboard-event' variant of 'event' exclusive-container*/0;
Memory[Current_routine->alloc] = /*tag for 'text' variant of 'event' exclusive-container*/0;
uint32_t curr_character;
assert(curr < SIZE(contents));
tb_utf8_char_to_unicode(&curr_character, &raw_contents[curr]);
//? cerr << "AA keyboard: " << curr_character << '\n'; //? 2
//? cerr << "AA keyboard: " << curr_character << '\n'; //? 3
Memory[Current_routine->alloc+/*skip exclusive container tag*/1] = curr_character;
curr += tb_utf8_char_length(raw_contents[curr]);
Current_routine->alloc += size_of_event();
@ -111,11 +113,13 @@ long long int count_events(const recipe& r) {
long long int result = 0;
for (long long int i = 0; i < SIZE(r.steps); ++i) {
const instruction& curr = r.steps.at(i);
//? cerr << curr.name << '\n'; //? 1
//? cerr << "aa: " << curr.name << '\n'; //? 3
//? cerr << "bb: " << curr.ingredients.at(0).name << '\n'; //? 1
if (curr.name == "type")
result += unicode_length(curr.ingredients.at(0).name);
else
result++;
//? cerr << "cc: " << result << '\n'; //? 1
}
return result;
}
@ -179,7 +183,7 @@ scenario events-in-scenario [
14 <- 65513 # mouse click
15 <- 0 # row
16 <- 1 # column
17 <- 1 # 'keycode'
17 <- 0 # 'text' (todo: make this 'keycode')
18 <- 65515 # up arrow
19 <- 0 # unused
20 <- 0 # unused

267
repl.mu
View File

@ -6,31 +6,32 @@ recipe main [
msg:address:array:character <- new [ready! type in an instruction, then hit enter. ctrl-d exits.
]
0:literal/real-screen <- print-string 0:literal/real-screen, msg:address:array:character, 245:literal/grey
0:literal/real-keyboard, 0:literal/real-screen <- color-session 0:literal/real-keyboard, 0:literal/real-screen
#? wait-for-key-from-keyboard #? 1
0:literal/real-console, 0:literal/real-screen <- color-session 0:literal/real-console, 0:literal/real-screen
close-console
]
recipe color-session [
default-space:address:array:location <- new location:type, 30:literal
keyboard:address <- next-ingredient
console:address <- next-ingredient
screen:address <- next-ingredient
{
inst:address:array:character, keyboard:address, screen:address <- read-instruction keyboard:address, screen:address
inst:address:array:character, console:address, screen:address <- read-instruction console:address, screen:address
break-unless inst:address:array:character
run-interactive inst:address:array:character
loop
}
reply keyboard:address/same-as-ingredient:0, screen:address/same-as-ingredient:1
reply console:address/same-as-ingredient:0, screen:address/same-as-ingredient:1
]
# basic keyboard input; just text and enter
# basic console input; just text and enter
scenario read-instruction1 [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [x <- copy y
assume-console [
type [x <- copy y
]
]
run [
1:address:array:character <- read-instruction keyboard:address, screen:address
1:address:array:character <- read-instruction console:address, screen:address
2:address:array:character <- new [=> ]
print-string screen:address, 2:address:array:character
print-string screen:address, 1:address:array:character
@ -51,13 +52,13 @@ scenario read-instruction1 [
]
]
# Read characters as they're typed at the keyboard, print them to the screen,
# Read characters as they're typed at the console, print them to the screen,
# accumulate them in a string, return the string at the end.
# Most of the complexity is for the printing to screen, to highlight strings
# and comments specially. Especially in the presence of backspacing.
recipe read-instruction [
default-space:address:array:location <- new location:type, 60:literal
k:address:keyboard <- next-ingredient
k:address:console <- next-ingredient
x:address:screen <- next-ingredient
result:address:buffer <- new-buffer 10:literal # string to maybe add to
trace [app], [read-instruction]
@ -70,7 +71,7 @@ recipe read-instruction [
completed?:boolean <- greater-than len:number, 0:literal
jump-if completed?:boolean, +completed:label
# Otherwise we're just getting started.
result:address:buffer, k:address:keyboard, x:address:screen <- slurp-regular-characters result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation
result:address:buffer, k:address:console, x:address:screen <- slurp-regular-characters result:address:buffer, k:address:console, x:address:screen, complete:continuation
#? $print [aaa: ], result:address:buffer #? 1
#? move-cursor-down-on-display #? 1
trace [error], [slurp-regular-characters should never return normally]
@ -79,15 +80,15 @@ recipe read-instruction [
#? $print [bbb: ], result2:address:array:character #? 1
#? move-cursor-down-on-display #? 1
trace [app], [exiting read-instruction]
reply result2:address:array:character, k:address:keyboard/same-as-ingredient:0, x:address:screen/same-as-ingredient:1
reply result2:address:array:character, k:address:console/same-as-ingredient:0, x:address:screen/same-as-ingredient:1
]
# read characters from the keyboard, print them to the screen in *white*.
# read characters from the console, print them to the screen in *white*.
# Transition to other routines for comments and strings.
recipe slurp-regular-characters [
default-space:address:array:location <- new location:type, 30:literal
result:address:buffer <- next-ingredient
k:address:keyboard <- next-ingredient
k:address:console <- next-ingredient
x:address:screen <- next-ingredient
complete:continuation <- next-ingredient
trace [app], [slurp-regular-characters]
@ -100,7 +101,8 @@ recipe slurp-regular-characters [
#? ] #? 1
#? move-cursor-down-on-display #? 1
# read character
c:character, k:address:keyboard <- wait-for-key k:address:keyboard
c:character, k:address:console found?:boolean <- read-key k:address:console
loop-unless found?:boolean +next-character:label
#? print-character x:address:screen, c:character #? 1
#? move-cursor-down-on-display #? 1
# quit?
@ -112,13 +114,13 @@ recipe slurp-regular-characters [
#? $print [ctrl-d] #? 1
#? move-cursor-down-on-display #? 1
trace [app], [slurp-regular-characters: ctrl-d]
reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
{
null?:boolean <- equal c:character, 0:literal/null
break-unless null?:boolean
trace [app], [slurp-regular-characters: null]
reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
# comment?
{
@ -126,7 +128,7 @@ recipe slurp-regular-characters [
break-unless comment?:boolean
print-character x:address:screen, c:character, 4:literal/blue
result:address:buffer <- buffer-append result:address:buffer, c:character
result:address:buffer, k:address:keyboard, x:address:screen <- slurp-comment result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation
result:address:buffer, k:address:console, x:address:screen <- slurp-comment result:address:buffer, k:address:console, x:address:screen, complete:continuation
# continue appending to this instruction, whether comment ended or was backspaced out of
loop +next-character:label
}
@ -136,7 +138,7 @@ recipe slurp-regular-characters [
break-unless string?:boolean
print-character x:address:screen, c:character, 6:literal/cyan
result:address:buffer <- buffer-append result:address:buffer, c:character
result:address:buffer, _, k:address:keyboard, x:address:screen <- slurp-string result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation
result:address:buffer, _, k:address:console, x:address:screen <- slurp-string result:address:buffer, k:address:console, x:address:screen, complete:continuation
loop +next-character:label
}
# assignment
@ -146,7 +148,7 @@ recipe slurp-regular-characters [
print-character x:address:screen, c:character, 1:literal/red
trace [app], [start of assignment: <]
result:address:buffer <- buffer-append result:address:buffer, c:character
result:address:buffer, k:address:keyboard, x:address:screen <- slurp-assignment result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation
result:address:buffer, k:address:console, x:address:screen <- slurp-assignment result:address:buffer, k:address:console, x:address:screen, complete:continuation
loop +next-character:label
}
# print
@ -180,7 +182,7 @@ recipe slurp-regular-characters [
#? $print [a6 #? 1
#? ] #? 1
#? move-cursor-down-on-display #? 1
reply result:address:buffer, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply result:address:buffer, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
loop +next-character:label
}
@ -201,14 +203,14 @@ recipe slurp-regular-characters [
continue-from complete:continuation
]
# read characters from keyboard, print them to screen in the comment color.
# read characters from console, print them to screen in the comment color.
#
# Simpler version of slurp-regular-characters; doesn't handle comments or
# strings. Tracks an extra count in case we backspace out of it
recipe slurp-comment [
default-space:address:array:location <- new location:type, 30:literal
result:address:buffer <- next-ingredient
k:address:keyboard <- next-ingredient
k:address:console <- next-ingredient
x:address:screen <- next-ingredient
complete:continuation <- next-ingredient
trace [app], [slurp-comment]
@ -217,19 +219,20 @@ recipe slurp-comment [
{
+next-character
# read character
c:character, k:address:keyboard <- wait-for-key k:address:keyboard
c:character, k:address:console, found?:boolean <- read-key k:address:console
loop-unless found?:boolean +next-character:label
# quit?
{
ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof
break-unless ctrl-d?:boolean
trace [app], [slurp-comment: ctrl-d]
reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
{
null?:boolean <- equal c:character, 0:literal/null
break-unless null?:boolean
trace [app], [slurp-comment: null]
reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
# print
print-character x:address:screen, c:character, 4:literal/blue
@ -244,7 +247,7 @@ recipe slurp-comment [
reset-color?:boolean <- lesser-or-equal characters-slurped:number, 0:literal
break-unless reset-color?:boolean
trace [app], [slurp-comment: too many backspaces; returning]
reply result:address:buffer, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply result:address:buffer, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
loop +next-character:label
}
@ -259,7 +262,7 @@ recipe slurp-comment [
continue-from complete:continuation
]
# read characters from keyboard, print them to screen in the string color and
# read characters from console, print them to screen in the string color and
# accumulate them into a buffer.
#
# Version of slurp-regular-characters that:
@ -269,7 +272,7 @@ recipe slurp-comment [
recipe slurp-string [
default-space:address:array:location <- new location:type, 30:literal
result:address:buffer <- next-ingredient
k:address:keyboard <- next-ingredient
k:address:console <- next-ingredient
x:address:screen <- next-ingredient
complete:continuation <- next-ingredient
nested-string?:boolean <- next-ingredient
@ -279,19 +282,20 @@ recipe slurp-string [
{
+next-character
# read character
c:character, k:address:keyboard <- wait-for-key k:address:keyboard
c:character, k:address:console, found?:boolean <- read-key k:address:console
loop-unless found?:boolean +next-character:label
# quit?
{
ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof
break-unless ctrl-d?:boolean
trace [app], [slurp-string: ctrl-d]
reply 0:literal, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
{
null?:boolean <- equal c:character, 0:literal/null
break-unless null?:boolean
trace [app], [slurp-string: null]
reply 0:literal, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
# string
{
@ -301,7 +305,7 @@ recipe slurp-string [
print-character x:address:screen, c:character, 6:literal/cyan
result:address:buffer <- buffer-append result:address:buffer, c:character
# make a recursive call to handle nested strings
result:address:buffer, tmp:number, k:address:keyboard, x:address:screen <- slurp-string result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation, 1:literal/nested?
result:address:buffer, tmp:number, k:address:console, x:address:screen <- slurp-string result:address:buffer, k:address:console, x:address:screen, complete:continuation, 1:literal/nested?
# but if we backspace over a completed nested string, handle it in the caller
characters-slurped:number <- add characters-slurped:number, tmp:number, 1:literal # for the leading '['
loop +next-character:label
@ -319,7 +323,7 @@ recipe slurp-string [
reset-color?:boolean <- lesser-or-equal characters-slurped:number, 0:literal
break-unless reset-color?:boolean
trace [app], [slurp-string: too many backspaces; returning]
reply result:address:buffer/same-as-ingredient:0, 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply result:address:buffer/same-as-ingredient:0, 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
loop +next-character:label
}
@ -333,11 +337,11 @@ recipe slurp-string [
{
break-unless nested-string?:boolean
# nested string? return like a normal recipe
reply result:address:buffer, characters-slurped:number, k:address:keyboard, x:address:screen
reply result:address:buffer, characters-slurped:number, k:address:console, x:address:screen
}
# top-level string call? recurse
trace [app], [slurp-string: close-bracket encountered; recursing to regular characters]
result:address:buffer, k:address:keyboard, x:address:screen <- slurp-regular-characters result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation
result:address:buffer, k:address:console, x:address:screen <- slurp-regular-characters result:address:buffer, k:address:console, x:address:screen, complete:continuation
# backspaced back into this string
trace [app], [slurp-string: backspaced back into string; restarting]
jump +next-character:label
@ -346,25 +350,26 @@ recipe slurp-string [
recipe slurp-assignment [
default-space:address:array:location <- new location:type, 30:literal
result:address:buffer <- next-ingredient
k:address:keyboard <- next-ingredient
k:address:console <- next-ingredient
x:address:screen <- next-ingredient
complete:continuation <- next-ingredient
{
+next-character
# read character
c:character, k:address:keyboard <- wait-for-key k:address:keyboard
c:character, k:address:console, found?:boolean <- read-key k:address:console
loop-unless found?:boolean +next-character:label
# quit?
{
ctrl-d?:boolean <- equal c:character, 4:literal/ctrl-d/eof
break-unless ctrl-d?:boolean
trace [app], [slurp-assignment: ctrl-d]
reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
{
null?:boolean <- equal c:character, 0:literal/null
break-unless null?:boolean
trace [app], [slurp-assignment: null]
reply 0:literal, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply 0:literal, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
# print
print-character x:address:screen, c:character, 1:literal/red
@ -376,11 +381,11 @@ recipe slurp-assignment [
backspace?:boolean <- equal c:character, 8:literal/backspace
break-unless backspace?:boolean
trace [app], [slurp-assignment: backspace; returning]
reply result:address:buffer/same-as-ingredient:0, k:address:keyboard/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
reply result:address:buffer/same-as-ingredient:0, k:address:console/same-as-ingredient:1, x:address:screen/same-as-ingredient:2
}
}
trace [app], [slurp-assignment: done, recursing to regular characters]
result:address:buffer, k:address:keyboard, x:address:screen <- slurp-regular-characters result:address:buffer, k:address:keyboard, x:address:screen, complete:continuation
result:address:buffer, k:address:console, x:address:screen <- slurp-regular-characters result:address:buffer, k:address:console, x:address:screen, complete:continuation
# backspaced back into this string
trace [app], [slurp-assignment: backspaced back into assignment; restarting]
jump +next-character:label
@ -388,10 +393,11 @@ recipe slurp-assignment [
scenario read-instruction-color-comment [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [# comment
]
assume-console [
type [# comment]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain-in-color 4:literal/blue, [
.# comment .
@ -405,11 +411,14 @@ scenario read-instruction-color-comment [
scenario read-instruction-cancel-comment-on-backspace [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [#a««z
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [#a]
press 8 # backspace
press 8 # backspace
type [z]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain-in-color 4:literal/blue, [
. .
@ -423,11 +432,15 @@ scenario read-instruction-cancel-comment-on-backspace [
scenario read-instruction-cancel-comment-on-backspace2 [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [#ab«««z
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [#ab]
press 8 # backspace
press 8 # backspace
press 8 # backspace
type [z]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain-in-color 4:literal/blue, [
. .
@ -441,11 +454,13 @@ scenario read-instruction-cancel-comment-on-backspace2 [
scenario read-instruction-cancel-comment-on-backspace3 [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [#a«z
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [#a]
press 8 # backspace
type [z]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain-in-color 4:literal/blue, [
.#z .
@ -459,13 +474,13 @@ scenario read-instruction-cancel-comment-on-backspace3 [
scenario read-instruction-stop-after-comment [
assume-screen 30:literal/width, 5:literal/height
# keyboard contains comment and then a second line
assume-keyboard [#abc
3
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
# console contains comment and then a second line
assume-console [
type [#abc
3]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
# check that read-instruction reads just the comment
screen-should-contain [
@ -477,10 +492,11 @@ scenario read-instruction-stop-after-comment [
scenario read-instruction-color-string [
#? $start-tracing #? 1
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [abc [string]
]
assume-console [
type [abc [string]]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.abc [string] .
@ -498,11 +514,12 @@ scenario read-instruction-color-string [
scenario read-instruction-color-string-multiline [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [abc [line1
line2]
]
assume-console [
type [abc [line1
line2]]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.abc [line1 .
@ -523,10 +540,11 @@ line2]
scenario read-instruction-color-string-and-comment [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [abc [string] # comment
]
assume-console [
type [abc [string] # comment]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.abc [string] # comment .
@ -548,10 +566,11 @@ scenario read-instruction-color-string-and-comment [
scenario read-instruction-ignore-comment-inside-string [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [abc [string # not a comment]
]
assume-console [
type [abc [string # not a comment]]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.abc [string # not a comment] .
@ -573,10 +592,11 @@ scenario read-instruction-ignore-comment-inside-string [
scenario read-instruction-ignore-string-inside-comment [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [abc # comment [not a string]
]
assume-console [
type [abc # comment [not a string]]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.abc # comment [not a string] .
@ -598,11 +618,12 @@ scenario read-instruction-ignore-string-inside-comment [
scenario read-instruction-color-string-inside-string [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [abc [string [inner string]]
]
assume-console [
type [abc [string [inner string]]]
]
run [
#? $start-tracing #? 1
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
#? $stop-tracing #? 1
#? $browse-trace #? 1
]
@ -622,12 +643,18 @@ scenario read-instruction-color-string-inside-string [
scenario read-instruction-cancel-string-on-backspace [
assume-screen 30:literal/width, 5:literal/height
# need to escape the '[' once for 'scenario' and once for 'assume-keyboard'
assume-keyboard [\\\[a««z
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
# need to escape the '[' once for 'scenario' and once for 'assume-console'
assume-console [
type [\\\\\[a]
press 8 # backspace
type [z]
]
run [
read-instruction keyboard:address, screen:address
#? d:address:array:event <- get console:address:console/deref, data:offset #? 1
#? $print [a: ], d:address:array:event #? 1
#? x:number <- length d:address:array:event/deref #? 1
#? $print [b: ], x:number #? 1
read-instruction console:address:console, screen:address
]
screen-should-contain-in-color 6:literal/cyan, [
. .
@ -641,11 +668,15 @@ scenario read-instruction-cancel-string-on-backspace [
scenario read-instruction-cancel-string-inside-string-on-backspace [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [[a[b]«««b]
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [\\\\\[a[b]]
press 8 # backspace
press 8 # backspace
press 8 # backspace
type [b\\\\\]]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain-in-color 6:literal/cyan, [
.[ab] .
@ -659,11 +690,13 @@ scenario read-instruction-cancel-string-inside-string-on-backspace [
scenario read-instruction-backspace-back-into-string [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [[a]«b
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [[a]]
press 8 # backspace
type [b]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.\\\[ab .
@ -688,10 +721,11 @@ scenario read-instruction-backspace-back-into-string [
scenario read-instruction-highlight-start-of-assignment [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [a <
]
assume-console [
type [a <]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.a < .
@ -709,10 +743,11 @@ scenario read-instruction-highlight-start-of-assignment [
scenario read-instruction-highlight-assignment [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [a <- b
]
assume-console [
type [a <- b]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.a <- b .
@ -730,11 +765,12 @@ scenario read-instruction-highlight-assignment [
scenario read-instruction-backspace-over-assignment [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [a <-«
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [a <-]
press 8 # backspace
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.a < .
@ -752,12 +788,14 @@ scenario read-instruction-backspace-over-assignment [
scenario read-instruction-assignment-continues-after-backspace [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [a <-«-
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [a <-]
press 8 # backspace
type [-]
]
#? $print [aaa] #? 1
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
]
screen-should-contain [
.a <- .
@ -775,11 +813,14 @@ scenario read-instruction-assignment-continues-after-backspace [
scenario read-instruction-assignment-continues-after-backspace2 [
assume-screen 30:literal/width, 5:literal/height
assume-keyboard [a <- ««-
]
replace-in-keyboard 171:literal/«, 8:literal/backspace
assume-console [
type [a <- ]
press 8 # backspace
press 8 # backspace
type [-]
]
run [
read-instruction keyboard:address, screen:address
read-instruction console:address, screen:address
#? $browse-trace #? 1
]
screen-should-contain [