| empty-init-in
+| lines-to-19-empty-in
| line-0-empty-in
t.0 0.on_black.
| line-0-empty-out
repeat line-0-empty-in line-0-empty-out t.17
repeat line-0-empty-in line-0-empty-out t.18
repeat line-0-empty-in line-0-empty-out t.19
+| lines-to-19-empty-out
repeat line-0-empty-in line-0-empty-out t.20
repeat line-0-empty-in line-0-empty-out t.21
| status-prompt-empty-in
repeat empty-init-in empty-init-out
# non-empty command input starts log at bottom, with date above it
+| input-foo-in
> foo
0 .!# invalid prompt command: not prefixed by /
+| input-foo-out
repeat line-0-empty-in line-0-empty-out
repeat line-0-empty-in line-0-empty-out t.19
| date-at-20-in
repeat status-prompt-empty-in status-prompt-empty-out
# further inputs grow log upwards
+| input-cmd-foo-in
> /foo
0 .!# invalid prompt command: /foo unknown
-> /foo
-0 .!# invalid prompt command: /foo unknown
+| input-cmd-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
repeat line-0-empty-in line-0-empty-out
repeat line-0-empty-in line-0-empty-out t.17
repeat date-at-20-in date-at-20-out t.18
+| foo-unprefixed-line-19-in
t.19 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: not prefixed by /
+| foo-unprefixed-line-19-out
+| foo-unknown-line-20-in
t.20 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo unknown
-t.21 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo unknown
+| foo-unknown-line-20-out
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.21
# check wrapping
> /foo_0123456789_0123456789_01234567
0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
+| unwrapped-at-21-in
t.21 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
+| unwrapped-at-21-out
+| input-wrapped-in
> /foo_0123456789_0123456789_012345678
0 .!# invalid prompt command: /foo_0123456789_0123456789_012345678 unknown
+| input-wrapped-out
+| wrapped-first-at-20-in
t.20 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo_0123456789_0123456789_012345678
+| wrapped-first-at-20-out
+| wrapped-second-at-21-in
t.21 0.on_black,bold,bright_red,bright_cyan. unknown
+| wrapped-second-at-21-out
+
+# check scrolling up on short history
+> /window.history.scroll up
+| topmost-scroll-in
+repeat lines-to-19-empty-in lines-to-19-empty-out
+repeat date-at-20-in date-at-20-out
+| topmost-scroll-out
+t.21 0.reverse.vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+
+# check scrolling down on short history
+> /window.history.scroll down
+repeat line-0-empty-in line-0-empty-out
+repeat line-0-empty-in line-0-empty-out t.14
+repeat date-at-20-in date-at-20-out t.15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.18
+repeat unwrapped-at-21-in unwrapped-at-21-out t.19
+repeat wrapped-first-at-20-in wrapped-first-at-20-out
+repeat wrapped-second-at-21-in wrapped-second-at-21-out
+repeat status-prompt-empty-in status-prompt-empty-out
+
+# check history growing below up-scroll
+> /window.history.scroll up
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat topmost-scroll-in topmost-scroll-out
+t.21 0.reverse.vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+
+# check scroll-down on longer history
+> /window.history.scroll down
+repeat line-0-empty-in line-0-empty-out
+repeat line-0-empty-in line-0-empty-out t.9
+repeat date-at-20-in date-at-20-out t.10
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.11
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
+repeat unwrapped-at-21-in unwrapped-at-21-out t.14
+repeat wrapped-first-at-20-in wrapped-first-at-20-out t.15
+repeat wrapped-second-at-21-in wrapped-second-at-21-out t.16
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.17
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.18
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.19
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.20
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.21
+repeat status-prompt-empty-in status-prompt-empty-out
+
+# check history growing upwards if scrolled down
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+repeat input-foo-in input-foo-out
+repeat input-cmd-foo-in input-cmd-foo-out
+| bottom-longer-history-in
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.0
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.1
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.2
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.3
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.4
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.5
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.6
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.7
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.8
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.9
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.10
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.11
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.14
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.20
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.21
+repeat status-prompt-empty-in status-prompt-empty-out
+| bottom-longer-history-out
+
+# check scroll-up on longer history no longer starting at just date, and counting unwrapped below-lines one-to-one
+> /window.history.scroll up
+| scrolled-up-longer-history-in
+repeat line-0-empty-in line-0-empty-out
+repeat line-0-empty-in line-0-empty-out t.1
+repeat date-at-20-in date-at-20-out t.2
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.3
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.4
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.5
+repeat unwrapped-at-21-in unwrapped-at-21-out t.6
+repeat wrapped-first-at-20-in wrapped-first-at-20-out t.7
+repeat wrapped-second-at-21-in wrapped-second-at-21-out t.8
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.9
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.10
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.11
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.12
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.13
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.14
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.20
+| scrolled-up-longer-history-out
+t.21 0.reverse.vvv [12] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+> /window.history.scroll down
+repeat bottom-longer-history-in bottom-longer-history-out
+
+# check adding a wrapped line under scroll-up increases visible below-count by one, but scroll down …
+> /window.history.scroll up
+repeat input-wrapped-in input-wrapped-out
+repeat scrolled-up-longer-history-in scrolled-up-longer-history-out
+t.21 0.reverse.vvv [13] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+> /window.history.scroll down
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.0
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.1
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.2
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.3
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.4
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.5
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.6
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.7
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.8
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.9
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.10
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.11
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.12
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.13
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.14
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.15
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.16
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.17
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.18
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.19
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.20
+t.21 0.reverse.vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+
+# check scroll-up over wrapped increases visible below-lines count only by fused history lines
+> /window.history.scroll down
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.0
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.1
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.2
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.3
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.4
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.5
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.6
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.7
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.8
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.9
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.10
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.11
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.14
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
+repeat wrapped-first-at-20-in wrapped-first-at-20-out t.20
+repeat wrapped-second-at-21-in wrapped-second-at-21-out t.21
+repeat status-prompt-empty-in status-prompt-empty-out
+> /window.history.scroll up
+t.21 0.reverse.vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+
+# check scrolls-up over longer history until top
+> /window.history.scroll up
+repeat line-0-empty-in line-0-empty-out
+repeat line-0-empty-in line-0-empty-out t.5
+repeat line-0-empty-in line-0-empty-out t.10
+repeat date-at-20-in date-at-20-out t.11
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.14
+repeat unwrapped-at-21-in unwrapped-at-21-out t.15
+repeat wrapped-first-at-20-in wrapped-first-at-20-out t.16
+repeat wrapped-second-at-21-in wrapped-second-at-21-out t.17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.20
+t.21 0.reverse.vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+> /window.history.scroll up
+repeat topmost-scroll-in topmost-scroll-out
+t.21 0.reverse.vvv [30] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat status-prompt-empty-in status-prompt-empty-out
+
> /quit
0 ..<