home · contact · privacy
In tests, replace anchoring from within script by inserts of pre-defined blocks.
authorChristian Heller <c.heller@plomlompom.de>
Wed, 22 Oct 2025 23:42:34 +0000 (01:42 +0200)
committerChristian Heller <c.heller@plomlompom.de>
Wed, 22 Oct 2025 23:42:34 +0000 (01:42 +0200)
src/ircplom/testing.py
src/tests/_timeout_retries.test
src/tests/connect_disconnect_legalities.test
src/tests/error_disconnects.test
src/tests/pingpong.test
src/tests/test.test
src/tests/tui_draw.test

index 406d2f183b66a13685d4e74a3ff51ddb4b92e19b..183df9d65d8cc0195913bb2c25d1668d3744a8e5 100644 (file)
@@ -16,12 +16,12 @@ from ircplom.tui_base import (TerminalInterface, TuiEvent,
 PATH_TESTS = Path('tests')
 _FAKE_TIMEOUT_PORTS_BEYOND = 10000
 
-_MARK_ANCHOR = '|'
 _MARK_COMMENT = '#'
+_MARK_FRAGMENT = '×'
+_MARK_INSERT = 'insert'
 _MARK_LOG = 'log'
 _MARK_LOGSRVRMSG = 'loggedservermsg'
 _MARK_PROMPT = '>'
-_MARK_REPEAT = 'repeat'
 _MARK_SCREENLINE = 'line'
 _MARK_SERVERMSG = 'servermsg'
 _MARK_WAIT = 'wait'
@@ -34,10 +34,10 @@ _TOK_IDX_LOGSRVRMSG = 's'
 _TOK_IDX_REPEAT = 'r'
 
 _SIGNATURE_FOR_CMD = {
+    _MARK_INSERT: (3, 2),
     _MARK_LOG: (2, 0),
     _MARK_LOGSRVRMSG: (3, 0),
     _MARK_PROMPT: (1, None),
-    _MARK_REPEAT: (2, 1),
     _MARK_SCREENLINE: (3, 0),
     _MARK_SERVERMSG: (2, 0),
     _MARK_WAIT: (1, 0),
@@ -210,21 +210,18 @@ class _Playbook:
                     (_SEP_2.join((index_str, _TOK_IDX_LOGSRVRMSG, str(1))),
                      _SEP_0.join((_MARK_LOG, args[1], args[2])))]
 
-        def repeat(index_str: str,
+        def insert(index_str: str,
                    args: tuple[str, ...],
-                   anchors: dict[str, int],
+                   fragments: dict[str, tuple[tuple[str, str], ...]],
                    **__
                    ) -> list[tuple[str, str]]:
             candidates = [
-                (_SEP_2.join((index_str, _TOK_IDX_REPEAT, lt[0])), lt[1])
-                for lt in self._lines_t[int(anchors[args[0]+'-in']):
-                                        int(anchors[args[0]+'-out'])]
-                if not lt[1].startswith(_MARK_ANCHOR)]  # keep anchors unique
-            idx_rep_offset = _SIGNATURE_FOR_CMD[_MARK_REPEAT][1]
-            assert idx_rep_offset is not None
-            if len(args) <= idx_rep_offset:
-                return candidates
-            rep_offset = int(args[idx_rep_offset])
+                    (_SEP_2.join((index_str, _TOK_IDX_REPEAT, lt[0])), lt[1])
+                    for lt in fragments[args[0]]]
+            idx_in, idx_out = ((int(val) if val else None)
+                               for val in args[1].split(_SEP_2))
+            candidates = candidates[idx_in:idx_out]
+            rep_offset = int(args[2])
             lowest_int: Optional[int] = None
             inserts = []
             for candidate in candidates:
@@ -257,18 +254,30 @@ class _Playbook:
         self._lines_t = [line_t for line_t in self._lines_t
                          if line_t[1].rstrip()
                          and not line_t[1].startswith(_MARK_COMMENT)]
-        expand_parsed(_MARK_LOGSRVRMSG, split_server_put_and_log)
+
+        fragments: dict[str, tuple[tuple[str, str], ...]] = {}
+        anchor = ''
+        fragment: list[tuple[str, str]] = []
+        fragments_cutoff = 0
+        for idx, line_t in enumerate(self._lines_t[:] + [('', '')]):
+            if line_t[1].startswith(_MARK_FRAGMENT):
+                if anchor:
+                    fragments[anchor] = tuple(fragment)
+                if not line_t[1][len(_MARK_FRAGMENT):].rstrip():
+                    fragments_cutoff = idx + 1
+                    break
+                anchor = line_t[1].split(_SEP_0, maxsplit=1)[1]
+                fragment.clear()
+                continue
+            fragment += [line_t]
+        self._lines_t = self._lines_t[fragments_cutoff:]
         while True:
-            anchors: dict[str, int] = {}
-            for idx, line_t in enumerate(self._lines_t):
-                if line_t[1].startswith(_MARK_ANCHOR):
-                    anchors[line_t[1].split(_SEP_0, maxsplit=1)[1]] = idx
             snapshot_before = self._lines_t[:]
-            expand_parsed(_MARK_REPEAT, repeat, anchors=anchors)
+            expand_parsed(_MARK_INSERT, insert, fragments=fragments)
             if self._lines_t == snapshot_before:
                 break
-        self._lines_t = [line_t for line_t in self._lines_t
-                         if not line_t[1].startswith(_MARK_ANCHOR)]
+
+        expand_parsed(_MARK_LOGSRVRMSG, split_server_put_and_log)
 
         if self._verbose:
             title_idx = 'line number(s)'
index c6f10ad39525159542061c305245a8c0cf78f79f..d741f81f00a6ff99bd687ac88f68ed4fe55646eb 100644 (file)
@@ -1,57 +1,59 @@
-# NB: FakeIrcConnection on any port > 10000 will fail connecting with a timeout
-# the TestingClient meanwhile will decrement any port of that range by 1 after
-# each started connection attempt
-> /connect foo.bar.baz:10003 foo:bar baz:foobarbazquux
-
-| clientwin-init-in
-| isupport-clear-in
+× isupport-clear
 log 1 $.. isupport cleared
 log 1 $.. isupport:CHANTYPES set to: [#&]
 log 1 $.. isupport:PREFIX set to: [(ov)@+]
 log 1 $.. isupport:USERLEN set to: [10]
-| isupport-clear-out
+
+× clientwin-init
+insert isupport-clear : +1
 log 1 $.. caps cleared
 log 1 $.. users cleared
 log 1 $.. channels cleared
-| clientwin-init-out
 log , $.. DISCONNECTED
-log 1 $.. hostname set to: [foo.bar.baz]
-| conn-init-retries-in
+
+× conn-retry
+log 1 $.. connection_state set to: [connecting]
+log 1 $.. port set to: [10002]
+log 1 $.. connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+
+× conn-init-retries
 log 1 $.. port set to: [10003]
 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 $.. connection_state set to: [connecting]
-log 1 $.. port set to: [10002]
-log 1 $.. connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+insert conn-retry : +1
 log 1 $!. will retry connecting in 1 seconds
-
-log 1 $.. connection_state set to: [connecting]
+insert conn-retry :1 +1
 log 1 $.. port set to: [10001]
-log 1 $.. connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+insert conn-retry 2: +1
 log 1 $!. will retry connecting in 2 seconds
-
-log 1 $.. connection_state set to: [connecting]
+insert conn-retry :1 +1
 log 1 $.. port set to: [10000]
-log 1 $.. connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+insert conn-retry 2: +1
 log 1 $!. will retry connecting in 4 seconds
-| conn-init-retries-out
 
-# with TestingClient finally having reduced port to 10000, connecting works now
-| conn-full-in
-| conn0-in
+× conn
 log 1 $.. connection_state set to: [connecting]
 log 1 $.. connection_state set to: [connected]
-| conn0-out
 log , $.. CONNECTED
-| conn1-in
 log 1 >.. CAP LS :302
 log 1 >.. USER foobarbazquux 0 * :baz
 log 1 >.. NICK :foo
-| conn1-out
-| conn-full-out
+
+
+# NB: FakeIrcConnection on any port > 10000 will fail connecting with a timeout
+# the TestingClient meanwhile will decrement any port of that range by 1 after
+# each started connection attempt
+> /connect foo.bar.baz:10003 foo:bar baz:foobarbazquux
+
+insert clientwin-init : +1
+log 1 $.. hostname set to: [foo.bar.baz]
+insert conn-init-retries : +1
+
+# with TestingClient finally having reduced port to 10000, connecting works now
+insert conn : +1
 
 # test retry chain also started by in-connection timeout
 servermsg 0 timeout
@@ -59,23 +61,20 @@ log 1 >.. PING :what's up?
 servermsg 0 timeout
 servermsg 0 no timely PONG from server
 log 1 $.. connection_state set to: [broken: no timely PONG from server]
-repeat isupport-clear
+insert isupport-clear : +1
 log 1 $.. connection_state set to: []
 log , $.. DISCONNECTED
 log 1 $!. will retry connecting in 1 seconds
-repeat conn-full
+insert conn : +1
 
 # on second server, check timed auto-retries don't activate after manual intervention
 > /connect baz.bar.foo:10003 foo:bar baz:foobarbazquux
-repeat clientwin-init +2
-log , $.. DISCONNECTED
+insert clientwin-init : +2
 log 2 $.. hostname set to: [baz.bar.foo]
-repeat conn-init-retries +2
+insert conn-init-retries : +2
 > /window 2
 > /reconnect
-repeat conn0 +2
-log , $.. CONNECTED
-repeat conn1 +2
+insert conn : +2
 wait 4
 > /disconnect
 log 2 >.. QUIT :ircplom says bye
index bed7b487b03b51068382e279af69fbd223ce666d..5277edd8741585557ee6a342af050b0850b8ff93 100644 (file)
@@ -1,11 +1,20 @@
-# to prepare, initiate connection
-> /connect foo.bar.baz foo bar:baz
-| isupport-clear-in
+× isupport-clear
 log 1 $.. isupport cleared
 log 1 $.. isupport:CHANTYPES set to: [#&]
 log 1 $.. isupport:PREFIX set to: [(ov)@+]
 log 1 $.. isupport:USERLEN set to: [10]
-| isupport-clear-out
+× connecting
+log 1 $.. connection_state set to: [connecting]
+log 1 $.. connection_state set to: [connected]
+log , $.. CONNECTED
+log 1 >.. CAP LS :302
+log 1 >.. USER baz 0 * :bar
+log 1 >.. NICK :foo
+
+# to prepare, initiate connection
+> /connect foo.bar.baz foo bar:baz
+insert isupport-clear : +1
 log 1 $.. caps cleared
 log 1 $.. users cleared
 log 1 $.. channels cleared
@@ -16,14 +25,7 @@ log 1 $.. nick_wanted set to: [foo]
 log 1 $.. user_wanted set to: [baz]
 log 1 $.. realname set to: [bar]
 log 1 $.. port set to: [6697]
-| connecting-in
-log 1 $.. connection_state set to: [connecting]
-log 1 $.. connection_state set to: [connected]
-log , $.. CONNECTED
-log 1 >.. CAP LS :302
-log 1 >.. USER baz 0 * :bar
-log 1 >.. NICK :foo
-| connecting-out
+insert connecting : +1
 
 # fail to reconnect while connected
 > /window 1
@@ -35,7 +37,7 @@ log 1 $!. not re-connecting since already connected
 log 1 >.. QUIT :ircplom says bye
 loggedservermsg 0 1 <.. ERROR :Closing link: (whatever@whatever.com) [Quit: ircplom says bye]
 log 1 $.. connection_state set to: [Closing link: (whatever@whatever.com) [Quit: ircplom says bye]]
-repeat isupport-clear
+insert isupport-clear : +1
 log 1 $.. connection_state set to: []
 log , $.. DISCONNECTED
 
@@ -45,7 +47,7 @@ log 1 $!. cannot send, connection seems closed
 
 # succeed to re-connect after disconnect
 > /reconnect
-repeat connecting
+insert connecting : +1
 
 > /quit
 log 0 <.. 
index e626d671aefd84378f99968cac4d78bb6ccf3d4d..0b1b39946777c034f4906353c131e1c46aed4c76 100644 (file)
@@ -1,11 +1,24 @@
-# to prepare first test, initiate connected state
-> /connect foo.bar.baz foo bar:baz
-| isupport-clear-in
+× isupport-clear
 log 1 $.. isupport cleared
 log 1 $.. isupport:CHANTYPES set to: [#&]
 log 1 $.. isupport:PREFIX set to: [(ov)@+]
 log 1 $.. isupport:USERLEN set to: [10]
-| isupport-clear-out
+× connecting
+log 1 $.. connection_state set to: [connecting]
+log 1 $.. connection_state set to: [connected]
+log , $.. CONNECTED
+log 1 >.. CAP LS :302
+log 1 >.. USER baz 0 * :bar
+log 1 >.. NICK :foo
+× disconnecting
+insert isupport-clear : +1
+log 1 $.. connection_state set to: []
+log , $.. DISCONNECTED
+
+# to prepare first test, initiate connected state
+> /connect foo.bar.baz foo bar:baz
+insert isupport-clear : +1
 log 1 $.. caps cleared
 log 1 $.. users cleared
 log 1 $.. channels cleared
@@ -16,33 +29,22 @@ log 1 $.. nick_wanted set to: [foo]
 log 1 $.. user_wanted set to: [baz]
 log 1 $.. realname set to: [bar]
 log 1 $.. port set to: [6697]
-| connecting-in
-log 1 $.. connection_state set to: [connecting]
-log 1 $.. connection_state set to: [connected]
-log , $.. CONNECTED
-log 1 >.. CAP LS :302
-log 1 >.. USER baz 0 * :bar
-log 1 >.. NICK :foo
-| connecting-out
+insert connecting : +1
 
 # test default ERROR handling
 loggedservermsg 0 1 <.. ERROR :abc def ghi
 log 1 $.. connection_state set to: [abc def ghi]
-| disconnecting-in
-repeat isupport-clear
-log 1 $.. connection_state set to: []
-log , $.. DISCONNECTED
-| disconnecting-out
+insert disconnecting : +1
 
 # to prepare next test, get back to connected state
 > /window 1
 > /reconnect
-repeat connecting
+insert connecting : +1
 
 # test "timed out)" ERROR handling
 loggedservermsg 0 1 <.. ERROR :Closing link: (Connection timed out)
 log 1 $.. connection_state set to: [Closing link: (Connection timed out)]
-repeat disconnecting
+insert disconnecting : +1
 log 1 $!. will retry connecting in 1 seconds
 
 # over and out
index ae5ea5f877028fb57fed5f6b3e598dd05c3a4d81..7c153f3859c267ddc7da65a2a4ea802791fd3796 100644 (file)
@@ -1,64 +1,67 @@
-> /connect foo.bar.baz foo:bar baz:foobarbazquux
-| isupport-clear-in
+× isupport-clear
 log 1 $.. isupport cleared
 log 1 $.. isupport:CHANTYPES set to: [#&]
 log 1 $.. isupport:PREFIX set to: [(ov)@+]
 log 1 $.. isupport:USERLEN set to: [10]
-| isupport-clear-out
-log 1 $.. caps cleared
-log 1 $.. users cleared
-log 1 $.. channels cleared
-log , $.. DISCONNECTED
-log 1 $.. hostname set to: [foo.bar.baz]
-log 1 $.. port set to: [-1]
-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 $.. port set to: [6697]
-| conn0-in
+
+× conn
 log 1 $.. connection_state set to: [connecting]
 log 1 $.. connection_state set to: [connected]
-| conn0-out
 log , $.. CONNECTED
-| conn1-in
 log 1 >.. CAP LS :302
 log 1 >.. USER foobarbazquux 0 * :baz
 log 1 >.. NICK :foo
-| conn1-out
-
-# ensure we PONG properly
-loggedservermsg 0 1 <.. PING :?
-log 1 >.. PONG :?
 
+× full-timeout
 # ping on timeout, go on as normal if PONG received 
-| full-timeout-in
-| trigger-ping-in
-servermsg 0 timeout
-log 1 >.. PING :what's up?
-| trigger-ping-out
+insert trigger-ping : +0
 loggedservermsg 0 1 <.. :*.?.net PONG *.?.net :what's up?
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your ident...
 log 2 <.. (server) *** Looking up your ident...
-
 # another timeout instead of pong? disconnect
-repeat trigger-ping
+insert trigger-ping : +0
 servermsg 0 timeout
 servermsg 0 no timely PONG from server
 log 1 $.. connection_state set to: [broken: no timely PONG from server]
-repeat isupport-clear
+insert isupport-clear : +1
 log 1 $.. connection_state set to: []
 log 2 $.. DISCONNECTED
 log 1 $!. will retry connecting in 1 seconds
-| full-timeout-out
+
+× trigger-ping
+servermsg 0 timeout
+log 1 >.. PING :what's up?
+
+
+> /connect foo.bar.baz foo:bar baz:foobarbazquux
+insert isupport-clear : +1
+log 1 $.. caps cleared
+log 1 $.. users cleared
+log 1 $.. channels cleared
+log , $.. DISCONNECTED
+log 1 $.. hostname set to: [foo.bar.baz]
+log 1 $.. port set to: [-1]
+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 $.. port set to: [6697]
+insert conn : +1
+
+# ensure we PONG properly
+loggedservermsg 0 1 <.. PING :?
+log 1 >.. PONG :?
+
+insert full-timeout : +0
 
 # on re-connect, ensure timer cleared, i.e. only 2nd time-out will disconnect
 > /window 1
 > /reconnect
-repeat conn0
+insert conn :2 +1
 log 2 $.. CONNECTED
-repeat conn1
-repeat full-timeout
+insert conn 3: +1
+insert full-timeout : +0
 
 > /quit
 log 0 <.. 
index b24b436e5ec27fe70821063c099015f45fa8849c..8ac97ef7436b4b7e4d9ba33f01d2c334443eea5e 100644 (file)
@@ -1,38 +1,26 @@
-# on /connect init databases, log in new windows
-> /connect foo.bar.baz foo:bar baz:foobarbazquux
-| standard-clears-in
-| isupport-clear-in
+× isupport-clear
 log 1 $.. isupport cleared
 log 1 $.. isupport:CHANTYPES set to: [#&]
 log 1 $.. isupport:PREFIX set to: [(ov)@+]
 log 1 $.. isupport:USERLEN set to: [10]
-| isupport-clear-out
+
+× standard-clear
+insert isupport-clear : +1
 log 1 $.. caps cleared
 log 1 $.. users cleared
 log 1 $.. channels cleared
 log , $.. DISCONNECTED
-| standard-clears-out
 
-# connect with values set by /connect, init CAP negotation
-log 1 $.. hostname set to: [foo.bar.baz]
-log 1 $.. port set to: [-1]
-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]
-| conn-in
+× conn_init_0
 log 1 $.. port set to: [6697]
-| conn0-in
 log 1 $.. connection_state set to: [connecting]
 log 1 $.. connection_state set to: [connected]
-| conn0-out
 log , $.. CONNECTED
-| conn1-in
 log 1 >.. CAP LS :302
-| conn-out
 log 1 >.. USER foobarbazquux 0 * :baz
 log 1 >.. NICK :foo
 
+× conn_init_1
 # expect some NOTICE and PING to process/reply during initiation
 loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Looking up your ident...
 log 2 <.. (server) *** Looking up your ident...
@@ -42,7 +30,6 @@ loggedservermsg 0 1 <.. :*.?.net NOTICE * :*** Found your hostname (baz.bar.foo)
 log 2 <.. (server) *** Found your hostname (baz.bar.foo)
 loggedservermsg 0 1 <.. PING :?
 log 1 >.. PONG :?
-
 # handle 433
 loggedservermsg 0 1 <.. :*.?.net 433 * foo :Nickname already in use
 log 1 $!. nickname already in use, trying increment
@@ -50,7 +37,6 @@ log 1 >.. NICK :foo0
 loggedservermsg 0 1 <.. :*.?.net 433 * foo0 :Nickname already in use
 log 1 $!. nickname already in use, trying increment
 log 1 >.. NICK :foo1
-
 # collect server capabilities
 loggedservermsg 0 1 <.. :*.?.net CAP * LS : foo bar sasl=PLAIN,EXTERNAL baz cap-notify
 log 1 >.. CAP REQ :sasl
@@ -65,7 +51,6 @@ log 1 $.. caps:foo:data set to: []
 log 1 $.. caps:sasl:data set to: []
 log 1 $.. caps:sasl:data set to: [PLAIN,EXTERNAL]
 log 1 $.. caps:sasl:enabled set to: [True]
-
 # authenticate via SASL, collect items of user identity
 log 1 $.. sasl_auth_state set to: [attempting]
 log 1 >.. AUTHENTICATE :PLAIN
@@ -79,14 +64,12 @@ log 1 $.. users:me:host set to: [baz.bar.foo]
 log 1 $.. sasl_account set to: [foo]
 loggedservermsg 0 1 <.. :foo.bar.baz 903 foo1 :SASL authentication successful
 log 1 $.. sasl_auth_state set to: [SASL authentication successful]
-
 # finish CAP negotation, thus login procedure
 log 1 >.. CAP :END
 
+× conn_init_2
 # of all pre-MOTD greeting messages, only process isupports
 loggedservermsg 0 1 <.. :foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
-| 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
@@ -105,7 +88,6 @@ loggedservermsg 0 1 <.. :foo.bar.baz 255 foo1 :I have 100 clients and 1 serveres
 loggedservermsg 0 1 <.. :foo.bar.baz 265 foo1 100 150 :Current local users 100, max 150
 loggedservermsg 0 1 <.. :foo.bar.baz 266 foo1 1010 1050 :Current global users 1010, max 1050
 loggedservermsg 0 1 <.. :foo.bar.baz 250 foo1 :Highest connection count: 151 (150 clients) (1080 connections received)
-
 # collect MOTD into a single output (rather than line-by-line)
 loggedservermsg 0 1 <.. :foo.bar.baz 375 foo1 :- foo.bar.baz Message of the Day -
 loggedservermsg 0 1 <.. :foo.bar.baz 372 foo1 :- Howdy! -
@@ -116,59 +98,19 @@ log 1 $.. motd set to:
 log 1 $..   - Howdy! -
 log 1 $..   - Welcome! -
 log 1 $..   - (to this server) -
-
 # collect user mode
 loggedservermsg 0 1 <.. :foo1 MODE foo1 :+Ziw
 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.
-| conn2-out
-
-# check difference in available commands when switching to client window
-> /join #test
-log 0 #!. invalid prompt command: /join unknown
-> /list
-log 0 #.. windows available via /window:
-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
-| conn3-in
-> /window 1
-> /help
-log 1 #.. commands available in this window:
-log 1 #..   /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
-log 1 #..   /disconnect [QUIT_MSG]
-log 1 #..   /help
-log 1 #..   /join CHANNEL
-log 1 #..   /list
-log 1 #..   /nick NEW_NICK
-log 1 #..   /privmsg TARGET MSG
-log 1 #..   /prompt_enter
-log 1 #..   /quit
-log 1 #..   /raw VERB [PARAMS_STR]
-log 1 #..   /reconnect
-log 1 #..   /window TOWARDS
-log 1 #..   /window.disconnect [QUIT_MSG]
-log 1 #..   /window.history.scroll DIRECTION
-log 1 #..   /window.join CHANNEL
-log 1 #..   /window.nick NEW_NICK
-log 1 #..   /window.paste
-log 1 #..   /window.privmsg TARGET MSG
-log 1 #..   /window.prompt.backspace
-log 1 #..   /window.prompt.move_cursor DIRECTION
-log 1 #..   /window.prompt.scroll DIRECTION
-log 1 #..   /window.raw VERB [PARAMS_STR]
-log 1 #..   /window.reconnect
 
+× during_conn
 # test recoverable 432
 > /nick @foo
 log 1 >.. NICK :@foo
 loggedservermsg 0 1 <.. :*.?.net 432 foo1 @foo :Erroneous nickname
 log 1 $!. nickname refused for bad format, keeping current one
-
 # join channel, collect topic, residents; update me:user from JOIN message; ensure topic.who not affecting users DB
 > /join #test
 log 1 >.. JOIN :#test
@@ -187,13 +129,11 @@ log 1 $.. channels:#test:user_ids set to:
 log 1 $..   1
 log 1 $..   me
 log 4 $.. residents: bar, foo1
-
 # deliver PRIVMSG to channel window, update sender's user+host from metadata
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar PRIVMSG #test :hi there
 log 1 $.. users:1:user set to: [~bar]
 log 1 $.. users:1:host set to: [bar.bar]
 log 4 <.. [bar] hi there
-
 # check _changing_ TOPIC message is communicated to channel window, as long as either content or who change
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar TOPIC #test :foo bar baz
 log 1 $.. channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
@@ -202,7 +142,6 @@ loggedservermsg 0 1 <.. :bar!~bar@bar.bar TOPIC #test :foo bar baz
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar TOPIC #test :abc def ghi
 log 1 $.. channels:#test:topic set to: [Topic(what='abc def ghi', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
 log 4 $.. bar!~bar@bar.bar set topic: abc def ghi
-
 # process non-self channel JOIN
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz JOIN :#test
 log 1 $.. users:2:nick set to: [?]
@@ -214,7 +153,6 @@ log 1 $..   1
 log 1 $..   2
 log 1 $..   me
 log 4 $.. baz!~baz@baz.baz joins
-
 # join second channel with partial residents identity to compare distribution of resident-specific messages
 > /join #testtest
 log 1 >.. JOIN :#testtest
@@ -230,7 +168,6 @@ log 1 $.. channels:#testtest:user_ids set to:
 log 1 $..   2
 log 1 $..   me
 log 5 $.. residents: baz, foo1
-
 # handle query window with known user
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz PRIVMSG foo1 :hi there
 log 6 <.. [baz] hi there
@@ -239,19 +176,16 @@ log 1 >.. PRIVMSG baz :hello, how is it going
 log 6 >.. [foo1] hello, how is it going
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz PRIVMSG foo1 :fine!
 log 6 <.. [baz] fine!
-
 # handle failure to query absent user
 > /privmsg barbar hello!
 log 1 >.. PRIVMSG barbar :hello!
 log 7 >.. [foo1] hello!
 loggedservermsg 0 1 <.. :*.?.net 401 foo1 barbar :No such nick/channel
 log 7 $!. barbar not online
-
 # handle non-self renaming
 loggedservermsg 0 1 <.. :baz!~baz@baz.baz NICK :bazbaz
 log 1 $.. users:2:nick set to: [bazbaz]
 log 4,5,6 $.. baz!~baz@baz.baz renames bazbaz
-
 # handle non-self PART in one of two inhabited channels, preserve identity into re-JOIN
 loggedservermsg 0 1 <.. :bazbaz!~baz@baz.baz PART :#test
 log 1 $.. channels:#test:exits:2 set to: [P]
@@ -266,7 +200,6 @@ log 1 $..   1
 log 1 $..   2
 log 1 $..   me
 log 4 $.. bazbaz!~baz@baz.baz joins
-
 # handle non-self PART in only inhabited channel, lose identity, re-join as new identity
 loggedservermsg 0 1 <.. :bar!~bar@bar.bar PART :#test
 log 1 $.. channels:#test:exits:1 set to: [P]
@@ -286,7 +219,6 @@ log 1 $..   2
 log 1 $..   3
 log 1 $..   me
 log 4 $.. bar!~bar@bar.bar joins
-
 # handle non-self QUIT
 loggedservermsg 0 1 <.. :bazbaz!~baz@baz.baz QUIT :Client Quit
 log 1 $.. users:2:exit_msg set to: [QClient Quit]
@@ -303,7 +235,6 @@ log 1 $..   me
 log 5 $.. bazbaz!~baz@baz.baz quits: Client Quit
 log 1 $.. channels:#testtest:exits:2 cleared
 log 1 $.. users:2 cleared
-
 # handle self-PART: clear channel, and its squatters
 loggedservermsg 0 1 <.. :foo1!~foobarbaz@baz.bar.foo PART :#test
 log 1 $.. channels:#test:exits:me set to: [P]
@@ -313,12 +244,10 @@ log 4 $.. foo1!~foobarbaz@baz.bar.foo parts
 log 1 $.. channels:#test:exits:me cleared
 log 1 $.. channels:#test cleared
 log 1 $.. users:3 cleared
-
 # handle lack of implementation
 loggedservermsg 0 1 <.. foo bar baz
 log 1 $!. No handler implemented for: foo bar baz
 log 2,3,4,5,6,7 $!. No handler implemented for: foo bar baz
-
 # handle /disconnect, clear all
 > /disconnect
 log 1 >.. QUIT :ircplom says bye
@@ -331,7 +260,7 @@ log 5 $.. foo1!~foobarbaz@baz.bar.foo quits: Client Quit
 log 1 $.. channels:#testtest:exits:me cleared
 loggedservermsg 0 1 <.. ERROR :Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]
 log 1 $.. connection_state set to: [Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]]
-repeat isupport-clear
+insert isupport-clear : +1
 log 1 $.. caps cleared
 log 1 $.. channels cleared
 log 1 $.. connection_state set to: []
@@ -340,7 +269,6 @@ log 1 $.. motd set to:
 log 1 $.. sasl_account set to: []
 log 1 $.. sasl_auth_state set to: []
 log 1 $.. users cleared
-
 # fail to send in disconnect, check alert window is command prompt window
 > /window 6
 > /privmsg barbar test
@@ -350,51 +278,109 @@ 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
-| conn3-out
+
+× disconnect
+insert isupport-clear : +8
+log 8 $.. connection_state set to: []
+log , $.. DISCONNECTED
+
+
+# on /connect init databases, log in new windows
+> /connect foo.bar.baz foo:bar baz:foobarbazquux
+insert standard-clear : +1
+
+# connect with values set by /connect, init CAP negotation
+log 1 $.. hostname set to: [foo.bar.baz]
+log 1 $.. port set to: [-1]
+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]
+insert conn_init_0 : +1
+
+insert conn_init_1 : +0
+insert conn_init_2 : +0
+
+# check difference in available commands when switching to client window
+> /join #test
+log 0 #!. invalid prompt command: /join unknown
+> /list
+log 0 #.. windows available via /window:
+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
+> /window 1
+> /help
+log 1 #.. commands available in this window:
+log 1 #..   /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
+log 1 #..   /disconnect [QUIT_MSG]
+log 1 #..   /help
+log 1 #..   /join CHANNEL
+log 1 #..   /list
+log 1 #..   /nick NEW_NICK
+log 1 #..   /privmsg TARGET MSG
+log 1 #..   /prompt_enter
+log 1 #..   /quit
+log 1 #..   /raw VERB [PARAMS_STR]
+log 1 #..   /reconnect
+log 1 #..   /window TOWARDS
+log 1 #..   /window.disconnect [QUIT_MSG]
+log 1 #..   /window.history.scroll DIRECTION
+log 1 #..   /window.join CHANNEL
+log 1 #..   /window.nick NEW_NICK
+log 1 #..   /window.paste
+log 1 #..   /window.privmsg TARGET MSG
+log 1 #..   /window.prompt.backspace
+log 1 #..   /window.prompt.move_cursor DIRECTION
+log 1 #..   /window.prompt.scroll DIRECTION
+log 1 #..   /window.raw VERB [PARAMS_STR]
+log 1 #..   /window.reconnect
+
+insert during_conn : +0
 
 # test setting up second client, but 432 irrecoverably
 > /connect baz.bar.foo ?foo foo:foo
-repeat standard-clears +8
+insert standard-clear : +8
 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]
-repeat conn +8
+insert conn_init_0 :5 +8
 log 8 >.. USER foo 0 * :foo
 log 8 >.. NICK :?foo
 loggedservermsg 1 8 <.. :*.?.net 432 * ?foo :Erroneous nickname
-| disconnect-in
-repeat isupport-clear +8
-log 8 $.. connection_state set to: []
-log , $.. DISCONNECTED
-| disconnect-out
+insert disconnect : +8
 log 8 $!. nickname refused for bad format, giving up
 
 # test failing third connection
 > /connect baz.baz.baz baz baz:baz
-repeat standard-clears +9
+insert standard-clear : +9
 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]
-repeat conn +9
+insert conn_init_0 :5 +9
 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 disconnect +9
+insert disconnect : +9
 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
-repeat conn0
+insert conn_init_0 1:3 +1
 log 2,3,4,5,6,7 $.. CONNECTED
-repeat conn1
+insert conn_init_0 4: +1
+insert conn_init_1 : +0
+insert conn_init_2 :1 +0
 log 1 >.. JOIN :#testtest
-repeat conn2
-repeat conn3
+insert conn_init_2 1: +0
+insert during_conn : +0
 
 > /quit
 log 0 <.. 
index d0f80f88c9765648ac5212913e5b289e22dd2037..e7fd8d77f76f01770efd8113b9dbdd3c25072e21 100644 (file)
-| empty-init-in
-| lines-empty-16-in
-| lines-empty-8-in
-| lines-empty-4-in
-| lines-empty-2-in
-| lines-empty-1-in
+× lines-empty-1
 line 0 on_black,bright_white §§
-| lines-empty-1-out
-repeat lines-empty-1 +1
-| lines-empty-2-out
-repeat lines-empty-1 +2
-repeat lines-empty-1 +3
-| lines-empty-4-out
-repeat lines-empty-2 +4
-repeat lines-empty-2 +6
-| lines-empty-8-out
-repeat lines-empty-4 +8
-repeat lines-empty-4 +12
-| lines-empty-16-out
-repeat lines-empty-4 +16
-repeat lines-empty-2 +20
-| status-[0]-prompt-in
-line 22 on_black,bright_white :start)=====================================================================([0]§§
-| prompt-empty-in
+
+× lines-empty
+insert lines-empty-1 : +0
+insert lines-empty-1 : +1
+insert lines-empty-1 : +2
+insert lines-empty-1 : +3
+insert lines-empty-1 : +4
+insert lines-empty-1 : +5
+insert lines-empty-1 : +6
+insert lines-empty-1 : +7
+insert lines-empty-1 : +8
+insert lines-empty-1 : +9
+insert lines-empty-1 : +10
+insert lines-empty-1 : +11
+insert lines-empty-1 : +12
+insert lines-empty-1 : +13
+insert lines-empty-1 : +14
+insert lines-empty-1 : +15
+insert lines-empty-1 : +16
+insert lines-empty-1 : +17
+insert lines-empty-1 : +18
+insert lines-empty-1 : +19
+insert lines-empty-1 : +20
+insert lines-empty-1 : +21
+
+× prompt-empty
 line 23 on_black,bright_white > § §§
 line 23 on_black,bright_white,reverse §§ §
-| prompt-empty-out
-| status-[0]-prompt-out
-| empty-init-out
+
+× bookmark
+line 0 on_black,bright_white --------------------------------------------------------------------------------§§
+
+× scrolldown-1
+line 21 on_black,bright_white,reverse vvv [1] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-2
+line 21 on_black,bright_white,reverse vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-3
+line 21 on_black,bright_white,reverse vvv [3] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-4
+line 21 on_black,bright_white,reverse vvv [4] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-6
+line 21 on_black,bright_white,reverse vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-8
+line 21 on_black,bright_white,reverse vvv [8] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-10
+line 21 on_black,bright_white,reverse vvv [10] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-11
+line 21 on_black,bright_white,reverse vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-12
+line 21 on_black,bright_white,reverse vvv [12] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-14
+line 21 on_black,bright_white,reverse vvv [14] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-22
+line 21 on_black,bright_white,reverse vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+× scrolldown-25
+line 21 on_black,bright_white,reverse vvv [25] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+
+× status-[0]-prompt
+line 22 on_black,bright_white :start)=====================================================================([0]§§
+insert prompt-empty : +23
+× status-[0]-1-prompt
+line 22 on_black,bright_white :start)===================================================================([0] 1§§
+insert prompt-empty : +23
+× status-[0]-1:2-prompt
+line 22 on_black,bright_white :start)===============================================================([0] (1:2)§§
+insert prompt-empty : +23
+× status-0-[1:2]-prompt
+line 22 on_black,bright_white foo.bar.baz:debug)====================================================(0 [(1:2)]§§
+insert prompt-empty : +23
+× status-[0]-1:4-prompt
+line 22 on_black,bright_white :start)===============================================================([0] (1:4)§§
+insert prompt-empty : +23
+× status-0-[1:4]-prompt
+line 22 on_black,bright_white foo.bar.baz:debug)====================================================(0 [(1:4)]§§
+insert prompt-empty : +23
+× status-[0]-1:6-prompt
+line 22 on_black,bright_white :start)===============================================================([0] (1:6)§§
+insert prompt-empty : +23
+× status-0-[1:6]-prompt
+line 22 on_black,bright_white foo.bar.baz:debug)====================================================(0 [(1:6)]§§
+insert prompt-empty : +23
+× status-0-[1]-prompt
+line 22 on_black,bright_white foo.bar.baz:debug)========================================================(0 [1]§§
+insert prompt-empty : +23
+× status-[0:1]-prompt
+line 22 on_black,bright_white :start)=================================================================([(0:1)]§§
+insert prompt-empty : +23
+× status-[0:1]-1-prompt
+line 22 on_black,bright_white :start)===============================================================([(0:1)] 1§§
+insert prompt-empty : +23
+× status-0:1-[1]-prompt
+line 22 on_black,bright_white foo.bar.baz:debug)====================================================((0:1) [1]§§
+insert prompt-empty : +23
+× status-[0:1]-1:19-prompt
+line 22 on_black,bright_white :start)==========================================================([(0:1)] (1:19)§§
+insert prompt-empty : +23
+× status-[0:3]-prompt
+line 22 on_black,bright_white :start)=================================================================([(0:3)]§§
+insert prompt-empty : +23
+× status-[0:12]-prompt
+line 22 on_black,bright_white :start)================================================================([(0:12)]§§
+insert prompt-empty : +23
+
+× history_0
+line 0 on_black,bright_white 20§§-§§-§§ §§
+line 1 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: not prefixed by / §§
+line 2 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo unknown §§
+line 3 on_black,bright_cyan #.. §§:§§:§§ commands available in this window:§§
+line 4 on_black,bright_cyan #.. §§:§§:§§   /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]§§
+line 5 on_black,bright_cyan #.. §§:§§:§§   /help§§
+line 6 on_black,bright_cyan #.. §§:§§:§§   /list§§
+line 7 on_black,bright_cyan #.. §§:§§:§§   /prompt_enter§§
+line 8 on_black,bright_cyan #.. §§:§§:§§   /quit§§
+line 9 on_black,bright_cyan #.. §§:§§:§§   /window TOWARDS§§
+line 10 on_black,bright_cyan #.. §§:§§:§§   /window.history.scroll DIRECTION§§
+line 11 on_black,bright_cyan #.. §§:§§:§§   /window.paste
+line 12 on_black,bright_cyan #.. §§:§§:§§   /window.prompt.backspace§§
+line 13 on_black,bright_cyan #.. §§:§§:§§   /window.prompt.move_cursor DIRECTION§§
+line 14 on_black,bright_cyan #.. §§:§§:§§   /window.prompt.scroll DIRECTION§§
+line 15 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /0 unknown§§
+line 16 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /1 unknown§§
+line 17 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /2 unknown§§
+line 18 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /3 unknown§§
+line 19 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /4 unknown§§
+line 20 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /5 unknown§§
+line 21 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /6 unknown§§
+line 22 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /7 unknown§§
+line 23 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_01234567 unknown§§
+line 24 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_012345678§§
+line 25 on_black,bright_red,bold     unknown§§
+line 26 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /bar_0123456789_0123456789_012345678§§
+line 27 on_black,bright_red,bold     unknown§§
+line 28 on_black,bright_cyan #.. §§:§§:§§ windows available via /window:§§
+line 29 on_black,bright_cyan #.. §§:§§:§§   0) :start§§
+line 30 on_black,bright_cyan #.. §§:§§:§§   1) foo.bar.baz:debug§§
+
+× history_1
+line 0 on_black,bright_white 20§§-§§-§§ §§
+line 1 on_black,bright_yellow $.. §§:§§:§§ isupport cleared
+line 2 on_black,bright_yellow $.. §§:§§:§§ isupport:CHANTYPES set to: [#&]
+line 3 on_black,bright_yellow $.. §§:§§:§§ isupport:PREFIX set to: [(ov)@+]
+line 4 on_black,bright_yellow $.. §§:§§:§§ isupport:USERLEN set to: [10]
+line 5 on_black,bright_yellow $.. §§:§§:§§ caps cleared
+line 6 on_black,bright_yellow $.. §§:§§:§§ users cleared
+line 7 on_black,bright_yellow $.. §§:§§:§§ channels cleared
+line 8 on_black,bright_yellow $.. §§:§§:§§ hostname set to: [foo.bar.baz]
+line 9 on_black,bright_yellow $.. §§:§§:§§ port set to: [-1]
+line 10 on_black,bright_yellow $.. §§:§§:§§ nick_wanted set to: [foo]
+line 11 on_black,bright_yellow $.. §§:§§:§§ user_wanted set to: [baz]
+line 12 on_black,bright_yellow $.. §§:§§:§§ realname set to: [bar]
+line 13 on_black,bright_yellow $.. §§:§§:§§ port set to: [6697]
+line 14 on_black,bright_yellow $.. §§:§§:§§ connection_state set to: [connecting]
+line 15 on_black,bright_yellow $.. §§:§§:§§ connection_state set to: [connected]
+line 16 on_black,bright_green >.. §§:§§:§§ CAP LS :302§§
+line 17 on_black,bright_green >.. §§:§§:§§ USER baz 0 * :bar§§
+line 18 on_black,bright_green >.. §§:§§:§§ NICK :foo§§
+line 19 on_black,bright_white <.. §§:§§:§§ PING :?
+line 20 on_black,bright_green >.. §§:§§:§§ PONG :?
+line 21 on_black,bright_white <.. §§:§§:§§ PING :123456789 123456789 123456789 123456789 123456789 123456789§§
+line 22 on_black,bright_white     123456789 123456789§§
+line 23 on_black,bright_green >.. §§:§§:§§ PONG :123456789 123456789 123456789 123456789 123456789 123456789§§
+line 24 on_black,bright_green     123456789 123456789§§
+line 25 on_black,bright_white <.. §§:§§:§§ PING :foo
+line 26 on_black,bright_green >.. §§:§§:§§ PONG :foo
+line 27 on_black,bright_white <.. §§:§§:§§ PING :bar
+line 28 on_black,bright_green >.. §§:§§:§§ PONG :bar
+line 29 on_black,bright_white <.. §§:§§:§§ PING :baz
+line 30 on_black,bright_green >.. §§:§§:§§ PONG :baz
+
+
+insert lines-empty : +0
+insert status-[0]-prompt : +22
 
 # nothing happening on empty command input
 > 
-repeat empty-init
+insert lines-empty : +0
+insert status-[0]-prompt : +22
 
 # check scrolling on empty history does nothing
 > /window.history.scroll up
-repeat empty-init
+insert lines-empty : +0
+insert status-[0]-prompt : +22
 > /window.history.scroll down
-repeat empty-init
+insert lines-empty : +0
+insert status-[0]-prompt : +22
 
 # non-empty command input starts log at bottom, with date above it
 > foo
 log 0 #!. invalid prompt command: not prefixed by /
-| with-only-2-lines-history-in
-repeat lines-empty-16 +0
-repeat lines-empty-4 +16
-| history-lines-0:0:2-in
-| history-lines-0:0:1-in
-line 20 on_black,bright_white 20§§-§§-§§ §§
-| history-lines-0:0:1-out
-| history-lines-0:1:2-in
-line 21 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: not prefixed by / §§
-| history-lines-0:1:2-out
-| history-lines-0:0:2-out
-repeat status-[0]-prompt
-| with-only-2-lines-history-out
+insert lines-empty :20 +0
+insert history_0 :2 +20
+insert status-[0]-prompt : +22
 
 # check scrolling on history merely 2 lines long won't do anything either
 > /window.history.scroll up
-repeat with-only-2-lines-history
+insert lines-empty :20 +0
+insert history_0 :2 +20
+insert status-[0]-prompt : +22
 > /window.history.scroll down
-repeat with-only-2-lines-history
+insert lines-empty :20 +0
+insert history_0 :2 +20
+insert status-[0]-prompt : +22
 
 # further inputs grow log upwards
 > /foo
 log 0 #!. invalid prompt command: /foo unknown
-| before-first-scroll-in
-repeat lines-empty-16 +0
-repeat lines-empty-2 +16
-repeat lines-empty-1 +18
-repeat history-lines-0:0:2 +19
-| history-lines-0:2:3-in
-line 21 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo unknown §§
-| history-lines-0:2:3-out
-repeat status-[0]-prompt
-| before-first-scroll-out
+insert lines-empty :19 +0
+insert history_0 :3 +19
+insert status-[0]-prompt : +22
 
 # check scrolling up does something on history 3 lines long
 > /window.history.scroll up
-| topmost-scroll-in
-repeat lines-empty-16 +0
-repeat lines-empty-4 +16
-repeat history-lines-0:0:1 +20
-| topmost-scroll-out
-| scrolldown-2-in
-line 21 on_black,bright_white,reverse vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| scrolldown-2-out
-repeat status-[0]-prompt
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-2 : +21
+insert status-[0]-prompt : +22
 
 # check scrolling down on 3-lines history
 > /window.history.scroll down
-repeat before-first-scroll
-
-# > /bar
-# log 0 #!. invalid prompt command: /bar unknown
-# | history-lines-0:0:4-in
-# repeat history-lines-0:0:2 +18
-# | history-lines-0:2:4-in
-# repeat history-lines-0:2:3 +20
-# line 21 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /bar unknown §§
-# | history-lines-0:2:4-out
-# | history-lines-0:0:4-out
+insert lines-empty :19 +0
+insert history_0 :3 +19
+insert status-[0]-prompt : +22
 
 # check history growing below up-scroll
 > /window.history.scroll up
-repeat topmost-scroll +0
-repeat scrolldown-2
-repeat status-[0]-prompt
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-2 : +21
+insert status-[0]-prompt : +22
 > /help
 log 0 #.. commands available in this window:
 log 0 #..   /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
@@ -119,78 +243,35 @@ log 0 #..   /window.paste
 log 0 #..   /window.prompt.backspace
 log 0 #..   /window.prompt.move_cursor DIRECTION
 log 0 #..   /window.prompt.scroll DIRECTION
-| before-scrolldown-not-to-bottom-in
-repeat topmost-scroll
-| scrolldown-14-in
-line 21 on_black,bright_white,reverse vvv [14] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| scrolldown-14-out
-| before-scrolldown-not-to-bottom-out
-line 22 on_black,bright_white :start)================================================================([(0:12)]§§
-repeat prompt-empty
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-14 : +21
+insert status-[0:12]-prompt : +22
 
 # check scroll-down on newer history longer than half a screen width does not fully land at bottom
 > /window.history.scroll down
-| after-scrolldown-not-to-bottom-in
-repeat lines-empty-8 +0
-repeat lines-empty-1 +8
-| history-lines-0:0:8-in
-repeat history-lines-0:0:2 +9
-| history-lines-0:2:4-in
-repeat history-lines-0:2:3 +11
-line 12 on_black,bright_cyan #.. §§:§§:§§ commands available in this window:§§
-| history-lines-0:2:4-out
-| history-lines-0:4:8-in
-line 13 on_black,bright_cyan #.. §§:§§:§§   /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]§§
-| history-lines-0:5:6-in
-line 14 on_black,bright_cyan #.. §§:§§:§§   /help§§
-| history-lines-0:5:6-out
-| history-lines-0:6:8-in
-line 15 on_black,bright_cyan #.. §§:§§:§§   /list§§
-| history-lines-0:7:8-in
-line 16 on_black,bright_cyan #.. §§:§§:§§   /prompt_enter§§
-| history-lines-0:7:8-out
-| history-lines-0:6:8-out
-| history-lines-0:4:8-out
-| history-lines-0:0:8-out
-| history-lines-0:8:12-in
-line 17 on_black,bright_cyan #.. §§:§§:§§   /quit§§
-line 18 on_black,bright_cyan #.. §§:§§:§§   /window TOWARDS§§
-| history-lines-0:10:12-in
-line 19 on_black,bright_cyan #.. §§:§§:§§   /window.history.scroll DIRECTION§§
-line 20 on_black,bright_cyan #.. §§:§§:§§   /window.paste
-| history-lines-0:10:12-out
-| history-lines-0:8:12-out
-| scrolldown-3-in
-line 21 on_black,bright_white,reverse vvv [3] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| scrolldown-3-out
-| status-[0:3]-prompt-in
-line 22 on_black,bright_white :start)=================================================================([(0:3)]§§
-repeat prompt-empty
-| status-[0:3]-prompt-out
-| after-scrolldown-not-to-bottom-out
+insert lines-empty :9 +0
+insert history_0 :12 +9
+insert scrolldown-3 : +21
+insert status-[0:3]-prompt : +22
 
 # check previous scroll-down not hitting bottom be fully reversible
 > /window.history.scroll up
-repeat before-scrolldown-not-to-bottom
-repeat status-[0:3]-prompt
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-14 : +21
+insert status-[0:3]-prompt : +22
 > /window.history.scroll down
-repeat after-scrolldown-not-to-bottom
+insert lines-empty :9 +0
+insert history_0 :12 +9
+insert scrolldown-3 : +21
+insert status-[0:3]-prompt : +22
 
 # scroll to bottom, check history still growing up even beyond upper fold
 > /window.history.scroll down
-repeat lines-empty-4 +0
-repeat lines-empty-2 +4
-repeat lines-empty-1 +6
-repeat history-lines-0:0:8 +7
-repeat history-lines-0:8:12 +15
-| history-lines-0:12:14-in
-line 19 on_black,bright_cyan #.. §§:§§:§§   /window.prompt.backspace§§
-line 20 on_black,bright_cyan #.. §§:§§:§§   /window.prompt.move_cursor DIRECTION§§
-| history-lines-0:12:14-out
-| history-lines-0:14:15-in
-line 21 on_black,bright_cyan #.. §§:§§:§§   /window.prompt.scroll DIRECTION§§
-| history-lines-0:14:15-out
-repeat status-[0]-prompt
+insert lines-empty :7 +0
+insert history_0 :15 +7
+insert status-[0]-prompt : +22
 > /0
 log 0 #!. invalid prompt command: /0 unknown
 > /1
@@ -207,140 +288,77 @@ log 0 #!. invalid prompt command: /5 unknown
 log 0 #!. invalid prompt command: /6 unknown
 > /7
 log 0 #!. invalid prompt command: /7 unknown
-| at-bottom-before-wrapped-in
-repeat history-lines-0:1:2 +0
-repeat history-lines-0:2:4 +1
-repeat history-lines-0:4:8 +3
-| history-lines-0:8:16-in
-repeat history-lines-0:8:12 +7
-| history-lines-0:12:16-in
-repeat history-lines-0:12:14 +11
-repeat history-lines-0:14:15 +13
-line 14 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /0 unknown§§
-| history-lines-0:12:16-out
-| history-lines-0:8:16-out
-| history-lines-0:16:20-in
-| history-lines-0:16:18-in
-line 15 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /1 unknown§§
-line 16 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /2 unknown§§
-| history-lines-0:16:18-out
-line 17 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /3 unknown§§
-line 18 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /4 unknown§§
-| history-lines-0:16:20-out
-| history-lines-0:20:22-in
-line 19 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /5 unknown§§
-line 20 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /6 unknown§§
-| history-lines-0:20:22-out
-| history-lines-0:22:23-in
-line 21 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /7 unknown§§
-| history-lines-0:22:23-out
-repeat status-[0]-prompt
-| at-bottom-before-wrapped-out
+insert history_0 1:23 +0
+insert status-[0]-prompt : +22
 
 # check scroll-down even with long history does nothing
 > /window.history.scroll down
-repeat at-bottom-before-wrapped
+insert history_0 1:23 +0
+insert status-[0]-prompt : +22
 
 # quick look one scroll up to check single-scroll increase of below-scroll count (when up-scroll not limited, and all lines un-wrapped)
 > /window.history.scroll up
-repeat lines-empty-8
-repeat lines-empty-1 +8
-repeat history-lines-0:0:8 +9
-repeat history-lines-0:8:12 +17
-| scrolldown-11-in
-line 21 on_black,bright_white,reverse vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| scrolldown-11-out
-repeat status-[0]-prompt
-> /window.history.scroll down
-repeat at-bottom-before-wrapped
+insert lines-empty :9 +0
+insert history_0 :12 +9
+insert scrolldown-11 : +21
+insert status-[0]-prompt : +22
 
 # check wrapping
+> /window.history.scroll down
 > /foo_0123456789_0123456789_01234567
 log 0 #!. invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
 > /foo_0123456789_0123456789_012345678
 log 0 #!. invalid prompt command: /foo_0123456789_0123456789_012345678 unknown
-| at-bottom-after-wrapped-in
-repeat history-lines-0:4:8 +0
-repeat history-lines-0:8:16 +4
-repeat history-lines-0:16:20 +12
-repeat history-lines-0:20:22 +16
-repeat history-lines-0:22:23 +18
-| history-lines-0:23:24-in
-line 19 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_01234567 unknown§§
-| history-lines-0:23:24-out
-| history-lines-0:24:26-in
-line 20 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /foo_0123456789_0123456789_012345678§§
-line 21 on_black,bright_red,bold     unknown§§
-| history-lines-0:24:26-out
-repeat status-[0]-prompt
-| at-bottom-after-wrapped-out
+insert history_0 4:26 +0
+insert status-[0]-prompt : +22
 
 # check scroll-up over wrapped moves up less history lines than screen lines
 > /window.history.scroll up
-| scrollup-after-wrapped-in
-repeat lines-empty-4 +0
-repeat lines-empty-2 +4
-repeat history-lines-0:0:8 +6
-repeat history-lines-0:8:12 +14
-repeat history-lines-0:12:14 +18
-repeat history-lines-0:14:15 +20
-| scrollup-after-wrapped-out
-| scrolldown-10-in
-line 21 on_black,bright_white,reverse vvv [10] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| scrolldown-10-out
-repeat status-[0]-prompt
+insert lines-empty :6 +0
+insert history_0 :15 +6
+insert scrolldown-10 : +21
+insert status-[0]-prompt : +22
 
 # check scroll-down fully reversible even if over wrapped
 > /window.history.scroll down
-repeat at-bottom-after-wrapped
+insert history_0 4:26 +0
+insert status-[0]-prompt : +22
 > /window.history.scroll up
-repeat scrollup-after-wrapped
-repeat scrolldown-10
-repeat status-[0]-prompt
+insert lines-empty :6 +0
+insert history_0 :15 +6
+insert scrolldown-10 : +21
+insert status-[0]-prompt : +22
 
 # check wrapped input only increases below-scroll count by one 
 > /bar_0123456789_0123456789_012345678
 log 0 #!. invalid prompt command: /bar_0123456789_0123456789_012345678 unknown
-repeat scrollup-after-wrapped
-repeat scrolldown-11
-| status-[0:1]-prompt-in
-line 22 on_black,bright_white :start)=================================================================([(0:1)]§§
-repeat prompt-empty
-| status-[0:1]-prompt-out
+insert lines-empty :6 +0
+insert history_0 :15 +6
+insert scrolldown-11 : +21
+insert status-[0:1]-prompt : +22
 
 # check scroll-down over wrapped will snap down to bottom of wrapped
 > /window.history.scroll down
-repeat history-lines-0:5:6 +0
-repeat history-lines-0:6:8 +1
-repeat history-lines-0:8:16 +3
-| history-lines-0:16:24-in
-repeat history-lines-0:16:20 +11
-repeat history-lines-0:20:22 +15
-repeat history-lines-0:22:23 +17
-repeat history-lines-0:23:24 +18
-| history-lines-0:16:24-out
-repeat history-lines-0:24:26 +19
-line 21 on_black,bright_white,reverse vvv [1] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-repeat status-[0:1]-prompt
+insert history_0 5:26 +0
+insert scrolldown-1 : +21
+insert status-[0:1]-prompt : +22
 
 # # check scrolls-up over longer history until top
 > /window.history.scroll up
-repeat scrollup-after-wrapped
-repeat scrolldown-11
-repeat status-[0:1]-prompt
+insert lines-empty :6 +0
+insert history_0 :15 +6
+insert scrolldown-11 : +21
+insert status-[0:1]-prompt : +22
 > /window.history.scroll up
-repeat lines-empty-16 +0
-repeat lines-empty-1 +16
-repeat history-lines-0:0:2 +17
-repeat history-lines-0:2:4 +19
-line 21 on_black,bright_white,reverse vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-repeat status-[0:1]-prompt
+insert lines-empty :17 +0
+insert history_0 :3 +17
+insert scrolldown-22 : +21
+insert status-[0:1]-prompt : +22
 > /window.history.scroll up
-repeat topmost-scroll
-| scrolldown-25-in
-line 21 on_black,bright_white,reverse vvv [25] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| scrolldown-25-out
-repeat status-[0:1]-prompt
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-25 : +21
+insert status-[0:1]-prompt : +22
 
 # check that triggering creation of new window with new lines adds it to status, with unread-lines count
 > /connect foo.bar.baz foo bar:baz
@@ -364,313 +382,158 @@ log , $.. CONNECTED
 log 1 >.. CAP LS :302
 log 1 >.. USER baz 0 * :bar
 log 1 >.. NICK :foo
-repeat topmost-scroll
-repeat scrolldown-25
-line 22 on_black,bright_white :start)==========================================================([(0:1)] (1:19)§§
-repeat prompt-empty
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-25 : +21
+insert status-[0:1]-1:19-prompt : +22
 
 # check switch to other window, updates to status line (movement of brackets, clearing of own unread-lines count)
 > /window 1
-repeat lines-empty-2 +0
-repeat lines-empty-1 +2
-| history-lines-1:0:16-in
-| history-lines-1:0:8-in
-repeat history-lines-0:0:1 +3
-line 4 on_black,bright_yellow $.. §§:§§:§§ isupport cleared
-line 5 on_black,bright_yellow $.. §§:§§:§§ isupport:CHANTYPES set to: [#&]
-line 6 on_black,bright_yellow $.. §§:§§:§§ isupport:PREFIX set to: [(ov)@+]
-| history-lines-1:4:8-in
-line 7 on_black,bright_yellow $.. §§:§§:§§ isupport:USERLEN set to: [10]
-| history-lines-1:5:6-in
-line 8 on_black,bright_yellow $.. §§:§§:§§ caps cleared
-| history-lines-1:5:6-out
-| history-lines-1:6:8-in
-line 9 on_black,bright_yellow $.. §§:§§:§§ users cleared
-line 10 on_black,bright_yellow $.. §§:§§:§§ channels cleared
-| history-lines-1:6:8-out
-| history-lines-1:4:8-out
-| history-lines-1:0:8-out
-| history-lines-1:8:16-in
-| history-lines-1:8:12-in
-line 11 on_black,bright_yellow $.. §§:§§:§§ hostname set to: [foo.bar.baz]
-line 12 on_black,bright_yellow $.. §§:§§:§§ port set to: [-1]
-| history-lines-1:10:12-in
-line 13 on_black,bright_yellow $.. §§:§§:§§ nick_wanted set to: [foo]
-line 14 on_black,bright_yellow $.. §§:§§:§§ user_wanted set to: [baz]
-| history-lines-1:10:12-out
-| history-lines-1:8:12-out
-| history-lines-1:12:16-in
-| history-lines-1:12:14-in
-line 15 on_black,bright_yellow $.. §§:§§:§§ realname set to: [bar]
-line 16 on_black,bright_yellow $.. §§:§§:§§ port set to: [6697]
-| history-lines-1:12:14-out
-| history-lines-1:14:15-in
-line 17 on_black,bright_yellow $.. §§:§§:§§ connection_state set to: [connecting]
-| history-lines-1:14:15-out
-line 18 on_black,bright_yellow $.. §§:§§:§§ connection_state set to: [connected]
-| history-lines-1:12:16-out
-| history-lines-1:8:16-out
-| history-lines-1:0:16-out
-| history-lines-1:16:18-in
-line 19 on_black,bright_green >.. §§:§§:§§ CAP LS :302§§
-line 20 on_black,bright_green >.. §§:§§:§§ USER baz 0 * :bar§§
-| history-lines-1:16:18-out
-| history-lines-1:18:19-in
-line 21 on_black,bright_green >.. §§:§§:§§ NICK :foo§§
-| history-lines-1:18:19-out
-line 22 on_black,bright_white foo.bar.baz:debug)====================================================((0:1) [1]§§
-repeat prompt-empty
+insert lines-empty :3 +0
+insert history_1 :19 +3
+insert status-0:1-[1]-prompt : +22
 
 # check switch-back to window 0, retaining clearing of window 1's unread-lines count
 > /window 0
-repeat topmost-scroll
-line 21 on_black,bright_white,reverse vvv [25] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| status-[0:1]-1-prompt-in
-line 22 on_black,bright_white :start)===============================================================([(0:1)] 1§§
-repeat prompt-empty
-| status-[0:1]-1-prompt-out
+insert lines-empty :20 +0
+insert history_0 :1 +20
+insert scrolldown-25 : +21
+insert status-[0:1]-1-prompt : +22
 
 # check that on full scroll-down, we now have a bookmark above the newest lines not previously scrolled into
 > /window.history.scroll down
-repeat lines-empty-8 +0
-repeat lines-empty-1 +8
-repeat history-lines-0:0:8 +9
-repeat history-lines-0:8:12 +17
-repeat scrolldown-14
-repeat status-[0:1]-1-prompt
+insert lines-empty :9 +0
+insert history_0 :12 +9
+insert scrolldown-14 : +21
+insert status-[0:1]-1-prompt : +22
 > /window.history.scroll down
-| before-first-sight-of-bookmark-in
-repeat history-lines-0:2:4 +0
-repeat history-lines-0:4:8 +2
-repeat history-lines-0:8:16 +6
-repeat history-lines-0:16:20 +14
-repeat history-lines-0:20:22 +18
-repeat history-lines-0:22:23 +20
-repeat scrolldown-3
-repeat status-[0:1]-1-prompt
-| before-first-sight-of-bookmark-out
+insert history_0 2:23 +0
+insert scrolldown-3 : +21
+insert status-[0:1]-1-prompt : +22
 > /window.history.scroll down
-| first-sight-of-bookmark-in
-repeat history-lines-0:7:8 +0
-repeat history-lines-0:8:16 +1
-repeat history-lines-0:16:24 +9
-repeat history-lines-0:24:26 +17
-| bookmark-in
-line 19 on_black,bright_white --------------------------------------------------------------------------------§§
-| bookmark-out
-| history-lines-0:26:28-in
-line 20 on_black,bright_red,bold #!. §§:§§:§§ invalid prompt command: /bar_0123456789_0123456789_012345678§§
-line 21 on_black,bright_red,bold     unknown§§
-| history-lines-0:26:28-out
-repeat status-[0]-1-prompt
-repeat status-[0]-1-prompt
-| first-sight-of-bookmark-out
+insert history_0 7:26 +0
+insert bookmark : +19
+insert history_0 26:28 +20
+insert status-[0]-1-prompt : +22
 
 # check that scrolling non-bottom bookmark out of sight, then scrolling it back into view again does not by itself move its position in the log history
 > /window.history.scroll up
-repeat lines-empty-2 +0
-repeat lines-empty-1 +2
-repeat history-lines-0:0:8 +3
-repeat history-lines-0:8:16 +11
-repeat history-lines-0:16:18 +19
-line 21 on_black,bright_white,reverse vvv [8] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-repeat status-[0]-1-prompt
+insert lines-empty :3 +0
+insert history_0 :18 +3
+insert scrolldown-8 : +21
+insert status-[0]-1-prompt : +22
 > /window.history.scroll down
-repeat first-sight-of-bookmark
+insert history_0 7:26 +0
+insert bookmark : +19
+insert history_0 26:28 +20
+insert status-[0]-1-prompt : +22
 
 # check that second switch to new window, previously left on bottom of history, establishes bookmark at bottom of log
 > /window 1
-repeat lines-empty-2 +0
-repeat history-lines-1:0:16 +2
-repeat history-lines-1:16:18 +18
-repeat history-lines-1:18:19 +20
-repeat bookmark +21
-| status-0-[1]-prompt-in
-line 22 on_black,bright_white foo.bar.baz:debug)========================================================(0 [1]§§
-repeat prompt-empty
-| status-0-[1]-prompt-out
+insert lines-empty :2 +0
+insert history_1 :19 +2
+insert bookmark : +21
+insert status-0-[1]-prompt : +22
 
 # check second switch-back places bookmark at bottom there too, since the newest lines previously succeeding it have now been read by us
 > /window 0
-repeat history-lines-0:7:8 +0
-repeat history-lines-0:8:16 +1
-repeat history-lines-0:16:24 +9
-| history-lines-0:24:28-in
-repeat history-lines-0:24:26 +17
-repeat history-lines-0:26:28 +19
-| history-lines-0:24:28-out
-repeat bookmark +21
-| status-[0]-1-prompt-in
-line 22 on_black,bright_white :start)===================================================================([0] 1§§
-repeat prompt-empty
-| status-[0]-1-prompt-out
+insert history_0 7:28 +0
+insert bookmark : +21
+insert status-[0]-1-prompt : +22
 
 # check new lines push bookmark up
 > /list
 log 0 #.. windows available via /window:
 log 0 #..   0) :start
 log 0 #..   1) foo.bar.baz:debug
-| before-first-server-responses-in
-repeat history-lines-0:10:12 +0
-repeat history-lines-0:12:16 +2
-repeat history-lines-0:16:24 +6
-repeat history-lines-0:24:28 +14
-repeat bookmark +18
-| history-lines-0:28:30-in
-line 19 on_black,bright_cyan #.. §§:§§:§§ windows available via /window:§§
-line 20 on_black,bright_cyan #.. §§:§§:§§   0) :start§§
-| history-lines-0:28:30-out
-| history-lines-0:30:31-in
-line 21 on_black,bright_cyan #.. §§:§§:§§   1) foo.bar.baz:debug§§
-| history-lines-0:30:31-out
-| before-first-server-responses-out
-repeat status-[0]-1-prompt
+insert history_0 10:28 +0
+insert bookmark : +18
+insert history_0 28:31 +19
+insert status-[0]-1-prompt : +22
 
 # check new lines growing in other window, one of which long enough to wrap, to be re-start count in status (with wrapped only as single) 
 loggedservermsg 0 1 <.. PING :?
 log 1 >.. PONG :?
 loggedservermsg 0 1 <.. PING :123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
 log 1 >.. PONG :123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
-repeat before-first-server-responses
-line 22 on_black,bright_white :start)===============================================================([0] (1:4)§§
-repeat prompt-empty
+insert history_0 10:28 +0
+insert bookmark : +18
+insert history_0 28:31 +19
+insert status-[0]-1:4-prompt : +22
 
 # check that switching to window with new lines, but left scroll-to-bottom, keeps the scroll-to-bottom, keeps bookmark after last line previously seen there
 > /window 1
-repeat history-lines-1:4:8 +0
-repeat history-lines-1:8:16 +4
-repeat history-lines-1:16:18 +12
-repeat history-lines-1:18:19 +14
-repeat bookmark +15
-| history-lines-1:19:20-in
-line 16 on_black,bright_white <.. §§:§§:§§ PING :?
-| history-lines-1:19:20-out
-| history-lines-1:20:24-in
-line 17 on_black,bright_green >.. §§:§§:§§ PONG :?
-line 18 on_black,bright_white <.. §§:§§:§§ PING :123456789 123456789 123456789 123456789 123456789 123456789§§
-line 19 on_black,bright_white     123456789 123456789§§
-line 20 on_black,bright_green >.. §§:§§:§§ PONG :123456789 123456789 123456789 123456789 123456789 123456789§§
-| history-lines-1:20:24-out
-| history-lines-1:24:25-in
-line 21 on_black,bright_green     123456789 123456789§§
-| history-lines-1:24:25-out
-repeat status-0-[1]-prompt
-
-# check that growth below scroll does not by itself re-position bookmark in history
+insert history_1 4:19 +0
+insert bookmark : +15
+insert history_1 19:25 +16
+insert status-0-[1]-prompt : +22
+
+### # check that growth below scroll does not by itself re-position bookmark in history
 > /window.history.scroll up
 loggedservermsg 0 1 <.. PING :foo
 log 1 >.. PONG :foo
-| early-win1-upscroll-in
-repeat lines-empty-4 +0
-repeat lines-empty-2 +4
-repeat history-lines-1:0:8 +6
-repeat history-lines-1:8:12 +14
-repeat history-lines-1:12:14 +18
-repeat history-lines-1:14:15 +20
-| early-win1-upscroll-out
-repeat scrolldown-10
-| status-0-[1:2]-prompt-in
-line 22 on_black,bright_white foo.bar.baz:debug)====================================================(0 [(1:2)]§§
-repeat prompt-empty
-| status-0-[1:2]-prompt-out
+insert lines-empty :6 +0
+insert history_1 0:15 +6
+insert scrolldown-10 : +21
+insert status-0-[1:2]-prompt : +22
 > /window.history.scroll down
-repeat history-lines-1:5:6 +0
-repeat history-lines-1:6:8 +1
-repeat history-lines-1:8:16 +3
-repeat history-lines-1:16:18 +11
-repeat history-lines-1:18:19 +13
-repeat bookmark +14
-repeat history-lines-1:19:20 +15
-repeat history-lines-1:20:24 +16
-repeat history-lines-1:24:25 +20
-repeat scrolldown-2
-repeat status-0-[1:2]-prompt
+insert history_1 5:19 +0
+insert bookmark : +14
+insert history_1 19:25 +15
+insert scrolldown-2 : +21
+insert status-0-[1:2]-prompt : +22
 
 # check that with new lines left unread, switch away and back into window moves bookmark below newest read line, counts unread lines in status
 > /window 0
-| win-0-only-for-win-1-tests-in
-repeat history-lines-0:10:12 +0
-repeat history-lines-0:12:16 +2
-repeat history-lines-0:16:24 +6
-repeat history-lines-0:24:28 +14
-repeat history-lines-0:28:30 +18
-repeat history-lines-0:30:31 +20
-repeat bookmark +21
-| win-0-only-for-win-1-tests-out
-line 22 on_black,bright_white :start)===============================================================([0] (1:2)§§
-repeat prompt-empty
+insert history_0 10:31 +0
+insert bookmark : +21
+insert status-[0]-1:2-prompt : +22
 > /window 1
-| keep-bookmark-on-outside-growth-test-in
-repeat history-lines-1:5:6 +0
-repeat history-lines-1:6:8 +1
-repeat history-lines-1:8:16 +3
-| history-lines-1:16:24-in
-repeat history-lines-1:16:18 +11
-repeat history-lines-1:18:19 +13
-repeat history-lines-1:19:20 +14
-repeat history-lines-1:20:24 +15
-| history-lines-1:16:24-out
-repeat history-lines-1:24:25 +19
-repeat bookmark +20
-| keep-bookmark-on-outside-growth-test-out
-repeat scrolldown-2
-repeat status-0-[1:2]-prompt
+insert history_1 5:25 +0
+insert bookmark : +20
+insert scrolldown-2 : +21
+insert status-0-[1:2]-prompt : +22
 
 # check that growing lines below scroll in other preserves non-bottom bookmark (left in sight on previous window leave)
 > /window 0
 loggedservermsg 0 1 <.. PING :bar
 log 1 >.. PONG :bar
-repeat win-0-only-for-win-1-tests
-line 22 on_black,bright_white :start)===============================================================([0] (1:4)§§
-repeat prompt-empty
+insert history_0 10:31 +0
+insert bookmark : +21
+insert status-[0]-1:4-prompt : +22
 > /window 1
-repeat keep-bookmark-on-outside-growth-test
-line 21 on_black,bright_white,reverse vvv [4] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-| status-0-[1:4]-prompt-in
-line 22 on_black,bright_white foo.bar.baz:debug)====================================================(0 [(1:4)]§§
-repeat prompt-empty
-| status-0-[1:4]-prompt-out
+insert history_1 5:25 +0
+insert bookmark : +20
+insert scrolldown-4 : +21
+insert status-0-[1:4]-prompt : +22
 
 # check same applies when leaving affected window with bookmark out-of-sight
 > /window.history.scroll up
-repeat early-win1-upscroll
-line 21 on_black,bright_white,reverse vvv [12] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-repeat status-0-[1:4]-prompt
+insert lines-empty :6 +0
+insert history_1 :15 +6
+insert scrolldown-12 : +21
+insert status-0-[1:4]-prompt : +22
 > /window 0
 loggedservermsg 0 1 <.. PING :baz
 log 1 >.. PONG :baz
-repeat win-0-only-for-win-1-tests
-line 22 on_black,bright_white :start)===============================================================([0] (1:6)§§
-repeat prompt-empty
+insert history_0 10:31 +0
+insert bookmark : +21
+insert status-[0]-1:6-prompt : +22
 > /window 1
-repeat early-win1-upscroll
-repeat scrolldown-14
-| status-0-[1:6]-prompt-in
-line 22 on_black,bright_white foo.bar.baz:debug)====================================================(0 [(1:6)]§§
-repeat prompt-empty
-| status-0-[1:6]-prompt-out
+insert lines-empty :6 +0
+insert history_1 :15 +6
+insert scrolldown-14 : +21
+insert status-0-[1:6]-prompt : +22
 > /window.history.scroll down
-repeat history-lines-1:5:6 +0
-repeat history-lines-1:6:8 +1
-repeat history-lines-1:8:16 +3
-repeat history-lines-1:16:24 +11
-repeat history-lines-1:24:25 +19
-repeat bookmark +20
-line 21 on_black,bright_white,reverse vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
-repeat status-0-[1:6]-prompt
+insert history_1 5:25 +0
+insert bookmark : +20
+insert scrolldown-6 : +21
+insert status-0-[1:6]-prompt : +22
 > /window.history.scroll down
-repeat history-lines-1:10:12 +0
-repeat history-lines-1:12:16 +2
-repeat history-lines-1:16:24 +6
-repeat history-lines-1:24:25 +14
-repeat bookmark +15
-line 16 on_black,bright_white <.. §§:§§:§§ PING :foo
-line 17 on_black,bright_green >.. §§:§§:§§ PONG :foo
-line 18 on_black,bright_white <.. §§:§§:§§ PING :bar
-line 19 on_black,bright_green >.. §§:§§:§§ PONG :bar
-line 20 on_black,bright_white <.. §§:§§:§§ PING :baz
-line 21 on_black,bright_green >.. §§:§§:§§ PONG :baz
-repeat status-0-[1]-prompt
+insert history_1 10:25 +0
+insert bookmark : +15
+insert history_1 25:31 +16
+insert status-0-[1]-prompt : +22
 
 > /quit
 log 0 <..