home · contact · privacy
For testing "repeat" directive, allow relative next to absolute number manipulations. master
authorChristian Heller <c.heller@plomlompom.de>
Fri, 17 Oct 2025 08:00:06 +0000 (10:00 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Fri, 17 Oct 2025 08:00:06 +0000 (10:00 +0200)
src/ircplom/testing.py
src/tests/test.test
src/tests/tui_draw.test

index bdc0ccee51e177abfe767f5113605475fb866fb6..926c338c98f2f12b965ccee8655368b192e33508 100644 (file)
@@ -225,7 +225,13 @@ class _Playbook:
                     if cmd_name == _MARK_ANCHOR:
                         continue
                     args_ = list(self._args_for_cmd(cmd_name, remains))
                     if cmd_name == _MARK_ANCHOR:
                         continue
                     args_ = list(self._args_for_cmd(cmd_name, remains))
-                    args_[0] = args[2]
+                    if args[2][0] in '+-':
+                        args_[0] = _SEP_1.join(
+                                str(int(n) + int(args[2]))
+                                for n in args_[0].split(_SEP_1) if n
+                                ) or ','
+                    else:
+                        args_[0] = args[2]
                     insert = _SEP_0.join([cmd_name] + args_)
                 inserts += [(index_str + ':r:' + inserted_t[0], insert)]
             return inserts
                     insert = _SEP_0.join([cmd_name] + args_)
                 inserts += [(index_str + ':r:' + inserted_t[0], insert)]
             return inserts
index 531032172af2b2492dd9a18f141df16370c83339..c80cd1a1b8ac73f558ff73cfcabbe5bea7b955f2 100644 (file)
@@ -10,8 +10,8 @@ log 1 ..$ isupport:USERLEN set to: [10]
 log 1 ..$ caps cleared
 log 1 ..$ users cleared
 log 1 ..$ channels cleared
 log 1 ..$ caps cleared
 log 1 ..$ users cleared
 log 1 ..$ channels cleared
-| standard-clears-out
 log , ..$ DISCONNECTED
 log , ..$ DISCONNECTED
+| standard-clears-out
 
 # connect with values set by /connect, init CAP negotation
 log 1 ..$ hostname set to: [foo.bar.baz]
 
 # connect with values set by /connect, init CAP negotation
 log 1 ..$ hostname set to: [foo.bar.baz]
@@ -20,14 +20,16 @@ log 1 ..$ nick_wanted set to: [foo]
 log 1 ..$ user_wanted set to: [foobarbazquux]
 log 1 ..$ realname set to: [baz]
 log 1 ..$ password set to: [bar]
 log 1 ..$ user_wanted set to: [foobarbazquux]
 log 1 ..$ realname set to: [baz]
 log 1 ..$ password set to: [bar]
+| conn-in
 log 1 ..$ port set to: [6697]
 log 1 ..$ port set to: [6697]
-| conn0
+| conn0-in
 log 1 ..$ connection_state set to: [connecting]
 log 1 ..$ connection_state set to: [connected]
 log 1 ..$ connection_state set to: [connecting]
 log 1 ..$ connection_state set to: [connected]
-| conn1
+| conn0-out
 log , ..$ CONNECTED
 log , ..$ CONNECTED
-| conn2
+| conn1-in
 log 1 ..> CAP LS :302
 log 1 ..> CAP LS :302
+| conn-out
 log 1 ..> USER foobarbazquux 0 * :baz
 log 1 ..> NICK :foo
 
 log 1 ..> USER foobarbazquux 0 * :baz
 log 1 ..> NICK :foo
 
@@ -83,7 +85,8 @@ log 1 ..> CAP :END
 
 # of all pre-MOTD greeting messages, only process isupports
 loggedservermsg 0 1 ..< :foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
 
 # of all pre-MOTD greeting messages, only process isupports
 loggedservermsg 0 1 ..< :foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
-| conn3
+| conn1-out
+| conn2-in
 loggedservermsg 0 1 ..< :foo.bar.baz 002 foo1 :Your host is foo.bar.baz
 loggedservermsg 0 1 ..< :foo.bar.baz 003 foo1 :This server was created Jan 1 2020
 loggedservermsg 0 1 ..< :foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
 loggedservermsg 0 1 ..< :foo.bar.baz 002 foo1 :Your host is foo.bar.baz
 loggedservermsg 0 1 ..< :foo.bar.baz 003 foo1 :This server was created Jan 1 2020
 loggedservermsg 0 1 ..< :foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
@@ -121,7 +124,7 @@ log 1 ..$ users:me:modes set to: [+Ziw]
 # handle bot query NOTICE
 loggedservermsg 0 1 ..< :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 log 3 ..< (SaslServ) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 # handle bot query NOTICE
 loggedservermsg 0 1 ..< :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 log 3 ..< (SaslServ) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
-| conn4
+| conn2-out
 
 # check difference in available commands when switching to client window
 > /join #test
 
 # check difference in available commands when switching to client window
 > /join #test
@@ -132,7 +135,7 @@ log 0 ..#   0) :start
 log 0 ..#   1) foo.bar.baz:debug
 log 0 ..#   2) foo.bar.baz:server
 log 0 ..#   3) foo.bar.baz/SaslServ
 log 0 ..#   1) foo.bar.baz:debug
 log 0 ..#   2) foo.bar.baz:server
 log 0 ..#   3) foo.bar.baz/SaslServ
-| conn5
+| conn3-in
 > /window 1
 > /help
 log 1 ..# commands available in this window:
 > /window 1
 > /help
 log 1 ..# commands available in this window:
@@ -347,60 +350,51 @@ log 6 .!$ cannot send, connection seems closed
 log 1 .!$ cannot send, connection seems closed
 > /privmsg #test test
 log 1 .!$ not sending, since not in channel
 log 1 .!$ cannot send, connection seems closed
 > /privmsg #test test
 log 1 .!$ not sending, since not in channel
-| conn6
+| conn3-out
 
 # test setting up second client, but 432 irrecoverably
 > /connect baz.bar.foo ?foo foo:foo
 
 # test setting up second client, but 432 irrecoverably
 > /connect baz.bar.foo ?foo foo:foo
-repeat standard-clears-in standard-clears-out 8
-log , ..$ DISCONNECTED
+repeat standard-clears-in standard-clears-out +7
 log 8 ..$ hostname set to: [baz.bar.foo]
 log 8 ..$ port set to: [-1]
 log 8 ..$ nick_wanted set to: [?foo]
 log 8 ..$ user_wanted set to: [foo]
 log 8 ..$ realname set to: [foo]
 log 8 ..$ hostname set to: [baz.bar.foo]
 log 8 ..$ port set to: [-1]
 log 8 ..$ nick_wanted set to: [?foo]
 log 8 ..$ user_wanted set to: [foo]
 log 8 ..$ realname set to: [foo]
-log 8 ..$ port set to: [6697]
-repeat conn0 conn1 8
-log , ..$ CONNECTED
-log 8 ..> CAP LS :302
+repeat conn-in conn-out +7
 log 8 ..> USER foo 0 * :foo
 log 8 ..> NICK :?foo
 loggedservermsg 1 8 ..< :*.?.net 432 * ?foo :Erroneous nickname
 log 8 ..> USER foo 0 * :foo
 log 8 ..> NICK :?foo
 loggedservermsg 1 8 ..< :*.?.net 432 * ?foo :Erroneous nickname
+| disconnect-in
 repeat isupport-clear-in isupport-clear-out 8
 log 8 ..$ connection_state set to: []
 log , ..$ DISCONNECTED
 repeat isupport-clear-in isupport-clear-out 8
 log 8 ..$ connection_state set to: []
 log , ..$ DISCONNECTED
+| disconnect-out
 log 8 .!$ nickname refused for bad format, giving up
 
 # test failing third connection
 > /connect baz.baz.baz baz baz:baz
 log 8 .!$ nickname refused for bad format, giving up
 
 # test failing third connection
 > /connect baz.baz.baz baz baz:baz
-repeat standard-clears-in standard-clears-out 9
-log , ..$ DISCONNECTED
+repeat standard-clears-in standard-clears-out +8
 log 9 ..$ hostname set to: [baz.baz.baz]
 log 9 ..$ port set to: [-1]
 log 9 ..$ nick_wanted set to: [baz]
 log 9 ..$ user_wanted set to: [baz]
 log 9 ..$ realname set to: [baz]
 log 9 ..$ hostname set to: [baz.baz.baz]
 log 9 ..$ port set to: [-1]
 log 9 ..$ nick_wanted set to: [baz]
 log 9 ..$ user_wanted set to: [baz]
 log 9 ..$ realname set to: [baz]
-log 9 ..$ port set to: [6697]
-repeat conn0 conn1 9
-log , ..$ CONNECTED
-log 9 ..> CAP LS :302
+repeat conn-in conn-out +8
 log 9 ..> USER baz 0 * :baz
 log 9 ..> NICK :baz
 servermsg 2 FAKE_IRC_CONN_ABORT_EXCEPTION
 log 9 ..$ connection_state set to: [broken: FAKE_IRC_CONN_ABORT_EXCEPTION]
 log 9 ..> USER baz 0 * :baz
 log 9 ..> NICK :baz
 servermsg 2 FAKE_IRC_CONN_ABORT_EXCEPTION
 log 9 ..$ connection_state set to: [broken: FAKE_IRC_CONN_ABORT_EXCEPTION]
-repeat isupport-clear-in isupport-clear-out 9
-log 9 ..$ connection_state set to: []
-log , ..$ DISCONNECTED
+repeat disconnect-in disconnect-out +1
 log 9 .!$ will retry connecting in 1 seconds
 
 # check that (save TUI tests assuming start on window 0, and no 4 yet) on reconnect, all the same effects can be expected
 > /reconnect
 log 9 .!$ will retry connecting in 1 seconds
 
 # check that (save TUI tests assuming start on window 0, and no 4 yet) on reconnect, all the same effects can be expected
 > /reconnect
-log 1 ..$ connection_state set to: [connecting]
-log 1 ..$ connection_state set to: [connected]
+repeat conn0-in conn0-out
 log 2,3,4,5,6,7 ..$ CONNECTED
 log 2,3,4,5,6,7 ..$ CONNECTED
-repeat conn2 conn3
+repeat conn1-in conn1-out
 log 1 ..> JOIN :#testtest
 log 1 ..> JOIN :#testtest
-repeat conn3 conn4
-repeat conn5 conn6
+repeat conn2-in conn2-out
+repeat conn3-in conn3-out
 
 > /quit
 log 0 ..< 
 
 > /quit
 log 0 ..< 
index 3f9d0679a3fae554d3c673d45216dbf290a042e9..360bcd895f7df42ebacb00b4ded4745b3b0f8f5f 100644 (file)
@@ -1,30 +1,32 @@
 | empty-init-in
 | empty-init-in
-| lines-to-19-empty-in
-| line-0-empty-in
+| lines-empty-16-in
+| lines-empty-8-in
+| lines-empty-4-in
+| lines-empty-2-in
+| lines-empty-1-in
 line 0 0 on_black                                                                                 
 line 0 0 on_black                                                                                 
-| line-0-empty-out
-repeat line-0-empty-in line-0-empty-out 1
-repeat line-0-empty-in line-0-empty-out 2
-repeat line-0-empty-in line-0-empty-out 3
-repeat line-0-empty-in line-0-empty-out 4
-repeat line-0-empty-in line-0-empty-out 5
-repeat line-0-empty-in line-0-empty-out 6
-repeat line-0-empty-in line-0-empty-out 7
-repeat line-0-empty-in line-0-empty-out 8
-repeat line-0-empty-in line-0-empty-out 9
-repeat line-0-empty-in line-0-empty-out 10
-repeat line-0-empty-in line-0-empty-out 11
-repeat line-0-empty-in line-0-empty-out 12
-repeat line-0-empty-in line-0-empty-out 13
-repeat line-0-empty-in line-0-empty-out 14
-repeat line-0-empty-in line-0-empty-out 15
-repeat line-0-empty-in line-0-empty-out 16
-repeat line-0-empty-in line-0-empty-out 17
-repeat line-0-empty-in line-0-empty-out 18
-repeat line-0-empty-in line-0-empty-out 19
-| lines-to-19-empty-out
-repeat line-0-empty-in line-0-empty-out 20
-repeat line-0-empty-in line-0-empty-out 21
+| lines-empty-1-out
+repeat lines-empty-1-in lines-empty-1-out 1
+| lines-empty-2-out
+repeat lines-empty-1-in lines-empty-1-out 2
+repeat lines-empty-1-in lines-empty-1-out 3
+| lines-empty-4-out
+repeat lines-empty-1-in lines-empty-1-out 4
+repeat lines-empty-1-in lines-empty-1-out 5
+repeat lines-empty-1-in lines-empty-1-out 6
+repeat lines-empty-1-in lines-empty-1-out 7
+| lines-empty-8-out
+repeat lines-empty-1-in lines-empty-1-out 8
+repeat lines-empty-1-in lines-empty-1-out 9
+repeat lines-empty-1-in lines-empty-1-out 10
+repeat lines-empty-1-in lines-empty-1-out 11
+repeat lines-empty-1-in lines-empty-1-out 12
+repeat lines-empty-1-in lines-empty-1-out 13
+repeat lines-empty-1-in lines-empty-1-out 14
+repeat lines-empty-1-in lines-empty-1-out 15
+| lines-empty-16-out
+repeat lines-empty-4-in lines-empty-4-out +16
+repeat lines-empty-2-in lines-empty-2-out +19
 | status-prompt-empty-in
 line 22 0  :start)=====================================================================([0]
 line 23 0  > 
 | status-prompt-empty-in
 line 22 0  :start)=====================================================================([0]
 line 23 0  > 
@@ -42,17 +44,20 @@ repeat empty-init-in empty-init-out
 > foo
 log 0 .!# invalid prompt command: not prefixed by /
 | input-foo-out
 > foo
 log 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 19
+repeat lines-empty-16-in lines-empty-16-out
+repeat lines-empty-4-in lines-empty-4-out +16
+| date-at-20-plus-topmost-in
 | date-at-20-in
 line 20 0 on_black 20
 line 20 4 on_black -
 line 20 7 on_black -
 line 20 10 on_black                                                                     
 | date-at-20-out
 | date-at-20-in
 line 20 0 on_black 20
 line 20 4 on_black -
 line 20 7 on_black -
 line 20 10 on_black                                                                     
 | date-at-20-out
+| foo-unprefixed-line-21-in
 line 21 0 on_black,bold,bright_red,bright_cyan .!# 
 line 21 13 on_black,bold,bright_red,bright_cyan invalid prompt command: not prefixed by /                          
 line 21 0 on_black,bold,bright_red,bright_cyan .!# 
 line 21 13 on_black,bold,bright_red,bright_cyan invalid prompt command: not prefixed by /                          
-
+| foo-unprefixed-line-21-out
+| date-at-20-plus-topmost-out
 repeat status-prompt-empty-in status-prompt-empty-out
 
 # further inputs grow log upwards
 repeat status-prompt-empty-in status-prompt-empty-out
 
 # further inputs grow log upwards
@@ -61,38 +66,53 @@ repeat status-prompt-empty-in status-prompt-empty-out
 log 0 .!# invalid prompt command: /foo unknown
 | input-cmd-foo-out
 repeat input-cmd-foo-in input-cmd-foo-out
 log 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 17
-repeat date-at-20-in date-at-20-out 18
-| foo-unprefixed-line-19-in
-line 19 13 on_black,bold,bright_red,bright_cyan invalid prompt command: not prefixed by /                          
-| foo-unprefixed-line-19-out
+repeat lines-empty-16-in lines-empty-16-out
+repeat lines-empty-2-in lines-empty-2-out +16
+| date-at-18-plus-3-in
+repeat date-at-20-plus-topmost-in date-at-20-plus-topmost-out -2
 | foo-unknown-line-20-in
 line 20 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 21
 | foo-unknown-line-20-in
 line 20 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 21
+| date-at-18-plus-3-out
+repeat status-prompt-empty-in status-prompt-empty-out
 
 # check wrapping
 > /foo_0123456789_0123456789_01234567
 log 0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
 
 # check wrapping
 > /foo_0123456789_0123456789_01234567
 log 0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
+repeat lines-empty-16-in lines-empty-16-out
+repeat lines-empty-1-in lines-empty-1-out +16
+| date-at-17-plus-4-in
+repeat date-at-18-plus-3-in date-at-18-plus-3-out -1
 | unwrapped-at-21-in
 line 21 13 on_black,bold,bright_red,bright_cyan invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
 | unwrapped-at-21-out
 | unwrapped-at-21-in
 line 21 13 on_black,bold,bright_red,bright_cyan invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
 | unwrapped-at-21-out
+| date-at-17-plus-4-out
+repeat status-prompt-empty-in status-prompt-empty-out
 | input-wrapped-in
 > /foo_0123456789_0123456789_012345678
 log 0 .!# invalid prompt command: /foo_0123456789_0123456789_012345678 unknown
 | input-wrapped-out
 | input-wrapped-in
 > /foo_0123456789_0123456789_012345678
 log 0 .!# invalid prompt command: /foo_0123456789_0123456789_012345678 unknown
 | input-wrapped-out
-| wrapped-first-at-20-in
+| scroll-returnable-0-in
+repeat lines-empty-8-in lines-empty-8-out
+repeat lines-empty-4-in lines-empty-4-out +8
+repeat lines-empty-2-in lines-empty-2-out +12
+repeat lines-empty-1-in lines-empty-1-out +14
+| date-at-15-plus-6-in
+repeat date-at-17-plus-4-in date-at-17-plus-4-out -2
+| wrapped-at-20-in
 line 20 13 on_black,bold,bright_red,bright_cyan invalid prompt command: /foo_0123456789_0123456789_012345678       
 line 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
 line 21 0 on_black,bold,bright_red,bright_cyan     unknown                                                                     
 line 21 0 on_black,bold,bright_red,bright_cyan     unknown                                                                     
-| wrapped-second-at-21-out
+| wrapped-at-20-out
+| date-at-15-plus-6-out
+repeat status-prompt-empty-in status-prompt-empty-out
+| scroll-returnable-0-out
 
 # check scrolling up on short history
 > /window.history.scroll up
 | topmost-scroll-in
 
 # 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 lines-empty-16-in lines-empty-16-out
+repeat lines-empty-4-in lines-empty-4-out +16
 repeat date-at-20-in date-at-20-out
 | topmost-scroll-out
 line 21 0 reverse vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat date-at-20-in date-at-20-out
 | topmost-scroll-out
 line 21 0 reverse vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -100,23 +120,15 @@ repeat status-prompt-empty-in status-prompt-empty-out
 
 # check scrolling down on short history
 > /window.history.scroll down
 
 # 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 14
-repeat date-at-20-in date-at-20-out 15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 17
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 18
-repeat unwrapped-at-21-in unwrapped-at-21-out 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
+repeat scroll-returnable-0-in scroll-returnable-0-out
 
 # check history growing below up-scroll
 > /window.history.scroll up
 
 # check history growing below up-scroll
 > /window.history.scroll up
+| input-foo-cmd-foo-in
 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
+| input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
 repeat input-foo-in input-foo-out
 repeat topmost-scroll-in topmost-scroll-out
 line 21 0 reverse vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat input-foo-in input-foo-out
 repeat topmost-scroll-in topmost-scroll-out
 line 21 0 reverse vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -124,123 +136,78 @@ repeat status-prompt-empty-in status-prompt-empty-out
 
 # check scroll-down on longer history
 > /window.history.scroll down
 
 # 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 9
-repeat date-at-20-in date-at-20-out 10
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 11
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 13
-repeat unwrapped-at-21-in unwrapped-at-21-out 14
-repeat wrapped-first-at-20-in wrapped-first-at-20-out 15
-repeat wrapped-second-at-21-in wrapped-second-at-21-out 16
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 17
+repeat lines-empty-8-in lines-empty-8-out
+repeat lines-empty-2-in lines-empty-2-out +8
+repeat date-at-15-plus-6-in date-at-15-plus-6-out -5
+| foo-only-fails-lines-2-at-17-in
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 17
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 18
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 18
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 19
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 20
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 21
+| foo-only-fails-lines-2-at-17-out
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +2
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 21
 repeat status-prompt-empty-in status-prompt-empty-out
 
 # check history growing upwards if scrolled down
 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 input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+repeat input-foo-cmd-foo-in input-foo-cmd-foo-out
+| scroll-returnable-1-in
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 0
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 0
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 1
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 2
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 3
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 4
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 5
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 6
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 7
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 8
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 9
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 10
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 11
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 13
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 14
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 19
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 20
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 21
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -16
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 3
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -13
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -11
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -9
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -7
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -5
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -3
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -1
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +1
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +3
 repeat status-prompt-empty-in status-prompt-empty-out
 repeat status-prompt-empty-in status-prompt-empty-out
-| bottom-longer-history-out
+| scroll-returnable-1-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
 
 # 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 1
-repeat date-at-20-in date-at-20-out 2
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 3
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 4
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 5
-repeat unwrapped-at-21-in unwrapped-at-21-out 6
-repeat wrapped-first-at-20-in wrapped-first-at-20-out 7
-repeat wrapped-second-at-21-in wrapped-second-at-21-out 8
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 9
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 10
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 11
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 12
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 13
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 14
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 19
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 20
-| scrolled-up-longer-history-out
+| scroll-returnable-2-in
+repeat lines-empty-2-in lines-empty-2-out
+repeat date-at-15-plus-6-in date-at-15-plus-6-out -13
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -8
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -6
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 13
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -3
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -1
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +1
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 20
+| scroll-returnable-2-out
 line 21 0 reverse vvv [12] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat status-prompt-empty-in status-prompt-empty-out
 > /window.history.scroll down
 line 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
+repeat scroll-returnable-1-in scroll-returnable-1-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
 
 # 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
+repeat scroll-returnable-2-in scroll-returnable-2-out
 line 21 0 reverse vvv [13] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 > /window.history.scroll down
 line 21 0 reverse vvv [13] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 > /window.history.scroll down
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 0
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 1
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 2
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 3
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 4
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 5
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 6
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 7
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 8
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 9
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 10
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 11
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 12
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 13
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -17
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 2
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -14
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -12
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -10
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -8
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -6
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 14
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 14
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 15
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 16
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 17
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 18
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 19
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -2
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +2
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 20
 line 21 0 reverse vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat status-prompt-empty-in status-prompt-empty-out
 repeat foo-unknown-line-20-in foo-unknown-line-20-out 20
 line 21 0 reverse vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat status-prompt-empty-in status-prompt-empty-out
@@ -248,27 +215,17 @@ 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 0
 # 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 0
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 1
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 2
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 3
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 4
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 5
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 6
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 7
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 8
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 9
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 10
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 11
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 13
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 14
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 19
-repeat wrapped-first-at-20-in wrapped-first-at-20-out 20
-repeat wrapped-second-at-21-in wrapped-second-at-21-out 21
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 1
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -15
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -13
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -11
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -9
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -7
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -5
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -3
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out -1
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +1
+repeat wrapped-at-20-in wrapped-at-20-out
 repeat status-prompt-empty-in status-prompt-empty-out
 > /window.history.scroll up
 line 21 0 reverse vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat status-prompt-empty-in status-prompt-empty-out
 > /window.history.scroll up
 line 21 0 reverse vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
@@ -276,19 +233,12 @@ repeat status-prompt-empty-in status-prompt-empty-out
 
 # check scrolls-up over longer history until top
 > /window.history.scroll up
 
 # 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 5
-repeat line-0-empty-in line-0-empty-out 10
-repeat date-at-20-in date-at-20-out 11
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 13
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 14
-repeat unwrapped-at-21-in unwrapped-at-21-out 15
-repeat wrapped-first-at-20-in wrapped-first-at-20-out 16
-repeat wrapped-second-at-21-in wrapped-second-at-21-out 17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out 19
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 20
+repeat lines-empty-8-in lines-empty-8-out
+repeat lines-empty-2-in lines-empty-2-out +8
+repeat lines-empty-1-in lines-empty-1-out +10
+repeat date-at-15-plus-6-in date-at-15-plus-6-out -4
+repeat foo-only-fails-lines-2-at-17-in foo-only-fails-lines-2-at-17-out +1
+repeat foo-unprefixed-line-21-in foo-unprefixed-line-21-out 20
 line 21 0 reverse vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat status-prompt-empty-in status-prompt-empty-out
 > /window.history.scroll up
 line 21 0 reverse vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
 repeat status-prompt-empty-in status-prompt-empty-out
 > /window.history.scroll up