mu/shell/sandbox.mu

615 lines
23 KiB
Forth
Raw Normal View History

type sandbox {
data: (handle gap-buffer)
value: (handle stream byte)
2021-04-11 03:44:26 +00:00
screen-var: (handle cell)
keyboard-var: (handle cell)
2021-02-23 03:46:23 +00:00
trace: (handle trace)
cursor-in-trace?: boolean
cursor-in-keyboard?: boolean
}
fn initialize-sandbox _self: (addr sandbox), screen-and-keyboard?: boolean {
var self/esi: (addr sandbox) <- copy _self
var data-ah/eax: (addr handle gap-buffer) <- get self, data
allocate data-ah
var data/eax: (addr gap-buffer) <- lookup *data-ah
initialize-gap-buffer data, 0x1000/4KB
2021-04-11 03:44:26 +00:00
#
var value-ah/eax: (addr handle stream byte) <- get self, value
populate-stream value-ah, 0x1000/4KB
2021-04-11 03:44:26 +00:00
#
{
compare screen-and-keyboard?, 0/false
2021-04-11 03:44:26 +00:00
break-if-=
var screen-ah/eax: (addr handle cell) <- get self, screen-var
new-screen screen-ah, 5/width, 4/height
var keyboard-ah/eax: (addr handle cell) <- get self, keyboard-var
new-keyboard keyboard-ah, 0x10/keyboard-capacity
2021-04-11 03:44:26 +00:00
}
#
var trace-ah/eax: (addr handle trace) <- get self, trace
allocate trace-ah
var trace/eax: (addr trace) <- lookup *trace-ah
2021-02-27 05:29:39 +00:00
initialize-trace trace, 0x1000/lines, 0x80/visible-lines
}
## some helpers for tests
fn initialize-sandbox-with _self: (addr sandbox), s: (addr array byte) {
var self/esi: (addr sandbox) <- copy _self
var data-ah/eax: (addr handle gap-buffer) <- get self, data
allocate data-ah
var data/eax: (addr gap-buffer) <- lookup *data-ah
initialize-gap-buffer-with data, s
}
fn allocate-sandbox-with _out: (addr handle sandbox), s: (addr array byte) {
var out/eax: (addr handle sandbox) <- copy _out
allocate out
var out-addr/eax: (addr sandbox) <- lookup *out
initialize-sandbox-with out-addr, s
}
2021-02-23 07:25:52 +00:00
##
2021-04-10 22:59:40 +00:00
fn render-sandbox screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int, xmax: int, ymax: int, globals: (addr global-table) {
2021-04-09 05:19:24 +00:00
clear-rect screen, xmin, ymin, xmax, ymax, 0/bg=black
var self/esi: (addr sandbox) <- copy _self
# data
var data-ah/eax: (addr handle gap-buffer) <- get self, data
var _data/eax: (addr gap-buffer) <- lookup *data-ah
var data/edx: (addr gap-buffer) <- copy _data
2021-02-23 07:59:35 +00:00
var x/eax: int <- copy xmin
var y/ecx: int <- copy ymin
2021-04-11 03:44:26 +00:00
y <- maybe-render-empty-screen screen, self, xmin, y
y <- maybe-render-keyboard screen, self, xmin, y
var cursor-in-sandbox?/ebx: boolean <- copy 0/false
{
var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
compare *cursor-in-trace?, 0/false
break-if-!=
cursor-in-sandbox? <- copy 1/true
}
2021-02-23 07:59:35 +00:00
x, y <- render-gap-buffer-wrapping-right-then-down screen, data, x, y, xmax, ymax, cursor-in-sandbox?
y <- increment
# trace
var trace-ah/eax: (addr handle trace) <- get self, trace
var _trace/eax: (addr trace) <- lookup *trace-ah
var trace/edx: (addr trace) <- copy _trace
var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
2021-02-23 07:59:35 +00:00
y <- render-trace screen, trace, xmin, y, xmax, ymax, *cursor-in-trace?
# value
2021-02-23 07:59:35 +00:00
$render-sandbox:value: {
var value-ah/eax: (addr handle stream byte) <- get self, value
var _value/eax: (addr stream byte) <- lookup *value-ah
var value/esi: (addr stream byte) <- copy _value
2021-02-23 16:58:43 +00:00
rewind-stream value
2021-02-23 07:59:35 +00:00
var done?/eax: boolean <- stream-empty? value
compare done?, 0/false
break-if-!=
var x/eax: int <- copy 0
x, y <- draw-text-wrapping-right-then-down screen, "=> ", xmin, y, xmax, ymax, xmin, y, 7/fg, 0/bg
var x2/edx: int <- copy x
var dummy/eax: int <- draw-stream-rightward screen, value, x2, xmax, y, 7/fg=grey, 0/bg
}
y <- add 2 # padding
2021-04-11 03:44:26 +00:00
y <- maybe-render-screen screen, self, xmin, y
2021-02-23 07:59:35 +00:00
# render menu
var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
compare *cursor-in-trace?, 0/false
{
break-if-=
2021-02-23 07:59:35 +00:00
render-trace-menu screen
return
}
2021-02-23 07:59:35 +00:00
render-sandbox-menu screen
}
2021-04-11 03:44:26 +00:00
fn maybe-render-empty-screen screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int -> _/ecx: int {
var self/esi: (addr sandbox) <- copy _self
var screen-obj-cell-ah/eax: (addr handle cell) <- get self, screen-var
var screen-obj-cell/eax: (addr cell) <- lookup *screen-obj-cell-ah
compare screen-obj-cell, 0
{
break-if-!=
return ymin
}
var screen-obj-cell-type/ecx: (addr int) <- get screen-obj-cell, type
compare *screen-obj-cell-type, 5/screen
{
break-if-=
return ymin # silently give up on rendering the screen
}
var y/ecx: int <- copy ymin
var screen-obj-ah/eax: (addr handle screen) <- get screen-obj-cell, screen-data
var _screen-obj/eax: (addr screen) <- lookup *screen-obj-ah
var screen-obj/edx: (addr screen) <- copy _screen-obj
var x/eax: int <- draw-text-rightward screen, "screen: ", xmin, 0x99/xmax, y, 7/fg, 0/bg
y <- render-empty-screen screen, screen-obj, x, y
y <- increment # padding
return y
}
2021-04-11 03:44:26 +00:00
fn maybe-render-screen screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int -> _/ecx: int {
var self/esi: (addr sandbox) <- copy _self
var screen-obj-cell-ah/eax: (addr handle cell) <- get self, screen-var
var screen-obj-cell/eax: (addr cell) <- lookup *screen-obj-cell-ah
compare screen-obj-cell, 0
{
break-if-!=
return ymin
}
var screen-obj-cell-type/ecx: (addr int) <- get screen-obj-cell, type
compare *screen-obj-cell-type, 5/screen
{
break-if-=
return ymin # silently give up on rendering the screen
}
var screen-obj-ah/eax: (addr handle screen) <- get screen-obj-cell, screen-data
var _screen-obj/eax: (addr screen) <- lookup *screen-obj-ah
var screen-obj/edx: (addr screen) <- copy _screen-obj
{
var screen-empty?/eax: boolean <- fake-screen-empty? screen-obj
compare screen-empty?, 0/false
break-if-=
return ymin
}
var x/eax: int <- draw-text-rightward screen, "screen: ", xmin, 0x99/xmax, ymin, 7/fg, 0/bg
2021-04-10 22:59:40 +00:00
var y/ecx: int <- copy ymin
y <- render-screen screen, screen-obj, x, y
return y
}
fn render-empty-screen screen: (addr screen), _target-screen: (addr screen), xmin: int, ymin: int -> _/ecx: int {
var target-screen/esi: (addr screen) <- copy _target-screen
var screen-y/edi: int <- copy ymin
# top border
{
set-cursor-position screen, xmin, screen-y
move-cursor-right screen
var width/edx: (addr int) <- get target-screen, width
var x/ebx: int <- copy 0
{
compare x, *width
break-if->=
draw-code-point-at-cursor screen, 0x2d/horizontal-bar, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
screen-y <- increment
}
# screen
var height/edx: (addr int) <- get target-screen, height
var y/ecx: int <- copy 0
{
compare y, *height
break-if->=
set-cursor-position screen, xmin, screen-y
draw-code-point-at-cursor screen, 0x7c/vertical-bar, 0x18/fg, 0/bg
move-cursor-right screen
var width/edx: (addr int) <- get target-screen, width
var x/ebx: int <- copy 0
{
compare x, *width
break-if->=
draw-code-point-at-cursor screen, 0x20/space, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
draw-code-point-at-cursor screen, 0x7c/vertical-bar, 0x18/fg, 0/bg
y <- increment
screen-y <- increment
loop
}
# bottom border
{
set-cursor-position screen, xmin, screen-y
move-cursor-right screen
var width/edx: (addr int) <- get target-screen, width
var x/ebx: int <- copy 0
{
compare x, *width
break-if->=
draw-code-point-at-cursor screen, 0x2d/horizontal-bar, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
screen-y <- increment
}
return screen-y
}
fn render-screen screen: (addr screen), _target-screen: (addr screen), xmin: int, ymin: int -> _/ecx: int {
var target-screen/esi: (addr screen) <- copy _target-screen
var screen-y/edi: int <- copy ymin
# top border
{
set-cursor-position screen, xmin, screen-y
move-cursor-right screen
var width/edx: (addr int) <- get target-screen, width
var x/ebx: int <- copy 0
{
compare x, *width
break-if->=
draw-code-point-at-cursor screen, 0x2d/horizontal-bar, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
screen-y <- increment
}
# screen
var height/edx: (addr int) <- get target-screen, height
var y/ecx: int <- copy 0
{
compare y, *height
break-if->=
set-cursor-position screen, xmin, screen-y
draw-code-point-at-cursor screen, 0x7c/vertical-bar, 0x18/fg, 0/bg
move-cursor-right screen
var width/edx: (addr int) <- get target-screen, width
var x/ebx: int <- copy 0
{
compare x, *width
break-if->=
print-screen-cell-of-fake-screen screen, target-screen, x, y
move-cursor-right screen
x <- increment
loop
}
draw-code-point-at-cursor screen, 0x7c/vertical-bar, 0x18/fg, 0/bg
y <- increment
screen-y <- increment
loop
}
# bottom border
{
set-cursor-position screen, xmin, screen-y
move-cursor-right screen
var width/edx: (addr int) <- get target-screen, width
var x/ebx: int <- copy 0
{
compare x, *width
break-if->=
draw-code-point-at-cursor screen, 0x2d/horizontal-bar, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
screen-y <- increment
}
return screen-y
2021-04-10 22:59:40 +00:00
}
fn maybe-render-keyboard screen: (addr screen), _self: (addr sandbox), xmin: int, ymin: int -> _/ecx: int {
var self/esi: (addr sandbox) <- copy _self
var keyboard-obj-cell-ah/eax: (addr handle cell) <- get self, keyboard-var
var keyboard-obj-cell/eax: (addr cell) <- lookup *keyboard-obj-cell-ah
compare keyboard-obj-cell, 0
{
break-if-!=
return ymin
}
var keyboard-obj-cell-type/ecx: (addr int) <- get keyboard-obj-cell, type
compare *keyboard-obj-cell-type, 6/keyboard
{
break-if-=
return ymin # silently give up on rendering the keyboard
}
var keyboard-obj-ah/eax: (addr handle gap-buffer) <- get keyboard-obj-cell, keyboard-data
var _keyboard-obj/eax: (addr gap-buffer) <- lookup *keyboard-obj-ah
var keyboard-obj/edx: (addr gap-buffer) <- copy _keyboard-obj
var x/eax: int <- draw-text-rightward screen, "keyboard: ", xmin, 0x99/xmax, ymin, 7/fg, 0/bg
var y/ecx: int <- copy ymin
var cursor-in-keyboard?/esi: (addr boolean) <- get self, cursor-in-keyboard?
y <- render-keyboard screen, keyboard-obj, x, y, *cursor-in-keyboard?
return y
}
# draw an evocative shape
fn render-keyboard screen: (addr screen), _keyboard: (addr gap-buffer), xmin: int, ymin: int, render-cursor?: boolean -> _/ecx: int {
var keyboard/esi: (addr gap-buffer) <- copy _keyboard
var width/edx: int <- copy 0x10/keyboard-capacity
var y/edi: int <- copy ymin
# top border
{
set-cursor-position screen, xmin, y
move-cursor-right screen
var x/ebx: int <- copy 0
{
compare x, width
break-if->=
draw-code-point-at-cursor screen, 0x2d/horizontal-bar, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
y <- increment
}
# keyboard
var x/eax: int <- copy xmin
draw-code-point screen, 0x7c/vertical-bar, x, y, 0x18/fg, 0/bg
x <- increment
x <- render-gap-buffer screen, keyboard, x, y, render-cursor?
x <- copy xmin
x <- add 1 # for left bar
x <- add 0x10/keyboard-capacity
draw-code-point screen, 0x7c/vertical-bar, x, y, 0x18/fg, 0/bg
y <- increment
# bottom border
{
set-cursor-position screen, xmin, y
move-cursor-right screen
var x/ebx: int <- copy 0
{
compare x, width
break-if->=
draw-code-point-at-cursor screen, 0x2d/horizontal-bar, 0x18/fg, 0/bg
move-cursor-right screen
x <- increment
loop
}
y <- increment
}
return y
}
fn print-screen-cell-of-fake-screen screen: (addr screen), _target: (addr screen), x: int, y: int {
var target/ecx: (addr screen) <- copy _target
var data-ah/eax: (addr handle array screen-cell) <- get target, data
var data/eax: (addr array screen-cell) <- lookup *data-ah
var index/ecx: int <- screen-cell-index target, x, y
var offset/ecx: (offset screen-cell) <- compute-offset data, index
var src-cell/esi: (addr screen-cell) <- index data, offset
var src-grapheme/eax: (addr grapheme) <- get src-cell, data
var src-color/ecx: (addr int) <- get src-cell, color
var src-background-color/edx: (addr int) <- get src-cell, background-color
draw-grapheme-at-cursor screen, *src-grapheme, *src-color, *src-background-color
}
2021-02-23 07:59:35 +00:00
fn render-sandbox-menu screen: (addr screen) {
var width/eax: int <- copy 0
var height/ecx: int <- copy 0
width, height <- screen-size screen
var y/ecx: int <- copy height
y <- decrement
2021-04-09 05:44:29 +00:00
var height/edx: int <- copy y
height <- increment
clear-rect screen, 0/x, y, width, height, 0/bg=black
2021-02-23 07:59:35 +00:00
set-cursor-position screen, 0/x, y
draw-text-rightward-from-cursor screen, " ctrl-s ", width, 0/fg, 7/bg=grey
draw-text-rightward-from-cursor screen, " run sandbox ", width, 7/fg, 0/bg
draw-text-rightward-from-cursor screen, " tab ", width, 0/fg, 9/bg=blue
draw-text-rightward-from-cursor screen, " move to trace ", width, 7/fg, 0/bg
}
fn edit-sandbox _self: (addr sandbox), key: byte, globals: (addr global-table), real-screen: (addr screen), real-keyboard: (addr keyboard), data-disk: (addr disk) {
var self/esi: (addr sandbox) <- copy _self
var g/edx: grapheme <- copy key
# ctrl-r
2021-02-22 05:25:38 +00:00
{
compare g, 0x12/ctrl-r
break-if-!=
# run function outside sandbox
2021-02-22 05:25:38 +00:00
# required: fn (addr screen), (addr keyboard)
# Mu will pass in the real screen and keyboard.
return
}
# ctrl-s
{
compare g, 0x13/ctrl-s
break-if-!=
# save to disk
var data-ah/eax: (addr handle gap-buffer) <- get self, data
var _data/eax: (addr gap-buffer) <- lookup *data-ah
var data/ecx: (addr gap-buffer) <- copy _data
{
compare data-disk, 0/no-disk
break-if-=
var stream-storage: (stream byte 0x200)
var stream/esi: (addr stream byte) <- address stream-storage
emit-gap-buffer data, stream
store-sector data-disk, 0/lba, stream
}
# run sandbox
var value-ah/eax: (addr handle stream byte) <- get self, value
2021-02-23 03:46:23 +00:00
var _value/eax: (addr stream byte) <- lookup *value-ah
var value/edx: (addr stream byte) <- copy _value
var trace-ah/eax: (addr handle trace) <- get self, trace
2021-04-11 03:44:26 +00:00
var _trace/eax: (addr trace) <- lookup *trace-ah
var trace/ebx: (addr trace) <- copy _trace
clear-trace trace
2021-04-11 03:44:26 +00:00
var screen-cell/eax: (addr handle cell) <- get self, screen-var
clear-screen-cell screen-cell
var keyboard-cell/esi: (addr handle cell) <- get self, keyboard-var
# don't clear
run data, value, globals, trace, screen-cell, keyboard-cell
return
}
2021-02-23 16:58:43 +00:00
# tab
2021-02-23 07:25:52 +00:00
var cursor-in-trace?/eax: (addr boolean) <- get self, cursor-in-trace?
{
2021-02-23 07:59:35 +00:00
compare g, 9/tab
break-if-!=
2021-02-23 07:59:35 +00:00
# if cursor in input, switch to trace
{
compare *cursor-in-trace?, 0/false
break-if-!=
copy-to *cursor-in-trace?, 1/true
return
}
2021-02-23 07:59:35 +00:00
# if cursor in trace, switch to input
copy-to *cursor-in-trace?, 0/false
return
2021-02-23 07:25:52 +00:00
}
# if cursor in trace, send cursor to trace
{
compare *cursor-in-trace?, 0/false
break-if-=
var trace-ah/eax: (addr handle trace) <- get self, trace
var trace/eax: (addr trace) <- lookup *trace-ah
edit-trace trace, g
return
}
2021-02-23 07:25:52 +00:00
# otherwise send cursor to input
var data-ah/eax: (addr handle gap-buffer) <- get self, data
var data/eax: (addr gap-buffer) <- lookup *data-ah
edit-gap-buffer data, g
return
}
2021-02-22 05:36:33 +00:00
fn run in: (addr gap-buffer), out: (addr stream byte), globals: (addr global-table), trace: (addr trace), screen-cell: (addr handle cell), keyboard-cell: (addr handle cell) {
var read-result-storage: (handle cell)
var read-result/esi: (addr handle cell) <- address read-result-storage
2021-02-23 03:46:23 +00:00
read-cell in, read-result, trace
var error?/eax: boolean <- has-errors? trace
{
compare error?, 0/false
break-if-=
return
}
2021-03-05 07:08:44 +00:00
var nil-storage: (handle cell)
2021-03-05 14:19:21 +00:00
var nil-ah/eax: (addr handle cell) <- address nil-storage
2021-03-05 07:08:44 +00:00
allocate-pair nil-ah
2021-03-05 05:24:48 +00:00
var eval-result-storage: (handle cell)
var eval-result/edi: (addr handle cell) <- address eval-result-storage
evaluate read-result, eval-result, *nil-ah, globals, trace, screen-cell, keyboard-cell
2021-03-05 05:24:48 +00:00
var error?/eax: boolean <- has-errors? trace
{
compare error?, 0/false
break-if-=
return
}
2021-03-02 07:25:22 +00:00
clear-stream out
2021-03-05 05:24:48 +00:00
print-cell eval-result, out, trace
mark-lines-dirty trace
2021-02-22 05:36:33 +00:00
}
fn test-run-integer {
var sandbox-storage: sandbox
var sandbox/esi: (addr sandbox) <- address sandbox-storage
initialize-sandbox sandbox, 0/no-screen-or-keyboard
# type "1"
edit-sandbox sandbox, 0x31/1, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# eval
edit-sandbox sandbox, 0x13/ctrl-s, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# setup: screen
var screen-on-stack: screen
var screen/edi: (addr screen) <- address screen-on-stack
2021-02-23 07:59:35 +00:00
initialize-screen screen, 0x80/width, 0x10/height
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
check-screen-row screen, 0/y, "1 ", "F - test-run-integer/0"
check-screen-row screen, 1/y, "... ", "F - test-run-integer/1"
check-screen-row screen, 2/y, "=> 1 ", "F - test-run-integer/2"
}
fn test-run-with-spaces {
var sandbox-storage: sandbox
var sandbox/esi: (addr sandbox) <- address sandbox-storage
initialize-sandbox sandbox, 0/no-screen-or-keyboard
2021-03-09 02:05:36 +00:00
# type input with whitespace before and after
edit-sandbox sandbox, 0x20/space, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
edit-sandbox sandbox, 0x31/1, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
edit-sandbox sandbox, 0x20/space, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
edit-sandbox sandbox, 0xa/newline, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# eval
edit-sandbox sandbox, 0x13/ctrl-s, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# setup: screen
var screen-on-stack: screen
var screen/edi: (addr screen) <- address screen-on-stack
initialize-screen screen, 0x80/width, 0x10/height
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
check-screen-row screen, 0/y, " 1 ", "F - test-run-with-spaces/0"
check-screen-row screen, 1/y, " ", "F - test-run-with-spaces/1"
check-screen-row screen, 2/y, "... ", "F - test-run-with-spaces/2"
check-screen-row screen, 3/y, "=> 1 ", "F - test-run-with-spaces/3"
}
2021-04-06 16:40:13 +00:00
fn test-run-quote {
var sandbox-storage: sandbox
var sandbox/esi: (addr sandbox) <- address sandbox-storage
initialize-sandbox sandbox, 0/no-screen-or-keyboard
2021-04-06 16:40:13 +00:00
# type "'a"
edit-sandbox sandbox, 0x27/quote, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
edit-sandbox sandbox, 0x61/a, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# eval
edit-sandbox sandbox, 0x13/ctrl-s, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# setup: screen
var screen-on-stack: screen
var screen/edi: (addr screen) <- address screen-on-stack
initialize-screen screen, 0x80/width, 0x10/height
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
2021-04-06 16:40:13 +00:00
check-screen-row screen, 0/y, "'a ", "F - test-run-quote/0"
check-screen-row screen, 1/y, "... ", "F - test-run-quote/1"
check-screen-row screen, 2/y, "=> a ", "F - test-run-quote/2"
}
fn test-run-error-invalid-integer {
var sandbox-storage: sandbox
var sandbox/esi: (addr sandbox) <- address sandbox-storage
initialize-sandbox sandbox, 0/no-screen-or-keyboard
# type "1a"
edit-sandbox sandbox, 0x31/1, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
edit-sandbox sandbox, 0x61/a, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# eval
edit-sandbox sandbox, 0x13/ctrl-s, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# setup: screen
var screen-on-stack: screen
var screen/edi: (addr screen) <- address screen-on-stack
2021-02-23 07:59:35 +00:00
initialize-screen screen, 0x80/width, 0x10/height
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
check-screen-row screen, 0/y, "1a ", "F - test-run-error-invalid-integer/0"
check-screen-row screen, 1/y, "... ", "F - test-run-error-invalid-integer/0"
check-screen-row screen, 2/y, "invalid number ", "F - test-run-error-invalid-integer/2"
}
fn test-run-move-cursor-into-trace {
var sandbox-storage: sandbox
var sandbox/esi: (addr sandbox) <- address sandbox-storage
initialize-sandbox sandbox, 0/no-screen-or-keyboard
# type "12"
edit-sandbox sandbox, 0x31/1, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
edit-sandbox sandbox, 0x32/2, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# eval
edit-sandbox sandbox, 0x13/ctrl-s, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
# setup: screen
var screen-on-stack: screen
var screen/edi: (addr screen) <- address screen-on-stack
2021-02-23 07:59:35 +00:00
initialize-screen screen, 0x80/width, 0x10/height
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
check-screen-row screen, 0/y, "12 ", "F - test-run-move-cursor-into-trace/pre-0"
check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, " | ", "F - test-run-move-cursor-into-trace/pre-0/cursor"
check-screen-row screen, 1/y, "... ", "F - test-run-move-cursor-into-trace/pre-1"
check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, " ", "F - test-run-move-cursor-into-trace/pre-1/cursor"
check-screen-row screen, 2/y, "=> 12 ", "F - test-run-move-cursor-into-trace/pre-2"
check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, " ", "F - test-run-move-cursor-into-trace/pre-2/cursor"
2021-02-23 07:59:35 +00:00
# move cursor into trace
edit-sandbox sandbox, 9/tab, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
2021-02-23 07:59:35 +00:00
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
2021-02-23 07:59:35 +00:00
check-screen-row screen, 0/y, "12 ", "F - test-run-move-cursor-into-trace/trace-0"
check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, " ", "F - test-run-move-cursor-into-trace/trace-0/cursor"
check-screen-row screen, 1/y, "... ", "F - test-run-move-cursor-into-trace/trace-1"
check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, "||| ", "F - test-run-move-cursor-into-trace/trace-1/cursor"
2021-02-23 16:58:43 +00:00
check-screen-row screen, 2/y, "=> 12 ", "F - test-run-move-cursor-into-trace/trace-2"
2021-02-23 07:59:35 +00:00
check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, " ", "F - test-run-move-cursor-into-trace/trace-2/cursor"
# move cursor into input
edit-sandbox sandbox, 9/tab, 0/no-globals, 0/no-screen, 0/no-keyboard, 0/no-disk
#
2021-04-10 22:59:40 +00:00
render-sandbox screen, sandbox, 0/x, 0/y, 0x80/width, 0x10/height, 0/no-globals
2021-02-23 07:59:35 +00:00
check-screen-row screen, 0/y, "12 ", "F - test-run-move-cursor-into-trace/input-0"
check-background-color-in-screen-row screen, 7/bg=cursor, 0/y, " | ", "F - test-run-move-cursor-into-trace/input-0/cursor"
check-screen-row screen, 1/y, "... ", "F - test-run-move-cursor-into-trace/input-1"
check-background-color-in-screen-row screen, 7/bg=cursor, 1/y, " ", "F - test-run-move-cursor-into-trace/input-1/cursor"
2021-02-23 16:58:43 +00:00
check-screen-row screen, 2/y, "=> 12 ", "F - test-run-move-cursor-into-trace/input-2"
2021-02-23 07:59:35 +00:00
check-background-color-in-screen-row screen, 7/bg=cursor, 2/y, " ", "F - test-run-move-cursor-into-trace/input-2/cursor"
}