PATH_TESTS = Path('tests')
_FAKE_TIMEOUT_PORTS_BEYOND = 10000
+_MARK_ANCHOR = '|'
+_MARK_COMMENT = '#'
+_MARK_LOG = 'log_'
+_MARK_LOGSRVRMSG = 'loggedservermsg_'
+_MARK_PROMPT = '>'
+_MARK_REPEAT = 'repeat'
+_MARK_SCREENLINE = 'line_'
+_MARK_SERVERMSG = 'servermsg_'
+_MARK_WAIT = 'wait'
+_SEP_0 = ' '
+_SEP_1 = ','
+_SEP_2 = ':'
+
class TestTerminal(QueueMixin, TerminalInterface):
'Collects keypresses from string queue, otherwise mostly dummy.'
self.db.port = self.db.port - 1
def _test_before(self, context: str, msg: str, cmp_msg: str) -> None:
- assert context.startswith(_CHAR_SERVER_MSG)
- assert context[len(_CHAR_SERVER_MSG):] == str(self.idx)
+ assert context.startswith(_MARK_SERVERMSG)
+ assert context[len(_MARK_SERVERMSG):] == str(self.idx)
assert msg == cmp_msg
def on_handled_loop_exception(self, e: IrcConnException) -> None:
super().handle_msg, msg)
-_CHAR_ANCHOR = '|'
-_CHAR_COMMENT = '#'
-_CHAR_CONTEXT_SEP = ' '
-_CHAR_ID_TYPE_SEP = ':'
-_CHAR_PROMPT = '>'
-_CHAR_SERVER_MSG = '<'
-_CHAR_RANGE = ':'
-_CHAR_RANGE_DATA_SEP = ' '
-_CHAR_WIN_ID_SEP = ','
-_CHAR_TUI = 't'
-_TOK_REPEAT = 'repeat'
-_TOK_WAIT = 'wait'
-
-
class _Playbook:
put_keypress: Optional[Callable] = None
assert_screen_line: Optional[Callable] = None
self._lines_t = [(str(idx + 1), line.rstrip('\n'))
for idx, line in enumerate(f.readlines())]
- def expand_parsed(marker, parse_into, **kwargs) -> bool:
+ def expand_parsed(marker: str, parse_into: Callable, **kwargs) -> bool:
inserts: list[tuple[str, str]] = []
for idx, line_t in enumerate(self._lines_t):
if not line_t[1].startswith(marker):
def split_server_put_and_log(line_t: tuple[str, str], **_
) -> list[tuple[str, str]]:
index_str = line_t[0]
- context, msg = self._split_by_context_separator(line_t[1])
+ context, msg = line_t[1].split(_SEP_0, maxsplit=1)
fmt, msg_no_fmt = msg.split(LOG_FMT_SEP, maxsplit=1)
for c in fmt[:-1]:
assert c in LOG_FMT_ATTRS
assert fmt[-1] == LOG_PREFIX_IN
- c_id, win_ids = context[1:].split(_CHAR_ID_TYPE_SEP, maxsplit=1)
- return [
- (index_str + ':s:0',
- f'{_CHAR_SERVER_MSG}{c_id}{_CHAR_CONTEXT_SEP}{msg_no_fmt}'),
- (index_str + ':s:1',
- win_ids + _CHAR_CONTEXT_SEP + msg)]
+ c_id, win_ids = context[len(_MARK_LOGSRVRMSG):].split(_SEP_2,
+ maxsplit=1)
+ return [(f'{index_str}:s:0', _SEP_0.join((_MARK_SERVERMSG + c_id,
+ msg_no_fmt))),
+ (f'{index_str}:s:1', _SEP_0.join((_MARK_LOG + win_ids,
+ msg)))]
def repeat(line_t: tuple[str, str], anchors: dict[str, int], **__
) -> list[tuple[str, str]]:
index_str = line_t[0]
- range_data = line_t[1][len(_TOK_REPEAT) + 1:].split(
- _CHAR_RANGE_DATA_SEP, maxsplit=2)
+ range_data = line_t[1].split(_SEP_0, maxsplit=1
+ )[1].split(_SEP_0, maxsplit=2)
start_key, end_key = range_data[:2]
start = anchors[start_key] + 1
end = anchors[end_key]
for inserted_t in self._lines_t[int(start):int(end)]:
insert = inserted_t[1]
if len(range_data) == 3\
- and insert and not insert.startswith(_CHAR_ANCHOR):
- insert = _CHAR_CONTEXT_SEP.join(
+ and insert and not insert.startswith(_MARK_ANCHOR):
+ insert = _SEP_0.join(
[range_data[2]]
- + [self._split_by_context_separator(insert)[1]])
+ + [insert.split(_SEP_0, maxsplit=1)[1]])
inserts += [(index_str + ':r:' + inserted_t[0], insert)]
return inserts
- while expand_parsed(_CHAR_ID_TYPE_SEP, split_server_put_and_log):
+ while expand_parsed(_MARK_LOGSRVRMSG, split_server_put_and_log):
pass
while True:
anchors: dict[str, int] = {}
for idx, line_t in enumerate(self._lines_t):
- if line_t[1][:1] == _CHAR_ANCHOR:
- anchors[line_t[1][2:]] = idx
- if not expand_parsed(_TOK_REPEAT, repeat, anchors=anchors):
+ if line_t[1].startswith(_MARK_ANCHOR):
+ anchors[line_t[1].split(_SEP_0, maxsplit=1)[1]] = idx
+ if not expand_parsed(_MARK_REPEAT, repeat, anchors=anchors):
break
self._lines_t = [
line_t for line_t in self._lines_t
- if line_t[1]
- and line_t[1][:1] not in {_CHAR_ANCHOR, _CHAR_COMMENT}]
+ if line_t[1] and not (line_t[1].startswith(_MARK_ANCHOR)
+ or line_t[1].startswith(_MARK_COMMENT))]
if self._verbose:
- self._max_len_idx = max(len(line_t[0]) for line_t in self._lines_t)
- self._max_len_ctx = max(
- len(self._split_by_context_separator(line_t[1])[0])
- for line_t in self._lines_t)
+ self._max_len_idx = max(len(line_t[0])
+ for line_t in self._lines_t)
+ self._max_len_ctx = max(len(line_t[1].split(_SEP_0)[0])
+ for line_t in self._lines_t)
title_idx = 'line number(s)'
title_ctx = 'context'
self._max_len_idx = max(self._max_len_idx, len(title_idx))
*f_args, **f_kwargs
) -> None:
'Call f with checks before and after against playbook, play it on.'
- context, msg = self._split_by_context_separator(self._current_line[1])
+ context, msg = self._current_line[1].split(_SEP_0, maxsplit=1)
if test_before:
test_before(context, msg)
self._idx += 1
def _play_till_test(self) -> None:
while True:
idx_info, line = self._current_line
- context, msg = self._split_by_context_separator(line)
+ context, msg = line.split(_SEP_0, maxsplit=1)
if self._verbose:
print(self._str_padded_to(idx_info, self._max_len_idx),
self._str_padded_to(context, self._max_len_ctx),
msg)
- if context == _CHAR_PROMPT:
+ if context == _MARK_PROMPT:
assert self.put_keypress is not None
for c in msg:
self.put_keypress(c)
self.put_keypress('KEY_ENTER')
break
- if context.startswith(_CHAR_SERVER_MSG):
- client = self._get_client(int(context[len(_CHAR_SERVER_MSG):]))
+ if context.startswith(_MARK_SERVERMSG):
+ client = self._get_client(int(context[len(_MARK_SERVERMSG):]))
assert isinstance(client.conn, _FakeIrcConnection), client.conn
client.conn.put_server_msg(msg)
break
- if context.startswith(_CHAR_TUI):
+ if context.startswith(_MARK_SCREENLINE):
assert self.assert_screen_line is not None
assert self.redraw_affected is not None
- _, y_str = context.split('.')
x_str, attrs_str, msg = msg.split('.', maxsplit=2)
self.redraw_affected()
- self.assert_screen_line(int(y_str), int(x_str), msg, attrs_str)
- elif context == _TOK_WAIT:
+ self.assert_screen_line(int(context[len(_MARK_SCREENLINE):]),
+ int(x_str), msg, attrs_str)
+ elif context.startswith(_MARK_LOG):
+ break
+ elif context == _MARK_WAIT:
assert msg.isdigit()
sleep(int(msg))
else:
break
self._idx += 1
- @staticmethod
- def _split_by_context_separator(line: str) -> tuple[str, ...]:
- 'Return two-items tuple of CHAR_CONTEXT_SEP-split line, or None.'
- return tuple(line.split(_CHAR_CONTEXT_SEP, maxsplit=1))
-
class TestingClientTui(ClientTui):
'Collects keypresses via TestTerminal and test file, compares log results.'
for c in time_str[:2] + time_str[3:5] + time_str[6:]:
assert c.isdigit()
assert time_str[2] == ':' and time_str[5] == ':'
- if _CHAR_RANGE in context:
- _, context = context.split(_CHAR_RANGE)
expected_win_ids = tuple(
- int(idx) for idx in context.split(_CHAR_WIN_ID_SEP) if idx)
+ int(idx) for idx in context[len(_MARK_LOG):].split(_SEP_1)
+ if idx)
info = ('WANTED:', expected_win_ids, expected_msg,
'GOT:', win_ids, msg_sans_time)
assert expected_msg == msg_sans_time, info
def cmd__prompt_enter(self) -> None:
def test_before(context: str, msg: str) -> None:
- assert context.startswith(_CHAR_PROMPT)
+ assert context == _MARK_PROMPT
assert msg == self.window.prompt.input_buffer[:]
self._playbook.test_wrap(test_before, None, super().cmd__prompt_enter)
| clientwin-init-in
| isupport-clear-in
-1 ..$ isupport cleared
-1 ..$ isupport:CHANTYPES set to: [#&]
-1 ..$ isupport:PREFIX set to: [(ov)@+]
-1 ..$ isupport:USERLEN set to: [10]
+log_1 ..$ isupport cleared
+log_1 ..$ isupport:CHANTYPES set to: [#&]
+log_1 ..$ isupport:PREFIX set to: [(ov)@+]
+log_1 ..$ isupport:USERLEN set to: [10]
| isupport-clear-out
-1 ..$ caps cleared
-1 ..$ users cleared
-1 ..$ channels cleared
+log_1 ..$ caps cleared
+log_1 ..$ users cleared
+log_1 ..$ channels cleared
| clientwin-init-out
, ..$ DISCONNECTED
-1 ..$ hostname set to: [foo.bar.baz]
+log_1 ..$ hostname set to: [foo.bar.baz]
| conn-init-retries-in
-1 ..$ port set to: [10003]
-1 ..$ nick_wanted set to: [foo]
-1 ..$ user_wanted set to: [foobarbazquux]
-1 ..$ realname set to: [baz]
-1 ..$ password set to: [bar]
+log_1 ..$ port set to: [10003]
+log_1 ..$ nick_wanted set to: [foo]
+log_1 ..$ user_wanted set to: [foobarbazquux]
+log_1 ..$ realname set to: [baz]
+log_1 ..$ password set to: [bar]
-1 ..$ connection_state set to: [connecting]
-1 ..$ port set to: [10002]
-1 ..$ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
-1 .!$ will retry connecting in 1 seconds
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ port set to: [10002]
+log_1 ..$ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+log_1 .!$ will retry connecting in 1 seconds
-1 ..$ connection_state set to: [connecting]
-1 ..$ port set to: [10001]
-1 ..$ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
-1 .!$ will retry connecting in 2 seconds
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ port set to: [10001]
+log_1 ..$ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+log_1 .!$ will retry connecting in 2 seconds
-1 ..$ connection_state set to: [connecting]
-1 ..$ port set to: [10000]
-1 ..$ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
-1 .!$ will retry connecting in 4 seconds
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ port set to: [10000]
+log_1 ..$ connection_state set to: [failed to connect: FAKE TESTING TIMEOUT]
+log_1 .!$ will retry connecting in 4 seconds
| conn-init-retries-out
# with TestingClient finally having reduced port to 10000, connecting works now
| conn-full-in
| conn0-in
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
| conn0-out
, ..$ CONNECTED
| conn1-in
-1 ..> CAP LS :302
-1 ..> USER foobarbazquux 0 * :baz
-1 ..> NICK :foo
+log_1 ..> CAP LS :302
+log_1 ..> USER foobarbazquux 0 * :baz
+log_1 ..> NICK :foo
| conn1-out
| conn-full-out
# test retry chain also started by in-connection timeout
-<0 timeout
-1 ..> PING :what's up?
-<0 timeout
-<0 no timely PONG from server
-1 ..$ connection_state set to: [broken: no timely PONG from server]
+servermsg_0 timeout
+log_1 ..> PING :what's up?
+servermsg_0 timeout
+servermsg_0 no timely PONG from server
+log_1 ..$ connection_state set to: [broken: no timely PONG from server]
repeat isupport-clear-in isupport-clear-out
-1 ..$ connection_state set to: []
+log_1 ..$ connection_state set to: []
, ..$ DISCONNECTED
-1 .!$ will retry connecting in 1 seconds
+log_1 .!$ will retry connecting in 1 seconds
repeat conn-full-in conn-full-out
# on second server, check timed auto-retries don't activate after manual intervention
> /connect baz.bar.foo:10003 foo:bar baz:foobarbazquux
-repeat clientwin-init-in clientwin-init-out 2
+repeat clientwin-init-in clientwin-init-out log_2
, ..$ DISCONNECTED
-2 ..$ hostname set to: [baz.bar.foo]
-repeat conn-init-retries-in conn-init-retries-out 2
+log_2 ..$ hostname set to: [baz.bar.foo]
+repeat conn-init-retries-in conn-init-retries-out log_2
> /window 2
> /reconnect
-repeat conn0-in conn0-out 2
+repeat conn0-in conn0-out log_2
, ..$ CONNECTED
-repeat conn1-in conn1-out 2
+repeat conn1-in conn1-out log_2
wait 4
> /disconnect
-2 ..> QUIT :ircplom says bye
+log_2 ..> QUIT :ircplom says bye
wait 4
> /quit
-0 ..<
+log_0 ..<
-0 ..# Found config at tests/config.toml, reading …
-0 ..# Connecting: {'hostname': 'irc.test0.net', 'nickname': 'foo', 'password': 'bar', 'username': 'baz', 'realname': 'quux', 'port': 1234, 'channels': ['#test', '##testtest']}
-1 ..$ isupport cleared
-1 ..$ isupport:CHANTYPES set to: [#&]
-1 ..$ isupport:PREFIX set to: [(ov)@+]
-1 ..$ isupport:USERLEN set to: [10]
-1 ..$ caps cleared
-1 ..$ users cleared
-1 ..$ channels cleared
+log_0 ..# Found config at tests/config.toml, reading …
+log_0 ..# Connecting: {'hostname': 'irc.test0.net', 'nickname': 'foo', 'password': 'bar', 'username': 'baz', 'realname': 'quux', 'port': 1234, 'channels': ['#test', '##testtest']}
+log_1 ..$ isupport cleared
+log_1 ..$ isupport:CHANTYPES set to: [#&]
+log_1 ..$ isupport:PREFIX set to: [(ov)@+]
+log_1 ..$ isupport:USERLEN set to: [10]
+log_1 ..$ caps cleared
+log_1 ..$ users cleared
+log_1 ..$ channels cleared
, ..$ DISCONNECTED
-1 ..$ hostname set to: [irc.test0.net]
-1 ..$ port set to: [1234]
-1 ..$ nick_wanted set to: [foo]
-1 ..$ user_wanted set to: [baz]
-1 *.$ realname set to: [quux]
-1 ..$ password set to: [bar]
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
+log_1 ..$ hostname set to: [irc.test0.net]
+log_1 ..$ port set to: [1234]
+log_1 ..$ nick_wanted set to: [foo]
+log_1 ..$ user_wanted set to: [baz]
+log_1 *.$ realname set to: [quux]
+log_1 ..$ password set to: [bar]
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
, ..$ CONNECTED
-1 ..> CAP LS :302
-1 *.> USER baz 0 * :quux
-1 ..> NICK :foo
+log_1 ..> CAP LS :302
+log_1 *.> USER baz 0 * :quux
+log_1 ..> NICK :foo
> /quit
-0 .<
+log_0 .<
# to prepare, initiate connection
> /connect foo.bar.baz foo bar:baz
| isupport-clear-in
-1 ..$ isupport cleared
-1 ..$ isupport:CHANTYPES set to: [#&]
-1 ..$ isupport:PREFIX set to: [(ov)@+]
-1 ..$ isupport:USERLEN set to: [10]
+log_1 ..$ isupport cleared
+log_1 ..$ isupport:CHANTYPES set to: [#&]
+log_1 ..$ isupport:PREFIX set to: [(ov)@+]
+log_1 ..$ isupport:USERLEN set to: [10]
| isupport-clear-out
-1 ..$ caps cleared
-1 ..$ users cleared
-1 ..$ channels cleared
+log_1 ..$ caps cleared
+log_1 ..$ users cleared
+log_1 ..$ channels cleared
, ..$ DISCONNECTED
-1 ..$ hostname set to: [foo.bar.baz]
-1 ..$ port set to: [-1]
-1 ..$ nick_wanted set to: [foo]
-1 ..$ user_wanted set to: [baz]
-1 ..$ realname set to: [bar]
-1 ..$ port set to: [6697]
+log_1 ..$ hostname set to: [foo.bar.baz]
+log_1 ..$ port set to: [-1]
+log_1 ..$ nick_wanted set to: [foo]
+log_1 ..$ user_wanted set to: [baz]
+log_1 ..$ realname set to: [bar]
+log_1 ..$ port set to: [6697]
| connecting-in
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
, ..$ CONNECTED
-1 ..> CAP LS :302
-1 ..> USER baz 0 * :bar
-1 ..> NICK :foo
+log_1 ..> CAP LS :302
+log_1 ..> USER baz 0 * :bar
+log_1 ..> NICK :foo
| connecting-out
# fail to reconnect while connected
> /window 1
> /reconnect
-1 .!$ not re-connecting since already connected
+log_1 .!$ not re-connecting since already connected
# handle /disconnect on being connected
> /disconnect
-1 ..> QUIT :ircplom says bye
-:0:1 ..< ERROR :Closing link: (whatever@whatever.com) [Quit: ircplom says bye]
-1 ..$ connection_state set to: [Closing link: (whatever@whatever.com) [Quit: ircplom says bye]]
+log_1 ..> QUIT :ircplom says bye
+loggedservermsg_0:1 ..< ERROR :Closing link: (whatever@whatever.com) [Quit: ircplom says bye]
+log_1 ..$ connection_state set to: [Closing link: (whatever@whatever.com) [Quit: ircplom says bye]]
repeat isupport-clear-in isupport-clear-out
-1 ..$ connection_state set to: []
+log_1 ..$ connection_state set to: []
, ..$ DISCONNECTED
# fail to disconnect when already disconnected
> /disconnect
-1 .!$ cannot send, connection seems closed
+log_1 .!$ cannot send, connection seems closed
# succeed to re-connect after disconnect
> /reconnect
repeat connecting-in connecting-out
> /quit
-0 ..<
+log_0 ..<
# to prepare first test, initiate connected state
> /connect foo.bar.baz foo bar:baz
| isupport-clear-in
-1 ..$ isupport cleared
-1 ..$ isupport:CHANTYPES set to: [#&]
-1 ..$ isupport:PREFIX set to: [(ov)@+]
-1 ..$ isupport:USERLEN set to: [10]
+log_1 ..$ isupport cleared
+log_1 ..$ isupport:CHANTYPES set to: [#&]
+log_1 ..$ isupport:PREFIX set to: [(ov)@+]
+log_1 ..$ isupport:USERLEN set to: [10]
| isupport-clear-out
-1 ..$ caps cleared
-1 ..$ users cleared
-1 ..$ channels cleared
+log_1 ..$ caps cleared
+log_1 ..$ users cleared
+log_1 ..$ channels cleared
, ..$ DISCONNECTED
-1 ..$ hostname set to: [foo.bar.baz]
-1 ..$ port set to: [-1]
-1 ..$ nick_wanted set to: [foo]
-1 ..$ user_wanted set to: [baz]
-1 ..$ realname set to: [bar]
-1 ..$ port set to: [6697]
+log_1 ..$ hostname set to: [foo.bar.baz]
+log_1 ..$ port set to: [-1]
+log_1 ..$ nick_wanted set to: [foo]
+log_1 ..$ user_wanted set to: [baz]
+log_1 ..$ realname set to: [bar]
+log_1 ..$ port set to: [6697]
| connecting-in
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
, ..$ CONNECTED
-1 ..> CAP LS :302
-1 ..> USER baz 0 * :bar
-1 ..> NICK :foo
+log_1 ..> CAP LS :302
+log_1 ..> USER baz 0 * :bar
+log_1 ..> NICK :foo
| connecting-out
# test default ERROR handling
-:0:1 ..< ERROR :abc def ghi
-1 ..$ connection_state set to: [abc def ghi]
+loggedservermsg_0:1 ..< ERROR :abc def ghi
+log_1 ..$ connection_state set to: [abc def ghi]
| disconnecting-in
repeat isupport-clear-in isupport-clear-out
-1 ..$ connection_state set to: []
+log_1 ..$ connection_state set to: []
, ..$ DISCONNECTED
| disconnecting-out
repeat connecting-in connecting-out
# test "timed out)" ERROR handling
-:0:1 ..< ERROR :Closing link: (Connection timed out)
-1 ..$ connection_state set to: [Closing link: (Connection timed out)]
+loggedservermsg_0:1 ..< ERROR :Closing link: (Connection timed out)
+log_1 ..$ connection_state set to: [Closing link: (Connection timed out)]
repeat disconnecting-in disconnecting-out
-1 .!$ will retry connecting in 1 seconds
+log_1 .!$ will retry connecting in 1 seconds
# over and out
> /quit
-0 ..<
+log_0 ..<
> /connect foo.bar.baz foo:bar baz:foobarbazquux
| isupport-clear-in
-1 ..$ isupport cleared
-1 ..$ isupport:CHANTYPES set to: [#&]
-1 ..$ isupport:PREFIX set to: [(ov)@+]
-1 ..$ isupport:USERLEN set to: [10]
+log_1 ..$ isupport cleared
+log_1 ..$ isupport:CHANTYPES set to: [#&]
+log_1 ..$ isupport:PREFIX set to: [(ov)@+]
+log_1 ..$ isupport:USERLEN set to: [10]
| isupport-clear-out
-1 ..$ caps cleared
-1 ..$ users cleared
-1 ..$ channels cleared
+log_1 ..$ caps cleared
+log_1 ..$ users cleared
+log_1 ..$ channels cleared
, ..$ DISCONNECTED
-1 ..$ hostname set to: [foo.bar.baz]
-1 ..$ port set to: [-1]
-1 ..$ nick_wanted set to: [foo]
-1 ..$ user_wanted set to: [foobarbazquux]
-1 ..$ realname set to: [baz]
-1 ..$ password set to: [bar]
-1 ..$ port set to: [6697]
+log_1 ..$ hostname set to: [foo.bar.baz]
+log_1 ..$ port set to: [-1]
+log_1 ..$ nick_wanted set to: [foo]
+log_1 ..$ user_wanted set to: [foobarbazquux]
+log_1 ..$ realname set to: [baz]
+log_1 ..$ password set to: [bar]
+log_1 ..$ port set to: [6697]
| conn0-in
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
| conn0-out
, ..$ CONNECTED
| conn1-in
-1 ..> CAP LS :302
-1 ..> USER foobarbazquux 0 * :baz
-1 ..> NICK :foo
+log_1 ..> CAP LS :302
+log_1 ..> USER foobarbazquux 0 * :baz
+log_1 ..> NICK :foo
| conn1-out
# ensure we PONG properly
-:0:1 ..< PING :?
-1 ..> PONG :?
+loggedservermsg_0:1 ..< PING :?
+log_1 ..> PONG :?
# ping on timeout, go on as normal if PONG received
| full-timeout-in
| trigger-ping-in
-<0 timeout
-1 ..> PING :what's up?
+servermsg_0 timeout
+log_1 ..> PING :what's up?
| trigger-ping-out
-:0:1 ..< :*.?.net PONG *.?.net :what's up?
-:0:1 ..< :*.?.net NOTICE * :*** Looking up your ident...
-2 ..< (server) *** Looking up your ident...
+loggedservermsg_0:1 ..< :*.?.net PONG *.?.net :what's up?
+loggedservermsg_0:1 ..< :*.?.net NOTICE * :*** Looking up your ident...
+log_2 ..< (server) *** Looking up your ident...
# another timeout instead of pong? disconnect
repeat trigger-ping-in trigger-ping-out
-<0 timeout
-<0 no timely PONG from server
-1 ..$ connection_state set to: [broken: no timely PONG from server]
+servermsg_0 timeout
+servermsg_0 no timely PONG from server
+log_1 ..$ connection_state set to: [broken: no timely PONG from server]
repeat isupport-clear-in isupport-clear-out
-1 ..$ connection_state set to: []
-2 ..$ DISCONNECTED
-1 .!$ will retry connecting in 1 seconds
+log_1 ..$ connection_state set to: []
+log_2 ..$ DISCONNECTED
+log_1 .!$ will retry connecting in 1 seconds
| full-timeout-out
# on re-connect, ensure timer cleared, i.e. only 2nd time-out will disconnect
> /window 1
> /reconnect
repeat conn0-in conn0-out
-2 ..$ CONNECTED
+log_2 ..$ CONNECTED
repeat conn1-in conn1-out
repeat full-timeout-in full-timeout-out
> /quit
-0 ..<
+log_0 ..<
> /connect foo.bar.baz foo:bar baz:foobarbazquux
| standard-clears-in
| isupport-clear-in
-1 ..$ isupport cleared
-1 ..$ isupport:CHANTYPES set to: [#&]
-1 ..$ isupport:PREFIX set to: [(ov)@+]
-1 ..$ isupport:USERLEN set to: [10]
+log_1 ..$ isupport cleared
+log_1 ..$ isupport:CHANTYPES set to: [#&]
+log_1 ..$ isupport:PREFIX set to: [(ov)@+]
+log_1 ..$ isupport:USERLEN set to: [10]
| isupport-clear-out
-1 ..$ caps cleared
-1 ..$ users cleared
-1 ..$ channels cleared
+log_1 ..$ caps cleared
+log_1 ..$ users cleared
+log_1 ..$ channels cleared
| standard-clears-out
, ..$ DISCONNECTED
# connect with values set by /connect, init CAP negotation
-1 ..$ hostname set to: [foo.bar.baz]
-1 ..$ port set to: [-1]
-1 ..$ nick_wanted set to: [foo]
-1 ..$ user_wanted set to: [foobarbazquux]
-1 ..$ realname set to: [baz]
-1 ..$ password set to: [bar]
-1 ..$ port set to: [6697]
+log_1 ..$ hostname set to: [foo.bar.baz]
+log_1 ..$ port set to: [-1]
+log_1 ..$ nick_wanted set to: [foo]
+log_1 ..$ user_wanted set to: [foobarbazquux]
+log_1 ..$ realname set to: [baz]
+log_1 ..$ password set to: [bar]
+log_1 ..$ port set to: [6697]
| conn0
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
| conn1
, ..$ CONNECTED
| conn2
-1 ..> CAP LS :302
-1 ..> USER foobarbazquux 0 * :baz
-1 ..> NICK :foo
+log_1 ..> CAP LS :302
+log_1 ..> USER foobarbazquux 0 * :baz
+log_1 ..> NICK :foo
# expect some NOTICE and PING to process/reply during initiation
-:0:1 ..< :*.?.net NOTICE * :*** Looking up your ident...
-2 ..< (server) *** Looking up your ident...
-:0:1 ..< :*.?.net NOTICE * :*** Looking up your hostname...
-2 ..< (server) *** Looking up your hostname...
-:0:1 ..< :*.?.net NOTICE * :*** Found your hostname (baz.bar.foo)
-2 ..< (server) *** Found your hostname (baz.bar.foo)
-:0:1 ..< PING :?
-1 ..> PONG :?
+loggedservermsg_0:1 ..< :*.?.net NOTICE * :*** Looking up your ident...
+log_2 ..< (server) *** Looking up your ident...
+loggedservermsg_0:1 ..< :*.?.net NOTICE * :*** Looking up your hostname...
+log_2 ..< (server) *** Looking up your hostname...
+loggedservermsg_0:1 ..< :*.?.net NOTICE * :*** Found your hostname (baz.bar.foo)
+log_2 ..< (server) *** Found your hostname (baz.bar.foo)
+loggedservermsg_0:1 ..< PING :?
+log_1 ..> PONG :?
# handle 433
-:0:1 ..< :*.?.net 433 * foo :Nickname already in use
-1 .!$ nickname already in use, trying increment
-1 ..> NICK :foo0
-:0:1 ..< :*.?.net 433 * foo0 :Nickname already in use
-1 .!$ nickname already in use, trying increment
-1 ..> NICK :foo1
+loggedservermsg_0:1 ..< :*.?.net 433 * foo :Nickname already in use
+log_1 .!$ nickname already in use, trying increment
+log_1 ..> NICK :foo0
+loggedservermsg_0:1 ..< :*.?.net 433 * foo0 :Nickname already in use
+log_1 .!$ nickname already in use, trying increment
+log_1 ..> NICK :foo1
# collect server capabilities
-:0:1 ..< :*.?.net CAP * LS : foo bar sasl=PLAIN,EXTERNAL baz cap-notify
-1 ..> CAP REQ :sasl
-1 ..> CAP :LIST
-:0:1 ..< :*.?.net CAP * ACK :sasl
-:0:1 ..< :*.?.net CAP * LIST :cap-notify sasl
-1 ..$ caps:bar:data set to: []
-1 ..$ caps:baz:data set to: []
-1 ..$ caps:cap-notify:data set to: []
-1 ..$ caps:cap-notify:enabled set to: [True]
-1 ..$ caps:foo:data set to: []
-1 ..$ caps:sasl:data set to: []
-1 ..$ caps:sasl:data set to: [PLAIN,EXTERNAL]
-1 ..$ caps:sasl:enabled set to: [True]
+loggedservermsg_0:1 ..< :*.?.net CAP * LS : foo bar sasl=PLAIN,EXTERNAL baz cap-notify
+log_1 ..> CAP REQ :sasl
+log_1 ..> CAP :LIST
+loggedservermsg_0:1 ..< :*.?.net CAP * ACK :sasl
+loggedservermsg_0:1 ..< :*.?.net CAP * LIST :cap-notify sasl
+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:cap-notify:enabled set to: [True]
+log_1 ..$ caps:foo:data set to: []
+log_1 ..$ caps:sasl:data set to: []
+log_1 ..$ caps:sasl:data set to: [PLAIN,EXTERNAL]
+log_1 ..$ caps:sasl:enabled set to: [True]
# authenticate via SASL, collect items of user identity
-1 ..$ sasl_auth_state set to: [attempting]
-1 ..> AUTHENTICATE :PLAIN
-:0:1 ..< AUTHENTICATE +
-1 ..> AUTHENTICATE :Zm9vAGZvbwBiYXI=
-:0:1 ..< :foo.bar.baz 900 foo1 foo1!foobarbazq@baz.bar.foo foo :You are now logged in as foo
-1 ..$ users:me:nick set to: [?]
-1 ..$ users:me:nick set to: [foo1]
-1 ..$ users:me:user set to: [foobarbazq]
-1 ..$ users:me:host set to: [baz.bar.foo]
-1 ..$ sasl_account set to: [foo]
-:0:1 ..< :foo.bar.baz 903 foo1 :SASL authentication successful
-1 ..$ sasl_auth_state set to: [SASL authentication successful]
+log_1 ..$ sasl_auth_state set to: [attempting]
+log_1 ..> AUTHENTICATE :PLAIN
+loggedservermsg_0:1 ..< AUTHENTICATE +
+log_1 ..> AUTHENTICATE :Zm9vAGZvbwBiYXI=
+loggedservermsg_0:1 ..< :foo.bar.baz 900 foo1 foo1!foobarbazq@baz.bar.foo foo :You are now logged in as foo
+log_1 ..$ users:me:nick set to: [?]
+log_1 ..$ users:me:nick set to: [foo1]
+log_1 ..$ users:me:user set to: [foobarbazq]
+log_1 ..$ users:me:host set to: [baz.bar.foo]
+log_1 ..$ sasl_account set to: [foo]
+loggedservermsg_0:1 ..< :foo.bar.baz 903 foo1 :SASL authentication successful
+log_1 ..$ sasl_auth_state set to: [SASL authentication successful]
# finish CAP negotation, thus login procedure
-1 ..> CAP :END
+log_1 ..> CAP :END
# of all pre-MOTD greeting messages, only process isupports
-:0:1 ..< :foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
+loggedservermsg_0:1 ..< :foo.bar.baz 001 foo1 :Welcome to the foo.bar.baz network
| conn3
-:0:1 ..< :foo.bar.baz 002 foo1 :Your host is foo.bar.baz
-:0:1 ..< :foo.bar.baz 003 foo1 :This server was created Jan 1 2020
-:0:1 ..< :foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
-:0:1 ..< :foo.bar.baz 005 foo1 ABC=DEF GHI=JKL :are supported by this server
-1 ..$ isupport:ABC set to: [DEF]
-1 ..$ isupport:GHI set to: [JKL]
-:0:1 ..< :foo.bar.baz 005 foo1 MNO=PQR STU=VWX Y=Z :are supported by this server
-1 ..$ isupport:MNO set to: [PQR]
-1 ..$ isupport:STU set to: [VWX]
-1 ..$ isupport:Y set to: [Z]
-:0:1 ..< :foo.bar.baz 251 foo1 :There are 10 users and 1000 invisible on 5 servers
-:0:1 ..< :foo.bar.baz 252 foo1 7 :IRC Operators online
-:0:1 ..< :foo.bar.baz 253 foo1 4 :unknown connection(s)
-:0:1 ..< :foo.bar.baz 254 foo1 800 :channels formed
-:0:1 ..< :foo.bar.baz 255 foo1 :I have 100 clients and 1 serveres
-:0:1 ..< :foo.bar.baz 265 foo1 100 150 :Current local users 100, max 150
-:0:1 ..< :foo.bar.baz 266 foo1 1010 1050 :Current global users 1010, max 1050
-:0:1 ..< :foo.bar.baz 250 foo1 :Highest connection count: 151 (150 clients) (1080 connections received)
+loggedservermsg_0:1 ..< :foo.bar.baz 002 foo1 :Your host is foo.bar.baz
+loggedservermsg_0:1 ..< :foo.bar.baz 003 foo1 :This server was created Jan 1 2020
+loggedservermsg_0:1 ..< :foo.bar.baz 004 foo1 foo.bar.baz ircserver-1.0 abc def ghi
+loggedservermsg_0:1 ..< :foo.bar.baz 005 foo1 ABC=DEF GHI=JKL :are supported by this server
+log_1 ..$ isupport:ABC set to: [DEF]
+log_1 ..$ isupport:GHI set to: [JKL]
+loggedservermsg_0:1 ..< :foo.bar.baz 005 foo1 MNO=PQR STU=VWX Y=Z :are supported by this server
+log_1 ..$ isupport:MNO set to: [PQR]
+log_1 ..$ isupport:STU set to: [VWX]
+log_1 ..$ isupport:Y set to: [Z]
+loggedservermsg_0:1 ..< :foo.bar.baz 251 foo1 :There are 10 users and 1000 invisible on 5 servers
+loggedservermsg_0:1 ..< :foo.bar.baz 252 foo1 7 :IRC Operators online
+loggedservermsg_0:1 ..< :foo.bar.baz 253 foo1 4 :unknown connection(s)
+loggedservermsg_0:1 ..< :foo.bar.baz 254 foo1 800 :channels formed
+loggedservermsg_0:1 ..< :foo.bar.baz 255 foo1 :I have 100 clients and 1 serveres
+loggedservermsg_0:1 ..< :foo.bar.baz 265 foo1 100 150 :Current local users 100, max 150
+loggedservermsg_0:1 ..< :foo.bar.baz 266 foo1 1010 1050 :Current global users 1010, max 1050
+loggedservermsg_0:1 ..< :foo.bar.baz 250 foo1 :Highest connection count: 151 (150 clients) (1080 connections received)
# collect MOTD into a single output (rather than line-by-line)
-:0:1 ..< :foo.bar.baz 375 foo1 :- foo.bar.baz Message of the Day -
-:0:1 ..< :foo.bar.baz 372 foo1 :- Howdy! -
-:0:1 ..< :foo.bar.baz 372 foo1 :- Welcome! -
-:0:1 ..< :foo.bar.baz 372 foo1 :- (to this server) -
-:0:1 ..< :foo.bar.baz 376 foo1 :End of /MOTD command
-1 ..$ motd set to:
-1 ..$ - Howdy! -
-1 ..$ - Welcome! -
-1 ..$ - (to this server) -
+loggedservermsg_0:1 ..< :foo.bar.baz 375 foo1 :- foo.bar.baz Message of the Day -
+loggedservermsg_0:1 ..< :foo.bar.baz 372 foo1 :- Howdy! -
+loggedservermsg_0:1 ..< :foo.bar.baz 372 foo1 :- Welcome! -
+loggedservermsg_0:1 ..< :foo.bar.baz 372 foo1 :- (to this server) -
+loggedservermsg_0:1 ..< :foo.bar.baz 376 foo1 :End of /MOTD command
+log_1 ..$ motd set to:
+log_1 ..$ - Howdy! -
+log_1 ..$ - Welcome! -
+log_1 ..$ - (to this server) -
# collect user mode
-:0:1 ..< :foo1 MODE foo1 :+Ziw
-1 ..$ users:me:modes set to: [+Ziw]
+loggedservermsg_0:1 ..< :foo1 MODE foo1 :+Ziw
+log_1 ..$ users:me:modes set to: [+Ziw]
# handle bot query NOTICE
-:0:1 ..< :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
-3 ..< (SaslServ) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+loggedservermsg_0:1 ..< :SaslServ!SaslServ@services.bar.baz NOTICE foo1 :Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
+log_3 ..< (SaslServ) Last login from ~foobarbaz@foo.bar.baz on Jan 1 22:00:00 2021 +0000.
| conn4
# check difference in available commands when switching to client window
> /join #test
-0 .!# invalid prompt command: /join unknown
+log_0 .!# invalid prompt command: /join unknown
> /list
-0 ..# windows available via /window:
-0 ..# 0) :start
-0 ..# 1) foo.bar.baz:debug
-0 ..# 2) foo.bar.baz:server
-0 ..# 3) foo.bar.baz/SaslServ
+log_0 ..# windows available via /window:
+log_0 ..# 0) :start
+log_0 ..# 1) foo.bar.baz:debug
+log_0 ..# 2) foo.bar.baz:server
+log_0 ..# 3) foo.bar.baz/SaslServ
| conn5
> /window 1
> /help
-1 ..# commands available in this window:
-1 ..# /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
-1 ..# /disconnect [QUIT_MSG]
-1 ..# /help
-1 ..# /join CHANNEL
-1 ..# /list
-1 ..# /nick NEW_NICK
-1 ..# /privmsg TARGET MSG
-1 ..# /prompt_enter
-1 ..# /quit
-1 ..# /raw VERB [PARAMS_STR]
-1 ..# /reconnect
-1 ..# /window TOWARDS
-1 ..# /window.disconnect [QUIT_MSG]
-1 ..# /window.history.scroll DIRECTION
-1 ..# /window.join CHANNEL
-1 ..# /window.nick NEW_NICK
-1 ..# /window.paste
-1 ..# /window.privmsg TARGET MSG
-1 ..# /window.prompt.backspace
-1 ..# /window.prompt.move_cursor DIRECTION
-1 ..# /window.prompt.scroll DIRECTION
-1 ..# /window.raw VERB [PARAMS_STR]
-1 ..# /window.reconnect
+log_1 ..# commands available in this window:
+log_1 ..# /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
+log_1 ..# /disconnect [QUIT_MSG]
+log_1 ..# /help
+log_1 ..# /join CHANNEL
+log_1 ..# /list
+log_1 ..# /nick NEW_NICK
+log_1 ..# /privmsg TARGET MSG
+log_1 ..# /prompt_enter
+log_1 ..# /quit
+log_1 ..# /raw VERB [PARAMS_STR]
+log_1 ..# /reconnect
+log_1 ..# /window TOWARDS
+log_1 ..# /window.disconnect [QUIT_MSG]
+log_1 ..# /window.history.scroll DIRECTION
+log_1 ..# /window.join CHANNEL
+log_1 ..# /window.nick NEW_NICK
+log_1 ..# /window.paste
+log_1 ..# /window.privmsg TARGET MSG
+log_1 ..# /window.prompt.backspace
+log_1 ..# /window.prompt.move_cursor DIRECTION
+log_1 ..# /window.prompt.scroll DIRECTION
+log_1 ..# /window.raw VERB [PARAMS_STR]
+log_1 ..# /window.reconnect
# test recoverable 432
> /nick @foo
-1 ..> NICK :@foo
-:0:1 ..< :*.?.net 432 foo1 @foo :Erroneous nickname
-1 .!$ nickname refused for bad format, keeping current one
+log_1 ..> NICK :@foo
+loggedservermsg_0:1 ..< :*.?.net 432 foo1 @foo :Erroneous nickname
+log_1 .!$ nickname refused for bad format, keeping current one
# join channel, collect topic, residents; update me:user from JOIN message; ensure topic.who not affecting users DB
> /join #test
-1 ..> JOIN :#test
-:0:1 ..< :foo1!~foobarbaz@baz.bar.foo JOIN #test
-1 ..$ users:me:user set to: [~foobarbaz]
-:0:1 ..< :foo.bar.baz 332 foo1 #test :foo bar baz
-1 ..$ channels:#test:exits cleared
-:0:1 ..< :foo.bar.baz 333 foo1 #test bar!~bar@OLD.bar.bar 1234567890
-1 ..$ channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='OLD.bar.bar'))]
-4 ..$ bar!~bar@OLD.bar.bar set topic: foo bar baz
-:0:1 ..< :foo.bar.baz 353 foo1 @ #test :foo1 @bar
-1 ..$ users:1:nick set to: [?]
-1 ..$ users:1:nick set to: [bar]
-:0:1 ..< :foo.bar.baz 366 foo1 #test :End of /NAMES list.
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 1
-1 ..$ me
-4 ..$ residents: bar, foo1
+log_1 ..> JOIN :#test
+loggedservermsg_0:1 ..< :foo1!~foobarbaz@baz.bar.foo JOIN #test
+log_1 ..$ users:me:user set to: [~foobarbaz]
+loggedservermsg_0:1 ..< :foo.bar.baz 332 foo1 #test :foo bar baz
+log_1 ..$ channels:#test:exits cleared
+loggedservermsg_0:1 ..< :foo.bar.baz 333 foo1 #test bar!~bar@OLD.bar.bar 1234567890
+log_1 ..$ channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='OLD.bar.bar'))]
+log_4 ..$ bar!~bar@OLD.bar.bar set topic: foo bar baz
+loggedservermsg_0:1 ..< :foo.bar.baz 353 foo1 @ #test :foo1 @bar
+log_1 ..$ users:1:nick set to: [?]
+log_1 ..$ users:1:nick set to: [bar]
+loggedservermsg_0:1 ..< :foo.bar.baz 366 foo1 #test :End of /NAMES list.
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 1
+log_1 ..$ me
+log_4 ..$ residents: bar, foo1
# deliver PRIVMSG to channel window, update sender's user+host from metadata
-:0:1 ..< :bar!~bar@bar.bar PRIVMSG #test :hi there
-1 ..$ users:1:user set to: [~bar]
-1 ..$ users:1:host set to: [bar.bar]
-4 ..< [bar] hi there
+loggedservermsg_0:1 ..< :bar!~bar@bar.bar PRIVMSG #test :hi there
+log_1 ..$ users:1:user set to: [~bar]
+log_1 ..$ users:1:host set to: [bar.bar]
+log_4 ..< [bar] hi there
# check _changing_ TOPIC message is communicated to channel window, as long as either content or who change
-:0:1 ..< :bar!~bar@bar.bar TOPIC #test :foo bar baz
-1 ..$ channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
-4 ..$ bar!~bar@bar.bar set topic: foo bar baz
-:0:1 ..< :bar!~bar@bar.bar TOPIC #test :foo bar baz
-:0:1 ..< :bar!~bar@bar.bar TOPIC #test :abc def ghi
-1 ..$ channels:#test:topic set to: [Topic(what='abc def ghi', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
-4 ..$ bar!~bar@bar.bar set topic: abc def ghi
+loggedservermsg_0:1 ..< :bar!~bar@bar.bar TOPIC #test :foo bar baz
+log_1 ..$ channels:#test:topic set to: [Topic(what='foo bar baz', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
+log_4 ..$ bar!~bar@bar.bar set topic: foo bar baz
+loggedservermsg_0:1 ..< :bar!~bar@bar.bar TOPIC #test :foo bar baz
+loggedservermsg_0:1 ..< :bar!~bar@bar.bar TOPIC #test :abc def ghi
+log_1 ..$ channels:#test:topic set to: [Topic(what='abc def ghi', who=NickUserHost(nick='bar', user='~bar', host='bar.bar'))]
+log_4 ..$ bar!~bar@bar.bar set topic: abc def ghi
# process non-self channel JOIN
-:0:1 ..< :baz!~baz@baz.baz JOIN :#test
-1 ..$ users:2:nick set to: [?]
-1 ..$ users:2:nick set to: [baz]
-1 ..$ users:2:user set to: [~baz]
-1 ..$ users:2:host set to: [baz.baz]
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 1
-1 ..$ 2
-1 ..$ me
-4 ..$ baz!~baz@baz.baz joins
+loggedservermsg_0:1 ..< :baz!~baz@baz.baz JOIN :#test
+log_1 ..$ users:2:nick set to: [?]
+log_1 ..$ users:2:nick set to: [baz]
+log_1 ..$ users:2:user set to: [~baz]
+log_1 ..$ users:2:host set to: [baz.baz]
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 1
+log_1 ..$ 2
+log_1 ..$ me
+log_4 ..$ baz!~baz@baz.baz joins
# join second channel with partial residents identity to compare distribution of resident-specific messages
> /join #testtest
-1 ..> JOIN :#testtest
-:0:1 ..< :foo1!~foobarbaz@baz.bar.foo JOIN #testtest
-:0:1 ..< :foo.bar.baz 332 foo1 #testtest :baz bar foo
-1 ..$ channels:#testtest:exits cleared
-:0:1 ..< :foo.bar.baz 333 foo1 #testtest bar!~bar@OLD.bar.bar 1234567890
-1 ..$ channels:#testtest:topic set to: [Topic(what='baz bar foo', who=NickUserHost(nick='bar', user='~bar', host='OLD.bar.bar'))]
-5 ..$ bar!~bar@OLD.bar.bar set topic: baz bar foo
-:0:1 ..< :foo.bar.baz 353 foo1 @ #testtest :foo1 baz
-:0:1 ..< :foo.bar.baz 366 foo1 #testtest :End of /NAMES list.
-1 ..$ channels:#testtest:user_ids set to:
-1 ..$ 2
-1 ..$ me
-5 ..$ residents: baz, foo1
+log_1 ..> JOIN :#testtest
+loggedservermsg_0:1 ..< :foo1!~foobarbaz@baz.bar.foo JOIN #testtest
+loggedservermsg_0:1 ..< :foo.bar.baz 332 foo1 #testtest :baz bar foo
+log_1 ..$ channels:#testtest:exits cleared
+loggedservermsg_0:1 ..< :foo.bar.baz 333 foo1 #testtest bar!~bar@OLD.bar.bar 1234567890
+log_1 ..$ channels:#testtest:topic set to: [Topic(what='baz bar foo', who=NickUserHost(nick='bar', user='~bar', host='OLD.bar.bar'))]
+log_5 ..$ bar!~bar@OLD.bar.bar set topic: baz bar foo
+loggedservermsg_0:1 ..< :foo.bar.baz 353 foo1 @ #testtest :foo1 baz
+loggedservermsg_0:1 ..< :foo.bar.baz 366 foo1 #testtest :End of /NAMES list.
+log_1 ..$ channels:#testtest:user_ids set to:
+log_1 ..$ 2
+log_1 ..$ me
+log_5 ..$ residents: baz, foo1
# handle query window with known user
-:0:1 ..< :baz!~baz@baz.baz PRIVMSG foo1 :hi there
-6 ..< [baz] hi there
+loggedservermsg_0:1 ..< :baz!~baz@baz.baz PRIVMSG foo1 :hi there
+log_6 ..< [baz] hi there
> /privmsg baz hello, how is it going
-1 ..> PRIVMSG baz :hello, how is it going
-6 ..> [foo1] hello, how is it going
-:0:1 ..< :baz!~baz@baz.baz PRIVMSG foo1 :fine!
-6 ..< [baz] fine!
+log_1 ..> PRIVMSG baz :hello, how is it going
+log_6 ..> [foo1] hello, how is it going
+loggedservermsg_0:1 ..< :baz!~baz@baz.baz PRIVMSG foo1 :fine!
+log_6 ..< [baz] fine!
# handle failure to query absent user
> /privmsg barbar hello!
-1 ..> PRIVMSG barbar :hello!
-7 ..> [foo1] hello!
-:0:1 ..< :*.?.net 401 foo1 barbar :No such nick/channel
-7 .!$ barbar not online
+log_1 ..> PRIVMSG barbar :hello!
+log_7 ..> [foo1] hello!
+loggedservermsg_0:1 ..< :*.?.net 401 foo1 barbar :No such nick/channel
+log_7 .!$ barbar not online
# handle non-self renaming
-:0:1 ..< :baz!~baz@baz.baz NICK :bazbaz
-1 ..$ users:2:nick set to: [bazbaz]
-4,5,6 ..$ baz!~baz@baz.baz renames bazbaz
+loggedservermsg_0:1 ..< :baz!~baz@baz.baz NICK :bazbaz
+log_1 ..$ users:2:nick set to: [bazbaz]
+log_4,5,6 ..$ baz!~baz@baz.baz renames bazbaz
# handle non-self PART in one of two inhabited channels, preserve identity into re-JOIN
-:0:1 ..< :bazbaz!~baz@baz.baz PART :#test
-1 ..$ channels:#test:exits:2 set to: [P]
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 1
-1 ..$ me
-4 ..$ bazbaz!~baz@baz.baz parts
-1 ..$ channels:#test:exits:2 cleared
-:0:1 ..< :bazbaz!~baz@baz.baz JOIN :#test
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 1
-1 ..$ 2
-1 ..$ me
-4 ..$ bazbaz!~baz@baz.baz joins
+loggedservermsg_0:1 ..< :bazbaz!~baz@baz.baz PART :#test
+log_1 ..$ channels:#test:exits:2 set to: [P]
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 1
+log_1 ..$ me
+log_4 ..$ bazbaz!~baz@baz.baz parts
+log_1 ..$ channels:#test:exits:2 cleared
+loggedservermsg_0:1 ..< :bazbaz!~baz@baz.baz JOIN :#test
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 1
+log_1 ..$ 2
+log_1 ..$ me
+log_4 ..$ bazbaz!~baz@baz.baz joins
# handle non-self PART in only inhabited channel, lose identity, re-join as new identity
-:0:1 ..< :bar!~bar@bar.bar PART :#test
-1 ..$ channels:#test:exits:1 set to: [P]
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 2
-1 ..$ me
-4 ..$ bar!~bar@bar.bar parts
-1 ..$ channels:#test:exits:1 cleared
-1 ..$ users:1 cleared
-:0:1 ..< :bar!~bar@bar.bar JOIN :#test
-1 ..$ users:3:nick set to: [?]
-1 ..$ users:3:nick set to: [bar]
-1 ..$ users:3:user set to: [~bar]
-1 ..$ users:3:host set to: [bar.bar]
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 2
-1 ..$ 3
-1 ..$ me
-4 ..$ bar!~bar@bar.bar joins
+loggedservermsg_0:1 ..< :bar!~bar@bar.bar PART :#test
+log_1 ..$ channels:#test:exits:1 set to: [P]
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 2
+log_1 ..$ me
+log_4 ..$ bar!~bar@bar.bar parts
+log_1 ..$ channels:#test:exits:1 cleared
+log_1 ..$ users:1 cleared
+loggedservermsg_0:1 ..< :bar!~bar@bar.bar JOIN :#test
+log_1 ..$ users:3:nick set to: [?]
+log_1 ..$ users:3:nick set to: [bar]
+log_1 ..$ users:3:user set to: [~bar]
+log_1 ..$ users:3:host set to: [bar.bar]
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 2
+log_1 ..$ 3
+log_1 ..$ me
+log_4 ..$ bar!~bar@bar.bar joins
# handle non-self QUIT
-:0:1 ..< :bazbaz!~baz@baz.baz QUIT :Client Quit
-1 ..$ users:2:exit_msg set to: [QClient Quit]
-6 ..$ bazbaz!~baz@baz.baz quits: Client Quit
-1 ..$ channels:#test:exits:2 set to: [QClient Quit]
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 3
-1 ..$ me
-4 ..$ bazbaz!~baz@baz.baz quits: Client Quit
-1 ..$ channels:#test:exits:2 cleared
-1 ..$ channels:#testtest:exits:2 set to: [QClient Quit]
-1 ..$ channels:#testtest:user_ids set to:
-1 ..$ me
-5 ..$ bazbaz!~baz@baz.baz quits: Client Quit
-1 ..$ channels:#testtest:exits:2 cleared
-1 ..$ users:2 cleared
+loggedservermsg_0:1 ..< :bazbaz!~baz@baz.baz QUIT :Client Quit
+log_1 ..$ users:2:exit_msg set to: [QClient Quit]
+log_6 ..$ bazbaz!~baz@baz.baz quits: Client Quit
+log_1 ..$ channels:#test:exits:2 set to: [QClient Quit]
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 3
+log_1 ..$ me
+log_4 ..$ bazbaz!~baz@baz.baz quits: Client Quit
+log_1 ..$ channels:#test:exits:2 cleared
+log_1 ..$ channels:#testtest:exits:2 set to: [QClient Quit]
+log_1 ..$ channels:#testtest:user_ids set to:
+log_1 ..$ me
+log_5 ..$ bazbaz!~baz@baz.baz quits: Client Quit
+log_1 ..$ channels:#testtest:exits:2 cleared
+log_1 ..$ users:2 cleared
# handle self-PART: clear channel, and its squatters
-:0:1 ..< :foo1!~foobarbaz@baz.bar.foo PART :#test
-1 ..$ channels:#test:exits:me set to: [P]
-1 ..$ channels:#test:user_ids set to:
-1 ..$ 3
-4 ..$ foo1!~foobarbaz@baz.bar.foo parts
-1 ..$ channels:#test:exits:me cleared
-1 ..$ channels:#test cleared
-1 ..$ users:3 cleared
+loggedservermsg_0:1 ..< :foo1!~foobarbaz@baz.bar.foo PART :#test
+log_1 ..$ channels:#test:exits:me set to: [P]
+log_1 ..$ channels:#test:user_ids set to:
+log_1 ..$ 3
+log_4 ..$ foo1!~foobarbaz@baz.bar.foo parts
+log_1 ..$ channels:#test:exits:me cleared
+log_1 ..$ channels:#test cleared
+log_1 ..$ users:3 cleared
# handle lack of implementation
-:0:1 ..< foo bar baz
-1 .!$ No handler implemented for: foo bar baz
-2,3,4,5,6,7 .!$ No handler implemented for: foo bar baz
+loggedservermsg_0:1 ..< foo bar baz
+log_1 .!$ No handler implemented for: foo bar baz
+log_2,3,4,5,6,7 .!$ No handler implemented for: foo bar baz
# handle /disconnect, clear all
> /disconnect
-1 ..> QUIT :ircplom says bye
-:0:1 ..< :foo1!~foobarbaz@baz.bar.foo QUIT :Client Quit
-1 ..$ users:me:exit_msg set to: [QClient Quit]
-3,6,7 ..$ foo1!~foobarbaz@baz.bar.foo quits: Client Quit
-1 ..$ channels:#testtest:exits:me set to: [QClient Quit]
-1 ..$ channels:#testtest:user_ids set to:
-5 ..$ foo1!~foobarbaz@baz.bar.foo quits: Client Quit
-1 ..$ channels:#testtest:exits:me cleared
-:0:1 ..< ERROR :Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]
-1 ..$ connection_state set to: [Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]]
+log_1 ..> QUIT :ircplom says bye
+loggedservermsg_0:1 ..< :foo1!~foobarbaz@baz.bar.foo QUIT :Client Quit
+log_1 ..$ users:me:exit_msg set to: [QClient Quit]
+log_3,6,7 ..$ foo1!~foobarbaz@baz.bar.foo quits: Client Quit
+log_1 ..$ channels:#testtest:exits:me set to: [QClient Quit]
+log_1 ..$ channels:#testtest:user_ids set to:
+log_5 ..$ foo1!~foobarbaz@baz.bar.foo quits: Client Quit
+log_1 ..$ channels:#testtest:exits:me cleared
+loggedservermsg_0:1 ..< ERROR :Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]
+log_1 ..$ connection_state set to: [Closing link: (~foobarbaz@baz.bar.foo) [Quit: ircplom says bye]]
repeat isupport-clear-in isupport-clear-out
-1 ..$ caps cleared
-1 ..$ channels cleared
-1 ..$ connection_state set to: []
-2,3,4,5,6,7 ..$ DISCONNECTED
-1 ..$ motd set to:
-1 ..$ sasl_account set to: []
-1 ..$ sasl_auth_state set to: []
-1 ..$ users cleared
+log_1 ..$ caps cleared
+log_1 ..$ channels cleared
+log_1 ..$ connection_state set to: []
+log_2,3,4,5,6,7 ..$ DISCONNECTED
+log_1 ..$ motd set to:
+log_1 ..$ sasl_account set to: []
+log_1 ..$ sasl_auth_state set to: []
+log_1 ..$ users cleared
# fail to send in disconnect, check alert window is command prompt window
> /window 6
> /privmsg barbar test
-6 .!$ cannot send, connection seems closed
+log_6 .!$ cannot send, connection seems closed
> /window 1
> /privmsg barbar test
-1 .!$ cannot send, connection seems closed
+log_1 .!$ cannot send, connection seems closed
> /privmsg #test test
-1 .!$ not sending, since not in channel
+log_1 .!$ not sending, since not in channel
| conn6
# test setting up second client, but 432 irrecoverably
> /connect baz.bar.foo ?foo foo:foo
-repeat standard-clears-in standard-clears-out 8
+repeat standard-clears-in standard-clears-out log_8
, ..$ DISCONNECTED
-8 ..$ hostname set to: [baz.bar.foo]
-8 ..$ port set to: [-1]
-8 ..$ nick_wanted set to: [?foo]
-8 ..$ user_wanted set to: [foo]
-8 ..$ realname set to: [foo]
-8 ..$ port set to: [6697]
-repeat conn0 conn1 8
+log_8 ..$ hostname set to: [baz.bar.foo]
+log_8 ..$ port set to: [-1]
+log_8 ..$ nick_wanted set to: [?foo]
+log_8 ..$ user_wanted set to: [foo]
+log_8 ..$ realname set to: [foo]
+log_8 ..$ port set to: [6697]
+repeat conn0 conn1 log_8
, ..$ CONNECTED
-1:8 ..> CAP LS :302
-1:8 ..> USER foo 0 * :foo
-1:8 ..> NICK :?foo
-:1:8 ..< :*.?.net 432 * ?foo :Erroneous nickname
-repeat isupport-clear-in isupport-clear-out 8
-8 ..$ connection_state set to: []
+log_8 ..> CAP LS :302
+log_8 ..> USER foo 0 * :foo
+log_8 ..> NICK :?foo
+loggedservermsg_1:8 ..< :*.?.net 432 * ?foo :Erroneous nickname
+repeat isupport-clear-in isupport-clear-out log_8
+log_8 ..$ connection_state set to: []
, ..$ DISCONNECTED
-8 .!$ nickname refused for bad format, giving up
+log_8 .!$ nickname refused for bad format, giving up
# test failing third connection
> /connect baz.baz.baz baz baz:baz
-repeat standard-clears-in standard-clears-out 9
+repeat standard-clears-in standard-clears-out log_9
, ..$ DISCONNECTED
-9 ..$ hostname set to: [baz.baz.baz]
-9 ..$ port set to: [-1]
-9 ..$ nick_wanted set to: [baz]
-9 ..$ user_wanted set to: [baz]
-9 ..$ realname set to: [baz]
-9 ..$ port set to: [6697]
-repeat conn0 conn1 9
+log_9 ..$ hostname set to: [baz.baz.baz]
+log_9 ..$ port set to: [-1]
+log_9 ..$ nick_wanted set to: [baz]
+log_9 ..$ user_wanted set to: [baz]
+log_9 ..$ realname set to: [baz]
+log_9 ..$ port set to: [6697]
+repeat conn0 conn1 log_9
, ..$ CONNECTED
-2:9 ..> CAP LS :302
-2:9 ..> USER baz 0 * :baz
-2:9 ..> NICK :baz
-<2 FAKE_IRC_CONN_ABORT_EXCEPTION
-9 ..$ connection_state set to: [broken: FAKE_IRC_CONN_ABORT_EXCEPTION]
-repeat isupport-clear-in isupport-clear-out 9
-9 ..$ connection_state set to: []
+log_9 ..> CAP LS :302
+log_9 ..> USER baz 0 * :baz
+log_9 ..> NICK :baz
+servermsg_2 FAKE_IRC_CONN_ABORT_EXCEPTION
+log_9 ..$ connection_state set to: [broken: FAKE_IRC_CONN_ABORT_EXCEPTION]
+repeat isupport-clear-in isupport-clear-out log_9
+log_9 ..$ connection_state set to: []
, ..$ DISCONNECTED
-9 .!$ will retry connecting in 1 seconds
+log_9 .!$ will retry connecting in 1 seconds
# check that (save TUI tests assuming start on window 0, and no 4 yet) on reconnect, all the same effects can be expected
> /reconnect
-1 ..$ connection_state set to: [connecting]
-1 ..$ connection_state set to: [connected]
-2,3,4,5,6,7 ..$ CONNECTED
+log_1 ..$ connection_state set to: [connecting]
+log_1 ..$ connection_state set to: [connected]
+log_2,3,4,5,6,7 ..$ CONNECTED
repeat conn2 conn3
-1 ..> JOIN :#testtest
+log_1 ..> JOIN :#testtest
repeat conn3 conn4
repeat conn5 conn6
> /quit
-0 ..<
+log_0 ..<
| empty-init-in
| lines-to-19-empty-in
| line-0-empty-in
-t.0 0.on_black.
+line_0 0.on_black.
| line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.1
-repeat line-0-empty-in line-0-empty-out t.2
-repeat line-0-empty-in line-0-empty-out t.3
-repeat line-0-empty-in line-0-empty-out t.4
-repeat line-0-empty-in line-0-empty-out t.5
-repeat line-0-empty-in line-0-empty-out t.6
-repeat line-0-empty-in line-0-empty-out t.7
-repeat line-0-empty-in line-0-empty-out t.8
-repeat line-0-empty-in line-0-empty-out t.9
-repeat line-0-empty-in line-0-empty-out t.10
-repeat line-0-empty-in line-0-empty-out t.11
-repeat line-0-empty-in line-0-empty-out t.12
-repeat line-0-empty-in line-0-empty-out t.13
-repeat line-0-empty-in line-0-empty-out t.14
-repeat line-0-empty-in line-0-empty-out t.15
-repeat line-0-empty-in line-0-empty-out t.16
-repeat line-0-empty-in line-0-empty-out t.17
-repeat line-0-empty-in line-0-empty-out t.18
-repeat line-0-empty-in line-0-empty-out t.19
+repeat line-0-empty-in line-0-empty-out line_1
+repeat line-0-empty-in line-0-empty-out line_2
+repeat line-0-empty-in line-0-empty-out line_3
+repeat line-0-empty-in line-0-empty-out line_4
+repeat line-0-empty-in line-0-empty-out line_5
+repeat line-0-empty-in line-0-empty-out line_6
+repeat line-0-empty-in line-0-empty-out line_7
+repeat line-0-empty-in line-0-empty-out line_8
+repeat line-0-empty-in line-0-empty-out line_9
+repeat line-0-empty-in line-0-empty-out line_10
+repeat line-0-empty-in line-0-empty-out line_11
+repeat line-0-empty-in line-0-empty-out line_12
+repeat line-0-empty-in line-0-empty-out line_13
+repeat line-0-empty-in line-0-empty-out line_14
+repeat line-0-empty-in line-0-empty-out line_15
+repeat line-0-empty-in line-0-empty-out line_16
+repeat line-0-empty-in line-0-empty-out line_17
+repeat line-0-empty-in line-0-empty-out line_18
+repeat line-0-empty-in line-0-empty-out line_19
| lines-to-19-empty-out
-repeat line-0-empty-in line-0-empty-out t.20
-repeat line-0-empty-in line-0-empty-out t.21
+repeat line-0-empty-in line-0-empty-out line_20
+repeat line-0-empty-in line-0-empty-out line_21
| status-prompt-empty-in
-t.22 0..:start)=====================================================================([0]
-t.23 0..>
-t.23 2.reverse.
-t.23 3..
+line_22 0..:start)=====================================================================([0]
+line_23 0..>
+line_23 2.reverse.
+line_23 3..
| status-prompt-empty-out
| empty-init-out
# non-empty command input starts log at bottom, with date above it
| input-foo-in
> foo
-0 .!# invalid prompt command: not prefixed by /
+log_0 .!# invalid prompt command: not prefixed by /
| input-foo-out
repeat line-0-empty-in line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.19
+repeat line-0-empty-in line-0-empty-out line_19
| date-at-20-in
-t.20 0.on_black.20
-t.20 4.on_black.-
-t.20 7.on_black.-
-t.20 10.on_black.
+line_20 0.on_black.20
+line_20 4.on_black.-
+line_20 7.on_black.-
+line_20 10.on_black.
| date-at-20-out
-t.21 0.on_black,bold,bright_red,bright_cyan..!#
-t.21 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: not prefixed by /
+line_21 0.on_black,bold,bright_red,bright_cyan..!#
+line_21 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: not prefixed by /
repeat status-prompt-empty-in status-prompt-empty-out
# further inputs grow log upwards
| input-cmd-foo-in
> /foo
-0 .!# invalid prompt command: /foo unknown
+log_0 .!# invalid prompt command: /foo unknown
| input-cmd-foo-out
repeat input-cmd-foo-in input-cmd-foo-out
repeat line-0-empty-in line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.17
-repeat date-at-20-in date-at-20-out t.18
+repeat line-0-empty-in line-0-empty-out line_17
+repeat date-at-20-in date-at-20-out line_18
| foo-unprefixed-line-19-in
-t.19 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: not prefixed by /
+line_19 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: not prefixed by /
| foo-unprefixed-line-19-out
| foo-unknown-line-20-in
-t.20 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo unknown
+line_20 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo unknown
| foo-unknown-line-20-out
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.21
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_21
# check wrapping
> /foo_0123456789_0123456789_01234567
-0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
+log_0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
| unwrapped-at-21-in
-t.21 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
+line_21 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo_0123456789_0123456789_01234567 unknown
| unwrapped-at-21-out
| input-wrapped-in
> /foo_0123456789_0123456789_012345678
-0 .!# invalid prompt command: /foo_0123456789_0123456789_012345678 unknown
+log_0 .!# invalid prompt command: /foo_0123456789_0123456789_012345678 unknown
| input-wrapped-out
| wrapped-first-at-20-in
-t.20 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo_0123456789_0123456789_012345678
+line_20 13.on_black,bold,bright_red,bright_cyan.invalid prompt command: /foo_0123456789_0123456789_012345678
| wrapped-first-at-20-out
| wrapped-second-at-21-in
-t.21 0.on_black,bold,bright_red,bright_cyan. unknown
+line_21 0.on_black,bold,bright_red,bright_cyan. unknown
| wrapped-second-at-21-out
# check scrolling up on short history
repeat lines-to-19-empty-in lines-to-19-empty-out
repeat date-at-20-in date-at-20-out
| topmost-scroll-out
-t.21 0.reverse.vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+line_21 0.reverse.vvv [6] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
# check scrolling down on short history
> /window.history.scroll down
repeat line-0-empty-in line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.14
-repeat date-at-20-in date-at-20-out t.15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.18
-repeat unwrapped-at-21-in unwrapped-at-21-out t.19
+repeat line-0-empty-in line-0-empty-out line_14
+repeat date-at-20-in date-at-20-out line_15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_17
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_18
+repeat unwrapped-at-21-in unwrapped-at-21-out line_19
repeat wrapped-first-at-20-in wrapped-first-at-20-out
repeat wrapped-second-at-21-in wrapped-second-at-21-out
repeat status-prompt-empty-in status-prompt-empty-out
repeat input-cmd-foo-in input-cmd-foo-out
repeat input-foo-in input-foo-out
repeat topmost-scroll-in topmost-scroll-out
-t.21 0.reverse.vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+line_21 0.reverse.vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
# check scroll-down on longer history
> /window.history.scroll down
repeat line-0-empty-in line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.9
-repeat date-at-20-in date-at-20-out t.10
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.11
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
-repeat unwrapped-at-21-in unwrapped-at-21-out t.14
-repeat wrapped-first-at-20-in wrapped-first-at-20-out t.15
-repeat wrapped-second-at-21-in wrapped-second-at-21-out t.16
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.17
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.18
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.19
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.20
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.21
+repeat line-0-empty-in line-0-empty-out line_9
+repeat date-at-20-in date-at-20-out line_10
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_11
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_13
+repeat unwrapped-at-21-in unwrapped-at-21-out line_14
+repeat wrapped-first-at-20-in wrapped-first-at-20-out line_15
+repeat wrapped-second-at-21-in wrapped-second-at-21-out line_16
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_17
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_18
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_19
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_20
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_21
repeat status-prompt-empty-in status-prompt-empty-out
# check history growing upwards if scrolled down
repeat input-foo-in input-foo-out
repeat input-cmd-foo-in input-cmd-foo-out
| bottom-longer-history-in
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.0
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.1
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.2
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.3
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.4
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.5
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.6
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.7
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.8
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.9
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.10
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.11
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.14
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.20
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.21
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_0
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_1
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_2
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_3
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_4
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_5
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_6
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_7
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_8
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_9
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_10
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_11
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_13
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_14
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_19
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_20
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_21
repeat status-prompt-empty-in status-prompt-empty-out
| bottom-longer-history-out
> /window.history.scroll up
| scrolled-up-longer-history-in
repeat line-0-empty-in line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.1
-repeat date-at-20-in date-at-20-out t.2
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.3
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.4
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.5
-repeat unwrapped-at-21-in unwrapped-at-21-out t.6
-repeat wrapped-first-at-20-in wrapped-first-at-20-out t.7
-repeat wrapped-second-at-21-in wrapped-second-at-21-out t.8
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.9
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.10
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.11
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.12
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.13
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.14
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.20
+repeat line-0-empty-in line-0-empty-out line_1
+repeat date-at-20-in date-at-20-out line_2
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_3
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_4
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_5
+repeat unwrapped-at-21-in unwrapped-at-21-out line_6
+repeat wrapped-first-at-20-in wrapped-first-at-20-out line_7
+repeat wrapped-second-at-21-in wrapped-second-at-21-out line_8
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_9
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_10
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_11
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_12
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_13
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_14
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_19
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_20
| scrolled-up-longer-history-out
-t.21 0.reverse.vvv [12] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+line_21 0.reverse.vvv [12] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
> /window.history.scroll down
repeat bottom-longer-history-in bottom-longer-history-out
> /window.history.scroll up
repeat input-wrapped-in input-wrapped-out
repeat scrolled-up-longer-history-in scrolled-up-longer-history-out
-t.21 0.reverse.vvv [13] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+line_21 0.reverse.vvv [13] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
> /window.history.scroll down
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.0
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.1
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.2
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.3
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.4
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.5
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.6
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.7
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.8
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.9
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.10
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.11
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.12
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.13
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.14
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.15
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.16
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.17
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.18
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.19
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.20
-t.21 0.reverse.vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_0
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_1
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_2
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_3
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_4
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_5
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_6
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_7
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_8
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_9
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_10
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_11
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_12
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_13
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_14
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_15
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_16
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_17
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_18
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_19
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_20
+line_21 0.reverse.vvv [2] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
# check scroll-up over wrapped increases visible below-lines count only by fused history lines
> /window.history.scroll down
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.0
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.1
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.2
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.3
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.4
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.5
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.6
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.7
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.8
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.9
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.10
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.11
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.14
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.15
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.16
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
-repeat wrapped-first-at-20-in wrapped-first-at-20-out t.20
-repeat wrapped-second-at-21-in wrapped-second-at-21-out t.21
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_0
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_1
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_2
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_3
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_4
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_5
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_6
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_7
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_8
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_9
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_10
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_11
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_13
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_14
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_15
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_16
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_19
+repeat wrapped-first-at-20-in wrapped-first-at-20-out line_20
+repeat wrapped-second-at-21-in wrapped-second-at-21-out line_21
repeat status-prompt-empty-in status-prompt-empty-out
> /window.history.scroll up
-t.21 0.reverse.vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+line_21 0.reverse.vvv [11] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
# check scrolls-up over longer history until top
> /window.history.scroll up
repeat line-0-empty-in line-0-empty-out
-repeat line-0-empty-in line-0-empty-out t.5
-repeat line-0-empty-in line-0-empty-out t.10
-repeat date-at-20-in date-at-20-out t.11
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.12
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.13
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.14
-repeat unwrapped-at-21-in unwrapped-at-21-out t.15
-repeat wrapped-first-at-20-in wrapped-first-at-20-out t.16
-repeat wrapped-second-at-21-in wrapped-second-at-21-out t.17
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.18
-repeat foo-unknown-line-20-in foo-unknown-line-20-out t.19
-repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out t.20
-t.21 0.reverse.vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+repeat line-0-empty-in line-0-empty-out line_5
+repeat line-0-empty-in line-0-empty-out line_10
+repeat date-at-20-in date-at-20-out line_11
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_12
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_13
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_14
+repeat unwrapped-at-21-in unwrapped-at-21-out line_15
+repeat wrapped-first-at-20-in wrapped-first-at-20-out line_16
+repeat wrapped-second-at-21-in wrapped-second-at-21-out line_17
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_18
+repeat foo-unknown-line-20-in foo-unknown-line-20-out line_19
+repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out line_20
+line_21 0.reverse.vvv [22] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
> /window.history.scroll up
repeat topmost-scroll-in topmost-scroll-out
-t.21 0.reverse.vvv [30] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+line_21 0.reverse.vvv [30] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
repeat status-prompt-empty-in status-prompt-empty-out
> /quit
-0 ..<
+log_0 ..<
# expected complaints on wrong command inputs
> foo
-0 .!# invalid prompt command: not prefixed by /
+log_0 .!# invalid prompt command: not prefixed by /
> /foo
-0 .!# invalid prompt command: /foo unknown
+log_0 .!# invalid prompt command: /foo unknown
> /help foo
-0 .!# invalid prompt command: /help given argument(s) while none expected
+log_0 .!# invalid prompt command: /help given argument(s) while none expected
> /window
-0 .!# invalid prompt command: /window too few arguments (given 0, need 1)
+log_0 .!# invalid prompt command: /window too few arguments (given 0, need 1)
# some simple expected command successes
> /help
-0 ..# commands available in this window:
-0 ..# /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
-0 ..# /help
-0 ..# /list
-0 ..# /prompt_enter
-0 ..# /quit
-0 ..# /window TOWARDS
-0 ..# /window.history.scroll DIRECTION
-0 ..# /window.paste
-0 ..# /window.prompt.backspace
-0 ..# /window.prompt.move_cursor DIRECTION
-0 ..# /window.prompt.scroll DIRECTION
+log_0 ..# commands available in this window:
+log_0 ..# /connect HOST_PORT [NICKNAME_PW] [REALNAME_USERNAME]
+log_0 ..# /help
+log_0 ..# /list
+log_0 ..# /prompt_enter
+log_0 ..# /quit
+log_0 ..# /window TOWARDS
+log_0 ..# /window.history.scroll DIRECTION
+log_0 ..# /window.paste
+log_0 ..# /window.prompt.backspace
+log_0 ..# /window.prompt.move_cursor DIRECTION
+log_0 ..# /window.prompt.scroll DIRECTION
> /list
-0 ..# windows available via /window:
-0 ..# 0) :start
+log_0 ..# windows available via /window:
+log_0 ..# 0) :start
# should probably not be available at all by explicit prompt writing, but for now this be the expected behavior …
> /prompt_enter
-0 .!# invalid prompt command: /prompt_enter would loop into ourselves
+log_0 .!# invalid prompt command: /prompt_enter would loop into ourselves
> /window.history.scroll foo
> /window.prompt.backspace
> /window.prompt.move_cursor foo
> /window.paste
> /quit
-0 ..<
+log_0 ..<