home · contact · privacy
In testing script inserts, allow more than one replacement instruction.
authorChristian Heller <c.heller@plomlompom.de>
Sat, 15 Nov 2025 22:10:10 +0000 (23:10 +0100)
committerChristian Heller <c.heller@plomlompom.de>
Sat, 15 Nov 2025 22:10:10 +0000 (23:10 +0100)
39 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/001-to-usermode [new file with mode: 0644]
src/tests/lib/attempting-to-connected
src/tests/lib/bazbarfoo [deleted file]
src/tests/lib/cap-msg [new file with mode: 0644]
src/tests/lib/caps [deleted file]
src/tests/lib/caps-data-set [new file with mode: 0644]
src/tests/lib/caps-neg-empty [new file with mode: 0644]
src/tests/lib/channels [deleted file]
src/tests/lib/cmd-disconnect
src/tests/lib/cmd-nick [new file with mode: 0644]
src/tests/lib/connect-to-connected
src/tests/lib/disconnect-to-stop-auto-reconnect [new file with mode: 0644]
src/tests/lib/error-to-disconnect
src/tests/lib/error-to-disconnected
src/tests/lib/join-empty
src/tests/lib/no-handler [new file with mode: 0644]
src/tests/lib/no-timely-pong
src/tests/lib/part [new file with mode: 0644]
src/tests/lib/pingpong
src/tests/lib/privmsg [new file with mode: 0644]
src/tests/lib/req-sasl [new file with mode: 0644]
src/tests/lib/servernotice
src/tests/lib/trigger-ping [new file with mode: 0644]
src/tests/lib/user-set-to [new file with mode: 0644]
src/tests/lib/usermode [deleted file]
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

index 3c3e1794ab02e582e30e5bada08af8f66ad832c8..0f53f97df0ded0bf84f2e4cafb3301c8ff1055ec 100644 (file)
@@ -32,7 +32,7 @@ _TOK_IDX_REPEAT = 'r'
 
 _SIGNATURE_FOR_CMD = {
     _MARK_FRAGMENT: (1, None),
-    _MARK_INSERT: (5, 2),
+    _MARK_INSERT: (4, 2),
     _MARK_LOG: (2, 0),
     _MARK_PROMPT: (1, None),
     _MARK_SCREENLINE: (3, 0),
@@ -209,11 +209,8 @@ class _Playbook:
                    ) -> list[tuple[str, str]]:
 
             def crop_to_range(range_str: str) -> None:
-                try:
-                    idx_in, idx_out = ((int(val) if val else None)
-                                       for val in range_str.split(_SEP_2))
-                except ValueError as e:
-                    assert False, (e, idx_str, insert_args)
+                idx_in, idx_out = ((int(val) if val else None)
+                                   for val in range_str.split(_SEP_2))
                 candidates[:] = candidates[idx_in:idx_out]
 
             def replace_pattern(to_replace: str, replacement: str) -> None:
@@ -252,23 +249,37 @@ class _Playbook:
                                         or ',']
                     candidate[1] = _SEP_0.join(to_join)
 
-            assert len(insert_args) in (1, 2, 3, 5), (idx_str, insert_args)
-            if len(insert_args) == 1 and insert_args[0].startswith(_TOK_FILE):
-                if insert_args[0] in inserted_files:
-                    return []
-                inserted_files.add(insert_args[0])
-                return lines_t_from_file(PATH_TESTS.joinpath(insert_args[0]),
-                                         f'{idx_str}{_TOK_FILE}{_SEP_2}')
-            candidates = [
-                    [_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) >= 5:
-                replace_pattern(*insert_args[3:5])
-            if len(insert_args) >= 3:
-                bump_int_fields(int(insert_args[2]))
+            try:
+                if len(insert_args) == 1\
+                        and insert_args[0].startswith(_TOK_FILE):
+                    if insert_args[0] in inserted_files:
+                        return []
+                    inserted_files.add(insert_args[0])
+                    return lines_t_from_file(
+                            PATH_TESTS.joinpath(insert_args[0]),
+                            f'{idx_str}{_TOK_FILE}{_SEP_2}')
+                candidates = [
+                        [_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:
+                    bump_int_fields(int(insert_args[2]))
+            except (AssertionError, ValueError):
+                assert False, (idx_str, insert_args)
             return [(c[0], c[1]) for c in candidates]
 
         self._lines_t = lines_t_from_file(self._path)
index 1f0e04bb7a12995263b6d39f329591b7cc6f2fd8..32ace8f207e45bb09f8f45bdaee09fc073e69b88 100644 (file)
@@ -1,46 +1,41 @@
-insert ./lib/001-setting-nick
+insert ./lib/001-to-usermode
 insert ./lib/attempting-to-connected
-insert ./lib/bazbarfoo
-# for: attempting-bazbarfoo, connect-bazbarfoo
 insert ./lib/conn
 # for: attempting, connect, connected
 insert ./lib/cmd-disconnect
+# for: cmd-disconnect
 insert ./lib/disconnect
 # for: disconnect1
-insert ./lib/enter-list-start
+insert ./lib/disconnect-to-stop-auto-reconnect
 insert ./lib/no-timely-pong
 insert ./lib/retry-in
-insert ./lib/usermode
+insert ./lib/trigger-ping
 
 × fake-testing-timeout
 log 1 $ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
-insert retry-in : +1 ? §§
+insert retry-in : +1 ? :§§
 
 × attempting-to-connected-plus-timeout
-insert attempting-to-connected : +1 6697 10000
-servermsg 0 timeout
-log 1 > PING :what's up?
+insert attempting-to-connected : +1 6697=10000 WIN_IDS :2
+insert trigger-ping : +0 LOG_ID=1 SERVER_ID :0
 insert no-timely-pong
 
+× timeout-w-exponential-wait
+insert attempting : +1 6697 :OLD_PORT
+log 1 $ port set to: [NEW_PORT]
+insert fake-testing-timeout : +1 §§ :SECONDS
+
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 # 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 : +1 6697 10003
+insert connect : +1 6697 :10003
 
 # check increase of retry waits
-insert attempting : +1 6697 10003
-log 1 $ port set to: [10002]
-insert fake-testing-timeout : +1 §§ 1
-#
-insert attempting : +1 6697 10002
-log 1 $ port set to: [10001]
-insert fake-testing-timeout : +1 §§ 2
-#
-insert attempting : +1 6697 10001
-log 1 $ port set to: [10000]
-insert fake-testing-timeout : +1 §§ 4
+insert timeout-w-exponential-wait : +1 OLD_PORT=10003 NEW_PORT=10002 SECONDS :1
+insert timeout-w-exponential-wait : +1 OLD_PORT=10002 NEW_PORT=10001 SECONDS :2
+insert timeout-w-exponential-wait : +1 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
@@ -48,8 +43,7 @@ insert attempting-to-connected-plus-timeout
 
 # check /disconnect aborts retry chain
 > /window 1
-> /disconnect
-log 1 $ already disconnected, stopped connecting attempts
+insert disconnect-to-stop-auto-reconnect
 wait 2
 
 # to check timed auto-retries don't activate after manual intervention:
@@ -57,13 +51,11 @@ wait 2
 > /reconnect
 insert attempting-to-connected-plus-timeout
 > /reconnect
-insert attempting-to-connected : +1 6697 10000
+insert attempting-to-connected : +1 6697=10000 WIN_IDS :2
 wait 2
 
 # same way ensure retry chain wasn't solely blocked by being connected
-insert 001-setting-nick
-insert usermode
-insert cmd-disconnect-0
-insert cmd-disconnect-1 :-1
-insert disconnect1 1: +1 WIN_IDS 2
+insert 001-to-usermode
+insert cmd-disconnect :-1
+insert disconnect1 1: +1 WIN_IDS :2
 wait 2
index 1fe22a978cf73e7a953de4c2993b7023ae4b86ff..ee4b94707cc74888ac9a0eff339cd1a2dad73e76 100644 (file)
@@ -1,24 +1,25 @@
 insert ./lib/001-setting-nick
+insert ./lib/001-to-usermode
 insert ./lib/attempting-to-connected
 insert ./lib/connect-to-connected
-insert ./lib/caps
-# for: cap-msg, caps-neg-empty
+insert ./lib/cap-msg
+insert ./lib/caps-neg-empty
+insert ./lib/caps-data-set
 insert ./lib/cmd-disconnect
+# for: cmd-disconnect
 insert ./lib/disconnect
+insert ./lib/req-sasl
 # for: disconnect1
 insert ./lib/servermsglogged
-insert ./lib/usermode
 
 × disconnect-to-reconnect-0
-insert 001-setting-nick : +0
-insert usermode : +0
-insert cmd-disconnect-0 : +0
-insert cmd-disconnect-1 : +0
+insert 001-to-usermode : +0
+insert cmd-disconnect : +0
 
 × disconnect-to-reconnect-1
-insert disconnect1 1: +1 WIN_IDS 2
+insert disconnect1 1: +1 WIN_IDS :2
 > /reconnect
-insert attempting-to-connected : +1
+insert attempting-to-connected : +1 WIN_IDS :2
 
 × disconnect-to-reconnect
 insert disconnect-to-reconnect-0
@@ -36,9 +37,9 @@ insert disconnect-to-reconnect-0 :-1
 insert disconnect-to-reconnect-1
 
 # check full, alphabetical processing of multi-line responses
-insert cap-msg : +0 ??? * LS * :foo bar baz 
-insert cap-msg : +0 ??? * LS * :oof rab zab
-insert cap-msg : +0 ??? * LS :ofo rba zba
+insert cap-msg : +0 CAPMSG :* LS * :foo bar baz
+insert cap-msg : +0 CAPMSG :* LS * :oof rab zab
+insert cap-msg : +0 CAPMSG :* 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: []
@@ -49,8 +50,8 @@ 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 : +0 ??? * LIST * :foo rab oof
-insert cap-msg : +0 ??? * LIST :zab rba
+insert cap-msg : +0 CAPMSG :* LIST * :foo rab oof
+insert cap-msg : +0 CAPMSG :* 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]
@@ -61,26 +62,19 @@ log 1 > CAP :END
 insert disconnect-to-reconnect
 
 # check REQ for "sasl" (even if no PLAIN), denied
-insert servermsglogged : +0 MSG :*.?.net CAP * LS :foo bar sasl
+insert servermsglogged : +0 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: []
-log 1 > CAP REQ :sasl
-log 1 > CAP :LIST
-insert cap-msg : +0 ??? * NAK :sasl
-insert cap-msg : +0 ??? * LIST :
+insert req-sasl : +0 REPLY=NAK CAPLIST :
 log 1 > CAP :END
 
 insert disconnect-to-reconnect
 
 # check REQ for "sasl" with PLAIN successful (but for lack of password, negotiation still ending instantly)
-insert cap-msg : +0 ??? * LS :sasl=PLAIN
-log 1 $ caps:sasl:data set to: []
-log 1 $ caps:sasl:data set to: [PLAIN]
-log 1 > CAP REQ :sasl
-log 1 > CAP :LIST
-insert cap-msg : +0 ??? * ACK :sasl
-insert cap-msg : +0 ??? * LIST :sasl
+insert cap-msg : +0 CAPMSG :* LS :sasl=PLAIN
+insert caps-data-set : +1 CAPNAME=sasl CAPVAL :PLAIN
+insert req-sasl : +0 REPLY=ACK CAPLIST :sasl
 log 1 $ caps:sasl:enabled set to: [True]
 log 1 > CAP :END
 
@@ -88,10 +82,9 @@ log 1 > CAP :END
 insert 001-setting-nick
 
 # check NEW, DEL working after CAP :END
-insert cap-msg : +0 ??? foo NEW :foo bar=baz
-log 1 $ caps:bar:data set to: []
-log 1 $ caps:bar:data set to: [baz]
+insert cap-msg : +0 CAPMSG :foo NEW :foo bar=baz
+insert caps-data-set : +1 CAPNAME=bar CAPVAL :baz
 log 1 $ caps:foo:data set to: []
-insert cap-msg : +0 ??? foo DEL :sasl foo
+insert cap-msg : +0 CAPMSG :foo DEL :sasl foo
 log 1 $ caps:foo cleared
 log 1 $ caps:sasl cleared
index cb700ff9302eb4d85305c25acf06e208828d08fe..e970aa348c727081f9f9d752163826fca157009d 100644 (file)
@@ -1,53 +1,46 @@
 insert ./lib/001-setting-nick
-insert ./lib/caps
-# for: caps-neg-empty
-insert ./lib/channels
-# for: cmd-nick, JOIN0, join-w-topic, part0, part1, topics-test
+insert ./lib/001-to-usermode
+insert ./lib/attempting-to-connected
+insert ./lib/caps-neg-empty
 insert ./lib/cmd-disconnect
-insert ./lib/conn
-# for: attempting, connected
+# for: cmd-disconnect-0, cmd-disconnect-1
+insert ./lib/cmd-nick
+# for: cmd-nick, rename
 insert ./lib/connect-to-connected
 insert ./lib/disconnect
 # for: disconnect0, disconnect1
 insert ./lib/join-empty
+# for: join-channel-0, join-channel-1, join-empty
+insert ./lib/part
+insert ./lib/privmsg
 insert ./lib/retry-in
 insert ./lib/servermsglogged
-insert ./lib/usermode
+insert ./lib/user-set-to
 
-× part-ch_test0
-insert part0 : +0 CHANNEL #ch_test0
-log 3 $ foo!~foobarbaz@baz.bar.foo parts
-insert part1 : +1 CHANNEL #ch_test0
+× part-empty
+insert part :-3 +0 USERIDS_CLEAR :cleared
+log CHAN_WIN_ID $ foo!~baz@baz.bar.foo parts
+insert part -2:
 
-× part-ch_test1
-insert part0 : +0 CHANNEL #ch_test1
-log 4 $ foo!~foobarbaz@baz.bar.foo parts
-insert part1 : +1 CHANNEL #ch_test1
-
-× conn-init
-insert caps-neg-empty : +0
-insert 001-setting-nick : +0
-
-× privmsg_ch_test0
-> /privmsg #ch_test0 TXT
-log 1 > PRIVMSG #ch_test0 :TXT
-log 3 > [foo] TXT
+× topic-set-to
+log 1 $ channels:CHANNEL:topic set to: [Topic(what='NEWTOPIC', who=NickUserHost(nick='baz', user='~baz', host='baz.baz'))]
+log 4 $ baz!~baz@baz.baz set topic: NEWTOPIC
 
 × reconnect
 > /reconnect
-insert attempting : +1
-insert connected : +1 WIN_IDS 2,3,4
-insert conn-init : +0
+insert attempting-to-connected : +1 WIN_IDS :2,3,4
+insert caps-neg-empty : +0
+insert 001-setting-nick : +0
 log 1 > JOIN :#ch_test0
-insert usermode : +0 ~baz ~foobarbaz
-insert servermsglogged : +0 MSG :foo!~foobarbaz@baz.bar.foo JOIN #ch_test0
-insert join-empty : +0 CHANNEL #ch_test0
+insert usermode
+insert servermsglogged : +0 MSG ::foo!~baz@baz.bar.foo JOIN #ch_test0
+insert join-empty : +0 CHANNEL :#ch_test0
 
 × ×--------------------------
 
 insert connect-to-connected
-insert conn-init
-insert usermode : +0 ~baz ~foobarbaz
+insert caps-neg-empty
+insert 001-to-usermode
 
 # check inability to privmsg into channel not yet joined
 > /window 2
@@ -55,36 +48,31 @@ insert usermode : +0 ~baz ~foobarbaz
 log 2 $ not sending, since not in channel
 
 # check join with minimum context (no topic, no other users etc.)
-> /join #ch_test0
-insert JOIN0 : +0 CHANNEL #ch_test0
-insert join-empty : +0 CHANNEL #ch_test0
+insert join-empty : +0 CHANNEL :#ch_test0
 
 # check privmsg into channel from other window only works by direct addressing
-> /window 2
 > msg_test1
 log 2 # invalid prompt command: not prefixed by /
-insert privmsg_ch_test0 : +1 TXT msg_test1
+insert privmsg : +1 TARGET=#ch_test0 TXT :msg_test1
 
 # check from within channel window privmsg works directly and indirectly
 > /window 3
-> msg_test2
-log 1 > PRIVMSG #ch_test0 :msg_test2
-log 3 > [foo] msg_test2
-insert privmsg_ch_test0 : +1 TXT msg_test2
+insert privmsg : +1 TARGET=#ch_test0 TXT :msg_test2
+> msg_test3
+insert privmsg 1: +1 TARGET=#ch_test0 TXT :msg_test3
 
-# check /part from minimal context, and that it only works from within channel window, and if already in channel
+# 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-ch_test0
+insert part-empty : +0 CHAN_WIN_ID=3 CHANNEL :#ch_test0
 > /part
 log 3 $ not in that channel
 
 # check /join without argument joins channel previously joined in same window
 > /join
-insert JOIN0 : +0 CHANNEL #ch_test0
-insert join-empty : +0 CHANNEL #ch_test0
+insert join-empty 1: +0 CHANNEL :#ch_test0
 
 # check cannot /join channel already joined, neither from its window nor from elsewhere
 > /join
@@ -97,147 +85,138 @@ log 2 $ already in that channel
 
 # 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-ch_test0
-> /join #ch_test1
-insert JOIN0 : +0 CHANNEL #ch_test1
-insert join-empty :-1 +0 CHANNEL #ch_test1
+insert part-empty : +0 CHAN_WIN_ID=3 CHANNEL :#ch_test0
+insert join-empty :-1 +0 CHANNEL :#ch_test1
 log 4 $ residents: foo
 
-# check /join into channel with other users, with multi-line 353, and @ rather than =
-> /join #ch_test0
-insert JOIN0 : +0 CHANNEL #ch_test0
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo = #ch_test0 :foo bar baz
-log 1 $ channels:#ch_test0:exits cleared
-log 1 $ users:1:nick set to: [?]
-log 1 $ users:1:nick set to: [bar]
-log 1 $ users:2:nick set to: [?]
-log 1 $ users:2:nick set to: [baz]
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo = #ch_test0 :oof rab zab
-log 1 $ users:3:nick set to: [?]
-log 1 $ users:3:nick set to: [oof]
-log 1 $ users:4:nick set to: [?]
-log 1 $ users:4:nick set to: [rab]
-log 1 $ users:5:nick set to: [?]
-log 1 $ users:5:nick set to: [zab]
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo #ch_test0 :End of /NAMES list.
-log 1 $ channels:#ch_test0:user_ids set to: [1], [2], [3], [4], [5], [me]
-log 3 $ residents: bar, baz, oof, rab, zab, foo
+# check /join to channel with one other user, and @ rather than = in 353 message
+insert join-channel-0 :-3 +0 CHANNEL :#ch_test0
+insert servermsglogged : +0 MSG ::foo.bar.baz 353 foo @ #ch_test0 :foo bar
+insert join-channel-0 -1: +1 CHANNEL :#ch_test0
+insert user-set-to :2 +1 USER_ID=1 USERNICK :bar
+insert join-channel-1 : +0 CHANNEL=#ch_test0 RESIDENT_IDS :[1], [me]
+log 3 $ residents: bar, foo
+
+# check /part from channel with other user
+insert part : +0 CHANNEL=#ch_test0 CHAN_WIN_ID=3 USERIDS_CLEAR :set to: [1]
+log 1 $ users:1 cleared
+
+# check /join into channel with many other users, with multi-line 353
+insert join-channel-0 : +0 CHANNEL=#ch_test0 RESIDENT_NAMES :foo baz oof
+insert user-set-to :2 +1 USER_ID=2 USERNICK :baz
+insert user-set-to :2 +1 USER_ID=3 USERNICK :oof
+insert servermsglogged : +0 MSG ::foo.bar.baz 353 foo = #ch_test0 :rab zab
+insert user-set-to :2 +1 USER_ID=4 USERNICK :rab
+insert user-set-to :2 +1 USER_ID=5 USERNICK :zab
+insert join-channel-1 : +0 CHANNEL=#ch_test0 RESIDENT_IDS :[2], [3], [4], [5], [me]
+log 3 $ residents: baz, oof, rab, zab, foo
 
 # check /join into channel with topic set
 > /window 4
-insert part-ch_test1
-insert join-w-topic : +0 CHANNAME #ch_test1
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo @ #ch_test1 :foo bar
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo #ch_test1 :End of /NAMES list.
-log 1 $ channels:#ch_test1:user_ids set to: [1], [me]
-log 4 $ residents: bar, foo
+insert part-empty : +0 CHAN_WIN_ID=4 CHANNEL :#ch_test1
+insert join-channel-0 :4 +0 CHANNEL :#ch_test1
+insert servermsglogged : +0 MSG ::foo.bar.baz 332 foo #ch_test1 :foo bar baz
+log 1 $ channels:#ch_test1:exits cleared
+insert servermsglogged : +0 MSG ::foo.bar.baz 333 foo #ch_test1 baz!~baz@OLD.baz.baz 1234567890
+insert topic-set-to : +1 baz.baz=OLD.baz.baz CHANNEL=#ch_test1 NEWTOPIC :foo bar baz
+insert servermsglogged : +0 MSG ::foo.bar.baz 353 foo = #ch_test1 :foo baz
+
+insert join-channel-1 : +0 CHANNEL=#ch_test1 RESIDENT_IDS :[2], [me]
+log 4 $ residents: baz, foo
 
 # check _observed_ topic change _does_ affect users database, and …
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar TOPIC #ch_test1 :foo bar baz
-log 1 $ users:1:user set to: [~bar]
-log 1 $ users:1:host set to: [bar.bar]
+insert servermsglogged : +0 MSG ::baz!~baz@baz.baz TOPIC #ch_test1 :foo bar baz
+insert user-set-to 2: +1 USER_ID=2 USERNAME=~baz USERHOST :baz.baz
 
 # … is echoed into channel window _if_ either content or setter change
-insert topics-test : +0 CHANNAME #ch_test1
+insert topic-set-to : +1 CHANNEL=#ch_test1 NEWTOPIC :foo bar baz
+insert servermsglogged : +0 MSG ::baz!~baz@baz.baz TOPIC #ch_test1 :foo bar baz
+insert servermsglogged : +0 MSG ::baz!~baz@baz.baz TOPIC #ch_test1 :foo foo baz
+insert topic-set-to : +1 CHANNEL=#ch_test1 NEWTOPIC :foo foo baz
 
 # check effects of other users' messages (PRIVMSG and NOTICE)
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar PRIVMSG #ch_test0 :msg_test3 msg_test4
-log 3 < [bar] msg_test3 msg_test4
-insert servermsglogged : +0 MSG :oof!~oof@oof.oof NOTICE #ch_test0 :msg_test5 msg_test6
-log 1 $ users:3:user set to: [~oof]
-log 1 $ users:3:host set to: [oof.oof]
+insert servermsglogged : +0 MSG ::baz!~baz@baz.baz PRIVMSG #ch_test0 :msg_test3 msg_test4
+log 3 < [baz] msg_test3 msg_test4
+insert servermsglogged : +0 MSG ::oof!~oof@oof.oof NOTICE #ch_test0 :msg_test5 msg_test6
+insert user-set-to 2: +1 USER_ID=3 USERNAME=~oof USERHOST :oof.oof
 log 3 < (oof) msg_test5 msg_test6
 
 # check effect of server NOTICE to channel
-insert servermsglogged : +0 MSG :*.?.net NOTICE #ch_test0 :msg_test6 msg_test7
+insert servermsglogged : +0 MSG ::*.?.net NOTICE #ch_test0 :msg_test6 msg_test7
 log 3 < (*.?.net) msg_test6 msg_test7
 
 # check part of user visible in other channel
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar PART :#ch_test0
-log 1 $ channels:#ch_test0:exits:1 set to: [P]
-log 1 $ channels:#ch_test0:user_ids set to: [2], [3], [4], [5], [me]
-log 3 $ bar!~bar@bar.bar parts
-log 1 $ channels:#ch_test0:exits:1 cleared
+insert servermsglogged : +0 MSG ::baz!~baz@baz.baz PART :#ch_test0
+log 1 $ channels:#ch_test0:exits:2 set to: [P]
+log 1 $ channels:#ch_test0:user_ids set to: [3], [4], [5], [me]
+log 3 $ baz!~baz@baz.baz parts
+log 1 $ channels:#ch_test0:exits:2 cleared
 
 # check part of user NOT visible in other channel
-insert servermsglogged : +0 MSG :oof!~oof@oof.oof PART :#ch_test0
+insert servermsglogged : +0 MSG ::oof!~oof@oof.oof PART :#ch_test0
 log 1 $ channels:#ch_test0:exits:3 set to: [P]
-log 1 $ channels:#ch_test0:user_ids set to: [2], [4], [5], [me]
+log 1 $ channels:#ch_test0:user_ids set to: [4], [5], [me]
 log 3 $ oof!~oof@oof.oof parts
 log 1 $ channels:#ch_test0:exits:3 cleared
 log 1 $ users:3 cleared
 
 # check other-user part with exit message
-insert servermsglogged : +0 MSG :zab!~zab@zab.zab PART #ch_test0 :goodbye world
-log 1 $ users:5:user set to: [~zab]
-log 1 $ users:5:host set to: [zab.zab]
+insert servermsglogged : +0 MSG ::zab!~zab@zab.zab PART #ch_test0 :goodbye world
+insert user-set-to 2: +1 USER_ID=5 USERNAME=~zab USERHOST :zab.zab
 log 1 $ channels:#ch_test0:exits:5 set to: [Pgoodbye world]
-log 1 $ channels:#ch_test0:user_ids set to: [2], [4], [me]
+log 1 $ channels:#ch_test0:user_ids set to: [4], [me]
 log 3 $ zab!~zab@zab.zab parts: goodbye world
 log 1 $ channels:#ch_test0:exits:5 cleared
 log 1 $ users:5 cleared
 
 # check re-join of user kept visible in other channel
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar JOIN :#ch_test0
-log 1 $ channels:#ch_test0:user_ids set to: [1], [2], [4], [me]
-log 3 $ bar!~bar@bar.bar joins
+insert servermsglogged : +0 MSG ::baz!~baz@baz.baz JOIN :#ch_test0
+log 1 $ channels:#ch_test0:user_ids set to: [2], [4], [me]
+log 3 $ baz!~baz@baz.baz joins
 
 # check re-join of user NOT kept visible in other channel
-insert servermsglogged : +0 MSG :oof!~oof@oof.oof JOIN :#ch_test0
-log 1 $ users:6:nick set to: [?]
-log 1 $ users:6:nick set to: [oof]
-log 1 $ users:6:user set to: [~oof]
-log 1 $ users:6:host set to: [oof.oof]
-log 1 $ channels:#ch_test0:user_ids set to: [1], [2], [4], [6], [me]
+insert servermsglogged : +0 MSG ::oof!~oof@oof.oof JOIN :#ch_test0
+insert user-set-to : +1 USER_ID=6 USERNICK=oof USERNAME=~oof USERHOST :oof.oof
+log 1 $ channels:#ch_test0:user_ids set to: [2], [4], [6], [me]
 log 3 $ oof!~oof@oof.oof joins
 
 # check renaming of user communicated into all windows of channels they're in – be it others, or oneself
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar NICK :bazbaz
-log 1 $ users:1:nick set to: [bazbaz]
-log 3,4 $ bar!~bar@bar.bar renames bazbaz
-insert cmd-nick : +1 ? myself
-insert servermsglogged : +0 MSG :foo!~foobarbaz@baz.bar.foo NICK :myself
-log 1 $ users:me:nick set to: [myself]
-log 3,4 $ foo!~foobarbaz@baz.bar.foo renames myself
-log 1 $ nick_wanted set to: [myself]
+insert rename : +0 USER_ID=2 NUH=baz!~baz@baz.baz NEWNICK :bazbaz
+insert cmd-nick : +0 NUH=foo!~baz@baz.bar.foo USER_ID=me NEWNICK :myself
 
 # reverting to foo to easen fragment re-use later on
-insert cmd-nick : +1 ? foo
-insert servermsglogged : +0 MSG :myself!~foobarbaz@baz.bar.foo NICK :foo
-log 1 $ users:me:nick set to: [foo]
-log 3,4 $ myself!~foobarbaz@baz.bar.foo renames foo
-log 1 $ nick_wanted set to: [foo]
+insert cmd-nick : +0 NUH=myself!~baz@baz.bar.foo USER_ID=me NEWNICK :foo
 
 # check QUIT affecting user in all their channels, removing them from DB
-insert servermsglogged : +0 MSG :bazbaz!~bar@bar.bar QUIT :Client Quit
-log 1 $ users:1:exit_msg set to: [QClient Quit]
-log , $ bazbaz!~bar@bar.bar quits: Client Quit
-log 1 $ channels:#ch_test0:exits:1 set to: [QClient Quit]
-log 1 $ channels:#ch_test0:user_ids set to: [2], [4], [6], [me]
-log 3 $ bazbaz!~bar@bar.bar quits: Client Quit
-log 1 $ channels:#ch_test0:exits:1 cleared
-log 1 $ channels:#ch_test1:exits:1 set to: [QClient Quit]
+insert servermsglogged : +0 MSG ::bazbaz!~baz@baz.baz QUIT :Client Quit
+log 1 $ users:2:exit_msg set to: [QClient Quit]
+log , $ bazbaz!~baz@baz.baz quits: Client Quit
+log 1 $ channels:#ch_test0:exits:2 set to: [QClient Quit]
+log 1 $ channels:#ch_test0:user_ids set to: [4], [6], [me]
+log 3 $ bazbaz!~baz@baz.baz quits: Client Quit
+log 1 $ channels:#ch_test0:exits:2 cleared
+log 1 $ channels:#ch_test1:exits:2 set to: [QClient Quit]
 log 1 $ channels:#ch_test1:user_ids set to: [me]
-log 4 $ bazbaz!~bar@bar.bar quits: Client Quit
-log 1 $ channels:#ch_test1:exits:1 cleared
-log 1 $ users:1 cleared
+log 4 $ bazbaz!~baz@baz.baz quits: Client Quit
+log 1 $ channels:#ch_test1:exits:2 cleared
+log 1 $ users:2 cleared
 
 # check effects of own QUIT while present in one channel
-insert part-ch_test1
-insert cmd-disconnect-0 : +0 ~baz ~foobarbaz
+insert part-empty : +0 CHAN_WIN_ID=4 CHANNEL :#ch_test1
+insert cmd-disconnect-0
 log 1 $ channels:#ch_test0:exits:me set to: [QClient Quit]
-log 1 $ channels:#ch_test0:user_ids set to: [2], [4], [6]
-log 3 $ foo!~foobarbaz@baz.bar.foo quits: Client Quit
+log 1 $ channels:#ch_test0:user_ids set to: [4], [6]
+log 3 $ foo!~baz@baz.bar.foo quits: Client Quit
 log 1 $ channels:#ch_test0:exits:me cleared
 insert cmd-disconnect-1 :-1 +0
-insert disconnect1 : +1 WIN_IDS 2,3,4
+insert disconnect1 : +1 WIN_IDS :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 +1 EXIT_MSG broken: FAKE_IRC_CONN_ABORT_EXCEPTION
-insert disconnect1 : +1 WIN_IDS 2,3,4
-insert retry-in : +1 ? 1
+insert disconnect0 :-1 +1 EXIT_MSG :broken: FAKE_IRC_CONN_ABORT_EXCEPTION
+insert disconnect1 : +1 WIN_IDS :2,3,4
+insert retry-in : +1 ? :1
 insert reconnect
index 359334886af96987ce63b08b3f61e3f2ce2a025f..b87aeedc5cbac3921dc0e7bcccab93e01ee82d07 100644 (file)
@@ -6,8 +6,8 @@ insert ./lib/conn
 log 0 # Found config at tests/config.toml, reading …
 log 0 # Connecting: {'hostname': 'foo.bar.baz', 'nickname': 'foo', 'password': 'supersecret', 'username': 'baz', 'realname': 'bar', 'port': 1234, 'channels': ['#test', '##testtest']}
 
-insert connect 1: +1 6697 1234
+insert connect 1: +1 6697 :1234
 log 1 $ password set to: [supersecret]
-insert attempting :-1 +1 6697 1234
+insert attempting :-1 +1 6697 :1234
 log 2 $ - password: supersecret
-insert connected : +1 WIN_IDS 2
+insert connected : +1 WIN_IDS :2
index a412915a3f06675da6335bf9180311fb6ccce727..c001320ac3713fd9bafceeed2d6480fe929049e9 100644 (file)
@@ -1,23 +1,20 @@
-insert ./lib/001-setting-nick
-insert ./lib/attempting-to-connected
+insert ./lib/001-to-usermode
+insert ./lib/already-disconnected
 insert ./lib/cmd-disconnect
-insert ./lib/conn
-# for: connect
-insert ./lib/conn-error
+# for: cmd-disconnect
+insert ./lib/connect-to-connected
 insert ./lib/disconnect
 # for: disconnect1
+insert ./lib/disconnect-to-stop-auto-reconnect
 insert ./lib/error-to-disconnect
 insert ./lib/error-to-disconnected
 insert ./lib/retry-in
-insert ./lib/usermode
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 # to prepare, initiate connection
-insert connect
-insert attempting-to-connected
-insert 001-setting-nick
-insert usermode
+insert connect-to-connected
+insert 001-to-usermode
 
 # fail to reconnect while connected
 > /window 1
@@ -25,9 +22,8 @@ insert usermode
 log 1 $ not re-connecting since already connected
 
 # handle /disconnect on being connected
-insert cmd-disconnect-0
-insert cmd-disconnect-1 :-1
-insert disconnect1 1: +1 WIN_IDS 2
+insert cmd-disconnect :-1
+insert disconnect1 1: +1 WIN_IDS :2
 
 # fail to disconnect when already disconnected
 > /disconnect
@@ -35,10 +31,9 @@ log 1 $ already disconnected and not attempting connect
 
 # succeed to re-connect after disconnect
 > /reconnect
-insert attempting-to-connected
+insert attempting-to-connected : +1 WIN_IDS :2
 
 # allow /disconnect outside connection for auto-connect stops
-insert error-to-disconnected : +0 §§§ Closing link: (Connection timed out)
-insert retry-in : +1 ? 1
-> /disconnect
-log 1 $ already disconnected, stopped connecting attempts
+insert error-to-disconnected : +0 §§§ :Closing link: (Connection timed out)
+insert retry-in : +1 ? :1
+insert disconnect-to-stop-auto-reconnect
index 4817f7b3ece008e2c57b04ece0a089d651adae97..b9c89cada5f77bc40b67b58ecb599f77b0872388 100644 (file)
@@ -8,8 +8,8 @@ insert ./lib/retry-in
 
 × reconnect-error-logged
 > /reconnect
-insert attempting-to-connected
-insert error-to-disconnected : +0 §§§ XXX
+insert attempting-to-connected : +1 WIN_IDS :2
+insert error-to-disconnected : +0 §§§ :XXX
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
@@ -17,14 +17,14 @@ insert error-to-disconnected : +0 §§§ XXX
 insert connect-to-connected
 
 # test default ERROR handling
-insert error-to-disconnected : +0 §§§ abc def ghi
+insert error-to-disconnected : +0 §§§ :abc def ghi
 
 # test ERROR regex (non-)matches
 > /window 1
-insert reconnect-error-logged : +0 XXX Closing link: (this should not match)
-insert reconnect-error-logged : +0 XXX Closing link: (Connection timed out)
-insert retry-in : +1 ? 1
-insert reconnect-error-logged : +0 XXX closing Link: (connection timed out)
-insert retry-in : +1 ? 1
-insert reconnect-error-logged : +0 XXX Closing link: (Ping timeout: 240 seconds)
-insert retry-in : +1 ? 1
+insert reconnect-error-logged : +0 XXX :Closing link: (this should not match)
+insert reconnect-error-logged : +0 XXX :Closing link: (Connection timed out)
+insert retry-in : +1 ? :1
+insert reconnect-error-logged : +0 XXX :closing Link: (connection timed out)
+insert retry-in : +1 ? :1
+insert reconnect-error-logged : +0 XXX :Closing link: (Ping timeout: 240 seconds)
+insert retry-in : +1 ? :1
index b52e66a30eb5ad744a114ebd3c038c3a6fcf349f..b414461822518e3a72528058bd4d3e3716fd063a 100644 (file)
@@ -1,29 +1,34 @@
-insert ./lib/001-setting-nick
-insert ./lib/caps
-# for: caps-neg-empty
+insert ./lib/001-to-usermode
+insert ./lib/caps-neg-empty
 insert ./lib/cmd-disconnect
+# for: cmd-disconnect
 insert ./lib/attempting-to-connected
 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
+insert ./lib/no-handler
 insert ./lib/servermsglogged
-insert ./lib/usermode
+insert ./lib/user-set-to
 
 × un-default
-# CHANTYPES (with parameter parsing test: will = confuse it?):
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo CHANTYPES=123=456 :
-log 1 $ isupport:CHANTYPES set to: [123=456]
-# PREFIX (with parameter parsing test: will = confuse it?):
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo PREFIX=(ovE)@+= :
-log 1 $ isupport:PREFIX set to: [(ovE)@+=]
-# USERLEN:
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo USERLEN=8 :
-log 1 $ isupport:USERLEN set to: [8]
-
-× no-handler
-log 1 $ No handler implemented for: :?
-log 2,3,4,5 $ No handler implemented for: :?
+insert servermsglogged : +0 MSG ::foo.bar.baz 005 foo KEY=VALUE :
+log 1 $ isupport:KEY set to: [VALUE]
+
+× un-defaults
+insert un-default : +0 KEY=CHANTYPES VALUE :123=456
+insert un-default : +0 KEY=PREFIX VALUE :(ovE)@+=
+insert un-default : +0 KEY=USERLEN VALUE :8
+
+× join-and-hi
+insert servermsglogged : +0 MSG ::NICKNAME!TO_CUTq@NICKNAME.NICKNAME JOIN :#ch_test8
+insert user-set-to : +1 USERHOST=NICKNAME.NICKNAME USERNAME=TO_CUTq USERNICK :NICKNAME
+log 1 $ channels:#ch_test8:user_ids set to: RESIDENT_IDS, [me]
+log 9 $ NICKNAME!TO_CUTq@NICKNAME.NICKNAME joins
+insert servermsglogged : +0 MSG ::NICKNAME!~TO_CUT@NICKNAME.NICKNAME PRIVMSG #ch_test8 :hi
+log 1 $ users:USER_ID:user set to: [~TO_CUT]
+log 9 < [NICKNAME] hi
 
 × ×-----------------------
 
@@ -32,114 +37,70 @@ log 2,3,4,5 $ No handler implemented for: :?
 insert connect-to-connected
 insert caps-neg-empty
 #
-# prepare minimal further connection setup with user nickname known
-# (referenced by later 005s)
-insert 001-setting-nick
+# prepare minimal further connection setup with user identity known
+insert 001-to-usermode
 
 # check setting of ISUPPORTs both with and without parameters, and last arg ignored
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo ABC=DEF GHI :are supported by this server
+insert servermsglogged : +0 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 : +0 MSG :foo.bar.baz 005 foo MNO=PQR STU=VWX,YZ :
+insert servermsglogged : +0 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 : +0 MSG :foo.bar.baz 005 foo -GHI DEF=MNO -STU :ignore me
+insert servermsglogged : +0 MSG ::foo.bar.baz 005 foo -GHI DEF=MNO -STU :ignore me
 log 1 $ isupport:GHI cleared
 log 1 $ isupport:DEF set to: [MNO]
 log 1 $ isupport:STU cleared
 
 # check setting and un-setting of defaulty ISUPPORTs
-insert un-default
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo -CHANTYPES -PREFIX -USERLEN :
+insert un-defaults
+insert servermsglogged : +0 MSG ::foo.bar.baz 005 foo -CHANTYPES -PREFIX -USERLEN :
 insert isupport-clear 1:
 
 # check disconnect on defaulty ISUPPORTs re-instates the respective defaults
-insert un-default
-insert usermode
+insert un-defaults
 > /window 1
-insert cmd-disconnect-0
-insert cmd-disconnect-1 :-1
-insert disconnect1 1: +1 WIN_IDS 2
-
-# test effect of USERLEN
+insert cmd-disconnect :-1
+insert disconnect1 1: +1 WIN_IDS :2
 
 > /reconnect
-insert attempting-to-connected
-insert caps-neg-empty : +0
-insert 001-setting-nick : +0
-insert usermode
-> /join #ch_test0
-log 1 > JOIN :#ch_test0
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN #ch_test0
-insert join-empty : +0 CHANNEL #ch_test0
-
-insert servermsglogged : +0 MSG :bar!foobarbazq@bar.bar JOIN :#ch_test0
-log 1 $ users:1:nick set to: [?]
-log 1 $ users:1:nick set to: [bar]
-log 1 $ users:1:user set to: [foobarbazq]
-log 1 $ users:1:host set to: [bar.bar]
-log 1 $ channels:#ch_test0:user_ids set to: [1], [me]
-log 3 $ bar!foobarbazq@bar.bar joins
-insert servermsglogged : +0 MSG :bar!~foobarbaz@bar.bar PRIVMSG #ch_test0 :hi
-log 1 $ users:1:user set to: [~foobarbaz]
-log 3 < [bar] hi
-
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo USERLEN=8 :
-log 1 $ isupport:USERLEN set to: [8]
+insert attempting-to-connected : +1 WIN_IDS :2
+insert caps-neg-empty
+insert 001-to-usermode
 
-insert servermsglogged : +0 MSG :baz!foobarba@baz.baz JOIN :#ch_test0
-log 1 $ users:2:nick set to: [?]
-log 1 $ users:2:nick set to: [baz]
-log 1 $ users:2:user set to: [foobarba]
-log 1 $ users:2:host set to: [baz.baz]
-log 1 $ channels:#ch_test0:user_ids set to: [1], [2], [me]
-log 3 $ baz!foobarba@baz.baz joins
-insert servermsglogged : +0 MSG :baz!~foobarb@baz.baz PRIVMSG #ch_test0 :hi
-log 1 $ users:2:user set to: [~foobarb]
-log 3 < [baz] hi
+# check effect of CHANTYPES
+insert join-empty : +0 CHANNEL :#ch_test0
+insert join-empty :-1 +0 CHANNEL :&ch_test1
+log 4 $ residents: foo
+insert no-handler : +0 ALERT_WIN_IDS=2,3,4 ? :foo!~baz@baz.bar.foo JOIN $ch_test2
+insert un-default : +0 KEY=CHANTYPES VALUE :#$%
+insert join-empty :-1 +0 CHANNEL :#ch_test3
+log 5 $ residents: foo
+insert no-handler : +0 ALERT_WIN_IDS=2,3,4,5 ? :foo!~baz@baz.bar.foo JOIN &ch_test4
+insert join-empty :-1 +0 CHANNEL :#ch_test5
+log 6 $ residents: foo
 
 # test effect of PREFIX
+insert join-channel-0 : +0 CHANNEL=#ch_test6 RESIDENT_NAMES :foo @bar +baz =quux
+insert user-set-to :2 +1 USER_ID=1 USERNICK :bar
+insert user-set-to :2 +1 USER_ID=2 USERNICK :baz
+insert user-set-to :2 +1 USER_ID=3 USERNICK :=quux
+insert join-channel-1 : +0 CHANNEL=#ch_test6 RESIDENT_IDS :[1], [2], [3], [me]
+log 7 $ residents: bar, baz, =quux, foo
+insert un-default : +0 KEY=PREFIX VALUE :(vE)+=
+insert join-channel-0 : +0 CHANNEL=#ch_test7 RESIDENT_NAMES :foo @bar +baz =quux
+insert user-set-to :2 +1 USER_ID=4 USERNICK :@bar
+insert user-set-to :2 +1 USER_ID=5 USERNICK :quux
+insert join-channel-1 : +0 CHANNEL=#ch_test7 RESIDENT_IDS :[2], [4], [5], [me]
+log 8 $ residents: baz, @bar, quux, foo
 
-> /join #ch_test1
-log 1 > JOIN :#ch_test1
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN #ch_test1
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo @ #ch_test1 :foo @bar +baz =quux
-log 1 $ channels:#ch_test1:exits cleared
-log 1 $ users:3:nick set to: [?]
-log 1 $ users:3:nick set to: [=quux]
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo #ch_test1 :End of /NAMES list.
-log 1 $ channels:#ch_test1:user_ids set to: [1], [2], [3], [me]
-log 4 $ residents: bar, baz, =quux, foo
-
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo PREFIX=(vE)+= :
-log 1 $ isupport:PREFIX set to: [(vE)+=]
-
-> /join #ch_test2
-log 1 > JOIN :#ch_test2
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN #ch_test2
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo @ #ch_test2 :foo @bar +baz =quux
-log 1 $ channels:#ch_test2:exits cleared
-log 1 $ users:4:nick set to: [?]
-log 1 $ users:4:nick set to: [@bar]
-log 1 $ users:5:nick set to: [?]
-log 1 $ users:5:nick set to: [quux]
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo #ch_test2 :End of /NAMES list.
-log 1 $ channels:#ch_test2:user_ids set to: [2], [4], [5], [me]
-log 5 $ residents: baz, @bar, quux, foo
-
-# check effect of CHANTYPES
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN #ch_test3
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN &ch_test4
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN $ch_test5
-insert no-handler : +1 ? foo!~baz@baz.bar.foo JOIN $ch_test5
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo CHANTYPES=&$% :
-log 1 $ isupport:CHANTYPES set to: [&$%]
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN #ch_test6
-insert no-handler : +1 ? foo!~baz@baz.bar.foo JOIN #ch_test6
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN &ch_test7
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN $ch_test8
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo JOIN %ch_test8
+# test effect of USERLEN
+insert join-empty :-1 +0 CHANNEL :#ch_test8
+log 9 $ residents: foo
+insert join-and-hi : +0 NICKNAME=user0 USER_ID=6 TO_CUT=foobarbaz RESIDENT_IDS :[6]
+insert un-default : +0 KEY=USERLEN VALUE :8
+insert join-and-hi : +0 NICKNAME=user1 USER_ID=7 TO_CUT=foobarb RESIDENT_IDS :[6], [7]
index c011b2a87a795411a64284c357dbfc1e9244e667..789db765bbe415ce219e086f9f9011a36df0958e 100644 (file)
@@ -1,6 +1,6 @@
 insert ./lib/servermsglogged
+insert ./lib/user-set-to
 
 × 001-setting-nick
-insert servermsglogged : +0 MSG :foo.bar.baz 001 foo :Welcome to the foo.bar.baz network
-log 1 $ users:me:nick set to: [?]
-log 1 $ users:me:nick set to: [foo]
+insert servermsglogged : +0 MSG ::foo.bar.baz 001 foo :Welcome to the foo.bar.baz network
+insert user-set-to :2 +1 USER_ID=me USERNICK :foo
diff --git a/src/tests/lib/001-to-usermode b/src/tests/lib/001-to-usermode
new file mode 100644 (file)
index 0000000..2ab63eb
--- /dev/null
@@ -0,0 +1,12 @@
+insert ./lib/001-setting-nick
+insert ./lib/servermsglogged
+insert ./lib/user-set-to
+
+× usermode
+insert servermsglogged : +0 MSG ::foo!~baz@baz.bar.foo MODE foo ABC
+insert user-set-to 2: +1 USER_ID=me USERNAME=~baz USERHOST :baz.bar.foo
+log 1 $ users:me:modes set to: [ABC]
+
+× 001-to-usermode
+insert 001-setting-nick
+insert usermode
index 608ed653d0dd5d52eac11724effaf038225a5dd6..68705a4325d2b4c62802cb1fced8dc61dbfc7a1c 100644 (file)
@@ -3,5 +3,5 @@ insert ./lib/conn
 
 × attempting-to-connected
 insert attempting
-insert connected : +1 WIN_IDS 2
+insert connected
 
diff --git a/src/tests/lib/bazbarfoo b/src/tests/lib/bazbarfoo
deleted file mode 100644 (file)
index c12c744..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-insert ./lib/conn
-# for: attempting, connect
-
-× connect-bazbarfoo
-insert connect : +3 foo.bar.baz baz.bar.foo
-
-× attempting-bazbarfoo
-insert attempting : +3 foo.bar.baz baz.bar.foo
diff --git a/src/tests/lib/cap-msg b/src/tests/lib/cap-msg
new file mode 100644 (file)
index 0000000..36c1f27
--- /dev/null
@@ -0,0 +1,4 @@
+insert ./lib/servermsglogged
+
+× cap-msg
+insert servermsglogged : +0 MSG ::*.?.net CAP CAPMSG
diff --git a/src/tests/lib/caps b/src/tests/lib/caps
deleted file mode 100644 (file)
index 48cc4bf..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-insert ./lib/servermsglogged
-
-× cap-msg
-insert servermsglogged : +0 MSG :*.?.net CAP ???
-
-× caps-neg-empty
-insert cap-msg : +0 ??? * LS :
-log 1 > CAP :LIST
-insert cap-msg : +0 ??? * LIST :
-log 1 > CAP :END
diff --git a/src/tests/lib/caps-data-set b/src/tests/lib/caps-data-set
new file mode 100644 (file)
index 0000000..bc03241
--- /dev/null
@@ -0,0 +1,3 @@
+× caps-data-set
+log 1 $ caps:CAPNAME:data set to: []
+log 1 $ caps:CAPNAME:data set to: [CAPVAL]
diff --git a/src/tests/lib/caps-neg-empty b/src/tests/lib/caps-neg-empty
new file mode 100644 (file)
index 0000000..c7818c3
--- /dev/null
@@ -0,0 +1,7 @@
+insert ./lib/cap-msg
+
+× caps-neg-empty
+insert cap-msg : +0 CAPMSG :* LS :
+log 1 > CAP :LIST
+insert cap-msg : +0 CAPMSG :* LIST :
+log 1 > CAP :END
diff --git a/src/tests/lib/channels b/src/tests/lib/channels
deleted file mode 100644 (file)
index bc3732d..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-insert ./lib/servermsglogged
-
-× cmd-nick
-> /nick ?
-log 1 > NICK :?
-
-× JOIN0
-log 1 > JOIN :CHANNEL
-insert servermsglogged : +0 MSG :foo!~foobarbaz@baz.bar.foo JOIN CHANNEL
-
-× join-w-topic
-> /join CHANNAME
-insert JOIN0 : +0 CHANNEL CHANNAME
-insert servermsglogged : +0 MSG :foo.bar.baz 332 foo CHANNAME :foo bar baz
-log 1 $ channels:CHANNAME:exits cleared
-insert servermsglogged : +0 MSG :foo.bar.baz 333 foo CHANNAME bar!~bar@OLD.bar.bar 1234567890
-log 1 $ channels:CHANNAME:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='OLD.bar.bar'))]
-log 4 $ bar!~bar@OLD.bar.bar set topic: foo bar baz
-
-× part0
-> /part
-log 1 > PART :CHANNEL
-insert servermsglogged : +0 MSG :foo!~foobarbaz@baz.bar.foo PART :CHANNEL
-log 1 $ channels:CHANNEL:exits:me set to: [P]
-log 1 $ channels:CHANNEL:user_ids cleared
-
-× part1
-log 1 $ channels:CHANNEL:exits:me cleared
-log 1 $ channels:CHANNEL cleared
-
-× topics-test
-log 1 $ channels:CHANNAME:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
-log 4 $ bar!~bar@bar.bar set topic: foo bar baz
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar TOPIC CHANNAME :foo bar baz
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar TOPIC CHANNAME :foo foo baz
-log 1 $ channels:CHANNAME:topic set to: [Topic(what='foo foo baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
-log 4 $ bar!~bar@bar.bar set topic: foo foo baz
index 489c51b49a61de0fa36b52215af97f5902852c21..ec63933d044e0aee6a3b3b89c7bc38d58d8e7206 100644 (file)
@@ -5,9 +5,13 @@ insert ./lib/error-to-disconnect
 × cmd-disconnect-0
 > /disconnect
 log 1 > QUIT :ircplom says bye
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo QUIT :Client Quit
+insert servermsglogged : +0 MSG ::foo!~baz@baz.bar.foo QUIT :Client Quit
 log 1 $ users:me:exit_msg set to: [QClient Quit]
 log , $ foo!~baz@baz.bar.foo quits: Client Quit
 
 × cmd-disconnect-1
-insert error-to-disconnect : +0 ? Closing link: [Quit: ircplom says bye]
+insert error-to-disconnect : +0 ? ::Closing link: [Quit: ircplom says bye]
+
+× cmd-disconnect
+insert cmd-disconnect-0
+insert cmd-disconnect-1
diff --git a/src/tests/lib/cmd-nick b/src/tests/lib/cmd-nick
new file mode 100644 (file)
index 0000000..8c32aa2
--- /dev/null
@@ -0,0 +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
+
+× cmd-nick
+> /nick NEWNICK
+log 1 > NICK :NEWNICK
+insert rename : +0
+log 1 $ nick_wanted set to: [NEWNICK]
index 20ca772d2605663e3bcdbe7972e368738e394798..cf45c6d009007cefb4e099c80335145fe42acbbe 100644 (file)
@@ -5,5 +5,4 @@ insert ./lib/conn
 
 × connect-to-connected
 insert connect : +1
-insert attempting-to-connected : +1
-
+insert attempting-to-connected : +1 WIN_IDS :2
diff --git a/src/tests/lib/disconnect-to-stop-auto-reconnect b/src/tests/lib/disconnect-to-stop-auto-reconnect
new file mode 100644 (file)
index 0000000..41fbdfb
--- /dev/null
@@ -0,0 +1,3 @@
+× disconnect-to-stop-auto-reconnect
+> /disconnect
+log 1 $ already disconnected, stopped connecting attempts
index d288fc9bbf98e15aad51127f38b2cbf8a223e64e..00c853f9a88b738cbc3113636d51241b413e3918 100644 (file)
@@ -3,5 +3,5 @@ insert ./lib/disconnect
 insert ./lib/servermsglogged
 
 × error-to-disconnect
-insert servermsglogged : +0 MSG ERROR :?
-insert disconnect0 : +1 EXIT_MSG ?
+insert servermsglogged : +0 MSG :ERROR :?
+insert disconnect0 : +1 EXIT_MSG :?
index b7b760a951d65078e98533b199c2e4c27db01d3e..7126435398c4817080ef50390161124d65c96665 100644 (file)
@@ -3,5 +3,5 @@ insert ./lib/disconnect
 insert ./lib/error-to-disconnect
 
 × error-to-disconnected
-insert error-to-disconnect :-1 +0 ? §§§
-insert disconnect1 1:-1 +1 WIN_IDS 2
+insert error-to-disconnect :-1 +0 ? :§§§
+insert disconnect1 1:-1 +1 WIN_IDS :2
index b9428c0fd005bf15e6a628b7a4332db140b8b7bb..c584db6919c50ed2871865835c720090afcba5cc 100644 (file)
@@ -1,8 +1,17 @@
 insert ./lib/servermsglogged
 
-× join-empty
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo @ CHANNEL :foo
+× join-channel-0
+> /join CHANNEL
+log 1 > JOIN :CHANNEL
+insert servermsglogged : +0 MSG ::foo!~baz@baz.bar.foo JOIN :CHANNEL
+insert servermsglogged : +0 MSG ::foo.bar.baz 353 foo = CHANNEL :RESIDENT_NAMES
 log 1 $ channels:CHANNEL:exits cleared
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo CHANNEL :End of /NAMES list.
-log 1 $ channels:CHANNEL:user_ids set to: [me]
+
+× join-channel-1
+insert servermsglogged : +0 MSG ::foo.bar.baz 366 foo CHANNEL :End of /NAMES list.
+log 1 $ channels:CHANNEL:user_ids set to: RESIDENT_IDS
+
+× join-empty
+insert join-channel-0 : +0 RESIDENT_NAMES :foo
+insert join-channel-1 : +0 RESIDENT_IDS :[me]
 log 3 $ residents: foo
diff --git a/src/tests/lib/no-handler b/src/tests/lib/no-handler
new file mode 100644 (file)
index 0000000..2a2a896
--- /dev/null
@@ -0,0 +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: ?
index 8b6f837d4f483051a86df6fc9909bed730873bd2..72bab471af88b0c9af9f8b4b05c9448f75275790 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 +1 EXIT_MSG broken: no timely PONG from server
-insert disconnect1 1:-1 +1 WIN_IDS 2
-insert retry-in : +1 ? 1
+insert disconnect0 :-1 +1 EXIT_MSG :broken: no timely PONG from server
+insert disconnect1 1:-1 +1 WIN_IDS :2
+insert retry-in : +1 ? :1
diff --git a/src/tests/lib/part b/src/tests/lib/part
new file mode 100644 (file)
index 0000000..2a1bccd
--- /dev/null
@@ -0,0 +1,11 @@
+insert ./lib/servermsglogged
+
+× part
+> /part
+log 1 > PART :CHANNEL
+insert servermsglogged : +0 MSG ::foo!~baz@baz.bar.foo PART :CHANNEL
+log 1 $ channels:CHANNEL:exits:me set to: [P]
+log 1 $ channels:CHANNEL:user_ids USERIDS_CLEAR
+log CHAN_WIN_ID $ foo!~baz@baz.bar.foo parts
+log 1 $ channels:CHANNEL:exits:me cleared
+log 1 $ channels:CHANNEL cleared
index d2f2becbcaa9fa4201030dedd17eb7417ec2dc7c..5737b069d1f7b0018ebda5d3700ca0408cae0926 100644 (file)
@@ -1,5 +1,5 @@
 insert ./lib/servermsglogged
 
 × ping-pong
-insert servermsglogged : +0 MSG PING :?
+insert servermsglogged : +0 MSG :PING :?
 log 1 > PONG :?
diff --git a/src/tests/lib/privmsg b/src/tests/lib/privmsg
new file mode 100644 (file)
index 0000000..d13786a
--- /dev/null
@@ -0,0 +1,4 @@
+× privmsg
+> /privmsg TARGET TXT
+log 1 > PRIVMSG TARGET :TXT
+log 3 > [foo] TXT
diff --git a/src/tests/lib/req-sasl b/src/tests/lib/req-sasl
new file mode 100644 (file)
index 0000000..4b50951
--- /dev/null
@@ -0,0 +1,8 @@
+insert ./lib/cap-msg
+
+× req-sasl
+log 1 > CAP REQ :sasl
+log 1 > CAP :LIST
+insert cap-msg : +0 CAPMSG :* REPLY :sasl
+insert cap-msg : +0 CAPMSG :* LIST :CAPLIST
+
index 7d6b93ff708ab9a80dcc52210fa07ca4292585f8..65fffb3071a2e24d81da9696ce6835643b9d22d1 100644 (file)
@@ -1,6 +1,6 @@
 insert ./lib/servermsglogged
 
 × servernotice
-insert servermsglogged : +0 MSG :*.?.net NOTICE * :XXX
+insert servermsglogged : +0 MSG ::*.?.net NOTICE * :XXX
 log 2 < (server) XXX
 
diff --git a/src/tests/lib/trigger-ping b/src/tests/lib/trigger-ping
new file mode 100644 (file)
index 0000000..9000abd
--- /dev/null
@@ -0,0 +1,3 @@
+× trigger-ping
+servermsg SERVER_ID timeout
+log LOG_ID > PING :what's up?
diff --git a/src/tests/lib/user-set-to b/src/tests/lib/user-set-to
new file mode 100644 (file)
index 0000000..b41abb5
--- /dev/null
@@ -0,0 +1,6 @@
+× user-set-to
+log 1 $ users:USER_ID:nick 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]
+
diff --git a/src/tests/lib/usermode b/src/tests/lib/usermode
deleted file mode 100644 (file)
index 255d82e..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-insert ./lib/servermsglogged
-
-× usermode
-insert servermsglogged : +0 MSG :foo!~baz@baz.bar.foo MODE foo ABC
-log 1 $ users:me:user set to: [~baz]
-log 1 $ users:me:host set to: [baz.bar.foo]
-log 1 $ users:me:modes set to: [ABC]
index 7d82cb6d8931ccd0bc960b0ddf920e4b3c075e6e..699edd33203236d2fbe45eab08beb333fdaf0fc1 100644 (file)
@@ -1,22 +1,18 @@
-insert ./lib/conn
-# for: attempting, connected
+insert ./lib/attempting-to-connected
 insert ./lib/connect-to-connected
 insert ./lib/no-timely-pong
 insert ./lib/pingpong
 insert ./lib/servermsglogged
 insert ./lib/servernotice
-
-× trigger-ping
-servermsg 0 timeout
-log 1 > PING :what's up?
+insert ./lib/trigger-ping
 
 × full-timeout
 # ping on timeout, go on as normal if PONG received 
-insert trigger-ping
-insert servermsglogged : +0 MSG :*.?.net PONG *.?.net :what's up?
-insert servernotice : +0 MSG XXX Looking up your ident...
+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...
 # another timeout instead of pong? disconnect
-insert trigger-ping
+insert trigger-ping : +0 SERVER_ID=0 LOG_ID :1
 insert no-timely-pong
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
@@ -31,6 +27,5 @@ insert full-timeout
 # on re-connect, ensure timer cleared, i.e. only 2nd time-out will disconnect
 > /window 1
 > /reconnect
-insert attempting
-insert connected : +1 WIN_IDS 2
+insert attempting-to-connected : +1 WIN_IDS :2
 insert full-timeout
index 15159c32c00cd3825fe75e643dee9cb70c97ad21..7561929063f407bd058e68343df3d8eeffbf424f 100644 (file)
@@ -1,64 +1,66 @@
-insert ./lib/bazbarfoo
-# for: attempting-bazbarfoo, connect-bazbarfoo
-insert ./lib/channels
-# for: cmd-nick, JOIN0, join-w-topic, part0, part1, topics-test
+insert ./lib/attempting-to-connected
+insert ./lib/cap-msg
+insert ./lib/caps-data-set
 insert ./lib/cmd-disconnect
+insert ./lib/cmd-nick
 insert ./lib/conn
 # for: attempting, connect, connected
 insert ./lib/disconnect
 # for: disconnect0, disconnect1
+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
+insert ./lib/part
 insert ./lib/pingpong
+insert ./lib/privmsg
+insert ./lib/req-sasl
 insert ./lib/retry-in
 insert ./lib/servermsglogged
 insert ./lib/servernotice
+insert ./lib/user-set-to
+
+× nick-increment
+insert servermsglogged : +0 MSG ::*.?.net 433 * NAME_A :Nickname already in use
+log 1 $ nickname already in use, trying increment
+log 1 > NICK :NAME_B
 
 
 
 × conn_init_1
 
 # expect some NOTICE and PING to process/reply during initiation
-insert servernotice : +0 XXX *** Looking up your ident...
-insert servernotice : +0 XXX *** Looking up your hostname...
-insert servernotice : +0 XXX *** Found your hostname (baz.bar.foo)
+insert servernotice : +0 XXX :*** Looking up your ident...
+insert servernotice : +0 XXX :*** Looking up your hostname...
+insert servernotice : +0 XXX :*** Found your hostname (baz.bar.foo)
 insert ping-pong : +0
 
 # handle 433
-insert servermsglogged : +0 MSG :*.?.net 433 * foo :Nickname already in use
-log 1 $ nickname already in use, trying increment
-log 1 > NICK :foo0
-insert servermsglogged : +0 MSG :*.?.net 433 * foo0 :Nickname already in use
-log 1 $ nickname already in use, trying increment
-log 1 > NICK :foo1
+insert nick-increment : +0 NAME_A=foo NAME_B :foo0
+insert nick-increment : +0 NAME_A=foo0 NAME_B :foo1
 
 # collect server capabilities
-insert servermsglogged : +0 MSG :*.?.net CAP * LS : foo bar sasl=PLAIN,EXTERNAL baz cap-notify
+insert cap-msg : +0 CAPMSG :* LS : foo bar sasl=PLAIN,EXTERNAL 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: []
-log 1 $ caps:sasl:data set to: [PLAIN,EXTERNAL]
-log 1 > CAP REQ :sasl
-log 1 > CAP :LIST
-insert servermsglogged : +0 MSG :*.?.net CAP * ACK :sasl
-insert servermsglogged : +0 MSG :*.?.net CAP * LIST :cap-notify sasl
+insert caps-data-set : +1 CAPNAME=sasl CAPVAL :PLAIN,EXTERNAL
+insert req-sasl : +0 REPLY=ACK CAPLIST :cap-notify sasl
 log 1 $ caps:cap-notify:enabled set to: [True]
 log 1 $ caps:sasl:enabled set to: [True]
 
 # authenticate via SASL, collect items of user identity
 log 1 $ sasl_auth_state set to: [attempting]
 log 1 > AUTHENTICATE :PLAIN
-insert servermsglogged : +0 MSG AUTHENTICATE +
+insert servermsglogged : +0 MSG :AUTHENTICATE +
 log 1 > AUTHENTICATE :Zm9vAGZvbwBiYXI=
-insert servermsglogged : +0 MSG :foo.bar.baz 900 foo1 foo1!foobarbazq@baz.bar.foo foo :You are now logged in as foo
-log 1 $ users:me:nick set to: [?]
-log 1 $ users:me:nick set to: [foo1]
-log 1 $ users:me:user set to: [foobarbazq]
-log 1 $ users:me:host set to: [baz.bar.foo]
+insert servermsglogged : +0 MSG ::foo.bar.baz 900 foo1 foo1!baz@baz.bar.foo foo :You are now logged in as foo
+insert user-set-to : +1 USER_ID=me USERNICK=foo1 USERNAME=baz USERHOST :baz.bar.foo
 log 1 $ sasl_account set to: [foo]
-insert servermsglogged : +0 MSG :foo.bar.baz 903 foo1 :SASL authentication successful
+insert servermsglogged : +0 MSG ::foo.bar.baz 903 foo1 :SASL authentication successful
 log 1 $ sasl_auth_state set to: [SASL authentication successful]
 
 # finish CAP negotation, thus login procedure
@@ -69,174 +71,122 @@ log 1 > CAP :END
 × conn_init_2
 
 # of all pre-MOTD greeting messages, only process isupports
-insert servermsglogged : +0 MSG :foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
-insert servermsglogged : +0 MSG :foo.bar.baz 002 foo1 :Your host is foo.bar.baz
-insert servermsglogged : +0 MSG :foo.bar.baz 003 foo1 :This server was created Jan 1 2020
-insert servermsglogged : +0 MSG :foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
-insert servermsglogged : +0 MSG :foo.bar.baz 005 foo1 ABC=DEF GHI :are supported by this server
+insert servermsglogged : +0 MSG ::foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
+insert servermsglogged : +0 MSG ::foo.bar.baz 002 foo1 :Your host is foo.bar.baz
+insert servermsglogged : +0 MSG ::foo.bar.baz 003 foo1 :This server was created Jan 1 2020
+insert servermsglogged : +0 MSG ::foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
+insert servermsglogged : +0 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 : +0 MSG :foo.bar.baz 251 foo1 :There are 10 users and 1000 invisible on 5 servers
-insert servermsglogged : +0 MSG :foo.bar.baz 252 foo1 7 :IRC Operators online
-insert servermsglogged : +0 MSG :foo.bar.baz 253 foo1 4 :unknown connection(s)
-insert servermsglogged : +0 MSG :foo.bar.baz 254 foo1 800 :channels formed
-insert servermsglogged : +0 MSG :foo.bar.baz 255 foo1 :I have 100 clients and 1 serveres
-insert servermsglogged : +0 MSG :foo.bar.baz 265 foo1 100 150 :Current local users 100, max 150
-insert servermsglogged : +0 MSG :foo.bar.baz 266 foo1 1010 1050 :Current global users 1010, max 1050
-insert servermsglogged : +0 MSG :foo.bar.baz 250 foo1 :Highest connection count: 151 (150 clients) (1080 connections received)
+insert servermsglogged : +0 MSG ::foo.bar.baz 251 foo1 :There are 10 users and 1000 invisible on 5 servers
+insert servermsglogged : +0 MSG ::foo.bar.baz 252 foo1 7 :IRC Operators online
+insert servermsglogged : +0 MSG ::foo.bar.baz 253 foo1 4 :unknown connection(s)
+insert servermsglogged : +0 MSG ::foo.bar.baz 254 foo1 800 :channels formed
+insert servermsglogged : +0 MSG ::foo.bar.baz 255 foo1 :I have 100 clients and 1 serveres
+insert servermsglogged : +0 MSG ::foo.bar.baz 265 foo1 100 150 :Current local users 100, max 150
+insert servermsglogged : +0 MSG ::foo.bar.baz 266 foo1 1010 1050 :Current global users 1010, max 1050
+insert servermsglogged : +0 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 : +0 MSG :foo.bar.baz 375 foo1 :- foo.bar.baz Message of the Day -
-insert servermsglogged : +0 MSG :foo.bar.baz 372 foo1 :- Howdy! -
-insert servermsglogged : +0 MSG :foo.bar.baz 372 foo1 :- Welcome! -
-insert servermsglogged : +0 MSG :foo.bar.baz 372 foo1 :- (to this server) -
-insert servermsglogged : +0 MSG :foo.bar.baz 376 foo1 :End of /MOTD command
+insert servermsglogged : +0 MSG ::foo.bar.baz 375 foo1 :- foo.bar.baz Message of the Day -
+insert servermsglogged : +0 MSG ::foo.bar.baz 372 foo1 :- Howdy! -
+insert servermsglogged : +0 MSG ::foo.bar.baz 372 foo1 :- Welcome! -
+insert servermsglogged : +0 MSG ::foo.bar.baz 372 foo1 :- (to this server) -
+insert servermsglogged : +0 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 : +0 MSG :foo1 MODE foo1 :+Ziw
+insert servermsglogged : +0 MSG ::foo1 MODE foo1 :+Ziw
 log 1 $ users:me:modes set to: [+Ziw]
 # handle bot query NOTICE
-insert servermsglogged : +0 MSG :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
-log 3 < (SaslServ) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+insert servermsglogged : +0 MSG ::SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~baz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+log 3 < (SaslServ) Last login from ~baz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
 
 
 
 × during_conn
 
 # test recoverable 432
-insert cmd-nick : +1 ? @foo
-insert servermsglogged : +0 MSG :*.?.net 432 foo1 @foo :Erroneous nickname
+insert cmd-nick :2 +1 NEWNICK :@foo
+insert servermsglogged : +0 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 : +1 ? foo
-insert servermsglogged : +0 MSG :foo1!~foobarbaz@baz.bar.foo NICK :foo
-log 1 $ users:me:user set to: [~foobarbaz]
-log 1 $ users:me:nick set to: [foo]
-log rename_win_ids $ foo1!~foobarbaz@baz.bar.foo renames foo
-
-# join channel, collect topic, residents; update me:user from JOIN message; ensure topic.who not affecting users DB
-insert join-w-topic : +0 CHANNAME #test
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo @ #test :foo @bar
-log 1 $ users:1:nick set to: [?]
-log 1 $ users:1:nick set to: [bar]
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo #test :End of /NAMES list.
-log 1 $ channels:#test:user_ids set to: [1], [me]
-log 4 $ residents: bar, foo
-
-# deliver PRIVMSG to channel window, update sender's user+host from metadata
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar PRIVMSG #test :hi there
-log 1 $ users:1:user set to: [~bar]
-log 1 $ users:1:host set to: [bar.bar]
-log 4 < [bar] hi there
+insert cmd-nick :4 +0 NUH=foo1!~baz@baz.bar.foo NEWNICK :foo
+log 1 $ users:me:user set to: [~baz]
+insert cmd-nick 4:-2 +1 USER_ID=me NEWNICK :foo
+log rename_win_ids $ foo1!~baz@baz.bar.foo renames foo
 
-# check _changing_ TOPIC message is communicated to channel window, as long as either content or who change
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar TOPIC #test :foo bar baz
-insert topics-test : +0 CHANNAME #test
+# join channel with other user
+insert join-channel-0 : +0 CHANNEL=#test RESIDENT_NAMES :foo @baz
+insert user-set-to :2 +1 USER_ID=1 USERNICK :baz
+insert join-channel-1 : +0 CHANNEL=#test RESIDENT_IDS :[1], [me]
+log 4 $ residents: baz, foo
 
 # process non-self channel JOIN
-insert servermsglogged : +0 MSG :baz!~baz@baz.baz JOIN :#test
-log 1 $ users:2:nick set to: [?]
-log 1 $ users:2:nick set to: [baz]
-log 1 $ users:2:user set to: [~baz]
-log 1 $ users:2:host set to: [baz.baz]
+insert servermsglogged : +0 MSG ::bar!~bar@bar.bar JOIN :#test
+insert user-set-to : +1 USER_ID=2 USERNICK=bar USERNAME=~bar USERHOST :bar.bar
 log 1 $ channels:#test:user_ids set to: [1], [2], [me]
-log 4 $ baz!~baz@baz.baz joins
+log 4 $ bar!~bar@bar.bar joins
 
 # join second channel with partial residents identity to compare distribution of resident-specific messages
-insert join-w-topic :-1 +0 CHANNAME #testtest
-log 5 $ bar!~bar@OLD.bar.bar set topic: foo bar baz
-insert servermsglogged : +0 MSG :foo.bar.baz 353 foo @ #testtest :foo baz
-insert servermsglogged : +0 MSG :foo.bar.baz 366 foo #testtest :End of /NAMES list.
-log 1 $ channels:#testtest:user_ids set to: [2], [me]
-log 5 $ residents: baz, foo
+insert join-channel-0 : +0 CHANNEL=#testtest RESIDENT_NAMES :foo bar
+insert join-channel-1 : +0 CHANNEL=#testtest RESIDENT_IDS :[2], [me]
+log 5 $ residents: bar, foo
 
 # handle query window with known user
-insert servermsglogged : +0 MSG :baz!~baz@baz.baz PRIVMSG foo :hi there
-log 6 < [baz] hi there
-> /privmsg baz hello, how is it going
-log 1 > PRIVMSG baz :hello, how is it going
+insert servermsglogged : +0 MSG ::bar!~bar@bar.bar PRIVMSG foo :hi there
+log 6 < [bar] hi there
+insert privmsg :-1 +1 TARGET=bar TXT :hello, how is it going
 log 6 > [foo] hello, how is it going
-insert servermsglogged : +0 MSG :baz!~baz@baz.baz PRIVMSG foo :fine!
-log 6 < [baz] fine!
+insert servermsglogged : +0 MSG ::bar!~bar@bar.bar PRIVMSG foo :fine!
+log 6 < [bar] fine!
 
 # handle failure to query absent user
-> /privmsg barbar hello!
-log 1 > PRIVMSG barbar :hello!
+insert privmsg :-1 +1 TARGET=barbar TXT :hello!
 log 7 > [foo] hello!
-insert servermsglogged : +0 MSG :*.?.net 401 foo barbar :No such nick/channel
+insert servermsglogged : +0 MSG ::*.?.net 401 foo barbar :No such nick/channel
 log 7 $ barbar not online
 
-# handle non-self renaming
-insert servermsglogged : +0 MSG :baz!~baz@baz.baz NICK :bazbaz
-log 1 $ users:2:nick set to: [bazbaz]
-log 4,5,6 $ baz!~baz@baz.baz renames bazbaz
-
-# handle non-self PART in one of two inhabited channels, preserve identity into re-JOIN
-insert servermsglogged : +0 MSG :bazbaz!~baz@baz.baz PART :#test
-log 1 $ channels:#test:exits:2 set to: [P]
-log 1 $ channels:#test:user_ids set to: [1], [me]
-log 4 $ bazbaz!~baz@baz.baz parts
-log 1 $ channels:#test:exits:2 cleared
-insert servermsglogged : +0 MSG :bazbaz!~baz@baz.baz JOIN :#test
-log 1 $ channels:#test:user_ids set to: [1], [2], [me]
-log 4 $ bazbaz!~baz@baz.baz joins
-
-# handle non-self PART in only inhabited channel, lose identity, re-join as new identity
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar PART :#test
-log 1 $ channels:#test:exits:1 set to: [P]
-log 1 $ channels:#test:user_ids set to: [2], [me]
-log 4 $ bar!~bar@bar.bar parts
-log 1 $ channels:#test:exits:1 cleared
-log 1 $ users:1 cleared
-insert servermsglogged : +0 MSG :bar!~bar@bar.bar JOIN :#test
-log 1 $ users:3:nick set to: [?]
-log 1 $ users:3:nick set to: [bar]
-log 1 $ users:3:user set to: [~bar]
-log 1 $ users:3:host set to: [bar.bar]
-log 1 $ channels:#test:user_ids set to: [2], [3], [me]
-log 4 $ bar!~bar@bar.bar joins
+# handle non-self renaming, even into window of previously not found target
+insert servermsglogged : +0 MSG ::bar!~bar@bar.bar NICK :barbar
+log 1 $ users:2:nick set to: [barbar]
+log 4,5,6,7 $ bar!~bar@bar.bar renames barbar
 
 # handle non-self QUIT
-insert servermsglogged : +0 MSG :bazbaz!~baz@baz.baz QUIT :Client Quit
+insert servermsglogged : +0 MSG ::barbar!~bar@bar.bar QUIT :Client Quit
 log 1 $ users:2:exit_msg set to: [QClient Quit]
-log 6 $ bazbaz!~baz@baz.baz quits: Client Quit
+log 6,7 $ barbar!~bar@bar.bar quits: Client Quit
 log 1 $ channels:#test:exits:2 set to: [QClient Quit]
-log 1 $ channels:#test:user_ids set to: [3], [me]
-log 4 $ bazbaz!~baz@baz.baz quits: Client Quit
+log 1 $ channels:#test:user_ids set to: [1], [me]
+log 4 $ barbar!~bar@bar.bar quits: Client Quit
 log 1 $ channels:#test:exits:2 cleared
 log 1 $ channels:#testtest:exits:2 set to: [QClient Quit]
 log 1 $ channels:#testtest:user_ids set to: [me]
-log 5 $ bazbaz!~baz@baz.baz quits: Client Quit
+log 5 $ barbar!~bar@bar.bar quits: Client Quit
 log 1 $ channels:#testtest:exits:2 cleared
 log 1 $ users:2 cleared
 
 # handle self-PART: clear channel, and its squatters
 > /window 4
-insert part0 :-1 +0 CHANNEL #test
-log 1 $ channels:#test:user_ids set to: [3]
-log 4 $ foo!~foobarbaz@baz.bar.foo parts
-insert part1 : +1 CHANNEL #test
-log 1 $ users:3 cleared
+insert part : +0 CHAN_WIN_ID=4 CHANNEL=#test USERIDS_CLEAR :set to: [1]
+log 1 $ users:1 cleared
 
 # handle lack of implementation
-insert servermsglogged : +0 MSG foo bar baz
-log 1 $ No handler implemented for: foo bar baz
-log 2,3,4,5,6,7 $ No handler implemented for: foo bar baz
+insert no-handler : +0 ALERT_WIN_IDS=2,3,4,5,6,7 ? :foo bar baz
 
 # handle /disconnect, clear all
-insert cmd-disconnect-0 :-1 +0 ~baz ~foobarbaz
-log 3,6,7 $ foo!~foobarbaz@baz.bar.foo quits: Client Quit
+insert cmd-disconnect-0 :-1
+log 3,6,7 $ foo!~baz@baz.bar.foo quits: Client Quit
 log 1 $ channels:#testtest:exits:me set to: [QClient Quit]
 log 1 $ channels:#testtest:user_ids cleared
-log 5 $ foo!~foobarbaz@baz.bar.foo quits: Client Quit
+log 5 $ foo!~baz@baz.bar.foo quits: Client Quit
 log 1 $ channels:#testtest:exits:me cleared
 insert cmd-disconnect-1 : +0
-insert disconnect1 :-1 +1 WIN_IDS 2,3,4,5,6,7
+insert disconnect1 :-1 +1 WIN_IDS :2,3,4,5,6,7
 log 1 $ motd cleared
 log 1 $ sasl_account set to: []
 log 1 $ sasl_auth_state set to: []
@@ -261,7 +211,7 @@ log 1 $ password set to: [bar]
 insert attempting :-1
 log 2 $ - password: bar
 
-insert connected : +1 WIN_IDS 2
+insert connected : +1 WIN_IDS :2
 insert conn_init_1
 insert conn_init_2
 
@@ -299,20 +249,19 @@ log 1 #   /window.prompt.scroll DIRECTION
 log 1 #   /window.raw VERB [PARAMS_STR]
 log 1 #   /window.reconnect
 
-insert during_conn : +0 rename_win_ids 3
+insert during_conn : +0 rename_win_ids :3
 
 # test setting up second client, but 432 irrecoverably
 > /connect baz.bar.foo:6697 ?foo bar:baz
-insert connect-bazbarfoo 1: +8 [foo] [?foo]
-insert attempting-bazbarfoo :2 +8
+insert connect 1: +8 foo.bar.baz=baz.bar.foo [foo] :[?foo]
+insert attempting :2 +8 foo.bar.baz :baz.bar.foo
 log 9 $ - nickname: ?foo
-insert attempting-bazbarfoo 3: +9
-insert connected :-1 +8 WIN_IDS 2
+insert attempting-to-connected 3:-1 +8 WIN_IDS=2 foo.bar.baz :baz.bar.foo
 log 8 > NICK :?foo
 servermsg 1 :*.?.net 432 * ?foo :Erroneous nickname
 log 8 < :*.?.net 432 * ?foo :Erroneous nickname
 insert isupport-clear : +8
-insert disconnect1 1:-1 +8 WIN_IDS 2
+insert disconnect1 1:-1 +8 WIN_IDS :2
 log 8 $ nickname refused for bad format, giving up
 
 # zero unread-lines counts in status line so it won't explode simulated screen
@@ -327,16 +276,14 @@ log 8 $ nickname refused for bad format, giving up
 > /window 1
 
 # test failing third connection
-insert connect : +10 foo.bar.baz baz.baz.baz
-insert attempting : +10 foo.bar.baz baz.baz.baz
-insert connected : +10 WIN_IDS 2
+insert connect : +10 foo.bar.baz :baz.baz.baz
+insert attempting-to-connected : +10 WIN_IDS=2 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 :-1 +10 EXIT_MSG :broken: FAKE_IRC_CONN_ABORT_EXCEPTION
+insert disconnect1 1:-1 +10 WIN_IDS :2
 log 10 $ will retry connecting in 1 seconds
 > /window 10
-> /disconnect
-log 10 $ already disconnected, stopped connecting attempts
+insert disconnect-to-stop-auto-reconnect : +10
 
 # zero unread-lines counts in status line so it won't explode simulated screen
 > /window 2
@@ -355,9 +302,9 @@ log 10 $ already disconnected, stopped connecting attempts
 > /reconnect
 insert attempting :-1
 log 2 $ - password: bar
-insert connected : +1 WIN_IDS 2,3,4,5,6,7
+insert connected : +1 WIN_IDS :2,3,4,5,6,7
 insert conn_init_1
 insert conn_init_2 :2
 log 1 > JOIN :#testtest
 insert conn_init_2 2:
-insert during_conn : +0 rename_win_ids 3,6,7
+insert during_conn : +0 rename_win_ids :3,6,7
index c16da481f8983830aceb3afb1f849794fd20b9ab..1a34b3ff39e3d792d31e698bc54ea60b78d03d69 100644 (file)
@@ -46,16 +46,16 @@ line 22 on_black,bright_white x123456789x1234567================================
 insert lines-prompt-empty
 
 × lines-status-prompt-start
-insert lines-status-prompt : +22 x123456789x1234567 :start)===========
+insert lines-status-prompt : +22 x123456789x1234567 ::start)===========
 
 × lines-status-prompt-foobarbaz
-insert lines-status-prompt : +22 x123456789x1234567 foo.bar.baz:debug)
+insert lines-status-prompt : +22 x123456789x1234567 :foo.bar.baz:debug)
 
 × line-invalid-prompt-command
 line 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 : +0 MSG :/CMD unknown
 
 × line-ping
 line 0 on_black,bright_white < §§:§§:§§ PING :?
@@ -64,8 +64,8 @@ line 0 on_black,bright_white < §§:§§:§§ PING :?
 line 0 on_black,bright_green > §§:§§:§§ PONG :?
 
 × lines-ping-pong
-insert line-ping : +0 ? ??
-insert line-pong : +1 ? ??
+insert line-ping : +0 ? :??
+insert line-pong : +1 ? :??
 
 × line-tui-log
 line 0 on_black,bright_cyan # §§:§§:§§ ?§§
@@ -90,202 +90,202 @@ line 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-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§§
 
 × history_1
 insert line-cal : +0
-insert line-server-log : +1 ? isupport cleared
-insert line-server-log : +2 ? isupport:CHANTYPES set to: [#&]
-insert line-server-log : +3 ? isupport:PREFIX set to: [(ov)@+]
-insert line-server-log : +4 ? isupport:USERLEN set to: [10]
-insert line-server-log : +5 ? caps cleared
-insert line-server-log : +6 ? users cleared
-insert line-server-log : +7 ? channels cleared
-insert line-server-log : +8 ? hostname set to: [foo.bar.baz]
-insert line-server-log : +9 ? port set to: [6697]
-insert line-server-log : +10 ? nick_wanted set to: [foo]
-insert line-server-log : +11 ? user_wanted set to: [baz]
-insert line-server-log : +12 ? realname set to: [bar]
-insert line-server-log : +13 ? connection_state set to: [connecting]
-insert line-server-log : +14 ? connection_state set to: [connected]
-insert line-client-msg : +15 ? CAP LS :302
-insert line-client-msg : +16 ? USER baz 0 * :bar
-insert line-client-msg : +17 ? NICK :foo
-insert lines-ping-pong : +18 ?? ?
-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 ?? foo
-insert lines-ping-pong : +26 ?? bar
-insert lines-ping-pong : +28 ?? baz
-insert lines-ping-pong : +30 ?? 0
-insert lines-ping-pong : +32 ?? 1
-insert lines-ping-pong : +34 ?? 2
-insert lines-ping-pong : +36 ?? 3
-insert lines-ping-pong : +38 ?? 4
-insert lines-ping-pong : +40 ?? 5
-insert lines-ping-pong : +42 ?? 6
-insert lines-ping-pong : +44 ?? 7
-insert lines-ping-pong : +46 ?? 8
-insert lines-ping-pong : +48 ?? 9
-insert lines-ping-pong : +50 ?? 10
-insert lines-ping-pong : +52 ?? 11
-insert lines-ping-pong : +54 ?? 12
-insert lines-ping-pong : +56 ?? 13
-insert lines-ping-pong : +58 ?? 14
-insert lines-ping-pong : +60 ?? 15
-insert lines-ping-pong : +62 ?? 16
-insert lines-ping-pong : +64 ?? 17
-insert lines-ping-pong : +66 ?? 18
-insert lines-ping-pong : +68 ?? 19
-insert lines-ping-pong : +70 ?? 20
-insert lines-ping-pong : +72 ?? 21
-insert lines-ping-pong : +74 ?? 22
-insert lines-ping-pong : +76 ?? 23
+insert line-server-log : +1 ? :isupport cleared
+insert line-server-log : +2 ? :isupport:CHANTYPES set to: [#&]
+insert line-server-log : +3 ? :isupport:PREFIX set to: [(ov)@+]
+insert line-server-log : +4 ? :isupport:USERLEN set to: [10]
+insert line-server-log : +5 ? :caps cleared
+insert line-server-log : +6 ? :users cleared
+insert line-server-log : +7 ? :channels cleared
+insert line-server-log : +8 ? :hostname set to: [foo.bar.baz]
+insert line-server-log : +9 ? :port set to: [6697]
+insert line-server-log : +10 ? :nick_wanted set to: [foo]
+insert line-server-log : +11 ? :user_wanted set to: [baz]
+insert line-server-log : +12 ? :realname set to: [bar]
+insert line-server-log : +13 ? :connection_state set to: [connecting]
+insert line-server-log : +14 ? :connection_state set to: [connected]
+insert line-client-msg : +15 ? :CAP LS :302
+insert line-client-msg : +16 ? :USER baz 0 * :bar
+insert line-client-msg : +17 ? :NICK :foo
+insert lines-ping-pong : +18 ?? :?
+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 ?? :foo
+insert lines-ping-pong : +26 ?? :bar
+insert lines-ping-pong : +28 ?? :baz
+insert lines-ping-pong : +30 ?? :0
+insert lines-ping-pong : +32 ?? :1
+insert lines-ping-pong : +34 ?? :2
+insert lines-ping-pong : +36 ?? :3
+insert lines-ping-pong : +38 ?? :4
+insert lines-ping-pong : +40 ?? :5
+insert lines-ping-pong : +42 ?? :6
+insert lines-ping-pong : +44 ?? :7
+insert lines-ping-pong : +46 ?? :8
+insert lines-ping-pong : +48 ?? :9
+insert lines-ping-pong : +50 ?? :10
+insert lines-ping-pong : +52 ?? :11
+insert lines-ping-pong : +54 ?? :12
+insert lines-ping-pong : +56 ?? :13
+insert lines-ping-pong : +58 ?? :14
+insert lines-ping-pong : +60 ?? :15
+insert lines-ping-pong : +62 ?? :16
+insert lines-ping-pong : +64 ?? :17
+insert lines-ping-pong : +66 ?? :18
+insert lines-ping-pong : +68 ?? :19
+insert lines-ping-pong : +70 ?? :20
+insert lines-ping-pong : +72 ?? :21
+insert lines-ping-pong : +74 ?? :22
+insert lines-ping-pong : +76 ?? :23
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
 
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # nothing happening on empty command input
 > 
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # check scrolling on empty history does nothing
 > /window.history.scroll up
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 > /window.history.scroll down
 insert lines-empty
-insert lines-status-prompt-start : +22 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # non-empty command input starts log at bottom, with date above it
-insert enter-unprefixed : +0 ? foo
+insert enter-unprefixed : +0 ? :foo
 insert lines-empty :20
 insert history_0 :2 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 > /window.history.scroll down
 insert lines-empty :20
 insert history_0 :2 +20
-insert lines-status-prompt-start : +22 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert line-scrolldown : +21 XXXXXX :[2] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert line-scrolldown : +21 XXXXXX :[2] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 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 X123456789X123456789X ============([(0:12)]
+insert line-scrolldown : +21 XXXXXX :[14] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :============([(0:12)]
 
 # 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 X123456789X123456789X =============([(0:3)]
+insert line-scrolldown : +21 XXXXXX :[3] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:3)]
 
 # 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 X123456789X123456789X =============([(0:3)]
+insert line-scrolldown : +21 XXXXXX :[14] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:3)]
 > /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 X123456789X123456789X =============([(0:3)]
+insert line-scrolldown : +21 XXXXXX :[3] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:3)]
 
 # 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 X123456789X123456789X =================([0]
-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 lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
+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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert line-scrolldown : +21 XXXXXX :[11] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # check wrapping
 > /window.history.scroll down
@@ -294,116 +294,116 @@ 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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert line-scrolldown : +21 XXXXXX :[10] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =================([0]
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 > /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 X123456789X123456789X =================([0]
+insert line-scrolldown : +21 XXXXXX :[10] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=================([0]
 
 # 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 X123456789X123456789X =============([(0:1)]
+insert line-scrolldown : +21 XXXXXX :[11] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
 
 # 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 X123456789X123456789X =============([(0:1)]
+insert line-scrolldown : +21 XXXXXX :[1] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
 
 # # 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 X123456789X123456789X =============([(0:1)]
+insert line-scrolldown : +21 XXXXXX :[11] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
 > /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 X123456789X123456789X =============([(0:1)]
+insert line-scrolldown : +21 XXXXXX :[22] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
 > /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 X123456789X123456789X =============([(0:1)]
+insert line-scrolldown : +21 XXXXXX :[25] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=============([(0:1)]
 
 # 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 X123456789X123456789X ([(0:1)] (1:18) (2:7)
+insert line-scrolldown : +21 XXXXXX :[25] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :([(0:1)] (1:18) (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 :4
 insert history_1 :18 +4
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====((0:1) [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====((0:1) [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 X123456789X123456789X =====([(0:1)] 1 (2:7)
+insert line-scrolldown : +21 XXXXXX :[25] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([(0:1)] 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 X123456789X123456789X =====([(0:1)] 1 (2:7)
+insert line-scrolldown : +21 XXXXXX :[14] v
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([(0:1)] 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 X123456789X123456789X =====([(0:1)] 1 (2:7)
+insert line-scrolldown : +21 XXXXXX :[3] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([(0:1)] 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 X123456789X123456789X =========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 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 X123456789X123456789X =========([0] 1 (2:7)
+insert line-scrolldown : +21 XXXXXX :[8] vv
+insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 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 X123456789X123456789X =========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 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 :3
 insert history_1 :18 +3
 insert line-bookmark : +21
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (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 X123456789X123456789X =========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
 
 # check new lines push bookmark up
 insert enter-list-start
@@ -412,223 +412,223 @@ 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 X123456789X123456789X =========([0] 1 (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=========([0] 1 (2:7)
 
 # check new lines growing in other window, one of which long enough to wrap, to be re-start count in status (with wrapped only as single) 
-insert ping-pong : +0 ? ?
-insert ping-pong : +0 ? 9 123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789
+insert ping-pong : +0 ? :?
+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 X123456789X123456789X =====([0] (1:4) (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:4) (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:18 +0
 insert line-bookmark : +15
 insert history_1 18:24 +16
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
 
 # check that growth below scroll does not by itself re-position bookmark in history
 > /window.history.scroll up
-insert ping-pong : +0 ? foo
+insert ping-pong : +0 ? :foo
 insert lines-empty :7
 insert history_1 0:14 +7
-insert line-scrolldown : +21 XXXXXX [10] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====(0 [(1:2)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[10] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
 > /window.history.scroll down
 insert history_1 4:18 +0
 insert line-bookmark : +14
 insert history_1 18:24 +15
-insert line-scrolldown : +21 XXXXXX [2] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====(0 [(1:2)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[2] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (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 X123456789X123456789X =====([0] (1:2) (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (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 X123456789X123456789X =====(0 [(1:2)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[2] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
 
 # 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 ? bar
+insert ping-pong : +0 ? :bar
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X =====([0] (1:4) (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (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 X123456789X123456789X =====(0 [(1:4)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[4] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:4)] (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 X123456789X123456789X =====(0 [(1:4)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[12] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:4)] (2:7)
 > /window 0
-insert ping-pong : +0 ? baz
+insert ping-pong : +0 ? :baz
 insert history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X =====([0] (1:6) (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (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 X123456789X123456789X =====(0 [(1:6)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[14] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:6)] (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 X123456789X123456789X =====(0 [(1:6)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[6] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:6)] (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 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
 
 # check log growth beyond max depth only remarkable after scrolling up to limit
-insert ping-pong : +0 ? 0
+insert ping-pong : +0 ? :0
 insert history_1 11:24 +0
 insert line-bookmark : +13
 insert history_1 24:32 +14
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (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 X123456789X123456789X =========(0 [1] (2:7)
+insert line-scrolldown : +21 XXXXXX :[9] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (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 X123456789X123456789X =========(0 [1] (2:7)
+insert line-scrolldown : +21 XXXXXX :[19] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (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 X123456789X123456789X =========(0 [1] (2:7)
+insert line-scrolldown : +21 XXXXXX :[29] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
 
 # check cut-off log growth seen from topmost scroll not affecting scrolldown count, but unread-lines status
-insert ping-pong : +0 ? 0
+insert ping-pong : +0 ? :0
 insert lines-empty :20
 insert history_1 2:3 +20
-insert line-scrolldown : +21 XXXXXX [29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====(0 [(1:2)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[29] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (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 X123456789X123456789X =====([0] (1:2) (2:7)
-insert ping-pong : +0 ? 1
-insert ping-pong : +0 ? 2
-insert ping-pong : +0 ? 3
-insert ping-pong : +0 ? 4
-insert ping-pong : +0 ? 5
-insert ping-pong : +0 ? 6
-insert ping-pong : +0 ? 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 lines-status-prompt-start : +22 X123456789X123456789X :=====([0] (1:2) (2:7)
+insert ping-pong : +0 ? :1
+insert ping-pong : +0 ? :2
+insert ping-pong : +0 ? :3
+insert ping-pong : +0 ? :4
+insert ping-pong : +0 ? :5
+insert ping-pong : +0 ? :6
+insert ping-pong : +0 ? :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 history_0 11:32 +0
 insert line-bookmark : +21
-insert lines-status-prompt-start : +22 X123456789X123456789X ====([0] (1:32) (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :====([0] (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 32:33 +20
-insert line-scrolldown : +21 XXXXXX [29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X ====(0 [(1:29)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[29] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:29)] (2:7)
 > /window.history.scroll down
 insert lines-empty :9
 insert history_1 32:44 +9
-insert line-scrolldown : +21 XXXXXX [18] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X ====(0 [(1:18)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[18] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:18)] (2:7)
 > /window.history.scroll down
 insert history_1 34:55 +0
-insert line-scrolldown : +21 XXXXXX [7] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====(0 [(1:7)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[7] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:7)] (2:7)
 > /window.history.scroll down
 insert history_1 40:60 +0
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
 
 # check bookmark remains absent with log growing while scrolled to bottom, …
-insert ping-pong : +0 ? 16
+insert ping-pong : +0 ? :16
 insert history_1 42:62 +0
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
 
 # … as well as if further growth happens below scroll 
 > /window.history.scroll up
 insert lines-empty :2
 insert history_1 34:53 +2
-insert line-scrolldown : +21 XXXXXX [11] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
-insert ping-pong : +0 ? 17
+insert line-scrolldown : +21 XXXXXX :[11] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+insert ping-pong : +0 ? :17
 insert lines-empty :4
 insert history_1 36:53 +4
-insert line-scrolldown : +21 XXXXXX [13] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====(0 [(1:2)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[13] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
 > /window.history.scroll down 
 insert history_1 43:64 +0
-insert line-scrolldown : +21 XXXXXX [2] vv
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =====(0 [(1:2)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[2] vv
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=====(0 [(1:2)] (2:7)
 > /window.history.scroll down 
 insert history_1 44:66 +0
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (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 36:53 +2
-insert line-scrolldown : +21 XXXXXX [11] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X =========(0 [1] (2:7)
-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 ping-pong : +0 ? 23
-insert ping-pong : +0 ? 24
-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 line-scrolldown : +21 XXXXXX :[11] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :=========(0 [1] (2:7)
+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 ping-pong : +0 ? :23
+insert ping-pong : +0 ? :24
+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 lines-empty :20
 insert history_1 66:67 +20
-insert line-scrolldown : +21 XXXXXX [29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X ====(0 [(1:29)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[29] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:29)] (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 X123456789X123456789X ====([0] (1:29) (2:7)
+insert lines-status-prompt-start : +22 X123456789X123456789X :====([0] (1:29) (2:7)
 > /window 1
 insert lines-empty :19
 insert history_1 66:67 +19
 insert line-bookmark : +20
-insert line-scrolldown : +21 XXXXXX [29] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X ====(0 [(1:29)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[29] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:29)] (2:7)
 > /window.history.scroll down
 insert lines-empty :8
 insert history_1 66:67 +8
 insert line-bookmark : +9
 insert history_1 67:78 +10
-insert line-scrolldown : +21 XXXXXX [18] v
-insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X ====(0 [(1:18)] (2:7)
+insert line-scrolldown : +21 XXXXXX :[18] v
+insert lines-status-prompt-foobarbaz : +22 X123456789X123456789X :====(0 [(1:18)] (2:7)
index ac492c53effa4b513f048563d4bb65bbe4dda2a1..43240d15c21ed09ac610403e14f84c831b3f2b08 100644 (file)
@@ -4,7 +4,7 @@ insert ./lib/servermsglogged
 insert ./lib/servernotice
 
 × servermsglogged-and-line-unwrapped
-insert servermsglogged : +0 MSG XXX
+insert servermsglogged : +0 MSG :XXX
 line 21 on_black,bright_white < §§:§§:§§ XXX§§
 
 × ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
@@ -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 : +0 XXX ::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 : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678 01
 line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
 line 21 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 : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789 1
 line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 123456789§§
 line 21 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 : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890 2
 line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
 line 21 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 : +0 MSG ::foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890  3
 line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 1234567890§§
 line 21 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 : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_2345678
 line 19 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
 line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_234567§§
 line 21 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 : +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 💓
 line 20 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo :456789 123456789 123456789 123456789 12345678§§
 line 21 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 : +0 MSG ::foo.bar.baz 002 foo :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456💓
 line 19 on_black,bright_white < §§:§§:§§ :foo.bar.baz 002 foo§§
 line 20 on_black,bright_white    :2345678_1_2345678_2_2345678_3_2345678_4_2345678_5_2345678_6_2345678_7_23456§§
 line 21 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 : +0 XXX :*** check that {esc|ape}s, formatting not counting into wrap
 line 20 on_black,bright_white < §§:§§:§§ :*.?.net NOTICE * :*** check that {esc|ape}s, formatting not counting§§
 line 21 on_black,bright_white    into wrap§§
 > /window 2
index 0d43a7d107c0c72eecdd604e109a5a29b92a4888..ee34d0160c7db8addf329a928fbfc8c65919de63 100644 (file)
@@ -8,8 +8,8 @@ insert ./lib/enter_misc
 > 
 
 # expected complaints on wrong command inputs
-insert enter-unprefixed : +0 ? foo
-insert enter-unknown : +0 ? foo
+insert enter-unprefixed : +0 ? :foo
+insert enter-unknown : +0 ? :foo
 > /help foo
 log 0 # invalid prompt command: /help given argument(s) while none expected
 > /window