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