home · contact · privacy
Overhaul testing "insert" instruction grammar, for greater flexibility.
authorChristian Heller <c.heller@plomlompom.de>
Mon, 8 Dec 2025 00:51:36 +0000 (01:51 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Mon, 8 Dec 2025 00:51:36 +0000 (01:51 +0100)
42 files changed:
src/ircplom/testing.py
src/tests/_timeout_retries.test
src/tests/caps.test
src/tests/channels.test
src/tests/config.test
src/tests/connect_disconnect_legalities.test
src/tests/error_disconnects.test
src/tests/isupports.test
src/tests/lib/001-setting-nick
src/tests/lib/attempting
src/tests/lib/attempting-to-connected
src/tests/lib/cap-msg
src/tests/lib/caps-neg-empty
src/tests/lib/cmd-disconnect
src/tests/lib/cmd-nick
src/tests/lib/connect
src/tests/lib/connect-to-connected
src/tests/lib/connect-w-password
src/tests/lib/connected
src/tests/lib/disconnect
src/tests/lib/error-to-disconnect
src/tests/lib/error-to-disconnected
src/tests/lib/join-empty
src/tests/lib/no-handler
src/tests/lib/no-timely-pong
src/tests/lib/part
src/tests/lib/pingpong
src/tests/lib/privmsg
src/tests/lib/req-sasl
src/tests/lib/retry-in
src/tests/lib/servermsglogged
src/tests/lib/servernotice
src/tests/lib/trigger-ping
src/tests/lib/user-set-to
src/tests/lib/usermode
src/tests/pingpong.test
src/tests/test.test
src/tests/tui_draw.test
src/tests/tui_line_formattings.test
src/tests/tui_prompt_basics.test
src/tests/tui_status_line_scrolling.test
src/tests/userset.test

index 28bc9490245e523ea39044ea1adc16045b95b56e..e954b3634127bbabdf6051c1fc2eaa31efc6e329 100644 (file)
@@ -32,15 +32,17 @@ _SEP_1 = ','
 _SEP_2 = ':'
 _TOK_FILE = './'
 _TOK_IDX_REPEAT = 'r'
+_KW_BUMP = 'bump='
+_KW_RANGE = 'range='
 
 _SIGNATURE_FOR_CMD = {
     _MARK_FRAGMENT: (1, None),
-    _MARK_INSERT: (4, 2),
-    _MARK_LOG: (2, 0),
+    _MARK_INSERT: (2, _KW_BUMP),
+    _MARK_LOG: (2, None),
     _MARK_PROMPT: (1, None),
     _MARK_SCREENLINE: (4, 0),
-    _MARK_SERVERMSG: (2, 0),
-    _MARK_WAIT: (1, 0),
+    _MARK_SERVERMSG: (2, None),
+    _MARK_WAIT: (1, None),
 }
 
 
@@ -220,42 +222,58 @@ class _Playbook:
                                    for val in range_str.split(_SEP_2))
                 candidates[:] = candidates[idx_in:idx_out]
 
-            def replace_pattern(to_replace: str, replacement: str) -> None:
-                candidates[:] = [[c[0], c[1].replace(to_replace, replacement)]
-                                 for c in candidates]
-
             def bump_int_fields(n_bump: int) -> None:
-                to_bump = []
-                start_offset: Optional[int] = None
+                t_bumpable = str | int | dict[str, int]
+                to_bump: list[tuple[str, tuple[t_bumpable, ...]]] = []
+                start_offset = None
                 for candidate in candidates:
-                    cmd_name, remains = candidate[1].split(_SEP_0, maxsplit=1)
+                    cmd_name, args = self._cmdname_and_args_from(candidate[1])
                     cmd_args_idx = _SIGNATURE_FOR_CMD[cmd_name][1]
-                    cmd_args: list[str | tuple[int, ...]]
-                    cmd_args = list(self._args_for_cmd(cmd_name, remains))
-                    if cmd_args_idx is not None\
-                            and len(cmd_args) > cmd_args_idx:
-                        cmd_arg = cmd_args[cmd_args_idx]
-                        assert isinstance(cmd_arg, str)
-                        vals = tuple(int(n) for n in cmd_arg.split(_SEP_1)
-                                     if n)
-                        if len(vals) > 0:
-                            start_offset = min(vals if start_offset is None
-                                               else (vals + (start_offset,)))
-                        cmd_args[cmd_args_idx] = vals
-                    to_bump += [(cmd_name, cmd_args)]
-                bumped_offset = n_bump - (start_offset or 0)
+                    bump_args: list[t_bumpable] = list(args)
+                    val = None
+                    if isinstance(cmd_args_idx, str):
+                        for idx, arg in [t for t in enumerate(args)
+                                         if isinstance(t[1], str)
+                                         and t[1].startswith(cmd_args_idx)]:
+                            assert isinstance(arg, str)
+                            val = int(arg[:len(cmd_args_idx)])
+                            bump_args[idx] = {cmd_args_idx: val}
+                    elif isinstance(cmd_args_idx, int)\
+                            and len(args) > cmd_args_idx:
+                        val = int(args[cmd_args_idx])
+                        bump_args[cmd_args_idx] = val
+                    if val is not None:
+                        start_offset = (val if start_offset is None
+                                        else min(val, start_offset))
+                    to_bump += [(cmd_name, tuple(bump_args))]
+                offset_bump = n_bump - (start_offset or 0)
                 for idx, candidate in enumerate(candidates):
-                    cmd_name, cmd_args = to_bump[idx]
+                    cmd_name, bumped_args = to_bump[idx]
                     to_join = [cmd_name]
-                    for cmd_arg in cmd_args:
-                        if isinstance(cmd_arg, str):
-                            to_join += [cmd_arg]
+                    for bumpable in bumped_args:
+                        if isinstance(bumpable, str):
+                            to_join += [bumpable]
+                        elif isinstance(bumpable, dict):
+                            to_join += [k + str(v + offset_bump)
+                                        for k, v in bumpable.items()]
                         else:
-                            to_join += [_SEP_1.join(str(n + bumped_offset)
-                                                    for n in cmd_arg)
-                                        or _SEP_1]
+                            to_join += [str(bumpable + offset_bump)]
                     candidate[1] = _SEP_0.join(to_join)
 
+            def replace_patterns(repl_code: str) -> None:
+                pseudo_space = ' '
+                if repl_code[1] == ' ':
+                    pseudo_space = repl_code[0]
+                    repl_code = repl_code[2:]
+                for tok in repl_code.split():
+                    assert '=' in tok[1:], tok
+                    left_a = tok[0]  # just in case we want to replace a "=" …
+                    left_b, right = tok[1:].split('=', maxsplit=1)
+                    left = (left_a + left_b).replace(pseudo_space, ' ')
+                    right = right.replace(pseudo_space, ' ')
+                    candidates[:] = [[c[0], c[1].replace(left, right)]
+                                     for c in candidates]
+
             try:
                 if len(insert_args) == 1\
                         and insert_args[0].startswith(_TOK_FILE):
@@ -269,22 +287,18 @@ class _Playbook:
                         [_SEP_2.join((idx_str, _TOK_IDX_REPEAT, sub_idx_str)),
                          line]
                         for sub_idx_str, line in fragments[insert_args[0]]]
-                if len(insert_args) >= 2:
-                    crop_to_range(insert_args[1])
-                if len(insert_args) == 4:
-                    remainder = insert_args[-1][:]
-                    repl_args = []
-                    while not remainder.startswith(':'):
-                        repl_arg, remainder = remainder.split(maxsplit=1)
-                        repl_args += [repl_arg]
-                    repl_args += [remainder[1:]]
-                    assert len(repl_args) >= 2, (idx_str, insert_args)
-                    for arg in repl_args[:-2]:
-                        assert '=' in arg
-                        replace_pattern(*arg.split('=', maxsplit=1))
-                    replace_pattern(*repl_args[-2:])
-                if len(insert_args) >= 3 and insert_args[2] != '+':
-                    bump_int_fields(int(insert_args[2]))
+                if len(insert_args) == 2:
+                    kwargs_str, repl_code = (
+                            insert_args[1][:-1].split('[', maxsplit=1)
+                            if insert_args[1].endswith(']')
+                            else (insert_args[1], ''))
+                    for kwarg in kwargs_str.split():
+                        if kwarg.startswith(_KW_RANGE):
+                            crop_to_range(kwarg[len(_KW_RANGE):])
+                        elif kwarg.startswith(_KW_BUMP):
+                            bump_int_fields(int(kwarg[len(_KW_BUMP):]))
+                    if repl_code:
+                        replace_patterns(repl_code)
             except (AssertionError, ValueError):
                 assert False, (idx_str, insert_args)
             return [(c[0], c[1]) for c in candidates]
@@ -511,7 +525,7 @@ class TestingClientTui(ClientTui):
             **kwargs
             ) -> None:
         def test_after(cmd_name: str, args: tuple[str, ...], ret) -> None:
-            assert cmd_name == _MARK_LOG, f'WANTED {_MARK_LOG} [{ret}]'
+            assert cmd_name == _MARK_LOG, (cmd_name, ret, args)
             win_ids, logged = ret
             fmt, time_str, msg_sans_time = logged.split(' ', maxsplit=2)
             msg_sans_time = fmt + ' ' + msg_sans_time
index 7801288c68b7bf6574d9706f18116dcbd6640125..35184f193299c4f73e7ad792393e2d5caa2a37ae 100644 (file)
@@ -13,29 +13,29 @@ insert ./lib/trigger-ping
 
 × fake-testing-timeout
 log 1 $ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
-insert retry-in : + ? :§§
+insert retry-in
 
 × attempting-to-connected-plus-timeout
-insert attempting-to-connected : + 6697=10000 WIN_IDS :2
-insert trigger-ping : + LOG_ID=1 SERVER_ID :0
+insert attempting-to-connected [6697=10000]
+insert trigger-ping
 insert no-timely-pong
 
 × timeout-w-exponential-wait
-insert attempting : + 6697 :OLD_PORT
-log 1 $ port set to: [NEW_PORT]
-insert fake-testing-timeout : + §§ :SECONDS
+insert attempting [6697=(OLD_PORT)]
+log 1 $ port set to: [(NEW_PORT)]
+insert fake-testing-timeout
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 # 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
-insert connect : + 6697 :10003
+insert connect [6697=10003]
 
 # check increase of retry waits
-insert timeout-w-exponential-wait : + OLD_PORT=10003 NEW_PORT=10002 SECONDS :1
-insert timeout-w-exponential-wait : + OLD_PORT=10002 NEW_PORT=10001 SECONDS :2
-insert timeout-w-exponential-wait : + OLD_PORT=10001 NEW_PORT=10000 SECONDS :4
+insert timeout-w-exponential-wait [(OLD_PORT)=10003 (NEW_PORT)=10002 (SECONDS)=1]
+insert timeout-w-exponential-wait [(OLD_PORT)=10002 (NEW_PORT)=10001 (SECONDS)=2]
+insert timeout-w-exponential-wait [(OLD_PORT)=10001 (NEW_PORT)=10000 (SECONDS)=4]
 
 # check connecting works with TestingClient port finally reduced to 10000,
 # and retry chain also started by in-connection timeout
@@ -51,11 +51,11 @@ wait 2
 > /reconnect
 insert attempting-to-connected-plus-timeout
 > /reconnect
-insert attempting-to-connected : + 6697=10000 WIN_IDS :2
+insert attempting-to-connected [6697=10000]
 wait 2
 
 # same way ensure retry chain wasn't solely blocked by being connected
 insert 001-to-usermode
-insert cmd-disconnect :-1
-insert disconnect1 1: + WIN_IDS :2
+insert cmd-disconnect range=:-1
+insert disconnect1 range=1:
 wait 2
index 509fb6507e87dbdccb196ef03582bb3ebfd15785..b61da75346069982a1605ee3cbf9fab6c1eb7723 100644 (file)
@@ -8,7 +8,7 @@ insert ./lib/cmd-disconnect
 insert ./lib/disconnect
 # for: disconnect1
 insert ./lib/req-sasl
-# for: get-sasl-plain, req-sasl
+# for: caps-init-reply-then-set-nick-then-list, get-sasl-plain, req-sasl
 insert ./lib/servermsglogged
 insert ./lib/usermode
 insert ./lib/user-set-to
@@ -18,9 +18,9 @@ insert usermode
 insert cmd-disconnect
 
 × disconnect-to-reconnect-1
-insert disconnect1 1: + WIN_IDS :2
+insert disconnect1 range=1:
 > /reconnect
-insert attempting-to-connected : + WIN_IDS :2
+insert attempting-to-connected
 
 × disconnect-to-reconnect
 insert disconnect-to-reconnect-0
@@ -35,13 +35,13 @@ insert caps-neg-empty
 
 > /window 2
 insert 001-setting-nick
-insert disconnect-to-reconnect-0 :-1
+insert disconnect-to-reconnect-0 range=:-1
 insert disconnect-to-reconnect-1
 
 # check full, alphabetical processing of multi-line responses
-insert cap-msg : + CAPMSG :* LS * :foo bar baz
-insert cap-msg : + CAPMSG :* LS * :oof rab zab
-insert cap-msg : + CAPMSG :* LS :ofo rba zba
+insert cap-msg [% (CAP_MSG)=*%LS%*%:foo%bar%baz]
+insert cap-msg [% (CAP_MSG)=*%LS%*%:oof%rab%zab]
+insert cap-msg [% (CAP_MSG)=*%LS%:ofo%rba%zba]
 log 1 $ caps:bar:data set to: []
 log 1 $ caps:baz:data set to: []
 log 1 $ caps:foo:data set to: []
@@ -52,9 +52,7 @@ log 1 $ caps:rba:data set to: []
 log 1 $ caps:zab:data set to: []
 log 1 $ caps:zba:data set to: []
 log 1 > CAP :LIST
-insert cap-msg : + CAPMSG :foo LIST * :foo rab oof
-insert user-set-to :1 + USER_ID=me USERNICK :foo
-insert cap-msg : + CAPMSG :foo LIST :zab rba
+insert caps-init-reply-then-set-nick-then-list [% (INIT_REPLY)=LIST%*%:foo%rab%oof (CAP_LIST)=zab%rba]
 log 1 $ caps:foo:enabled set to: [True]
 log 1 $ caps:oof:enabled set to: [True]
 log 1 $ caps:rab:enabled set to: [True]
@@ -65,11 +63,11 @@ log 1 > CAP :END
 insert disconnect-to-reconnect
 
 # check REQ for "sasl" (even if no PLAIN), denied
-insert servermsglogged : + MSG ::*.?.net CAP * LS :foo bar sasl
+insert servermsglogged [% (MSG)=:*.?.net%CAP%*%LS%:foo%bar%sasl]
 log 1 $ caps:bar:data set to: []
 log 1 $ caps:foo:data set to: []
 log 1 $ caps:sasl:data set to: []
-insert req-sasl : + REPLY=NAK CAPLIST :
+insert req-sasl [(REPLY)=NAK (CAP_LIST)=]
 log 1 > CAP :END
 
 insert disconnect-to-reconnect
@@ -79,9 +77,9 @@ insert get-sasl-plain
 log 1 > CAP :END
 
 # check NEW, DEL working after CAP :END
-insert cap-msg : + CAPMSG :foo NEW :foo bar=baz
+insert cap-msg [% (CAP_MSG)=foo%NEW%:foo%bar=baz]
 log 1 $ caps:bar:data set to: [baz]
 log 1 $ caps:foo:data set to: []
-insert cap-msg : + CAPMSG :foo DEL :sasl foo
+insert cap-msg [% (CAP_MSG)=foo%DEL%:sasl%foo]
 log 1 $ caps:foo deleted
 log 1 $ caps:sasl deleted
index 0ff910babc3fc5e44c13cd0c8ecc25bca44fc02d..ad79f872e7b8ef05cbe67c183f3fc0ab8aa5b256 100644 (file)
@@ -10,10 +10,10 @@ insert ./lib/connect-to-connected
 insert ./lib/disconnect
 # for: disconnect0, disconnect1
 insert ./lib/join-empty
-# for: join-channel-0, join-channel-1, join-empty
+# for: join-channel-0-cmd-to-list-residents, join-channel-0-0-cmd-to-ack, join-channel-0-1-list-residents join-channel-1-end-of-names, join-empty
 insert ./lib/no-handler
 insert ./lib/part
-# for: exit-channel, part, parts-core, quit
+# for: part, part-core, parts-no-msg-me, quit
 insert ./lib/privmsg
 insert ./lib/retry-in
 insert ./lib/servermsglogged
@@ -21,36 +21,36 @@ insert ./lib/user-set-to
 insert ./lib/usermode
 
 × part-empty
-insert part-no-msg-me : + USERIDS_CLEAR :emptied
+insert part-no-msg-me [(USERIDS_CLEAR)=emptied]
 
 × privmsg-win
-insert privmsg : + TARGET_WIN_ID=NUMBER TARGET :#ch_winNUMBER
+insert privmsg [(TARGET_WIN_ID)=(WIN_ID) (TARGET)=#ch_win(WIN_ID)]
 
 × topic-set-to
-log 1 $ channels:CHANNEL:topic set to: [Topic(what='NEWTOPIC', who=NickUserHost(nick='baz', user='~bazbaz', host='baz.baz'))]
-log 4 $ baz!~bazbaz@baz.baz set topic: NEWTOPIC
+log 1 $ channels:#ch_win(WIN_ID):topic set to: [Topic(what='(TOPIC)', who=NickUserHost(nick='baz', user='~bazbaz', host='baz.baz'))]
+log 4 $ baz!~bazbaz@baz.baz set topic: (TOPIC)
 
 × reconnect
 > /reconnect
-insert attempting-to-connected : + WIN_IDS :2,3,4
+insert attempting-to-connected [% log%2%$%CONNECTED=log%2,3,4%$%CONNECTED]
 insert caps-neg-empty
 insert 001-setting-nick
 log 1 > JOIN :#ch_win3
 insert usermode
-insert servermsglogged : + MSG ::foo!~foofoo@foo.foo JOIN #ch_win3
-insert join-empty 2: + NUMBER :3
+insert servermsglogged [% (MSG)=:foo!~foofoo@foo.foo%JOIN%#ch_win3]
+insert join-empty range=2: [(WIN_ID)=3]
 
 × join-already-in
-> /join TARGET
-log LOG_WIN_ID $ already in that channel
+> /join (TARGET)
+log (WIN_ID) $ already in that channel
 
 × part-no-msg-other
-insert part-no-msg 2:-1 + NUMBER=3 USERIDS_CLEAR :set to: REMAINING_IDS
+insert part-no-msg range=2:-1 [% (WIN_ID)=3 (USERIDS_CLEAR)=set%to:%(REMAINING_IDS)]
 
 × set-prefix
-insert servermsglogged : + MSG ::foo.bar.baz MODE #ch_win3 MODESET NICK
-log 1 $ channels:#ch_win3:prefixes:PREFIX NEW_IDS
-log 3 $ NICK VERB PREFIX
+insert servermsglogged [% (MSG)=:foo.bar.baz%MODE%#ch_win3%(MODESET)%(NICK)]
+log 1 $ channels:#ch_win3:prefixes:(PREFIX) (NEW_IDS)
+log 3 $ (NICK) (VERB) (PREFIX)
 
 × ×--------------------------
 
@@ -64,173 +64,170 @@ insert 001-to-usermode
 log 2 $ not sending, since not in channel
 
 # check join with minimum context (no topic, no other users etc.)
-insert join-empty : + NUMBER :3
+insert join-empty [(WIN_ID)=3]
 
 # check privmsg into channel from other window only works by direct addressing
 > msg_test1
 log 2 # invalid prompt command: not prefixed by /
-insert privmsg-win : + NUMBER=3 TXT :msg_test1
+insert privmsg-win [(WIN_ID)=3 (TXT)=msg_test1]
 
 # check from within channel window privmsg works directly and indirectly
 > /window 3
-insert privmsg-win : + NUMBER=3 TXT :msg_test2
+insert privmsg-win [(WIN_ID)=3 (TXT)=msg_test2]
 > msg_test3
-insert privmsg-win 1: + NUMBER=3 TXT :msg_test3
+insert privmsg-win range=1: [(WIN_ID)=3 (TXT)=msg_test3]
 
 # check /part and that it only works from within channel window, and if already in channel
 > /window 2
 > /part
 log 2 # invalid prompt command: /part unknown
 > /window 3
-insert part-empty : + NUMBER :3
+insert part-empty [(WIN_ID)=3]
 > /part
 log 3 $ not in that channel
 
 # check /join without argument joins channel previously joined in same window
 > /join
-insert join-empty 1: + NUMBER :3
+insert join-empty range=1: [(WIN_ID)=3]
 
 # check cannot /join channel already joined, neither from its window nor from elsewhere
-insert join-already-in : + LOG_WIN_ID=3 TARGET :
-insert join-already-in : + LOG_WIN_ID=3 TARGET :#ch_win3
+insert join-already-in [(WIN_ID)=3 (TARGET)=]
+insert join-already-in [(WIN_ID)=3 (TARGET)=#ch_win3]
 > /window 2
-insert join-already-in : + LOG_WIN_ID=2 TARGET :#ch_win3
+insert join-already-in [(WIN_ID)=2 (TARGET)=#ch_win3]
 
 # check join to different channel name initiates new window, even if there's already a window for a channel that's been /parted
 > /window 3
-insert part-empty : + NUMBER :3
-insert join-empty : + NUMBER :4
+insert part-empty [(WIN_ID)=3]
+insert join-empty [(WIN_ID)=4]
 
 # check 353 also understood if using @ rather than =
-insert join-empty : + NUMBER=3 = :@
-insert part-empty : + NUMBER :3
+insert join-empty [(WIN_ID)=3 ==@]
+insert part-empty [(WIN_ID)=3]
 
 # check /join to, and part from, channel with one other user
-insert join-channel-0 : + CHANNEL=#ch_win3 RESIDENT_NAMES :foo bar
-insert user-set-to :1 + USER_ID=1 USERNICK :bar
-insert join-channel-1 : + CHANNEL=#ch_win3 RESIDENT_IDS :[1], [me]
-log 3 $ residents: bar, foo
-insert part-no-msg-me : + NUMBER=3 USERIDS_CLEAR :set to: [1]
+insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=3 (RESIDENT_NAMES)=foo%bar]
+insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=bar]
+insert join-channel-1-end-of-names [% (WIN_ID)=3 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=bar,%foo]
+insert part-no-msg-me [% (WIN_ID)=3 (USERIDS_CLEAR)=set%to:%[1]]
 log 1 $ users:1 deleted
 
 # check /join into channel with many other users, with multi-line 353, and membership prefixes
-insert join-channel-0 : + CHANNEL=#ch_win3 RESIDENT_NAMES :foo @baz +oof
-insert user-set-to :1 + USER_ID=2 USERNICK :baz
+insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=3 (RESIDENT_NAMES)=foo%@baz%+oof]
+insert user-set-to range=:1 [(USER_ID)=2 (USER_NICK)=baz]
 log 1 $ channels:#ch_win3:prefixes:@ set to: [2]
-insert user-set-to :1 + USER_ID=3 USERNICK :oof
+insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)=oof]
 log 1 $ channels:#ch_win3:prefixes:+ set to: [3]
-insert servermsglogged : + MSG ::foo.bar.baz 353 foo = #ch_win3 :+rab zab
-insert user-set-to :1 + USER_ID=4 USERNICK :rab
+insert servermsglogged [% (MSG)=:foo.bar.baz%353%foo%=%#ch_win3%:+rab%zab]
+insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=rab]
 log 1 $ channels:#ch_win3:prefixes:+ set to: [3], [4]
-insert user-set-to :1 + USER_ID=5 USERNICK :zab
-insert join-channel-1 : + CHANNEL=#ch_win3 RESIDENT_IDS :[2], [3], [4], [5], [me]
-log 3 $ residents: @baz, +oof, +rab, zab, foo
+insert user-set-to range=:1 [(USER_ID)=5 (USER_NICK)=zab]
+insert join-channel-1-end-of-names [% (WIN_ID)=3 (RESIDENT_IDS)=[2],%[3],%[4],%[5],%[me] (RESIDENT_NICKS)=@baz,%+oof,%+rab,%zab,%foo]
 
 # check server giving and taking membership prefixes
-insert set-prefix : + MODESET=-o PREFIX=@ VERB=loses NICK=baz NEW_IDS :emptied
-insert set-prefix : + MODESET=-v PREFIX=+ VERB=loses NICK=rab NEW_IDS :set to: [3]
-insert set-prefix : + MODESET=-v PREFIX=+ VERB=loses NICK=oof NEW_IDS :emptied
-insert set-prefix : + MODESET=+v PREFIX=+ VERB=gains NICK=oof NEW_IDS :set to: [3]
-insert set-prefix : + MODESET=+o PREFIX=@ VERB=gains NICK=zab NEW_IDS :set to: [5]
-insert set-prefix : + MODESET=+o PREFIX=@ VERB=gains NICK=baz NEW_IDS :set to: [2], [5]
-insert set-prefix : + MODESET=+o PREFIX=@ VERB=gains NICK=foo NEW_IDS :set to: [2], [5], [me]
+insert set-prefix [(MODESET)=-o (PREFIX)=@ (VERB)=loses (NICK)=baz (NEW_IDS)=emptied]
+insert set-prefix [% (MODESET)=-v (PREFIX)=+ (VERB)=loses (NICK)=rab (NEW_IDS)=set%to:%[3]]
+insert set-prefix [(MODESET)=-v (PREFIX)=+ (VERB)=loses (NICK)=oof (NEW_IDS)=emptied]
+insert set-prefix [% (MODESET)=+v (PREFIX)=+ (VERB)=gains (NICK)=oof (NEW_IDS)=set%to:%[3]]
+insert set-prefix [% (MODESET)=+o (PREFIX)=@ (VERB)=gains (NICK)=zab (NEW_IDS)=set%to:%[5]]
+insert set-prefix [% (MODESET)=+o (PREFIX)=@ (VERB)=gains (NICK)=baz (NEW_IDS)=set%to:%[2],%[5]]
+insert set-prefix [% (MODESET)=+o (PREFIX)=@ (VERB)=gains (NICK)=foo (NEW_IDS)=set%to:%[2],%[5],%[me]]
 
 # check server setting unknown modes towards users
-insert servermsglogged : + MSG ::foo.bar.baz MODE #ch_win3 +a zab
-insert no-handler -2: + ALERT_WIN_IDS=2,3,4 ? :for nickname setting channel mode: +a
-insert servermsglogged : + MSG ::foo.bar.baz MODE #ch_win3 -b rab
-insert no-handler -2: + ALERT_WIN_IDS=2,3,4 ? :for nickname setting channel mode: -b
+insert servermsglogged [% (MSG)=:foo.bar.baz_MODE%#ch_win3%+a%zab]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=:foo.bar.baz_MODE%#ch_win3%+a%zab]
+insert servermsglogged [% (MSG)=:foo.bar.baz%MODE%#ch_win3%-b%rab]
+insert no-handler range=-2: [% (ALERT_WIN_IDS)=2,3,4 (MSG)=for%nickname%setting%channel%mode:%-b]
 
 # check /join into channel with topic set
 > /window 4
-insert part-empty : + NUMBER :4
-insert join-channel-0-0 : + CHANNEL :#ch_win4
-insert servermsglogged : + MSG ::foo.bar.baz 332 foo #ch_win4 :foo bar baz
-insert servermsglogged : + MSG ::foo.bar.baz 333 foo #ch_win4 baz!~bazbaz@OLD.baz.baz 1234567890
-insert topic-set-to : + baz.baz=OLD.baz.baz CHANNEL=#ch_win4 NEWTOPIC :foo bar baz
-insert join-channel-0-1 : + CHANNEL=#ch_win4 RESIDENT_NAMES :foo baz
-insert join-channel-1 : + CHANNEL=#ch_win4 RESIDENT_IDS :[2], [me]
-log 4 $ residents: baz, foo
+insert part-empty [(WIN_ID)=4]
+insert join-channel-0-0-cmd-to-ack [(WIN_ID)=4]
+insert servermsglogged [% (MSG)=:foo.bar.baz%332%foo%#ch_win4%:foo%bar%baz]
+insert servermsglogged [% (MSG)=:foo.bar.baz%333%foo%#ch_win4%baz!~bazbaz@OLD.baz.baz%1234567890]
+insert topic-set-to [% baz.baz=OLD.baz.baz (WIN_ID)=4 (TOPIC)=foo%bar%baz]
+insert join-channel-0-1-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%baz]
+insert join-channel-1-end-of-names [% (WIN_ID)=4 (RESIDENT_IDS)=[2],%[me] (RESIDENT_NICKS)=baz,%foo]
 
 # check _observed_ topic change _does_ affect users database, and …
-insert servermsglogged : + MSG ::baz!~bazbaz@baz.baz TOPIC #ch_win4 :foo bar baz
-insert user-set-to 1: + USER_ID=2 USERNAME=~bazbaz USERHOST :baz.baz
+insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%TOPIC%#ch_win4%:foo%bar%baz]
+insert user-set-to range=1: [(USER_ID)=2 (USER_USER)=~bazbaz (USER_HOST)=baz.baz]
 
 # … is echoed into channel window _if_ either content or setter change
-insert topic-set-to : + CHANNEL=#ch_win4 NEWTOPIC :foo bar baz
-insert servermsglogged : + MSG ::baz!~bazbaz@baz.baz TOPIC #ch_win4 :foo bar baz
-insert servermsglogged : + MSG ::baz!~bazbaz@baz.baz TOPIC #ch_win4 :foo foo baz
-insert topic-set-to : + CHANNEL=#ch_win4 NEWTOPIC :foo foo baz
+insert topic-set-to [% (WIN_ID)=4 (TOPIC)=foo%bar%baz]
+insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%TOPIC%#ch_win4%:foo%bar%baz]
+insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%TOPIC%#ch_win4%:foo%foo%baz]
+insert topic-set-to [% (WIN_ID)=4 (TOPIC)=foo%foo%baz]
 
 # check effects of other users' messages (PRIVMSG and NOTICE)
-insert servermsglogged : + MSG ::baz!~bazbaz@baz.baz PRIVMSG #ch_win3 :msg_test3 msg_test4
+insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%PRIVMSG%#ch_win3%:msg_test3%msg_test4]
 log 3 < [@baz] msg_test3 msg_test4
-insert servermsglogged : + MSG ::oof!~oofoof@oof.oof NOTICE #ch_win3 :msg_test5 msg_test6
-insert user-set-to 1: + USER_ID=3 USERNAME=~oofoof USERHOST :oof.oof
+insert servermsglogged [% (MSG)=:oof!~oofoof@oof.oof%NOTICE%#ch_win3%:msg_test5%msg_test6]
+insert user-set-to range=1: [(USER_ID)=3 (USER_USER)=~oofoof (USER_HOST)=oof.oof]
 log 3 < (+oof) msg_test5 msg_test6
 
 # check effect own PRIVMSG into channel, now that we got @
-insert privmsg-win : + NUMBER=3 foo=@foo TXT :msg_test7
+insert privmsg-win [(WIN_ID)=3 foo=@foo (TXT)=msg_test7]
 
 # check effect of server NOTICE to channel
-insert servermsglogged : + MSG ::*.?.net NOTICE #ch_win3 :msg_test8 msg_test9
+insert servermsglogged [% (MSG)=:*.?.net%NOTICE%#ch_win3%:msg_test8%msg_test9]
 log 3 < (*.?.net) msg_test8 msg_test9
 
 # check part of user visible, and of user NOT visible in other channel
-insert part-no-msg-other : + USER_ID=2 NICK=baz REMAINING_IDS :[3], [4], [5], [me]
+insert part-no-msg-other [% (USER_ID)=2 (NICK)=baz (REMAINING_IDS)=[3],%[4],%[5],%[me]]
 log 1 $ channels:#ch_win3:prefixes:@ set to: [5], [me]
-insert part-no-msg-other : + USER_ID=3 NICK=oof REMAINING_IDS :[4], [5], [me]
+insert part-no-msg-other [% (USER_ID)=3 (NICK)=oof (REMAINING_IDS)=[4],%[5],%[me]]
 log 1 $ channels:#ch_win3:prefixes:+ emptied
 log 1 $ users:3 deleted
 
 # check other-user part with exit message
-insert part 2:4 + NICK=zab ARGS :#ch_win3 :goodbye
-insert user-set-to 1: + USER_ID=5 USERNAME=~zabzab USERHOST :zab.zab
-insert parts-core : + USER_ID=5 NICK=zab NUMBER=3 USERIDS_CLEAR=set§to:§[4],§[me] exitMSG=goodbye exitPREFIX=:§ § : 
+insert part range=2:4 [% (NICK)=zab (ARGS)=#ch_win3%:goodbye]
+insert user-set-to range=1: [(USER_ID)=5 (USER_USER)=~zabzab (USER_HOST)=zab.zab]
+insert part-core [% (USER_ID)=5 (NICK)=zab (WIN_ID)=3 (USERIDS_CLEAR)=set%to:%[4],%[me] (EXIT_MSG)=goodbye]
 log 1 $ channels:#ch_win3:prefixes:@ set to: [me]
 log 1 $ users:5 deleted
 
 # check re-join of user kept visible in other channel
-insert servermsglogged : + MSG ::baz!~bazbaz@baz.baz JOIN :#ch_win3
+insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%JOIN%:#ch_win3]
 log 1 $ channels:#ch_win3:user_ids set to: [2], [4], [me]
 log 3 $ baz!~bazbaz@baz.baz joins
 
 # check re-join of user NOT kept visible in other channel
-insert servermsglogged : + MSG ::oof!~oofoof@oof.oof JOIN :#ch_win3
-insert user-set-to : + USER_ID=6 USERNICK=oof USERNAME=~oofoof USERHOST :oof.oof
+insert servermsglogged [% (MSG)=:oof!~oofoof@oof.oof%JOIN%:#ch_win3]
+insert user-set-to [(USER_ID)=6 (USER_NICK)=oof (USER_USER)=~oofoof (USER_HOST)=oof.oof]
 log 1 $ channels:#ch_win3:user_ids set to: [2], [4], [6], [me]
 log 3 $ oof!~oofoof@oof.oof joins
 
 # check renaming of user communicated into all windows of channels they're in – be it others, or oneself
-insert rename : + USER_ID=2 NUH=baz!~bazbaz@baz.baz NEWNICK :bazbaz
-insert rename : + USER_ID=2 NUH=bazbaz!~bazbaz@baz.baz NEWNICK :baz
-insert cmd-nick : + NUH=foo!~foofoo@foo.foo USER_ID=me NEWNICK :myself
+insert rename [(USER_ID)=2 (NUH)=baz!~bazbaz@baz.baz (NICK)=bazbaz]
+insert rename [(USER_ID)=2 (NUH)=bazbaz!~bazbaz@baz.baz (NICK)=baz]
+insert cmd-nick [(NUH)=foo!~foofoo@foo.foo (USER_ID)=me (NICK)=myself]
 
 # reverting to foo to easen fragment re-use later on
-insert cmd-nick : + NUH=myself!~foofoo@foo.foo USER_ID=me NEWNICK :foo
+insert cmd-nick [(NUH)=myself!~foofoo@foo.foo (USER_ID)=me (NICK)=foo]
 
 # check QUIT affecting user in all their channels, removing them from DB
-insert servermsglogged : + MSG ::baz!~bazbaz@baz.baz QUIT :Client Quit
+insert servermsglogged [% (MSG)=:baz!~bazbaz@baz.baz%QUIT%:Client%Quit]
 log 1 $ users:2:exit_msg set to: [QClient Quit]
 log , $ baz!~bazbaz@baz.baz quits: Client Quit
-insert quit : + USER_ID=2 NICK=baz NUMBER=3 REMAINING_IDS :[4], [6], [me]
-insert quit : + USER_ID=2 NICK=baz NUMBER=4 REMAINING_IDS :[me]
+insert quits [% (USER_ID)=2 (NICK)=baz (WIN_ID)=3 (USERIDS_CLEAR)=set%to:%[4],%[6],%[me]]
+insert quits [% (USER_ID)=2 (NICK)=baz (WIN_ID)=4 (USERIDS_CLEAR)=set%to:%[me]]
 log 1 $ users:2 deleted
 
 # check effects of own QUIT while present in one channel
-insert part-empty : + NUMBER :4
+insert part-empty [(WIN_ID)=4]
 insert cmd-disconnect-0
-insert quit : + USER_ID=me NICK=foo NUMBER=3 REMAINING_IDS :[4], [6]
+insert quits [% (USER_ID)=me (NICK)=foo (WIN_ID)=3 (USERIDS_CLEAR)=set%to:%[4],%[6]]
 log 1 $ channels:#ch_win3:prefixes:@ emptied
-insert cmd-disconnect-1 :-1
-insert disconnect1 : + WIN_IDS :2,3,4
+insert cmd-disconnect-1 range=:-1
+insert disconnect1 [% log%2%=log%2,3,4%]
 
 # check /reconnect calling auto-rejoin on the one channel inhabited on previous leaving
 insert reconnect
 
 # check same mechanism holding on externally triggered disconnect
 servermsg 0 FAKE_IRC_CONN_ABORT_EXCEPTION
-insert disconnect0 :-1 + EXIT_MSG :broken: FAKE_IRC_CONN_ABORT_EXCEPTION
-insert disconnect1 : + WIN_IDS :2,3,4
-insert retry-in : + ? :1
+insert disconnect0 range=:-1 [% (EXIT_MSG)=broken:%FAKE_IRC_CONN_ABORT_EXCEPTION]
+insert disconnect1 [% log%2%=log%2,3,4%]
+insert retry-in [(SECONDS)=1]
 insert reconnect
index 0f4119cd015669672bebb147248082deddefd99d..53d5d09abc0b04bbdbab14a0e6cdfb423a3252ba 100644 (file)
@@ -2,7 +2,6 @@ insert ./lib/connect-w-password
 # for: connect-to-connected-w-password
 
 × ×---------------------------------------------------
-
 log 0 # Found config at tests/config.toml, reading …
 log 0 # Connecting: {'hostname': 'foo.bar.baz', 'nickname': 'foo', 'password': 'supersecret', 'username': 'foofoo', 'realname': 'foo foo', 'port': 1234, 'channels': ['#test', '##testtest']}
-insert connect-to-connected-w-password 1: + 6697=1234 SECRET=supersecret WIN_IDS :2
+insert connect-to-connected-w-password range=1: [6697=1234 SECRET=supersecret]
index c11de616dade7b8d8e5bcb6dcb022641eb9733d1..50d981b2161bf48fd713574e44672d13ccb8da0a 100644 (file)
@@ -21,8 +21,8 @@ insert 001-to-usermode
 log 1 $ not re-connecting since already connected
 
 # handle /disconnect on being connected
-insert cmd-disconnect :-1
-insert disconnect1 1: + WIN_IDS :2
+insert cmd-disconnect range=:-1
+insert disconnect1 range=1:
 
 # fail to disconnect when already disconnected
 > /disconnect
@@ -30,9 +30,9 @@ log 1 $ already disconnected and not attempting connect
 
 # succeed to re-connect after disconnect
 > /reconnect
-insert attempting-to-connected : + WIN_IDS :2
+insert attempting-to-connected
 
 # allow /disconnect outside connection for auto-connect stops
-insert error-to-disconnected : + §§§ :Closing link: (Connection timed out)
-insert retry-in : + ? :1
+insert error-to-disconnected [% (EXIT_MSG)=Closing%link:%(Connection%timed%out)]
+insert retry-in [(SECONDS)=1]
 insert disconnect-to-stop-auto-reconnect
index 747640e66bb80c8d3cdac44eae6f98e91d507242..298cf1fb4a70e0f6003dc23ef755b185b0b8b3e6 100644 (file)
@@ -8,8 +8,12 @@ insert ./lib/retry-in
 
 × reconnect-error-logged
 > /reconnect
-insert attempting-to-connected : + WIN_IDS :2
-insert error-to-disconnected : + §§§ :XXX
+insert attempting-to-connected
+insert error-to-disconnected [% (EXIT_MSG)=Closing%link:%((CAUSE))]
+
+× reconnect-error-logged-retry
+insert reconnect-error-logged
+insert retry-in [(SECONDS)=1]
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
@@ -17,14 +21,11 @@ insert error-to-disconnected : + §§§ :XXX
 insert connect-to-connected
 
 # test default ERROR handling
-insert error-to-disconnected : + §§§ :abc def ghi
+insert error-to-disconnected [% (EXIT_MSG)=abc%def%ghi]
 
 # test ERROR regex (non-)matches
 > /window 1
-insert reconnect-error-logged : + XXX :Closing link: (this should not match)
-insert reconnect-error-logged : + XXX :Closing link: (Connection timed out)
-insert retry-in : + ? :1
-insert reconnect-error-logged : + XXX :closing Link: (connection timed out)
-insert retry-in : + ? :1
-insert reconnect-error-logged : + XXX :Closing link: (Ping timeout: 240 seconds)
-insert retry-in : + ? :1
+insert reconnect-error-logged [% (CAUSE)=this%should%not%match]
+insert reconnect-error-logged-retry [% (CAUSE)=Connection%timed%out]
+insert reconnect-error-logged-retry [% Closing%link=closing%Link (CAUSE)=connection%timed%out]
+insert reconnect-error-logged-retry [% (CAUSE)=Ping%timeout:%240%seconds]
index 468d086084523afec779e2b42701cdffad68abbe..c962cc231e10ebe0987b96e8579efcc64aa5830d 100644 (file)
@@ -7,28 +7,28 @@ insert ./lib/connect-to-connected
 insert ./lib/disconnect
 insert ./lib/isupport-clear
 insert ./lib/join-empty
-# for: join-channel-0, join-channel-1, join-empty
+# for: join-channel-0-cmd-to-list-residents, join-channel-1, join-empty
 insert ./lib/no-handler
 insert ./lib/servermsglogged
 insert ./lib/user-set-to
 
 × un-default
-insert servermsglogged : + MSG ::foo.bar.baz 005 foo KEY=VALUE :
-log 1 $ isupport:KEY set to: [VALUE]
+insert servermsglogged [% (MSG)=:foo.bar.baz%005%foo%(KEY)=(VALUE)%:]
+log 1 $ isupport:(KEY) set to: [(VALUE)]
 
 × un-defaults
-insert un-default : + KEY=CHANTYPES VALUE :123=456
-insert un-default : + KEY=PREFIX VALUE :(ovE)@+=
-insert un-default : + KEY=USERLEN VALUE :8
+insert un-default [(KEY)=CHANTYPES (VALUE)=123=456]
+insert un-default [(KEY)=PREFIX (VALUE)=(ovE)@+=]
+insert un-default [(KEY)=USERLEN (VALUE)=8]
 
 × join-and-hi
-insert servermsglogged : + MSG ::NICKNAME!TO_CUTq@NICKNAME.NICKNAME JOIN :#ch_win9
-insert user-set-to : + USERHOST=NICKNAME.NICKNAME USERNAME=TO_CUTq USERNICK :NICKNAME
-log 1 $ channels:#ch_win9:user_ids set to: RESIDENT_IDS, [me]
-log 9 $ NICKNAME!TO_CUTq@NICKNAME.NICKNAME joins
-insert servermsglogged : + MSG ::NICKNAME!~TO_CUT@NICKNAME.NICKNAME PRIVMSG #ch_win9 :hi
-log 1 $ users:USER_ID:user set to: [~TO_CUT]
-log 9 < [NICKNAME] hi
+insert servermsglogged [% (MSG)=:(NICK)!(TO_CUT)q@(NICK).(NICK)%JOIN%:#ch_win9]
+insert user-set-to [(USER_HOST)=(NICK).(NICK) (USER_USER)=(TO_CUT)q (USER_NICK)=(NICK)]
+log 1 $ channels:#ch_win9:user_ids set to: (RESIDENT_IDS), [me]
+log 9 $ (NICK)!(TO_CUT)q@(NICK).(NICK) joins
+insert servermsglogged [% (MSG)=:(NICK)!~(TO_CUT)@(NICK).(NICK)%PRIVMSG%#ch_win9%:hi]
+log 1 $ users:(USER_ID):user set to: [~(TO_CUT)]
+log 9 < [(NICK)] hi
 
 × ×-----------------------
 
@@ -41,66 +41,64 @@ insert caps-neg-empty
 insert 001-to-usermode
 
 # check setting of ISUPPORTs both with and without parameters, and last arg ignored
-insert servermsglogged : + MSG ::foo.bar.baz 005 foo ABC=DEF GHI :are supported by this server
+insert servermsglogged [% (MSG)=:foo.bar.baz%005%foo%ABC=DEF%GHI%:are%supported%by%this%server]
 log 1 $ isupport:ABC set to: [DEF]
 log 1 $ isupport:GHI set to: []
 
 # check further 005 not re-setting whole dict, and last arg possibly empty
-insert servermsglogged : + MSG ::foo.bar.baz 005 foo MNO=PQR STU=VWX,YZ :
+insert servermsglogged [% (MSG)=:foo.bar.baz%005%foo%MNO=PQR%STU=VWX,YZ%:]
 log 1 $ isupport:MNO set to: [PQR]
 log 1 $ isupport:STU set to: [VWX,YZ]
 
 # check minus args clearing non-defaulty ISUPPORTs, and intermingling with positive args 
-insert servermsglogged : + MSG ::foo.bar.baz 005 foo -GHI DEF=MNO -STU :ignore me
+insert servermsglogged [% (MSG)=:foo.bar.baz%005%foo%-GHI%DEF=MNO%-STU%:ignore%me]
 log 1 $ isupport:GHI deleted
 log 1 $ isupport:DEF set to: [MNO]
 log 1 $ isupport:STU deleted
 
 # check setting and un-setting of defaulty ISUPPORTs
 insert un-defaults
-insert servermsglogged : + MSG ::foo.bar.baz 005 foo -CHANTYPES -PREFIX -USERLEN :
-insert isupport-clear 1:
+insert servermsglogged [% (MSG)=:foo.bar.baz%005%foo%-CHANTYPES%-PREFIX%-USERLEN%:]
+insert isupport-clear range=1:
 
 # check disconnect on defaulty ISUPPORTs re-instates the respective defaults
 insert un-defaults
 > /window 1
-insert cmd-disconnect :-1
-insert disconnect1 1: + WIN_IDS :2
+insert cmd-disconnect range=:-1
+insert disconnect1 range=1:
 
 > /reconnect
-insert attempting-to-connected : + WIN_IDS :2
+insert attempting-to-connected
 insert caps-neg-empty
 insert 001-to-usermode
 
 # check effect of CHANTYPES
-insert join-empty : + NUMBER :3
-insert join-empty : + NUMBER=4 #ch_win :&ch_win
-insert no-handler : + ALERT_WIN_IDS=2,3,4 ? :foo!~baz@baz.bar.foo JOIN $ch_winA
-insert un-default : + KEY=CHANTYPES VALUE :#$%
-insert join-empty : + NUMBER :5
-insert no-handler : + ALERT_WIN_IDS=2,3,4,5 ? :foo!~baz@baz.bar.foo JOIN &ch_winB
-insert join-empty : + NUMBER=6 #ch_win :$ch_win
+insert join-empty [(WIN_ID)=3]
+insert join-empty [(WIN_ID)=4 #ch_win=&ch_win]
+insert no-handler [% (ALERT_WIN_IDS)=2,3,4 (MSG)=foo!~baz@baz.bar.foo%JOIN%$ch_winA]
+insert un-default [(KEY)=CHANTYPES (VALUE)=#$%]
+insert join-empty [(WIN_ID)=5]
+insert no-handler [% (ALERT_WIN_IDS)=2,3,4,5 (MSG)=foo!~baz@baz.bar.foo%JOIN%&ch_winB]
+insert join-empty [(WIN_ID)=6 #ch_win=$ch_win]
 
 # test effect of PREFIX
-insert join-channel-0 : + CHANNEL=#ch_win7 RESIDENT_NAMES :foo @bar +baz =quux
-insert user-set-to :1 + USER_ID=1 USERNICK :bar
+insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=7 (RESIDENT_NAMES)=foo%@bar%+baz%=quux]
+insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=bar]
 log 1 $ channels:#ch_win7:prefixes:@ set to: [1]
-insert user-set-to :1 + USER_ID=2 USERNICK :baz
+insert user-set-to range=:1 [(USER_ID)=2 (USER_NICK)=baz]
 log 1 $ channels:#ch_win7:prefixes:+ set to: [2]
-insert user-set-to :1 + USER_ID=3 USERNICK :=quux
-insert join-channel-1 : + CHANNEL=#ch_win7 RESIDENT_IDS :[1], [2], [3], [me]
-log 7 $ residents: @bar, +baz, =quux, foo
-insert un-default : + KEY=PREFIX VALUE :(vE)+=
-insert join-channel-0 : +0 CHANNEL=#ch_win8 RESIDENT_NAMES :foo @bar +baz =quux
-insert user-set-to :1 + USER_ID=4 USERNICK :@bar
+insert user-set-to range=:1 [(USER_ID)=3 (USER_NICK)==quux]
+insert join-channel-1-end-of-names [% (WIN_ID)=7 (RESIDENT_IDS)=[1],%[2],%[3],%[me] (RESIDENT_NICKS)=@bar,%+baz,%=quux,%foo]
+insert un-default [(KEY)=PREFIX (VALUE)=(vE)+=]
+insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=8 (RESIDENT_NAMES)=foo%@bar%+baz%=quux]
+insert user-set-to range=:1 [(USER_ID)=4 (USER_NICK)=@bar]
 log 1 $ channels:#ch_win8:prefixes:+ set to: [2]
-insert user-set-to :1 + USER_ID=5 USERNICK :quux
+insert user-set-to range=:1 [(USER_ID)=5 (USER_NICK)=quux]
 log 1 $ channels:#ch_win8:prefixes:= set to: [5]
-insert join-channel-1 : + CHANNEL=#ch_win8 RESIDENT_IDS :[2], [4], [5], [me]
-log 8 $ residents: +baz, @bar, =quux, foo
+insert join-channel-1-end-of-names [% (WIN_ID)=8 (RESIDENT_IDS)=[2],%[4],%[5],%[me] (RESIDENT_NICKS)=+baz,%@bar,%=quux,%foo]
 
 # test effect of USERLEN
-insert join-empty : + NUMBER :9
-insert join-and-hi : + NICKNAME=user0 USER_ID=6 TO_CUT=foobarbaz RESIDENT_IDS :[6]
-insert un-default : + KEY=USERLEN VALUE :8
-insert join-and-hi : + NICKNAME=user1 USER_ID=7 TO_CUT=foobarb RESIDENT_IDS :[6], [7]
+insert join-empty [(WIN_ID)=9]
+insert join-and-hi [(NICK)=user0 (USER_ID)=6 (TO_CUT)=foobarbaz (RESIDENT_IDS)=[6]]
+insert un-default [(KEY)=USERLEN (VALUE)=8]
+insert join-and-hi [% (NICK)=user1 (USER_ID)=7 (TO_CUT)=foobarb (RESIDENT_IDS)=[6],%[7]]
index 15c2879e9339f05448e251589dbeaa0fe6028df8..302682417393d2d888924cf4e3b7a0c5983ab2d6 100644 (file)
@@ -2,5 +2,5 @@ insert ./lib/servermsglogged
 insert ./lib/user-set-to
 
 × 001-setting-nick
-insert servermsglogged : + MSG ::foo.bar.baz 001 foo :Welcome to the foo.bar.baz network
-insert user-set-to :1 + USER_ID=me USERNICK :foo
+insert servermsglogged [_ (MSG)=:foo.bar.baz_001_foo_:Welcome_to_the_foo.bar.baz_network]
+insert user-set-to range=:1 [(USER_ID)=me (USER_NICK)=foo]
index 1b8f719df99cce4ce624d29a8d5b67f6ca112e97..ee3e47ccdb3fe5522996e74486d663e63129fb02 100644 (file)
@@ -5,4 +5,3 @@ log 2 $ - nickname: foo
 log 2 $ - realname: foo foo
 log 2 $ - username: foofoo
 log 2 $ - no password
-
index cf9d3458f8a4912f1d6fd5839563a6dd4846a8a7..a22d1c1e72e7c0004c2b28beac6643d1aafd6058 100644 (file)
@@ -4,4 +4,3 @@ insert ./lib/connected
 × attempting-to-connected
 insert attempting
 insert connected
-
index 36c1f27d7217c66b3bb94e5368637ce155b08382..27f63919b4f56cfa3f4010df8f5813a11db4103a 100644 (file)
@@ -1,4 +1,4 @@
 insert ./lib/servermsglogged
 
 × cap-msg
-insert servermsglogged : +0 MSG ::*.?.net CAP CAPMSG
+insert servermsglogged [% (MSG)=:*.?.net%CAP%(CAP_MSG)]
index c7818c3c605e9fa1af88da72c9503a1b617297a2..45a92149ff4088f5edf40f7ff3e53acaf119b465 100644 (file)
@@ -1,7 +1,7 @@
 insert ./lib/cap-msg
 
 × caps-neg-empty
-insert cap-msg : +0 CAPMSG :* LS :
+insert cap-msg [% (CAP_MSG)=*%LS%:]
 log 1 > CAP :LIST
-insert cap-msg : +0 CAPMSG :* LIST :
+insert cap-msg [% (CAP_MSG)=*%LIST%:]
 log 1 > CAP :END
index 28e39b867075b0d14823b1713eabe42673ee5853..e9a467d9584dfc38711dab472bbbb78e162fa173 100644 (file)
@@ -5,12 +5,12 @@ insert ./lib/error-to-disconnect
 × cmd-disconnect-0
 > /disconnect
 log 1 > QUIT :ircplom says bye
-insert servermsglogged : +0 MSG ::foo!~foofoo@foo.foo QUIT :Client Quit
+insert servermsglogged [% (MSG)=:foo!~foofoo@foo.foo%QUIT%:Client%Quit]
 log 1 $ users:me:exit_msg set to: [QClient Quit]
 log , $ foo!~foofoo@foo.foo quits: Client Quit
 
 × cmd-disconnect-1
-insert error-to-disconnect : +0 ? ::Closing link: foo.foo (Client Quit)
+insert error-to-disconnect [% (EXIT_MSG)=:Closing%link:%foo.foo%(Client%Quit)]
 
 × cmd-disconnect
 insert cmd-disconnect-0
index 8c32aa2e55f4693f3354f1dbe2389d97666aa0a1..b58f7924ba54ea46336d4cf8f89131c0d9114917 100644 (file)
@@ -1,12 +1,12 @@
 insert ./lib/servermsglogged
 
 × rename
-insert servermsglogged : +0 MSG ::NUH NICK :NEWNICK
-log 1 $ users:USER_ID:nick set to: [NEWNICK]
-log 3,4 $ NUH renames NEWNICK
+insert servermsglogged [% (MSG)=:(NUH)%NICK%:(NICK)]
+log 1 $ users:(USER_ID):nick set to: [(NICK)]
+log 3,4 $ (NUH) renames (NICK)
 
 × cmd-nick
-> /nick NEWNICK
-log 1 > NICK :NEWNICK
-insert rename : +0
-log 1 $ nick_wanted set to: [NEWNICK]
+> /nick (NICK)
+log 1 > NICK :(NICK)
+insert rename
+log 1 $ nick_wanted set to: [(NICK)]
index 527d62a17b6fef10824be7fb847b9637b1253aef..fe1275eae8148ea3223e9826f2442e5e58f248b4 100644 (file)
@@ -2,7 +2,7 @@ insert ./lib/isupport-clear
 
 × connect
 > /connect foo.bar.baz:6697 foo foo foo:foofoo
-insert isupport-clear 1: +1
+insert isupport-clear range=1:
 log , $ NOT CONNECTED
 log 1 $ hostname set to: [foo.bar.baz]
 log 1 $ port set to: [6697]
index 8d9892a241dae99ac8923b5be696f7c1d5736495..2739ff0e90091b96e934588e54132b02d242fc9e 100644 (file)
@@ -3,4 +3,4 @@ insert ./lib/connect
 
 × connect-to-connected
 insert connect
-insert attempting-to-connected : + WIN_IDS :2
+insert attempting-to-connected
index e19434280a781fc526398b1de7c37aaadde6f2c3..4c57186ed209807ddc675f23b0f3e8a99514c85c 100644 (file)
@@ -4,11 +4,11 @@ insert ./lib/connected
 
 × connect-w-password
 > /connect foo.bar.baz:6697 foo:SECRET foo foo:foofoo
-insert connect 1:
+insert connect range=1:
 log 1 $ password set to: [SECRET]
 
 × attempting-to-connected-w-password
-insert attempting :-1
+insert attempting range=:-1
 log 2 $ - password: SECRET
 insert connected
 
index 45ae99ca32dc8003ca25f6dd8982591ffc084113..5db8b5e8214b6321987d50b2363a192f07f5fbc6 100644 (file)
@@ -1,6 +1,6 @@
 × connected
 log 1 $ connection_state set to: [connected]
-log WIN_IDS $ CONNECTED
+log 2 $ CONNECTED
 log 1 > CAP LS :302
 log 1 > USER foofoo 0 * :foo foo
 log 1 > NICK :foo
index a7f629e26170fd722fed928f348bab484359a1aa..618b8537a05779311e33a9d9c205f3389abb10d5 100644 (file)
@@ -1,12 +1,12 @@
 insert ./lib/isupport-clear
 
 × disconnect0
-log 1 $ connection_state set to: [EXIT_MSG]
-insert isupport-clear : +1
+log 1 $ connection_state set to: [(EXIT_MSG)]
+insert isupport-clear
 log 1 $ caps cleared
 
 × disconnect1
 log 1 $ channels cleared
 log 1 $ connection_state set to: []
-log WIN_IDS $ NOT CONNECTED
+log 2 $ NOT CONNECTED
 log 1 $ users cleared
index d2dc9652424e96f0615a27fffe0e647ec5c8e8d5..0de41e1d1af341100b5b9d576a995b4abf9efcec 100644 (file)
@@ -3,5 +3,5 @@ insert ./lib/disconnect
 insert ./lib/servermsglogged
 
 × error-to-disconnect
-insert servermsglogged : + MSG :ERROR :?
-insert disconnect0 : + EXIT_MSG :?
+insert servermsglogged [% (MSG)=ERROR%:(EXIT_MSG)]
+insert disconnect0
index 0dec882c9f1f37e5bad0498510f5a4ae3036ed82..36d6058d43295f672c04cc7f1df5833fef0a86b0 100644 (file)
@@ -3,5 +3,5 @@ insert ./lib/disconnect
 insert ./lib/error-to-disconnect
 
 × error-to-disconnected
-insert error-to-disconnect :-1 + ? :§§§
-insert disconnect1 1:-1 + WIN_IDS :2
+insert error-to-disconnect range=:-1
+insert disconnect1 range=1:-1
index 69a94cc3594c22d14295551c010825c82c1fc860..3d7f823072e450657d50dfdb17c3a037a0a2d373 100644 (file)
@@ -1,22 +1,22 @@
 insert ./lib/servermsglogged
 
-× join-channel-0-0
-> /join CHANNEL
-log 1 > JOIN :CHANNEL
-insert servermsglogged : + MSG ::foo!~foofoo@foo.foo JOIN :CHANNEL
+× join-channel-0-0-cmd-to-ack
+> /join #ch_win(WIN_ID)
+log 1 > JOIN :#ch_win(WIN_ID)
+insert servermsglogged [% (MSG)=:foo!~foofoo@foo.foo%JOIN%:#ch_win(WIN_ID)]
 
-× join-channel-0-1
-insert servermsglogged : + MSG ::foo.bar.baz 353 foo = CHANNEL :RESIDENT_NAMES
+× join-channel-0-1-list-residents
+insert servermsglogged [% (MSG)=:foo.bar.baz%353%foo%=%#ch_win(WIN_ID)%:(RESIDENT_NAMES)]
 
-× join-channel-0
-insert join-channel-0-0
-insert join-channel-0-1
+× join-channel-0-cmd-to-list-residents
+insert join-channel-0-0-cmd-to-ack
+insert join-channel-0-1-list-residents
 
-× join-channel-1
-insert servermsglogged : + MSG ::foo.bar.baz 366 foo CHANNEL :End of /NAMES list.
-log 1 $ channels:CHANNEL:user_ids set to: RESIDENT_IDS
+× join-channel-1-end-of-names
+insert servermsglogged [% (MSG)=:foo.bar.baz%366%foo%#ch_win(WIN_ID)%:End%of%/NAMES%list.]
+log 1 $ channels:#ch_win(WIN_ID):user_ids set to: (RESIDENT_IDS)
+log (WIN_ID) $ residents: (RESIDENT_NICKS)
 
 × join-empty
-insert join-channel-0 : + CHANNEL=#ch_winNUMBER RESIDENT_NAMES :foo
-insert join-channel-1 : + CHANNEL=#ch_winNUMBER RESIDENT_IDS :[me]
-log NUMBER $ residents: foo
+insert join-channel-0-cmd-to-list-residents [(RESIDENT_NAMES)=foo]
+insert join-channel-1-end-of-names [(RESIDENT_IDS)=[me] (RESIDENT_NICKS)=foo]
index 2a2a8963da656287378e66a702f5ee37d9173da1..8d53e5b2266b5b835ff51591a636b159d468e438 100644 (file)
@@ -1,6 +1,6 @@
 insert ./lib/servermsglogged
 
 × no-handler
-insert servermsglogged : +0 MSG :?
-log 1 $ No handler implemented for: ?
-log ALERT_WIN_IDS $ No handler implemented for: ?
+insert servermsglogged
+log 1 $ No handler implemented for: (MSG)
+log (ALERT_WIN_IDS) $ No handler implemented for: (MSG)
index 3fd4aa65fe079dc7ccade7735ea64ef9962b4981..60616160bc36dc65700d951de34571ddfa00e321 100644 (file)
@@ -5,6 +5,6 @@ insert ./lib/retry-in
 × no-timely-pong
 servermsg 0 timeout
 servermsg 0 no timely PONG from server
-insert disconnect0 :-1 + EXIT_MSG :broken: no timely PONG from server
-insert disconnect1 1:-1 + WIN_IDS :2
-insert retry-in : + ? :1
+insert disconnect0 range=:-1 [% (EXIT_MSG)=broken:%no%timely%PONG%from%server]
+insert disconnect1 range=1:-1
+insert retry-in [(SECONDS)=1]
index f0f07d4ee6dd8fc40af23fdcd2edde7807c0e6be..ddfc59c62fce06d6fd8786aeea5ae9a0738384b3 100644 (file)
@@ -1,29 +1,23 @@
 insert ./lib/servermsglogged
 
-× exit-channel
-log 1 $ channels:#ch_winNUMBER:exits:USER_ID set to: [exitTYPEexitMSG]
-log 1 $ channels:#ch_winNUMBER:user_ids USERIDS_CLEAR
-log NUMBER $ NICK!~NICKNICK@NICK.NICK exitDESCexitPREFIXexitMSG
-log 1 $ channels:#ch_winNUMBER:exits:USER_ID deleted
+× part-core
+log 1 $ channels:#ch_win(WIN_ID):exits:(USER_ID) set to: [P(EXIT_MSG)]
+log 1 $ channels:#ch_win(WIN_ID):user_ids (USERIDS_CLEAR)
+log (WIN_ID) $ (NICK)!~(NICK)(NICK)@(NICK).(NICK) parts: (EXIT_MSG)
+log 1 $ channels:#ch_win(WIN_ID):exits:(USER_ID) deleted
 
-× parts-core
-insert exit-channel : + exitTYPE=P exitDESC :parts
+× quits
+insert part-core [% parts=quits P(EXIT_MSG)=Q(EXIT_MSG) (EXIT_MSG)=Client%Quit]
 
 × part
 > /part
-log 1 > PART :#ch_winNUMBER
-insert servermsglogged : + MSG ::NICK!~NICKNICK@NICK.NICK PART ARGS
-insert parts-core : + exitPREFIX= exitMSG :
-log 1 $ channels:#ch_winNUMBER deleted
+log 1 > PART :#ch_win(WIN_ID)
+insert servermsglogged [% (MSG)=:(NICK)!~(NICK)(NICK)@(NICK).(NICK)%PART%(ARGS)]
+insert part-core [% (EXIT_MSG)= parts:%=parts]
+log 1 $ channels:#ch_win(WIN_ID) deleted
 
 × part-no-msg
-insert part : + ARGS ::#ch_winNUMBER
+insert part [(ARGS)=:#ch_win(WIN_ID)]
 
 × part-no-msg-me
-insert part-no-msg : + USER_ID=me NICK :foo
-
-× quits
-insert exit-channel : + exitTYPE=Q exitDESC=quits exitPREFIX=:§ exitMSG=Client§Quit § : 
-
-× quit
-insert quits : + USERIDS_CLEAR=set§to:§REMAINING_IDS § : 
+insert part-no-msg [(USER_ID)=me (NICK)=foo]
index 5737b069d1f7b0018ebda5d3700ca0408cae0926..d6351faba8e0f32a2dd9e4493d72c851df85639c 100644 (file)
@@ -1,5 +1,5 @@
 insert ./lib/servermsglogged
 
 × ping-pong
-insert servermsglogged : +0 MSG :PING :?
+insert servermsglogged [% (MSG)=PING%:?]
 log 1 > PONG :?
index ed7f1237cf7f3e4f49eb46176e3e13388d1eeb40..eb9bdc35f48e9ac04c2aca1806cb1e469b0a8fe0 100644 (file)
@@ -1,4 +1,4 @@
 × privmsg
-> /privmsg TARGET TXT
-log 1 > PRIVMSG TARGET :TXT
-log TARGET_WIN_ID > [foo] TXT
+> /privmsg (TARGET) (TXT)
+log 1 > PRIVMSG (TARGET) :(TXT)
+log (TARGET_WIN_ID) > [foo] (TXT)
index 4006cdb7f3a6a621774c262f329dd21b5bf446e9..12f591b453364b341df07fe1f3cba81a705866e4 100644 (file)
@@ -1,15 +1,18 @@
 insert ./lib/cap-msg
 insert ./lib/user-set-to
 
+× caps-init-reply-then-set-nick-then-list
+insert cap-msg [% (CAP_MSG)=foo%(INIT_REPLY)]
+insert user-set-to range=:1 [(USER_ID)=me (USER_NICK)=foo]
+insert cap-msg [% (CAP_MSG)=foo%LIST%:(CAP_LIST)]
+
 × req-sasl
 log 1 > CAP REQ :sasl
 log 1 > CAP :LIST
-insert cap-msg : +0 CAPMSG :foo REPLY :sasl
-insert user-set-to :1 + USER_ID=me USERNICK :foo
-insert cap-msg : +0 CAPMSG :foo LIST :CAPLIST
+insert caps-init-reply-then-set-nick-then-list [% (INIT_REPLY)=(REPLY)%:sasl]
 
 × get-sasl-plain
-insert cap-msg : + CAPMSG :* LS :sasl=PLAIN
+insert cap-msg [% (CAP_MSG)=*%LS%:sasl=PLAIN]
 log 1 $ caps:sasl:data set to: [PLAIN]
-insert req-sasl : + REPLY=ACK CAPLIST :sasl
+insert req-sasl [(REPLY)=ACK (CAP_LIST)=sasl]
 log 1 $ caps:sasl:enabled set to: [True]
index 316bffc3199fd59216d7e54ad8a461849996b741..621149629ffddc9c249428e3af9b731b54c23fbe 100644 (file)
@@ -1,2 +1,2 @@
 × retry-in
-log 1 $ will retry connecting in ? seconds
+log 1 $ will retry connecting in (SECONDS) seconds
index 1899b7aba20e94149e269421c325f640cd8a6f5c..c2f199e69c28ffb44a242fae685dca12012dec34 100644 (file)
@@ -1,6 +1,3 @@
-× servermsglogged-core
-servermsg SERVER_ID MSG
-log WIN_ID < MSG
-
 × servermsglogged
-insert servermsglogged-core : + SERVER_ID=0 WIN_ID :1
+servermsg 0 (MSG)
+log 1 < (MSG)
index 65fffb3071a2e24d81da9696ce6835643b9d22d1..06787d2700b01cae95951ffde09f3ba77b3868c1 100644 (file)
@@ -1,6 +1,5 @@
 insert ./lib/servermsglogged
 
 × servernotice
-insert servermsglogged : +0 MSG ::*.?.net NOTICE * :XXX
-log 2 < (server) XXX
-
+insert servermsglogged [% (MSG)=:*.?.net%NOTICE%*%:(NOTICE)]
+log 2 < (server) (NOTICE)
index 9000abd546b193fae7026cd58d6d977cd116b157..381ce1956d9df208c4b923b1087ae13ff19e2d8f 100644 (file)
@@ -1,3 +1,3 @@
 × trigger-ping
-servermsg SERVER_ID timeout
-log LOG_ID > PING :what's up?
+servermsg 0 timeout
+log 1 > PING :what's up?
index 484742233f871f5eef931111256d401cece98d09..44f9e3e456feb1c39b9873385a7bf90dcb55e5b7 100644 (file)
@@ -1,5 +1,5 @@
 × user-set-to
-log 1 $ users:USER_ID:nick set to: [USERNICK]
-log 1 $ users:USER_ID:user set to: [USERNAME]
-log 1 $ users:USER_ID:host set to: [USERHOST]
+log 1 $ users:(USER_ID):nick set to: [(USER_NICK)]
+log 1 $ users:(USER_ID):user set to: [(USER_USER)]
+log 1 $ users:(USER_ID):host set to: [(USER_HOST)]
 
index 958248e9b5f757419a6bdeb2ac130a3e60e6a3d6..5da46014918380442da7e63f21bf5e032e97ce11 100644 (file)
@@ -2,6 +2,6 @@ insert ./lib/servermsglogged
 insert ./lib/user-set-to
 
 × usermode
-insert servermsglogged : + MSG ::foo!~foofoo@foo.foo MODE foo +ABC
-insert user-set-to 1: + USER_ID=me USERNAME=~foofoo USERHOST :foo.foo
+insert servermsglogged [% (MSG)=:foo!~foofoo@foo.foo%MODE%foo%+ABC]
+insert user-set-to range=1: [(USER_ID)=me (USER_USER)=~foofoo (USER_HOST)=foo.foo]
 log 1 $ users:me:modes set to: [ABC]
index 171c4bc7fcdc789ee43d546cc2e4302bf4fabd60..3ca43eb806e6c0ee171e06571429fc19e0c9f76d 100644 (file)
@@ -8,11 +8,11 @@ insert ./lib/trigger-ping
 
 × full-timeout
 # ping on timeout, go on as normal if PONG received 
-insert trigger-ping : +0 SERVER_ID=0 LOG_ID :1
-insert servermsglogged : +0 MSG ::*.?.net PONG *.?.net :what's up?
-insert servernotice : +0 MSG :XXX Looking up your ident...
+insert trigger-ping
+insert servermsglogged [% (MSG)=:*.?.net%PONG%*.?.net%:what's%up?]
+insert servernotice [% (NOTICE)=Looking%up%your%ident...]
 # another timeout instead of pong? disconnect
-insert trigger-ping : +0 SERVER_ID=0 LOG_ID :1
+insert trigger-ping
 insert no-timely-pong
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
@@ -27,5 +27,5 @@ insert full-timeout
 # on re-connect, ensure timer cleared, i.e. only 2nd time-out will disconnect
 > /window 1
 > /reconnect
-insert attempting-to-connected : + WIN_IDS :2
+insert attempting-to-connected
 insert full-timeout
index 3dca97369297407c84c73a141b09c704a86539ef..b747218fde19c9cbc3760e246477ec3d561ed950 100644 (file)
@@ -10,10 +10,9 @@ insert ./lib/disconnect-to-stop-auto-reconnect
 insert ./lib/enter-list-start
 insert ./lib/isupport-clear
 insert ./lib/join-empty
-# for: join-channel-0, join-channel-1
-insert ./lib/no-handler
+# for: join-channel-0-cmd-to-list-residents, join-channel-1-end-of-names
 insert ./lib/part
-# for: part-no-msg-me, quit, quits
+# for: part-no-msg-me, quits
 insert ./lib/pingpong
 insert ./lib/privmsg
 insert ./lib/req-sasl
@@ -24,32 +23,32 @@ insert ./lib/servernotice
 insert ./lib/user-set-to
 
 × nick-increment
-insert servermsglogged : + MSG ::*.?.net 433 * NAME_A :Nickname already in use
+insert servermsglogged [% (MSG)=:*.?.net%433%*%(NICK_OLD)%:Nickname%already%in%use]
 log 1 $ nickname already in use, trying increment
-log 1 > NICK :NAME_B
+log 1 > NICK :(NICK_NEW)
 
 
 
 × conn_init_1
 
 # expect some NOTICE and PING to process/reply during initiation
-insert servernotice : + XXX :*** Looking up your ident...
-insert servernotice : + XXX :*** Looking up your hostname...
-insert servernotice : + XXX :*** Found your hostname (foo.foo)
+insert servernotice [% (NOTICE)=***%Looking%up%your%ident...]
+insert servernotice [% (NOTICE)=***%Looking%up%your%hostname...]
+insert servernotice [% (NOTICE)=***%Found%your%hostname%(foo.foo)]
 insert ping-pong
 
 # handle 433
-insert nick-increment : + NAME_A=foo NAME_B :foo0
-insert nick-increment : + NAME_A=foo0 NAME_B :foo1
+insert nick-increment [(NICK_OLD)=foo (NICK_NEW)=foo0]
+insert nick-increment [(NICK_OLD)=foo0 (NICK_NEW)=foo1]
 
 # collect server capabilities
-insert cap-msg : + CAPMSG :* LS : foo bar sasl=IGNORE baz cap-notify
+insert cap-msg [% (CAP_MSG)=*%LS%:%foo%bar%sasl=IGNORE%baz%cap-notify]
 log 1 $ caps:bar:data set to: []
 log 1 $ caps:baz:data set to: []
 log 1 $ caps:cap-notify:data set to: []
 log 1 $ caps:foo:data set to: []
 log 1 $ caps:sasl:data set to: [IGNORE]
-insert req-sasl : + foo=foo1 REPLY=ACK CAPLIST :cap-notify sasl
+insert req-sasl [% foo=foo1 (REPLY)=ACK (CAP_LIST)=cap-notify%sasl]
 log 1 $ caps:cap-notify:enabled set to: [True]
 log 1 $ caps:sasl:enabled set to: [True]
 
@@ -61,38 +60,39 @@ log 1 > CAP :END
 × conn_init_2
 
 # of all pre-MOTD greeting messages, only process isupports
-insert servermsglogged : + MSG ::foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
-insert servermsglogged : + MSG ::foo.bar.baz 002 foo1 :Your host is foo.bar.baz
-insert servermsglogged : + MSG ::foo.bar.baz 003 foo1 :This server was created Jan 1 2020
-insert servermsglogged : + MSG ::foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
-insert servermsglogged : + MSG ::foo.bar.baz 005 foo1 ABC=DEF GHI :are supported by this server
+insert servermsglogged [% (MSG)=:foo.bar.baz%001%foo1%:Welcome%to%the%foo.bar.baz%network]
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo1%:Your%host%is%foo.bar.baz]
+insert servermsglogged [% (MSG)=:foo.bar.baz%003%foo1%:This%server%was%created%Jan%1%2020]
+
+insert servermsglogged [% (MSG)=:foo.bar.baz%004%foo1%foo.bar.baz%ircserver-1.0%abc%def%ghi]
+insert servermsglogged [% (MSG)=:foo.bar.baz%005%foo1%ABC=DEF%GHI%:are%supported%by%this%server]
 log 1 $ isupport:ABC set to: [DEF]
 log 1 $ isupport:GHI set to: []
-insert servermsglogged : + MSG ::foo.bar.baz 251 foo1 :There are 10 users and 1000 invisible on 5 servers
-insert servermsglogged : + MSG ::foo.bar.baz 252 foo1 7 :IRC Operators online
-insert servermsglogged : + MSG ::foo.bar.baz 253 foo1 4 :unknown connection(s)
-insert servermsglogged : + MSG ::foo.bar.baz 254 foo1 800 :channels formed
-insert servermsglogged : + MSG ::foo.bar.baz 255 foo1 :I have 100 clients and 1 serveres
-insert servermsglogged : + MSG ::foo.bar.baz 265 foo1 100 150 :Current local users 100, max 150
-insert servermsglogged : + MSG ::foo.bar.baz 266 foo1 1010 1050 :Current global users 1010, max 1050
-insert servermsglogged : + MSG ::foo.bar.baz 250 foo1 :Highest connection count: 151 (150 clients) (1080 connections received)
+insert servermsglogged [% (MSG)=:foo.bar.baz%251%foo1%:There%are%10%users%and%1000%invisible%on%5%servers]
+insert servermsglogged [% (MSG)=:foo.bar.baz%252%foo1%7%:IRC%Operators%online]
+insert servermsglogged [% (MSG)=:foo.bar.baz%253%foo1%4%:unknown%connection(s)]
+insert servermsglogged [% (MSG)=:foo.bar.baz%254%foo1%800%:channels%formed]
+insert servermsglogged [% (MSG)=:foo.bar.baz%255%foo1%:I%have%100%clients%and%1%serveres]
+insert servermsglogged [% (MSG)=:foo.bar.baz%265%foo1%100%150%:Current%local%users%100,%max%150]
+insert servermsglogged [% (MSG)=:foo.bar.baz%266%foo1%1010%1050%:Current%global%users%1010,%max%1050]
+insert servermsglogged [% (MSG)=: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)
-insert servermsglogged : + MSG ::foo.bar.baz 375 foo1 :- foo.bar.baz Message of the Day -
-insert servermsglogged : + MSG ::foo.bar.baz 372 foo1 :- Howdy! -
-insert servermsglogged : + MSG ::foo.bar.baz 372 foo1 :- Welcome! -
-insert servermsglogged : + MSG ::foo.bar.baz 372 foo1 :- (to this server) -
-insert servermsglogged : + MSG ::foo.bar.baz 376 foo1 :End of /MOTD command
+insert servermsglogged [% (MSG)=:foo.bar.baz%375%foo1%:-%foo.bar.baz%Message%of%the%Day%-]
+insert servermsglogged [% (MSG)=:foo.bar.baz%372%foo1%:-%Howdy!%-]
+insert servermsglogged [% (MSG)=:foo.bar.baz%372%foo1%:-%Welcome!%-]
+insert servermsglogged [% (MSG)=:foo.bar.baz%372%foo1%:-%(to%this%server)%-]
+insert servermsglogged [% (MSG)=:foo.bar.baz%376%foo1%:End%of%/MOTD%command]
 log 1 $ motd set to: [- Howdy! -], [- Welcome! -], [- (to this server) -]
 log 2 $ - Howdy! -
 log 2 $ - Welcome! -
 log 2 $ - (to this server) -
 
 # collect user mode
-insert servermsglogged : + MSG ::foo1 MODE foo1 :+Ziw
+insert servermsglogged [% (MSG)=:foo1%MODE%foo1%:+Ziw]
 log 1 $ users:me:modes set to: [Ziw]
 # handle bot query NOTICE
-insert servermsglogged : + MSG ::SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foo@foo.foo on Jan 1 22:00:00 2021 +0000.
+insert servermsglogged [% (MSG)=:SaslServ!SaslServ@services.bar.baz%NOTICE%foo1%:Last%login%from%~foo@foo.foo%on%Jan%1%22:00:00%2021%+0000.]
 log 3 < (SaslServ) Last login from ~foo@foo.foo on Jan 1 22:00:00 2021 +0000.
 
 
@@ -100,74 +100,69 @@ log 3 < (SaslServ) Last login from ~foo@foo.foo on Jan 1 22:00:00 2021 +0000.
 × during_conn
 
 # test recoverable 432
-insert cmd-nick :2 + NEWNICK :@foo
-insert servermsglogged : + MSG ::*.?.net 432 foo1 @foo :Erroneous nickname
+insert cmd-nick range=:2 [(NICK)=@foo]
+insert servermsglogged [% (MSG)=:*.?.net%432%foo1%@foo%:Erroneous%nickname]
 log 1 $ nickname refused for bad format, keeping current one
 
 # rename to easen code-reuse
-insert cmd-nick :4 + NUH=foo1!~foofoo@foo.foo NEWNICK :foo
+insert cmd-nick range=:4 [(NUH)=foo1!~foofoo@foo.foo (NICK)=foo]
 log 1 $ users:me:user set to: [~foofoo]
 log 1 $ users:me:host set to: [foo.foo]
-insert cmd-nick 4:-2 + USER_ID=me NEWNICK :foo
-log rename_win_ids $ foo1!~foofoo@foo.foo renames foo
+insert cmd-nick range=4:-2 [(USER_ID)=me (NICK)=foo]
+log 3 $ foo1!~foofoo@foo.foo renames foo
 
 # join channel with other user
-insert join-channel-0 : + CHANNEL=#ch_win4 RESIDENT_NAMES :foo @baz
-insert user-set-to :1 + USER_ID=1 USERNICK :baz
+insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=4 (RESIDENT_NAMES)=foo%@baz]
+insert user-set-to range=:1 [(USER_ID)=1 (USER_NICK)=baz]
 log 1 $ channels:#ch_win4:prefixes:@ set to: [1]
-insert join-channel-1 : + CHANNEL=#ch_win4 RESIDENT_IDS :[1], [me]
-log 4 $ residents: @baz, foo
+insert join-channel-1-end-of-names [% (WIN_ID)=4 (RESIDENT_IDS)=[1],%[me] (RESIDENT_NICKS)=@baz,%foo]
 
 # process non-self channel JOIN
-insert servermsglogged : + MSG ::bar!~barbar@bar.bar JOIN :#ch_win4
-insert user-set-to : + USER_ID=2 USERNICK=bar USERNAME=~barbar USERHOST :bar.bar
+insert servermsglogged [% (MSG)=:bar!~barbar@bar.bar%JOIN%:#ch_win4]
+insert user-set-to [(USER_ID)=2 (USER_NICK)=bar (USER_USER)=~barbar (USER_HOST)=bar.bar]
 log 1 $ channels:#ch_win4:user_ids set to: [1], [2], [me]
 log 4 $ bar!~barbar@bar.bar joins
 
 # join second channel with partial residents identity to compare distribution of resident-specific messages
-insert join-channel-0 : + CHANNEL=#ch_win5 RESIDENT_NAMES :foo bar
-insert join-channel-1 : + CHANNEL=#ch_win5 RESIDENT_IDS :[2], [me]
-log 5 $ residents: bar, foo
+insert join-channel-0-cmd-to-list-residents [% (WIN_ID)=5 (RESIDENT_NAMES)=foo%bar]
+insert join-channel-1-end-of-names [% (WIN_ID)=5 (RESIDENT_IDS)=[2],%[me] (RESIDENT_NICKS)=bar,%foo]
 
 # handle query window with known user
-insert servermsglogged : + MSG ::bar!~barbar@bar.bar PRIVMSG foo :hi there
+insert servermsglogged [% (MSG)=:bar!~barbar@bar.bar%PRIVMSG%foo%:hi%there]
 log 6 < [bar] hi there
-insert privmsg : + TARGET_WIN_ID=6 TARGET=bar TXT :hello, how is it going
-insert servermsglogged : + MSG ::bar!~barbar@bar.bar PRIVMSG foo :fine!
+insert privmsg [% (TARGET_WIN_ID)=6 (TARGET)=bar (TXT)=hello,%how%is%it%going]
+insert servermsglogged [% (MSG)=:bar!~barbar@bar.bar%PRIVMSG%foo%:fine!]
 log 6 < [bar] fine!
 
 # handle failure to query absent user
-insert privmsg : + TARGET_WIN_ID=7 TARGET=barbar TXT :hello!
-insert servermsglogged : + MSG ::*.?.net 401 foo barbar :No such nick/channel
+insert privmsg [(TARGET_WIN_ID)=7 (TARGET)=barbar (TXT)=hello!]
+insert servermsglogged [% (MSG)=:*.?.net%401%foo%barbar%:No%such%nick/channel]
 log 7 $ barbar not online
 
 # handle non-self renaming, even into window of previously not found target
-insert servermsglogged : + MSG ::bar!~barbar@bar.bar NICK :barbar
+insert servermsglogged [% (MSG)=:bar!~barbar@bar.bar%NICK%:barbar]
 log 1 $ users:2:nick set to: [barbar]
 log 4,5,6,7 $ bar!~barbar@bar.bar renames barbar
 
 # handle non-self QUIT
-insert servermsglogged : + MSG ::barbar!~barbar@bar.bar QUIT :Client Quit
+insert servermsglogged [% (MSG)=:barbar!~barbar@bar.bar%QUIT%:Client%Quit]
 log 1 $ users:2:exit_msg set to: [QClient Quit]
 log 6,7 $ barbar!~barbar@bar.bar quits: Client Quit
-insert quit : + USER_ID=2 NICK=bar NUMBER=4 bar!=barbar! REMAINING_IDS :[1], [me]
-insert quit : + USER_ID=2 NICK=bar NUMBER=5 bar!=barbar! REMAINING_IDS :[me]
+insert quits [% (USER_ID)=2 (NICK)=bar (WIN_ID)=4 bar!=barbar! (USERIDS_CLEAR)=set%to:%[1],%[me]]
+insert quits [% (USER_ID)=2 (NICK)=bar (WIN_ID)=5 bar!=barbar! (USERIDS_CLEAR)=set%to:%[me]]
 log 1 $ users:2 deleted
 
 # handle self-PART: clear channel, and its squatters
 > /window 4
-insert part-no-msg-me : + NUMBER=4 USERIDS_CLEAR :set to: [1]
+insert part-no-msg-me [% (WIN_ID)=4 (USERIDS_CLEAR)=set%to:%[1]]
 log 1 $ users:1 deleted
 
-# handle lack of implementation
-insert no-handler : + ALERT_WIN_IDS=2,3,4,5,6,7 ? :foo bar baz
-
 # handle /disconnect, clear all
-insert cmd-disconnect-0 :-1
+insert cmd-disconnect-0 range=:-1
 log 3,6,7 $ foo!~foofoo@foo.foo quits: Client Quit
-insert quits : + USER_ID=me NICK=foo NUMBER=5 USERIDS_CLEAR :emptied
+insert quits [(USER_ID)=me (NICK)=foo (WIN_ID)=5 (USERIDS_CLEAR)=emptied]
 insert cmd-disconnect-1
-insert disconnect1 :-1 + WIN_IDS :2,3,4,5,6,7
+insert disconnect1 range=:-1 [% log%2%=log%2,3,4,5,6,7%]
 log 1 $ motd emptied
 log 1 $ users cleared
 
@@ -184,7 +179,7 @@ log 1 $ not sending, since not in channel
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 # on /connect init databases, log in new windows, connect with values set by /connect, init CAP negotiation
-insert connect-to-connected-w-password : + WIN_IDS :2
+insert connect-to-connected-w-password
 
 insert conn_init_1
 insert conn_init_2
@@ -223,36 +218,37 @@ log 1 #   /window.prompt.scroll DIRECTION
 log 1 #   /window.raw VERB [PARAMS_STR]
 log 1 #   /window.reconnect
 
-insert during_conn : + rename_win_ids :3
+insert during_conn
 
 # test setting up second client, but 432 irrecoverably
 > /connect baz.bar.foo:6697 ?foo foo foo:foofoo
-insert connect 1: +8 foo.bar.baz=baz.bar.foo [foo] :[?foo]
-insert attempting :2 +8 foo.bar.baz :baz.bar.foo
+insert connect range=1: [% foo.bar.baz=baz.bar.foo [foo]=[?foo] log%1%=log%8%]
+insert attempting range=:2 [% log%1%=log%8% log%2%=log%9% foo.bar.baz=baz.bar.foo]
 log 9 $ - nickname: ?foo
-insert attempting-to-connected 3:-1 +8 WIN_IDS=2 foo.bar.baz :baz.bar.foo
+insert attempting range=3: [% log%2%=log%9%]
+insert connected range=:-1 [% log%1%=log%8% log%2%=log%9%]
 log 8 > NICK :?foo
-insert servermsglogged-core : + SERVER_ID=1 WIN_ID=8 MSG ::*.?.net 432 * ?foo :Erroneous nickname
-insert isupport-clear : +8
-insert disconnect1 1:-1 +8 WIN_IDS :2
+insert servermsglogged [% servermsg%0=servermsg%1 log%1%=log%8% (MSG)=:*.?.net%432%*%?foo%:Erroneous%nickname]
+insert isupport-clear  [% log%1%=log%8%]
+insert disconnect1 range=1:-1 [% log%1%=log%8% log%2%=log%9%]
 log 8 $ nickname refused for bad format, giving up
 
 # test failing third connection
-insert connect : +10 foo.bar.baz :baz.baz.baz
-insert attempting-to-connected : +10 WIN_IDS=2 foo.bar.baz :baz.baz.baz
+insert connect [% foo.bar.baz=baz.baz.baz log%1%=log%10%]
+insert attempting-to-connected [% log%1%=log%10% log%2%=log%11% foo.bar.baz=baz.baz.baz]
 servermsg 2 FAKE_IRC_CONN_ABORT_EXCEPTION
-insert disconnect0 :-1 +10 EXIT_MSG :broken: FAKE_IRC_CONN_ABORT_EXCEPTION
-insert disconnect1 1:-1 +10 WIN_IDS :2
+insert disconnect0 range=:-1 [% log%1%=log%10% (EXIT_MSG)=broken:%FAKE_IRC_CONN_ABORT_EXCEPTION]
+insert disconnect1 range=1:-1 [% log%1%=log%10% log%2%=log%11%]
 log 10 $ will retry connecting in 1 seconds
 > /window 10
-insert disconnect-to-stop-auto-reconnect : +10
+insert disconnect-to-stop-auto-reconnect [% log%1%=log%10%]
 
 # check that (save TUI tests assuming start on window 0, and no 4 yet) on reconnect, all the same effects can be expected
 > /window 1
 > /reconnect
-insert attempting-to-connected-w-password : + WIN_IDS :2,3,4,5,6,7
+insert attempting-to-connected-w-password [% log%2%$%CONNECTED=log%2,3,4,5,6,7%$%CONNECTED]
 insert conn_init_1
-insert conn_init_2 :2
+insert conn_init_2 range=:2
 log 1 > JOIN :#ch_win5
-insert conn_init_2 2:
-insert during_conn : + rename_win_ids :3,6,7
+insert conn_init_2 range=2:
+insert during_conn [% log%3%=log%3,6,7%]
index af4f635ff407a4efb8602d1ff284ecfdb1dd1f99..6947ed6d453aae5c3caf37d96bf09a114fc9c391 100644 (file)
@@ -8,28 +8,28 @@ insert ./lib/pingpong
 line 0 0 on_black,bright_white §§
 
 × 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
+insert lines-empty-1 bump=0
+insert lines-empty-1 bump=1
+insert lines-empty-1 bump=2
+insert lines-empty-1 bump=3
+insert lines-empty-1 bump=4
+insert lines-empty-1 bump=5
+insert lines-empty-1 bump=6
+insert lines-empty-1 bump=7
+insert lines-empty-1 bump=8
+insert lines-empty-1 bump=9
+insert lines-empty-1 bump=10
+insert lines-empty-1 bump=11
+insert lines-empty-1 bump=12
+insert lines-empty-1 bump=13
+insert lines-empty-1 bump=14
+insert lines-empty-1 bump=15
+insert lines-empty-1 bump=16
+insert lines-empty-1 bump=17
+insert lines-empty-1 bump=18
+insert lines-empty-1 bump=19
+insert lines-empty-1 bump=20
+insert lines-empty-1 bump=21
 
 × lines-prompt-empty
 line 23 0 on_black,bright_white > § §§
@@ -39,24 +39,24 @@ line 23 0 on_black,bright_white,reverse §§ §
 line 0 0 on_black,bright_white --------------------------------------------------------------------------------§§
 
 × line-scrolldown
-line 21 0 on_black,bright_white,reverse vvv XXXXXXvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
+line 0 0 on_black,bright_white,reverse vvv XXXXXXvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv§§
 
 × lines-status-prompt
 line 22 0 on_black,bright_white x123456789x1234567=========================================X123456789X123456789X§§
-line 22 FOCUS_X on_black,bright_white,bold [FOCUS_STR]
+line 22 (FOCUS_X) on_black,bright_white,bold [(FOCUS_STR)]
 insert lines-prompt-empty
 
 × lines-status-prompt-start
-insert lines-status-prompt : +22 x123456789x1234567 ::start)===========
+insert lines-status-prompt [x123456789x1234567=:start)===========]
 
 × lines-status-prompt-foobarbaz
-insert lines-status-prompt : +22 x123456789x1234567 :foo.bar.baz:debug)
+insert lines-status-prompt [x123456789x1234567=foo.bar.baz:debug)]
 
 × line-invalid-prompt-command
-line 0 0 on_black,bright_red,bold # §§:§§:§§ invalid prompt command: MSG§§
+line 0 0 on_black,bright_red,bold # §§:§§:§§ invalid prompt command: (MSG)§§
 
 × line-invalid-prompt-command-unknown
-insert line-invalid-prompt-command : +0 MSG :/CMD unknown
+insert line-invalid-prompt-command bump=0 [% (MSG)=/(CMD)%unknown]
 
 × line-ping
 line 0 0 on_black,bright_white < §§:§§:§§ PING :?
@@ -65,8 +65,8 @@ line 0 0 on_black,bright_white < §§:§§:§§ PING :?
 line 0 0 on_black,bright_green > §§:§§:§§ PONG :?
 
 × lines-ping-pong
-insert line-ping : +0 ? :??
-insert line-pong : +1 ? :??
+insert line-ping bump=0
+insert line-pong bump=1
 
 × line-tui-log
 line 0 0 on_black,bright_cyan # §§:§§:§§ ?§§
@@ -90,202 +90,202 @@ line 0 0 on_black,bright_green > §§:§§:§§ ?§§
 line 0 0 on_black,bright_white 20§§-§§-§§ §§
 
 × history_0
-insert line-cal : +0
-insert line-invalid-prompt-command : +1 MSG :not prefixed by /
-insert line-invalid-prompt-command-unknown : +2 CMD :foo
-insert line-tui-log : +3 ? :commands available in this window:
-insert line-tui-log : +4 ? :  /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]§§
-insert line-tui-log : +5 ? :  /help§§
-insert line-tui-log : +6 ? :  /list§§
-insert line-tui-log : +7 ? :  /prompt_enter§§
-insert line-tui-log : +8 ? :  /quit§§
-insert line-tui-log : +9 ? :  /window TOWARDS§§
-insert line-tui-log : +10 ? :  /window.history.scroll DIRECTION§§
-insert line-tui-log : +11 ? :  /window.paste
-insert line-tui-log : +12 ? :  /window.prompt.backspace§§
-insert line-tui-log : +13 ? :  /window.prompt.move_cursor DIRECTION§§
-insert line-tui-log : +14 ? :  /window.prompt.scroll DIRECTION§§
-insert line-invalid-prompt-command-unknown : +15 CMD :0
-insert line-invalid-prompt-command-unknown : +16 CMD :1
-insert line-invalid-prompt-command-unknown : +17 CMD :2
-insert line-invalid-prompt-command-unknown : +18 CMD :3
-insert line-invalid-prompt-command-unknown : +19 CMD :4
-insert line-invalid-prompt-command-unknown : +20 CMD :5
-insert line-invalid-prompt-command-unknown : +21 CMD :6
-insert line-invalid-prompt-command-unknown : +22 CMD :7
-insert line-invalid-prompt-command-unknown : +23 CMD :foo_0123456789_0123456789_0123456789
-insert line-invalid-prompt-command : +24 MSG :/foo_0123456789_0123456789_0123456789_§§
-insert line-bright-red-bold : +25 ? :   unknown
-insert line-invalid-prompt-command : +26 MSG :/bar_0123456789_0123456789_0123456789_§§
-insert line-bright-red-bold : +27 ? :   unknown
-insert line-tui-log : +28 ? :windows available via /window:§§
-insert line-tui-log : +29 ? :  0) :start§§
-insert line-tui-log : +30 ? :  1) foo.bar.baz:debug§§
-insert line-tui-log : +31 ? :  2) foo.bar.baz:server§§
+insert line-cal bump=0
+insert line-invalid-prompt-command bump=1 [% (MSG)=not%prefixed%by%/]
+insert line-invalid-prompt-command-unknown bump=2 [(CMD)=foo]
+insert line-tui-log bump=3 [% ?=commands%available%in%this%window:]
+insert line-tui-log bump=4 [% ?=%%/connect%HOST_PORT%[NICKNAME_PW]%[REALNAME_USERNAME]§§]
+insert line-tui-log bump=5 [% ?=%%/help§§]
+insert line-tui-log bump=6 [% ?=%%/list§§]
+insert line-tui-log bump=7 [% ?=%%/prompt_enter§§]
+insert line-tui-log bump=8 [% ?=%%/quit§§]
+insert line-tui-log bump=9 [% ?=%%/window%TOWARDS§§]
+insert line-tui-log bump=10 [% ?=%%/window.history.scroll%DIRECTION§§]
+insert line-tui-log bump=11 [% ?=%%/window.paste]
+insert line-tui-log bump=12 [% ?=%%/window.prompt.backspace§§]
+insert line-tui-log bump=13 [% ?=%%/window.prompt.move_cursor%DIRECTION§§]
+insert line-tui-log bump=14 [% ?=%%/window.prompt.scroll%DIRECTION§§]
+insert line-invalid-prompt-command-unknown bump=15 [(CMD)=0]
+insert line-invalid-prompt-command-unknown bump=16 [(CMD)=1]
+insert line-invalid-prompt-command-unknown bump=17 [(CMD)=2]
+insert line-invalid-prompt-command-unknown bump=18 [(CMD)=3]
+insert line-invalid-prompt-command-unknown bump=19 [(CMD)=4]
+insert line-invalid-prompt-command-unknown bump=20 [(CMD)=5]
+insert line-invalid-prompt-command-unknown bump=21 [(CMD)=6]
+insert line-invalid-prompt-command-unknown bump=22 [(CMD)=7]
+insert line-invalid-prompt-command-unknown bump=23 [(CMD)=foo_0123456789_0123456789_0123456789]
+insert line-invalid-prompt-command bump=24 [(MSG)=/foo_0123456789_0123456789_0123456789_§§]
+insert line-bright-red-bold bump=25 [% ?=%%%unknown]
+insert line-invalid-prompt-command bump=26 [(MSG)=/bar_0123456789_0123456789_0123456789_§§]
+insert line-bright-red-bold bump=27 [% ?=%%%unknown]
+insert line-tui-log bump=28 [% ?=windows%available%via%/window:§§]
+insert line-tui-log bump=29 [% ?=%%0)%:start§§]
+insert line-tui-log bump=30 [% ?=%%1)%foo.bar.baz:debug§§]
+insert line-tui-log bump=31 [% ?=%%2)%foo.bar.baz:server§§]
 
 × history_1
-insert line-cal : +0
-insert line-server-log : +1 ? :isupport:CHANTYPES set to: [#&]
-insert line-server-log : +2 ? :isupport:PREFIX set to: [(ov)@+]
-insert line-server-log : +3 ? :isupport:USERLEN set to: [10]
-insert line-server-log : +4 ? :hostname set to: [foo.bar.baz]
-insert line-server-log : +5 ? :port set to: [6697]
-insert line-server-log : +6 ? :nick_wanted set to: [foo]
-insert line-server-log : +7 ? :user_wanted set to: [foofoo]
-insert line-server-log : +8 ? :realname set to: [foo foo]
-insert line-server-log : +9 ? :connection_state set to: [connecting]
-insert line-server-log : +10 ? :connection_state set to: [connected]
-insert line-client-msg : +11 ? :CAP LS :302
-insert line-client-msg : +12 ? :USER foofoo 0 * :foo foo
-insert line-client-msg : +13 ? :NICK :foo
-insert lines-ping-pong : +14 ?? :0
-insert lines-ping-pong : +16 ?? :1
-insert lines-ping-pong : +18 ?? :2
-insert line-ping : +20 ? :9 123456789 123456789 123456789 123456789 123456789 123456789§§
-insert line-bright-white : +21 ? :   123456789 123456789
-insert line-pong : +22 ? :9 123456789 123456789 123456789 123456789 123456789 123456789§§
-insert line-bright-green : +23 ? :   123456789 123456789
-insert lines-ping-pong : +24 ?? :3
-insert lines-ping-pong : +26 ?? :4
-insert lines-ping-pong : +28 ?? :5
-insert lines-ping-pong : +30 ?? :6
-insert lines-ping-pong : +32 ?? :7
-insert lines-ping-pong : +34 ?? :8
-insert lines-ping-pong : +36 ?? :9
-insert lines-ping-pong : +38 ?? :10
-insert lines-ping-pong : +40 ?? :11
-insert lines-ping-pong : +42 ?? :12
-insert lines-ping-pong : +44 ?? :13
-insert lines-ping-pong : +46 ?? :14
-insert lines-ping-pong : +48 ?? :15
-insert lines-ping-pong : +50 ?? :16
-insert lines-ping-pong : +52 ?? :17
-insert lines-ping-pong : +54 ?? :18
-insert lines-ping-pong : +56 ?? :19
-insert lines-ping-pong : +58 ?? :20
-insert lines-ping-pong : +60 ?? :21
-insert lines-ping-pong : +62 ?? :22
-insert lines-ping-pong : +64 ?? :23
-insert lines-ping-pong : +66 ?? :24
-insert lines-ping-pong : +68 ?? :25
-insert lines-ping-pong : +70 ?? :26
-insert lines-ping-pong : +72 ?? :27
-insert lines-ping-pong : +74 ?? :28
-insert lines-ping-pong : +76 ?? :29
-insert lines-ping-pong : +78 ?? :30
+insert line-cal bump=0
+insert line-server-log bump=1 [% ?=isupport:CHANTYPES%set%to:%[#&]]
+insert line-server-log bump=2 [% ?=isupport:PREFIX%set%to:%[(ov)@+]]
+insert line-server-log bump=3 [% ?=isupport:USERLEN%set%to:%[10]]
+insert line-server-log bump=4 [% ?=hostname%set%to:%[foo.bar.baz]]
+insert line-server-log bump=5 [% ?=port%set%to:%[6697]]
+insert line-server-log bump=6 [% ?=nick_wanted%set%to:%[foo]]
+insert line-server-log bump=7 [% ?=user_wanted%set%to:%[foofoo]]
+insert line-server-log bump=8 [% ?=realname%set%to:%[foo%foo]]
+insert line-server-log bump=9 [% ?=connection_state%set%to:%[connecting]]
+insert line-server-log bump=10 [% ?=connection_state%set%to:%[connected]]
+insert line-client-msg bump=11 [% ?=CAP%LS%:302]
+insert line-client-msg bump=12 [% ?=USER%foofoo%0%*%:foo%foo]
+insert line-client-msg bump=13 [% ?=NICK%:foo]
+insert lines-ping-pong bump=14 [?=0]
+insert lines-ping-pong bump=16 [?=1]
+insert lines-ping-pong bump=18 [?=2]
+insert line-ping bump=20 [% ?=9%123456789%123456789%123456789%123456789%123456789%123456789§§]
+insert line-bright-white bump=21 [% ?=%%%123456789%123456789]
+insert line-pong bump=22 [% ?=9%123456789%123456789%123456789%123456789%123456789%123456789§§]
+insert line-bright-green bump=23 [% ?=%%%123456789%123456789]
+insert lines-ping-pong bump=24 [?=3]
+insert lines-ping-pong bump=26 [?=4]
+insert lines-ping-pong bump=28 [?=5]
+insert lines-ping-pong bump=30 [?=6]
+insert lines-ping-pong bump=32 [?=7]
+insert lines-ping-pong bump=34 [?=8]
+insert lines-ping-pong bump=36 [?=9]
+insert lines-ping-pong bump=38 [?=10]
+insert lines-ping-pong bump=40 [?=11]
+insert lines-ping-pong bump=42 [?=12]
+insert lines-ping-pong bump=44 [?=13]
+insert lines-ping-pong bump=46 [?=14]
+insert lines-ping-pong bump=48 [?=15]
+insert lines-ping-pong bump=50 [?=16]
+insert lines-ping-pong bump=52 [?=17]
+insert lines-ping-pong bump=54 [?=18]
+insert lines-ping-pong bump=56 [?=19]
+insert lines-ping-pong bump=58 [?=20]
+insert lines-ping-pong bump=60 [?=21]
+insert lines-ping-pong bump=62 [?=22]
+insert lines-ping-pong bump=64 [?=23]
+insert lines-ping-pong bump=66 [?=24]
+insert lines-ping-pong bump=68 [?=25]
+insert lines-ping-pong bump=70 [?=26]
+insert lines-ping-pong bump=72 [?=27]
+insert lines-ping-pong bump=74 [?=28]
+insert lines-ping-pong bump=76 [?=29]
+insert lines-ping-pong bump=78 [?=30]
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 insert lines-empty
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # nothing happening on empty command input
 > 
 insert lines-empty
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scrolling on empty history does nothing
 > /window.history.scroll up
 insert lines-empty
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 > /window.history.scroll down
 insert lines-empty
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # non-empty command input starts log at bottom, with date above it
-insert enter-unprefixed : +0 ? :foo
-insert lines-empty :20
-insert history_0 :2 +20
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert enter-unprefixed [?=foo]
+insert lines-empty range=:20
+insert history_0 range=:2 bump=20
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scrolling on history merely 2 lines long won't do anything either
 > /window.history.scroll up
-insert lines-empty :20
-insert history_0 :2 +20
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:20
+insert history_0 range=:2 bump=20
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 > /window.history.scroll down
-insert lines-empty :20
-insert history_0 :2 +20
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:20
+insert history_0 range=:2 bump=20
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # further inputs grow log upwards
 > /foo
 log 0 # invalid prompt command: /foo unknown
-insert lines-empty :19
-insert history_0 :3 +19
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:19
+insert history_0 range=:3 bump=19
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scrolling up does something on history 3 lines long
 > /window.history.scroll up
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[2]%vv]
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scrolling down on 3-lines history
 > /window.history.scroll down
-insert lines-empty :19
-insert history_0 :3 +19
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:19
+insert history_0 range=:3 bump=19
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check history growing below up-scroll
 > /window.history.scroll up
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[2]%vv]
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 insert enter-help-win0
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-start : +22 FOCUS_X=72 FOCUS_STR=(0:12) X123456789X123456789X :============(§§§§§§§§
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[14]%v]
+insert lines-status-prompt-start [(FOCUS_X)=72 (FOCUS_STR)=(0:12) X123456789X123456789X=============(§§§§§§§§]
 
 # check scroll-down on newer history longer than half a screen width does not fully land at bottom
 > /window.history.scroll down
-insert lines-empty :9
-insert history_0 :12 +9
-insert line-scrolldown : +21 XXXXXX :[3] vv
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:3) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:9
+insert history_0 range=:12 bump=9
+insert line-scrolldown bump=21 [% XXXXXX=[3]%vv]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:3) X123456789X123456789X==============(§§§§§§§]
 
 # check previous scroll-down not hitting bottom be fully reversible
 > /window.history.scroll up
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:3) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[14]%v]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:3) X123456789X123456789X==============(§§§§§§§]
 > /window.history.scroll down
-insert lines-empty :9
-insert history_0 :12 +9
-insert line-scrolldown : +21 XXXXXX :[3] vv
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:3) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:9
+insert history_0 range=:12 bump=9
+insert line-scrolldown bump=21 [% XXXXXX=[3]%vv]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:3) X123456789X123456789X==============(§§§§§§§]
 
 # scroll to bottom, check history still growing up even beyond upper fold
 > /window.history.scroll down
-insert lines-empty :7
-insert history_0 :15 +7
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
-insert enter-unknown : +0 ? :0
-insert enter-unknown : +0 ? :1
-insert enter-unknown : +0 ? :2
-insert enter-unknown : +0 ? :3
-insert enter-unknown : +0 ? :4
-insert enter-unknown : +0 ? :5
-insert enter-unknown : +0 ? :6
-insert enter-unknown : +0 ? :7
-insert history_0 1:23 +0
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:7
+insert history_0 range=:15 bump=7
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
+insert enter-unknown [?=0]
+insert enter-unknown [?=1]
+insert enter-unknown [?=2]
+insert enter-unknown [?=3]
+insert enter-unknown [?=4]
+insert enter-unknown [?=5]
+insert enter-unknown [?=6]
+insert enter-unknown [?=7]
+insert history_0 range=1:23 bump=0
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scroll-down even with long history does nothing
 > /window.history.scroll down
-insert history_0 1:23 +0
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert history_0 range=1:23 bump=0
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # 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
-insert lines-empty :9
-insert history_0 :12 +9
-insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:9
+insert history_0 range=:12 bump=9
+insert line-scrolldown bump=21 [% XXXXXX=[11]%v]
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check wrapping
 > /window.history.scroll down
@@ -293,351 +293,351 @@ insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X1234567
 log 0 # invalid prompt command: /foo_0123456789_0123456789_0123456789 unknown
 > /foo_0123456789_0123456789_0123456789_
 log 0 # invalid prompt command: /foo_0123456789_0123456789_0123456789_ unknown
-insert history_0 4:26 +0
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert history_0 range=4:26 bump=0
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scroll-up over wrapped moves up less history lines than screen lines
 > /window.history.scroll up
-insert lines-empty :6
-insert history_0 :15 +6
-insert line-scrolldown : +21 XXXXXX :[10] v
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:6
+insert history_0 range=:15 bump=6
+insert line-scrolldown bump=21 [% XXXXXX=[10]%v]
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check scroll-down fully reversible even if over wrapped
 > /window.history.scroll down
-insert history_0 4:26 +0
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert history_0 range=4:26 bump=0
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 > /window.history.scroll up
-insert lines-empty :6
-insert history_0 :15 +6
-insert line-scrolldown : +21 XXXXXX :[10] v
-insert lines-status-prompt-start : +22 FOCUS_X=77 FOCUS_STR=0 X123456789X123456789X :=================(§§§
+insert lines-empty range=:6
+insert history_0 range=:15 bump=6
+insert line-scrolldown bump=21 [% XXXXXX=[10]%v]
+insert lines-status-prompt-start [(FOCUS_X)=77 (FOCUS_STR)=0 X123456789X123456789X==================(§§§]
 
 # check wrapped input only increases below-scroll count by one
 > /bar_0123456789_0123456789_0123456789_
 log 0 # invalid prompt command: /bar_0123456789_0123456789_0123456789_ unknown
-insert lines-empty :6
-insert history_0 :15 +6
-insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:6
+insert history_0 range=:15 bump=6
+insert line-scrolldown bump=21 [% XXXXXX=[11]%v]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:1) X123456789X123456789X==============(§§§§§§§]
 
 # check scroll-down over wrapped will snap down to bottom of wrapped
 > /window.history.scroll down
-insert history_0 5:26 +0
-insert line-scrolldown : +21 XXXXXX :[1] vv
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
+insert history_0 range=5:26 bump=0
+insert line-scrolldown bump=21 [% XXXXXX=[1]%vv]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:1) X123456789X123456789X==============(§§§§§§§]
 
 # # check scrolls-up over longer history until top
 > /window.history.scroll up
-insert lines-empty :6
-insert history_0 :15 +6
-insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:6
+insert history_0 range=:15 bump=6
+insert line-scrolldown bump=21 [% XXXXXX=[11]%v]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:1) X123456789X123456789X==============(§§§§§§§]
 > /window.history.scroll up
-insert lines-empty :17
-insert history_0 :3 +17
-insert line-scrolldown : +21 XXXXXX :[22] v
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:17
+insert history_0 range=:3 bump=17
+insert line-scrolldown bump=21 [% XXXXXX=[22]%v]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:1) X123456789X123456789X==============(§§§§§§§]
 > /window.history.scroll up
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[25] v
-insert lines-status-prompt-start : +22 FOCUS_X=73 FOCUS_STR=(0:1) X123456789X123456789X :=============(§§§§§§§
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[25]%v]
+insert lines-status-prompt-start [(FOCUS_X)=73 (FOCUS_STR)=(0:1) X123456789X123456789X==============(§§§§§§§]
 
 # check that triggering creation of new window with new lines adds it to status, with unread-lines count
 insert connect-to-connected
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[25] v
-insert lines-status-prompt-start : +22 FOCUS_X=60 FOCUS_STR=(0:1) X123456789X123456789X :(§§§§§§§ (1:14) (2:7)
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[25]%v]
+insert lines-status-prompt-start [% (FOCUS_X)=60 (FOCUS_STR)=(0:1) X123456789X123456789X=(§§§§§§§%(1:14)%(2:7)]
 
 # check switch to other window, updates to status line (movement of brackets, clearing of own unread-lines count)
 > /window 1
-insert lines-empty :8
-insert history_1 :14 +8
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=====((0:1) §§§ (2:7)
+insert lines-empty range=:8
+insert history_1 range=:14 bump=8
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X======((0:1)%§§§%(2:7)]
 
 # check switch-back to window 0, retaining clearing of window 1's unread-lines count
 > /window 0
-insert lines-empty :20
-insert history_0 :1 +20
-insert line-scrolldown : +21 XXXXXX :[25] v
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=(0:1) X123456789X123456789X :=====(§§§§§§§ 1 (2:7)
+insert lines-empty range=:20
+insert history_0 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[25]%v]
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=(0:1) X123456789X123456789X======(§§§§§§§%1%(2:7)]
 
 # check that on full scroll-down, we now have a bookmark above the newest lines not previously scrolled into
 > /window.history.scroll down
-insert lines-empty :9
-insert history_0 :12 +9
-insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=(0:1) X123456789X123456789X :=====(§§§§§§§ 1 (2:7)
+insert lines-empty range=:9
+insert history_0 range=:12 bump=9
+insert line-scrolldown bump=21 [% XXXXXX=[14]%v]
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=(0:1) X123456789X123456789X======(§§§§§§§%1%(2:7)]
 > /window.history.scroll down
-insert history_0 2:23 +0
-insert line-scrolldown : +21 XXXXXX :[3] vv
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=(0:1) X123456789X123456789X :=====(§§§§§§§ 1 (2:7)
+insert history_0 range=2:23 bump=0
+insert line-scrolldown bump=21 [% XXXXXX=[3]%vv]
+insert lines-status-prompt-start bump=22 [% (FOCUS_X)=65 (FOCUS_STR)=(0:1) X123456789X123456789X======(§§§§§§§%1%(2:7)]
 > /window.history.scroll down
-insert history_0 7:26 +0
-insert line-bookmark : +19
-insert history_0 26:28 +20
-insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
+insert history_0 range=7:26 bump=0
+insert line-bookmark bump=19
+insert history_0 range=26:28 bump=20
+insert lines-status-prompt-start [% (FOCUS_X)=69 (FOCUS_STR)=0 X123456789X123456789X==========(§§§%1%(2:7)]
 
 # check SIGWINCH does not re-set bookmark
 > raise_sigwinch
-insert history_0 7:26 +0
-insert line-bookmark : +19
-insert history_0 26:28 +20
-insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
+insert history_0 range=7:26 bump=0
+insert line-bookmark bump=19
+insert history_0 range=26:28 bump=20
+insert lines-status-prompt-start [% (FOCUS_X)=69 (FOCUS_STR)=0 X123456789X123456789X==========(§§§%1%(2:7)]
 
 # 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
-insert lines-empty :3
-insert history_0 :18 +3
-insert line-scrolldown : +21 XXXXXX :[8] vv
-insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
+insert lines-empty range=:3
+insert history_0 range=:18 bump=3
+insert line-scrolldown bump=21 [% XXXXXX=[8]%vv]
+insert lines-status-prompt-start [% (FOCUS_X)=69 (FOCUS_STR)=0 X123456789X123456789X==========(§§§%1%(2:7)]
 > /window.history.scroll down
-insert history_0 7:26 +0
-insert line-bookmark : +19
-insert history_0 26:28 +20
-insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
+insert history_0 range=7:26 bump=0
+insert line-bookmark bump=19
+insert history_0 range=26:28 bump=20
+insert lines-status-prompt-start [% (FOCUS_X)=69 (FOCUS_STR)=0 X123456789X123456789X==========(§§§%1%(2:7)]
 
 # check that second switch to new window, previously left on bottom of history, establishes bookmark at bottom of log
 > /window 1
-insert lines-empty :7
-insert history_1 :14 +7
-insert line-bookmark : +21
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert lines-empty range=:7
+insert history_1 range=:14 bump=7
+insert line-bookmark bump=21
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # 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
-insert history_0 7:28 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
+insert history_0 range=7:28 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=69 (FOCUS_STR)=0 X123456789X123456789X==========(§§§%1%(2:7)]
 
 # check new lines push bookmark up
 insert enter-list-start
 log 0 #   1) foo.bar.baz:debug
 log 0 #   2) foo.bar.baz:server
-insert history_0 11:28 +0
-insert line-bookmark : +17
-insert history_0 28:32 +18
-insert lines-status-prompt-start : +22 FOCUS_X=69 FOCUS_STR=0 X123456789X123456789X :=========(§§§ 1 (2:7)
+insert history_0 range=11:28 bump=0
+insert line-bookmark bump=17
+insert history_0 range=28:32 bump=18
+insert lines-status-prompt-start [% (FOCUS_X)=69 (FOCUS_STR)=0 X123456789X123456789X==========(§§§%1%(2:7)]
 
 # check new lines growing in other window, one of which long enough to wrap, to re-start count in status (with wrapped only as single) 
-insert ping-pong : +0 ? :0
-insert ping-pong : +0 ? :1
-insert ping-pong : +0 ? :2
-insert ping-pong : +0 ? :9 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
-insert history_0 11:28 +0
-insert line-bookmark : +17
-insert history_0 28:32 +18
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:8) (2:7)
+insert ping-pong [?=0]
+insert ping-pong [?=1]
+insert ping-pong [?=2]
+insert ping-pong [% ?=9%123456789%123456789%123456789%123456789%123456789%123456789%123456789%123456789]
+insert history_0 range=11:28 bump=0
+insert line-bookmark bump=17
+insert history_0 range=28:32 bump=18
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=0 X123456789X123456789X======(§§§%(1:8)%(2:7)]
 
 # 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
-insert history_1 3:14 +0
-insert line-bookmark : +11
-insert history_1 14:24 +12
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert history_1 range=3:14 bump=0
+insert line-bookmark bump=11
+insert history_1 range=14:24 bump=12
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # check that growth below scroll does not by itself re-position bookmark in history
 > /window.history.scroll up
-insert ping-pong : +0 ? :3
-insert lines-empty :7
-insert history_1 0:14 +7
-insert line-scrolldown : +21 XXXXXX :[10] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert ping-pong bump=0 [?=3]
+insert lines-empty range=:7
+insert history_1 range=0:14 bump=7
+insert line-scrolldown bump=21 [% XXXXXX=[10]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:2) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert history_1 4:14 +0
-insert line-bookmark : +10
-insert history_1 14:24 +11
-insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert history_1 range=4:14 bump=0
+insert line-bookmark bump=10
+insert history_1 range=14:24 bump=11
+insert line-scrolldown bump=21 [% XXXXXX=[2]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:2) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 
 # 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
-insert history_0 11:32 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:2) (2:7)
+insert history_0 range=11:32 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=0 X123456789X123456789X======(§§§%(1:2)%(2:7)]
 > /window 1
-insert history_1 4:24 +0
-insert line-bookmark : +20
-insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert history_1 range=4:24 bump=0
+insert line-bookmark bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[2]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:2) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 
-# check that growing lines below scroll in other preserves non-bottom bookmark (left in sight on previous window leave)
+# check that growing lines below scroll in other preserves non-bottom bookmark (left in sight on previous window leave)]
 > /window 0
-insert ping-pong : +0 ? :4
-insert history_0 11:32 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:4) (2:7)
+insert ping-pong bump=0 [?=4]
+insert history_0 range=11:32 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=0 X123456789X123456789X======(§§§%(1:4)%(2:7)]
 > /window 1
-insert history_1 4:24 +0
-insert line-bookmark : +20
-insert line-scrolldown : +21 XXXXXX :[4] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:4) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert history_1 range=4:24 bump=0
+insert line-bookmark bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[4]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:4) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 
 # check same applies when leaving affected window with bookmark out-of-sight
 > /window.history.scroll up
-insert lines-empty :7
-insert history_1 :14 +7
-insert line-scrolldown : +21 XXXXXX :[12] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:4) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert lines-empty range=:7
+insert history_1 range=:14 bump=7
+insert line-scrolldown bump=21 [% XXXXXX=[12]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:4) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 > /window 0
-insert ping-pong : +0 ? :5
-insert history_0 11:32 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:6) (2:7)
+insert ping-pong bump=0 [?=5]
+insert history_0 range=11:32 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=0 X123456789X123456789X======(§§§%(1:6)%(2:7)]
 > /window 1
-insert lines-empty :7
-insert history_1 :14 +7
-insert line-scrolldown : +21 XXXXXX :[14] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:6) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert lines-empty range=:7
+insert history_1 range=:14 bump=7
+insert line-scrolldown bump=21 [% XXXXXX=[14]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:6) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert history_1 4:24 +0
-insert line-bookmark : +20
-insert line-scrolldown : +21 XXXXXX :[6] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:6) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert history_1 range=4:24 bump=0
+insert line-bookmark bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[6]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:6) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert history_1 9:24 +0
-insert line-bookmark : +15
-insert history_1 24:30 +16
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert history_1 range=9:24 bump=0
+insert line-bookmark bump=15
+insert history_1 range=24:30 bump=16
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # check log growth beyond max depth only remarkable after scrolling up to limit
-insert ping-pong : +0 ? :6
-insert history_1 11:24 +0
-insert line-bookmark : +13
-insert history_1 24:32 +14
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert ping-pong bump=0 [?=6]
+insert history_1 range=11:24 bump=0
+insert line-bookmark bump=13
+insert history_1 range=24:32 bump=14
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 > /window.history.scroll up
-insert history_1 1:22 +0
-insert line-scrolldown : +21 XXXXXX :[9] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert history_1 range=1:22 bump=0
+insert line-scrolldown bump=21 [% XXXXXX=[9]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 > /window.history.scroll up
-insert lines-empty :10
-insert history_1 :11 +10
-insert line-scrolldown : +21 XXXXXX :[19] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert lines-empty range=:10
+insert history_1 range=:11 bump=10
+insert line-scrolldown bump=21 [% XXXXXX=[19]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 > /window.history.scroll up
-insert lines-empty :20
-insert history_1 :1 +20
-insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert lines-empty range=:20
+insert history_1 range=:1 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[29]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # check cut-off log growth seen from topmost scroll not affecting scrolldown count, but unread-lines status
-insert ping-pong : +0 ? :7
-insert lines-empty :20
-insert history_1 2:3 +20
-insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert ping-pong bump=0 [?=7]
+insert lines-empty range=:20
+insert history_1 range=2:3 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[29]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:2) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 
 # check unread-lines count potentially growing above max log depth if in other window
 > /window 0
-insert history_0 11:32 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=65 FOCUS_STR=0 X123456789X123456789X :=====(§§§ (1:2) (2:7)
-insert ping-pong : +0 ? :8
-insert ping-pong : +0 ? :9
-insert ping-pong : +0 ? :10
-insert ping-pong : +0 ? :11
-insert ping-pong : +0 ? :12
-insert ping-pong : +0 ? :13
-insert ping-pong : +0 ? :14
-insert ping-pong : +0 ? :15
-insert ping-pong : +0 ? :16
-insert ping-pong : +0 ? :17
-insert ping-pong : +0 ? :18
-insert ping-pong : +0 ? :19
-insert ping-pong : +0 ? :20
-insert ping-pong : +0 ? :21
-insert ping-pong : +0 ? :22
-insert history_0 11:32 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=64 FOCUS_STR=0 X123456789X123456789X :====(§§§ (1:32) (2:7)
+insert history_0 range=11:32 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=65 (FOCUS_STR)=0 X123456789X123456789X======(§§§%(1:2)%(2:7)]
+insert ping-pong [?=8]
+insert ping-pong [?=9]
+insert ping-pong [?=10]
+insert ping-pong [?=11]
+insert ping-pong [?=12]
+insert ping-pong [?=13]
+insert ping-pong [?=14]
+insert ping-pong [?=15]
+insert ping-pong [?=16]
+insert ping-pong [?=17]
+insert ping-pong [?=18]
+insert ping-pong [?=19]
+insert ping-pong [?=20]
+insert ping-pong [?=21]
+insert ping-pong [?=22]
+insert history_0 range=11:32 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=64 (FOCUS_STR)=0 X123456789X123456789X=====(§§§%(1:32)%(2:7)]
 
 # check switching into window scrolled-top with more unread lines than max log depth shrinks former to latter, and scrolling down no bookmark is to be found
 > /window 1
-insert lines-empty :20
-insert history_1 34:35 +20
-insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:29) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
+insert lines-empty range=:20
+insert history_1 range=34:35 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[29]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=66 (FOCUS_STR)=(1:29) X123456789X123456789X=====(0%§§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert lines-empty :9
-insert history_1 34:46 +9
-insert line-scrolldown : +21 XXXXXX :[18] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:18) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
+insert lines-empty range=:9
+insert history_1 range=34:46 bump=9
+insert line-scrolldown bump=21 [% XXXXXX=[18]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=66 (FOCUS_STR)=(1:18) X123456789X123456789X=====(0%§§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert history_1 36:57 +0
-insert line-scrolldown : +21 XXXXXX :[7] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:7) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert history_1 range=36:57 bump=0
+insert line-scrolldown bump=21 [% XXXXXX=[7]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:7) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert history_1 42:62 +0
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert history_1 range=42:62 bump=0
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # check bookmark remains absent with log growing while scrolled to bottom, …
-insert ping-pong : +0 ? :23
-insert history_1 44:64 +0
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert ping-pong [?=23]
+insert history_1 range=44:64 bump=0
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # … as well as if further growth happens below scroll 
 > /window.history.scroll up
-insert lines-empty :2
-insert history_1 36:55 +2
-insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
-insert ping-pong : +0 ? :24
-insert lines-empty :4
-insert history_1 38:55 +4
-insert line-scrolldown : +21 XXXXXX :[13] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
-> /window.history.scroll down 
-insert history_1 45:66 +0
-insert line-scrolldown : +21 XXXXXX :[2] vv
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=67 FOCUS_STR=(1:2) X123456789X123456789X :=====(0 §§§§§§§ (2:7)
+insert lines-empty range=:2
+insert history_1 range=36:55 bump=2
+insert line-scrolldown bump=21 [% XXXXXX=[11]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
+insert ping-pong bump=0 [?=24]
+insert lines-empty range=:4
+insert history_1 range=38:55 bump=4
+insert line-scrolldown bump=21 [% XXXXXX=[13]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:2) X123456789X123456789X======(0%§§§§§§§%(2:7)]
+> /window.history.scroll down
+insert history_1 range=45:66 bump=0
+insert line-scrolldown bump=21 [% XXXXXX=[2]%vv]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=67 (FOCUS_STR)=(1:2) X123456789X123456789X======(0%§§§§§§§%(2:7)]
 > /window.history.scroll down 
-insert history_1 46:68 +0
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
+insert history_1 range=46:68 bump=0
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
 
 # check unread-lines status not growing beyond max log if within active window, and …
 > /window.history.scroll up
-insert lines-empty :2
-insert history_1 38:55 +2
-insert line-scrolldown : +21 XXXXXX :[11] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=71 FOCUS_STR=1 X123456789X123456789X :=========(0 §§§ (2:7)
-insert ping-pong : +0 ? :25
-insert ping-pong : +0 ? :26
-insert ping-pong : +0 ? :27
-insert ping-pong : +0 ? :28
-insert ping-pong : +0 ? :29
-insert ping-pong : +0 ? :30
-insert ping-pong : +0 ? :31
-insert ping-pong : +0 ? :32
-insert ping-pong : +0 ? :33
-insert ping-pong : +0 ? :34
-insert ping-pong : +0 ? :35
-insert ping-pong : +0 ? :36
-insert ping-pong : +0 ? :37
-insert ping-pong : +0 ? :38
-insert ping-pong : +0 ? :39
-insert lines-empty :20
-insert history_1 68:69 +20
-insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:29) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
+insert lines-empty range=:2
+insert history_1 range=38:55 bump=2
+insert line-scrolldown bump=21 [% XXXXXX=[11]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=71 (FOCUS_STR)=1 X123456789X123456789X==========(0%§§§%(2:7)]
+insert ping-pong [?=25]
+insert ping-pong [?=26]
+insert ping-pong [?=27]
+insert ping-pong [?=28]
+insert ping-pong [?=29]
+insert ping-pong [?=30]
+insert ping-pong [?=31]
+insert ping-pong [?=32]
+insert ping-pong [?=33]
+insert ping-pong [?=34]
+insert ping-pong [?=35]
+insert ping-pong [?=36]
+insert ping-pong [?=37]
+insert ping-pong [?=38]
+insert ping-pong [?=39]
+insert lines-empty range=:20
+insert history_1 range=68:69 bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[29]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=66 (FOCUS_STR)=(1:29) X123456789X123456789X=====(0%§§§§§§§§%(2:7)]
 
 # … setting bookmark visible after switching back-and-forth
 > /window 0
-insert history_0 11:32 +0
-insert line-bookmark : +21
-insert lines-status-prompt-start : +22 FOCUS_X=64 FOCUS_STR=0 X123456789X123456789X :====(§§§ (1:29) (2:7)
+insert history_0 range=11:32 bump=0
+insert line-bookmark bump=21
+insert lines-status-prompt-start [% (FOCUS_X)=64 (FOCUS_STR)=0 X123456789X123456789X=====(§§§%(1:29)%(2:7)]
 > /window 1
-insert lines-empty :19
-insert history_1 68:69 +19
-insert line-bookmark : +20
-insert line-scrolldown : +21 XXXXXX :[29] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:29) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
+insert lines-empty range=:19
+insert history_1 range=68:69 bump=19
+insert line-bookmark bump=20
+insert line-scrolldown bump=21 [% XXXXXX=[29]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=66 (FOCUS_STR)=(1:29) X123456789X123456789X=====(0%§§§§§§§§%(2:7)]
 > /window.history.scroll down
-insert lines-empty :8
-insert history_1 68:69 +8
-insert line-bookmark : +9
-insert history_1 69:80 +10
-insert line-scrolldown : +21 XXXXXX :[18] v
-insert lines-status-prompt-foobarbaz : +22 FOCUS_X=66 FOCUS_STR=(1:18) X123456789X123456789X :====(0 §§§§§§§§ (2:7)
+insert lines-empty range=:8
+insert history_1 range=68:69 bump=8
+insert line-bookmark bump=9
+insert history_1 range=69:80 bump=10
+insert line-scrolldown bump=21 [% XXXXXX=[18]%v]
+insert lines-status-prompt-foobarbaz [% (FOCUS_X)=66 (FOCUS_STR)=(1:18) X123456789X123456789X=====(0%§§§§§§§§%(2:7)]
index 80dd83c62338a217adca7d964217fed3b67a5cab..ae0c54f9a7911fb0636dc4998d1587807e56f619 100644 (file)
@@ -4,8 +4,8 @@ insert ./lib/servermsglogged
 insert ./lib/servernotice
 
 × servermsglogged-and-line-unwrapped
-insert servermsglogged : +0 MSG :XXX
-line 21 0 on_black,bright_white < §§:§§:§§ XXX§§
+insert servermsglogged
+line 21 0 on_black,bright_white < §§:§§:§§ (MSG)§§
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
@@ -14,46 +14,46 @@ insert 001-setting-nick
 > /window 1
 
 # check full line not wrapped
-insert servermsglogged-and-line-unwrapped : +0 XXX ::foo.bar.baz 001 foo :6789 123456789 123456789 123456789 12345678 0
+insert servermsglogged-and-line-unwrapped [% (MSG)=:foo.bar.baz%001%foo%:6789%123456789%123456789%123456789%12345678%0]
 
 # check wrap if last space-separated item one char too long 
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 01
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:456789%123456789%123456789%123456789%12345678%01]
 line 20 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
 line 21 0 on_black,bright_white    01§§
 
 # check wrap if item starts right after width-final space
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789 1
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:456789%123456789%123456789%123456789%123456789%1]
 line 20 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789§§
 line 21 0 on_black,bright_white    1§§
 
 # check wrap if item starts right after space after item extending to end of width
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890 2
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:456789%123456789%123456789%123456789%1234567890%2]
 line 20 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
 line 21 0 on_black,bright_white    2§§
 
 # check wrap if item starts right after double-space after item extending to end of width
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890  3
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:456789%123456789%123456789%123456789%1234567890%%3]
 line 20 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
 line 21 0 on_black,bright_white     3§§
 
 # check wrap on item too large to fit into screen width minus indent
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_2345678
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_2345678]
 line 19 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
 line 20 0 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_234567§§
 line 21 0 on_black,bright_white   8
 
 # check wrapping calculation on double-width character (tbh not much of a test since the tester itself counts specifically this char as two, so it's pretty much the same as above testing with a sequence of two ASCII chars; mostly just ensures that the wrapping code relies on Terminal.length_to_term)
-insert servermsglogged-and-line-unwrapped : +0 XXX ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567 💓
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 💓
+insert servermsglogged-and-line-unwrapped [% (MSG)=:foo.bar.baz%002%foo%:456789%123456789%123456789%123456789%1234567%💓]
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:456789%123456789%123456789%123456789%12345678%💓]
 line 20 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
 line 21 0 on_black,bright_white    💓§§
-insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456💓
+insert servermsglogged [% (MSG)=:foo.bar.baz%002%foo%:2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456💓]
 line 19 0 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
 line 20 0 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456§§
 line 21 0 on_black,bright_white   💓§§
 
 # check interpretation and escape of formatting characters
-insert servernotice : +0 XXX :*** check that {esc|ape}s, formatting not counting into wrap
+insert servernotice [% (NOTICE)=***%check%that%{esc|ape}s,%formatting%not%counting%into%wrap]
 line 20 0 on_black,bright_white < §§:§§:§§ :*.?.net NOTICE * :*** check that {esc|ape}s, formatting not counting§§
 line 21 0 on_black,bright_white    into wrap§§
 > /window 2
index ee34d0160c7db8addf329a928fbfc8c65919de63..caa21bd47d2fff8fe7b5cc3f7f2ba81e808f63d9 100644 (file)
@@ -8,8 +8,9 @@ insert ./lib/enter_misc
 > 
 
 # expected complaints on wrong command inputs
-insert enter-unprefixed : +0 ? :foo
-insert enter-unknown : +0 ? :foo
+insert enter-unprefixed [?=foo]
+insert enter-unknown [?=foo]
+
 > /help foo
 log 0 # invalid prompt command: /help given argument(s) while none expected
 > /window
index 3402d58be7573ab5550303db969b8b4609b5301f..1a4db1e0f352d9075914174fd5c078f1a4d1d0d6 100644 (file)
@@ -3,64 +3,64 @@ insert ./lib/caps-neg-empty
 insert ./lib/001-to-usermode
 
 × new-hi
-insert servermsglogged : +0 MSG ::winWIN_ID!~winWIN_ID@bar.bar PRIVMSG foo :hi there
-log WIN_ID < [winWIN_ID] hi there
+insert servermsglogged [% (MSG)=:win(WIN_ID)!~win(WIN_ID)@bar.bar%PRIVMSG%foo%:hi%there]
+log (WIN_ID) < [win(WIN_ID)] hi there
 
 × status-line
-line 22 0 on_black,bright_white LINE
-line 22 FOCUS_X on_black,bright_white,bold [FOCUS_STR]
+line 22 0 on_black,bright_white (LINE)
+line 22 (FOCUS_X) on_black,bright_white,bold [(FOCUS_STR)]
 
 × ×---------------------------------
 
 insert connect-to-connected
 insert caps-neg-empty
 insert 001-to-usermode
-insert new-hi : + WIN_ID :3
-insert new-hi : + WIN_ID :4
-insert new-hi : + WIN_ID :5
-insert new-hi : + WIN_ID :6
-insert new-hi : + WIN_ID :7
-insert new-hi : + WIN_ID :8
-insert new-hi : + WIN_ID :9
-insert new-hi : + WIN_ID :10
-insert status-line : + FOCUS_X=15 FOCUS_STR=0 LINE ::start)=======(§§§ (1:32) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2)§§
+insert new-hi [(WIN_ID)=3]
+insert new-hi [(WIN_ID)=4]
+insert new-hi [(WIN_ID)=5]
+insert new-hi [(WIN_ID)=6]
+insert new-hi [(WIN_ID)=7]
+insert new-hi [(WIN_ID)=8]
+insert new-hi [(WIN_ID)=9]
+insert new-hi [(WIN_ID)=10]
+insert status-line [% (FOCUS_X)=15 (FOCUS_STR)=0 (LINE)=:start)=======(§§§%(1:32)%(2:7)%(3:2)%(4:2)%(5:2)%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)§§]
 
 # grow windows list to maximum before ellipsis necessary
-insert new-hi : + WIN_ID :11
-insert status-line : + FOCUS_X=8 FOCUS_STR=0 LINE ::start)(§§§ (1:33) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:2)§§
+insert new-hi [(WIN_ID)=11]
+insert status-line [% (FOCUS_X)=8 (FOCUS_STR)=0 (LINE)=:start)(§§§%(1:33)%(2:7)%(3:2)%(4:2)%(5:2)%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)%(11:2)§§]
 
 # grow list beyond, with focus on left force ellipsis to the right
-insert new-hi : + WIN_ID :12
-insert status-line : + FOCUS_X=8 FOCUS_STR=0 LINE ::start)(§§§ (1:34) (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:…>§§
+insert new-hi [(WIN_ID)=12]
+insert status-line [% (FOCUS_X)=8 (FOCUS_STR)=0 (LINE)=:start)(§§§%(1:34)%(2:7)%(3:2)%(4:2)%(5:2)%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)%(11:…>§§]
 
 # shrink (uncut) listing but grow title to the left more, forcing ellipsis still to cut earlier
 > /window 1
-insert status-line : + FOCUS_X=21 FOCUS_STR=1 LINE :foo.bar.baz:debug)(0 §§§ (2:7) (3:2) (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2…>§§
+insert status-line [% (FOCUS_X)=21 (FOCUS_STR)=1 (LINE)=foo.bar.baz:debug)(0%§§§%(2:7)%(3:2)%(4:2)%(5:2)%(6:2)%(7:2)%(8:2)%(9:2)%(10:2…>§§]
 
 # further shrink uncut listing until ellipsis gone again; with focus not moving beyond left half, don't scroll yet
 > /window 3
-insert status-line : + FOCUS_X=28 FOCUS_STR=3 LINE :foo.bar.baz/win3)(0 1 (2:7) §§§ (4:2) (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11…>§§
+insert status-line [% (FOCUS_X)=28 (FOCUS_STR)=3 (LINE)=foo.bar.baz/win3)(0%1%(2:7)%§§§%(4:2)%(5:2)%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)%(11…>§§]
 > /window 4
-insert status-line : + FOCUS_X=30 FOCUS_STR=4 LINE :foo.bar.baz/win4)(0 1 (2:7) 3 §§§ (5:2) (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) …>§§
+insert status-line [% (FOCUS_X)=30 (FOCUS_STR)=4 (LINE)=foo.bar.baz/win4)(0%1%(2:7)%3%§§§%(5:2)%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)%(11:2)%…>§§]
 > /window 5
-insert status-line : + FOCUS_X=32 FOCUS_STR=5 LINE :foo.bar.baz/win5)(0 1 (2:7) 3 4 §§§ (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) (12:2)§§
+insert status-line [% (FOCUS_X)=32 (FOCUS_STR)=5 (LINE)=foo.bar.baz/win5)(0%1%(2:7)%3%4%§§§%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)%(11:2)%(12:2)§§]
 
 # grow uncut listing again, re-establishing ellipsis to the right
-insert new-hi : + WIN_ID :13
-insert status-line : + FOCUS_X=36 FOCUS_STR=5 LINE :foo.bar.baz/win5)(0 (1:1) (2:7) 3 4 §§§ (6:2) (7:2) (8:2) (9:2) (10:2) (11:2) …>§§
+insert new-hi [(WIN_ID)=13]
+insert status-line [% (FOCUS_X)=36 (FOCUS_STR)=5 (LINE)=foo.bar.baz/win5)(0%(1:1)%(2:7)%3%4%§§§%(6:2)%(7:2)%(8:2)%(9:2)%(10:2)%(11:2)%…>§§]
 
 # move focus into middle of listing, scrolling so that ellipsis on both side
 > /window 8
-insert status-line : + FOCUS_X=47 FOCUS_STR=8 LINE :foo.bar.baz/win8)<…:1) (2:7) 3 4 5 (6:2) (7:2) §§§ (9:2) (10:2) (11:2) (12:2) …>§§
+insert status-line [% (FOCUS_X)=47 (FOCUS_STR)=8 (LINE)=foo.bar.baz/win8)<…:1)%(2:7)%3%4%5%(6:2)%(7:2)%§§§%(9:2)%(10:2)%(11:2)%(12:2)%…>§§]
 
 # move focus further to the right, so that only ellipsis on the left
 > /window 9
-insert status-line : + FOCUS_X=49 FOCUS_STR=9 LINE :foo.bar.baz/win9)<…:1) (2:7) 3 4 5 (6:2) (7:2) 8 §§§ (10:2) (11:2) (12:2) (13:2)§§
+insert status-line [% (FOCUS_X)=49 (FOCUS_STR)=9 (LINE)=foo.bar.baz/win9)<…:1)%(2:7)%3%4%5%(6:2)%(7:2)%8%§§§%(10:2)%(11:2)%(12:2)%(13:2)§§]
 
 # shrink uncut listing to return to full view again (no ellipses) 
 > /window 13
-insert status-line : + FOCUS_X=76 FOCUS_STR=13 LINE :foo.bar.baz/win13)(0 (1:1) (2:7) 3 4 5 (6:2) (7:2) 8 9 (10:2) (11:2) (12:2) §§§§§§
+insert status-line [% (FOCUS_X)=76 (FOCUS_STR)=13 (LINE)=foo.bar.baz/win13)(0%(1:1)%(2:7)%3%4%5%(6:2)%(7:2)%8%9%(10:2)%(11:2)%(12:2)%§§§§§§]
 
 # add new window, re-establishing ellipsis to the left, with focus remaining quite to the right
-insert new-hi : + WIN_ID :14
-insert status-line : + FOCUS_X=69 FOCUS_STR=13 LINE :foo.bar.baz/win13)<…(2:7) 3 4 5 (6:2) (7:2) 8 9 (10:2) (11:2) (12:2) §§§§ (14:2)§§
+insert new-hi [(WIN_ID)=14]
+insert status-line [% (FOCUS_X)=69 (FOCUS_STR)=13 (LINE)=foo.bar.baz/win13)<…(2:7)%3%4%5%(6:2)%(7:2)%8%9%(10:2)%(11:2)%(12:2)%§§§§%(14:2)§§]
index 967044f239682bfffda211674c95d0a8dbce7f9b..fade4e346afafcf7d92699d2a9585415559d1590 100644 (file)
@@ -12,80 +12,80 @@ insert ./lib/user-set-to
 
 × connecting-to-nick
 > /reconnect
-insert attempting-to-connected-w-password : + SECRET=foo WIN_IDS :2
+insert attempting-to-connected-w-password [SECRET=foo]
 
 × cap-to-auth
 insert get-sasl-plain
 log 1 $ sasl_auth_state set to: [attempting]
 log 1 > AUTHENTICATE :PLAIN
-insert servermsglogged : + MSG :AUTHENTICATE +
+insert servermsglogged [% (MSG)=AUTHENTICATE%+]
 log 1 > AUTHENTICATE :Zm9vAGZvbwBmb28=
 
 × end-auth
-insert servermsglogged : + MSG ::foo.bar.baz NUMERIC foo :SASL authentication SASL_STATE
-log 1 $ sasl_auth_state set to: [SASL authentication SASL_STATE]
+insert servermsglogged [% (MSG)=:foo.bar.baz%(NUMERIC)%foo%:SASL%authentication%(SASL_STATE)]
+log 1 $ sasl_auth_state set to: [SASL authentication (SASL_STATE)]
 log 1 > CAP :END
 
 × ×-------------------------------------
 
-insert connect-w-password : + SECRET :foo
+insert connect-w-password [SECRET=foo]
 
 # check not setting any user data, going straight to disconnect once possible
-insert connecting-to-nick 1:
+insert connecting-to-nick range=1:
 > /window 1
 #
-insert cmd-disconnect-0 :2
-insert cmd-disconnect-1 :-1
-insert disconnect1 1:-1 + WIN_IDS :2
+insert cmd-disconnect-0 range=:2
+insert cmd-disconnect-1 range=:-1
+insert disconnect1 range=1:-1
 
 # check going straight to disconnect once possible, only receiving user data in QUIT message
 insert connecting-to-nick
 #
-insert cmd-disconnect-0 :-2 + ~baz@baz.bar.foo :~foo@foo.foo
-insert user-set-to : + USER_ID=me USERNICK=foo USERNAME=~foofoo USERHOST :foo.foo
-insert cmd-disconnect-0 -2: + ~baz@baz.bar.foo :~foo@foo.foo
-insert cmd-disconnect-1 :-1
-insert disconnect1 1: + WIN_IDS :2
+insert cmd-disconnect-0 range=:-2 [~baz@baz.bar.foo=~foo@foo.foo]
+insert user-set-to [(USER_ID)=me (USER_NICK)=foo (USER_USER)=~foofoo (USER_HOST)=foo.foo]
+insert cmd-disconnect-0 range=-2: [~baz@baz.bar.foo=~foo@foo.foo]
+insert cmd-disconnect-1 range=:-1
+insert disconnect1 range=1:
 
 # check receiving nickname during set-up, other stuff only via QUIT message
 # check immediate 
 insert connecting-to-nick
-insert cap-msg : + CAPMSG :* LS :
+insert cap-msg [% (CAP_MSG)=*%LS%:]
 log 1 > CAP :LIST
-insert cap-msg : + CAPMSG :foo LIST :
-insert user-set-to :1 + USER_ID=me USERNICK :foo
+insert cap-msg [% (CAP_MSG)=foo%LIST%:]
+insert user-set-to range=:1 [(USER_ID)=me (USER_NICK)=foo]
 log 1 > CAP :END
 #
-insert cmd-disconnect-0 :-2 + ~baz@baz.bar.foo :~foo@foo.foo
-insert user-set-to 1: + USER_ID=me USERNAME=~foofoo USERHOST :foo.foo
-insert cmd-disconnect-0 -2: + ~baz@baz.bar.foo :~foo@foo.foo
-insert cmd-disconnect-1 :-1
-insert disconnect1 1: + WIN_IDS :2
+insert cmd-disconnect-0 range=:-2 [~baz@baz.bar.foo=~foo@foo.foo]
+insert user-set-to range=1: [(USER_ID)=me (USER_USER)=~foofoo (USER_HOST)=foo.foo]
+insert cmd-disconnect-0 range=-2: [~baz@baz.bar.foo=~foo@foo.foo]
+insert cmd-disconnect-1 range=:-1
+insert disconnect1 range=1:
 
 # check failing SASL authentication
 insert connecting-to-nick
 insert cap-to-auth
-insert end-auth : + NUMERIC=904 SASL_STATE :failed
+insert end-auth [(NUMERIC)=904 (SASL_STATE)=failed]
 #
-insert cmd-disconnect-0 :-2 + ~baz@baz.bar.foo :~foo@foo.foo
-insert user-set-to 1: + USER_ID=me USERNAME=~foofoo USERHOST :foo.foo
-insert cmd-disconnect-0 -2: + ~baz@baz.bar.foo :~foo@foo.foo
+insert cmd-disconnect-0 range=:-2 [~baz@baz.bar.foo=~foo@foo.foo]
+insert user-set-to range=1: [(USER_ID)=me (USER_USER)=~foofoo (USER_HOST)=foo.foo]
+insert cmd-disconnect-0 range=-2: [~baz@baz.bar.foo=~foo@foo.foo]
 insert cmd-disconnect-1
-insert disconnect1 1:-1 + WIN_IDS :2
+insert disconnect1 range=1:-1
 log 1 $ sasl_auth_state set to: []
-insert disconnect1 -1:
+insert disconnect1 range=-1:
 
 # check successful SASL authentication
 insert connecting-to-nick
 insert cap-to-auth
-insert servermsglogged : + MSG ::foo.bar.baz 900 foo foo!foo@foo.foo foo :You are now logged in as foo
-insert user-set-to 1: + USER_ID=me USERNAME=foo USERHOST :foo.foo
+insert servermsglogged [% (MSG)=:foo.bar.baz%900%foo%foo!foo@foo.foo%foo%:You%are%now%logged%in%as%foo]
+insert user-set-to range=1: [(USER_ID)=me (USER_USER)=foo (USER_HOST)=foo.foo]
 log 1 $ sasl_account set to: [foo]
-insert end-auth : + NUMERIC=903 SASL_STATE :successful
+insert end-auth [(NUMERIC)=903 (SASL_STATE)=successful]
 
 # check tilde addition and MODE setting
-insert servermsglogged : + MSG ::foo!~foo@foo.foo MODE foo +aBc 
+insert servermsglogged [% (MSG)=:foo!~foo@foo.foo%MODE%foo%+aBc]
 log 1 $ users:me:user set to: [~foo]
 log 1 $ users:me:modes set to: [Bac]
-insert servermsglogged : + MSG ::foo!~foo@foo.foo MODE foo -cba
+insert servermsglogged [% (MSG)=:foo!~foo@foo.foo%MODE%foo%-cba]
 log 1 $ users:me:modes set to: [B]