_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),
) -> 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:
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)
-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
# 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:
> /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
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
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: []
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]
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
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
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
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
# 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
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
-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
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
# 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
× 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
× ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
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
-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
× ×-----------------------
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]
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
--- /dev/null
+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
× attempting-to-connected
insert attempting
-insert connected : +1 WIN_IDS 2
+insert connected
+++ /dev/null
-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
--- /dev/null
+insert ./lib/servermsglogged
+
+× cap-msg
+insert servermsglogged : +0 MSG ::*.?.net CAP CAPMSG
+++ /dev/null
-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
--- /dev/null
+× caps-data-set
+log 1 $ caps:CAPNAME:data set to: []
+log 1 $ caps:CAPNAME:data set to: [CAPVAL]
--- /dev/null
+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
+++ /dev/null
-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
× 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
--- /dev/null
+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]
× connect-to-connected
insert connect : +1
-insert attempting-to-connected : +1
-
+insert attempting-to-connected : +1 WIN_IDS :2
--- /dev/null
+× disconnect-to-stop-auto-reconnect
+> /disconnect
+log 1 $ already disconnected, stopped connecting attempts
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 :?
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
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
--- /dev/null
+insert ./lib/servermsglogged
+
+× no-handler
+insert servermsglogged : +0 MSG :?
+log 1 $ No handler implemented for: ?
+log ALERT_WIN_IDS $ No handler implemented for: ?
× 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
--- /dev/null
+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
insert ./lib/servermsglogged
× ping-pong
-insert servermsglogged : +0 MSG PING :?
+insert servermsglogged : +0 MSG :PING :?
log 1 > PONG :?
--- /dev/null
+× privmsg
+> /privmsg TARGET TXT
+log 1 > PRIVMSG TARGET :TXT
+log 3 > [foo] TXT
--- /dev/null
+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
+
insert ./lib/servermsglogged
× servernotice
-insert servermsglogged : +0 MSG :*.?.net NOTICE * :XXX
+insert servermsglogged : +0 MSG ::*.?.net NOTICE * :XXX
log 2 < (server) XXX
--- /dev/null
+× trigger-ping
+servermsg SERVER_ID timeout
+log LOG_ID > PING :what's up?
--- /dev/null
+× 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]
+
+++ /dev/null
-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]
-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
× ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
# 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
-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
× 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: []
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
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
> /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
> /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
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 :?
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 # §§:§§:§§ ?§§
× 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
> /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
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)
insert ./lib/servernotice
× servermsglogged-and-line-unwrapped
-insert servermsglogged : +0 MSG XXX
+insert servermsglogged : +0 MSG :XXX
line 21 on_black,bright_white < §§:§§:§§ XXX§§
× ×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××
> /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
>
# 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