From: Christian Heller Date: Fri, 17 Oct 2025 03:43:13 +0000 (+0200) Subject: Restructure testing command syntax for greater flexibility and extensibility. X-Git-Url: https://plomlompom.com/repos/%7B%7B%20web_path%20%7D%7D/%7B%7Bprefix%7D%7D/%7B%7Bprefix%7D%7D/add_structured?a=commitdiff_plain;ds=sidebyside;p=ircplom Restructure testing command syntax for greater flexibility and extensibility. --- diff --git a/src/ircplom/testing.py b/src/ircplom/testing.py index ff7babb..bdc0cce 100644 --- a/src/ircplom/testing.py +++ b/src/ircplom/testing.py @@ -18,17 +18,29 @@ _FAKE_TIMEOUT_PORTS_BEYOND = 10000 _MARK_ANCHOR = '|' _MARK_COMMENT = '#' -_MARK_LOG = 'log_' -_MARK_LOGSRVRMSG = 'loggedservermsg_' +_MARK_LOG = 'log' +_MARK_LOGSRVRMSG = 'loggedservermsg' _MARK_PROMPT = '>' _MARK_REPEAT = 'repeat' -_MARK_SCREENLINE = 'line_' -_MARK_SERVERMSG = 'servermsg_' +_MARK_SCREENLINE = 'line' +_MARK_SERVERMSG = 'servermsg' _MARK_WAIT = 'wait' _SEP_0 = ' ' _SEP_1 = ',' _SEP_2 = ':' +_N_ARGS_FOR_CMD = { + _MARK_ANCHOR: 1, + _MARK_COMMENT: 2, + _MARK_LOG: 2, + _MARK_LOGSRVRMSG: 3, + _MARK_PROMPT: 1, + _MARK_REPEAT: 3, + _MARK_SCREENLINE: 4, + _MARK_SERVERMSG: 2, + _MARK_WAIT: 1 +} + class TestTerminal(QueueMixin, TerminalInterface): 'Collects keypresses from string queue, otherwise mostly dummy.' @@ -75,7 +87,7 @@ class TestTerminal(QueueMixin, TerminalInterface): yield TuiEvent.affector('handle_keyboard_event' ).kw(typed_in=to_yield) - def assert_screen_line(self, y: int, x: int, text: str, attrs_str: str + def assert_screen_line(self, y: int, x: int, attrs_str: str, text: str ) -> None: 'Assert test screen at (y,x) shows text, with attrs of attrs_str set.' assert len(text) + x <= self.size.x @@ -83,9 +95,10 @@ class TestTerminal(QueueMixin, TerminalInterface): for idx, cell_expected in enumerate( (self._attrs_tuple_from_str(attrs_str), c) for c in text): cell_found = self._screen[y][x + idx] - info = (x + idx, 'EXPECTED/FOUND', - cell_expected, cell_found, - text, ''.join(t[1] for t in self._screen[y][x:])) + info = ('AT_X', x + idx, + 'CHAR EXPECTED', cell_expected, 'FOUND', cell_found, + 'FULL LINE EXPECTED', text, + 'FOUND', ''.join(t[1] for t in self._screen[y][x:])) assert cell_expected == cell_found, info @@ -138,20 +151,21 @@ class _TestClientKnowingTui(ClientKnowingTui): if self.db.port > _FAKE_TIMEOUT_PORTS_BEYOND: self.db.port = self.db.port - 1 - def _test_before(self, context: str, msg: str, cmp_msg: str) -> None: - assert context.startswith(_MARK_SERVERMSG) - assert context[len(_MARK_SERVERMSG):] == str(self.idx) - assert msg == cmp_msg + def _test_before(self, cmd_name: str, args: tuple[str, ...], cmp_msg: str + ) -> None: + assert cmd_name == _MARK_SERVERMSG + assert args[0] == str(self.idx) + assert args[1] == cmp_msg def on_handled_loop_exception(self, e: IrcConnException) -> None: self.playbook.test_wrap( - lambda ctx, msg: self._test_before(ctx, msg, str(e)), None, - super().on_handled_loop_exception, e) + lambda cmd_name, args: self._test_before(cmd_name, args, str(e)), + None, super().on_handled_loop_exception, e) def handle_msg(self, msg: IrcMessage) -> None: self.playbook.test_wrap( - lambda ctx, msg_: self._test_before(ctx, msg_, msg.raw), None, - super().handle_msg, msg) + lambda cmd_name, args: self._test_before(cmd_name, args, msg.raw), + None, super().handle_msg, msg) class _Playbook: @@ -170,46 +184,49 @@ class _Playbook: 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): + if not line_t[1]: + continue + cmd_name, remains = line_t[1].split(_SEP_0, maxsplit=1) + if not cmd_name == marker: continue - inserts = parse_into(line_t, **kwargs) + inserts = parse_into(line_t[0], + self._args_for_cmd(cmd_name, remains), + **kwargs) self._lines_t = (self._lines_t[:idx] + inserts + self._lines_t[idx + 1:]) break return bool(inserts) - def split_server_put_and_log(line_t: tuple[str, str], **_ + def split_server_put_and_log(index_str: str, + args: tuple[str, ...], + **_ ) -> list[tuple[str, str]]: - index_str = line_t[0] - context, msg = line_t[1].split(_SEP_0, maxsplit=1) - fmt, msg_no_fmt = msg.split(LOG_FMT_SEP, maxsplit=1) + fmt, msg_no_fmt = args[2].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[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], **__ + return [(f'{index_str}:s:0', + _SEP_0.join((_MARK_SERVERMSG, args[0], msg_no_fmt))), + (f'{index_str}:s:1', + _SEP_0.join((_MARK_LOG, args[1], args[2])))] + + def repeat(index_str: str, + args: tuple[str, ...], + anchors: dict[str, int], + **__ ) -> list[tuple[str, str]]: - index_str = line_t[0] - 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] inserts: list[tuple[str, str]] = [] - for inserted_t in self._lines_t[int(start):int(end)]: + for inserted_t in self._lines_t[int(anchors[args[0]] + 1 + ):int(anchors[args[1]])]: insert = inserted_t[1] - if len(range_data) == 3\ - and insert and not insert.startswith(_MARK_ANCHOR): - insert = _SEP_0.join( - [range_data[2]] - + [insert.split(_SEP_0, maxsplit=1)[1]]) + if len(args) == 3 and insert: + cmd_name, remains = insert.split(_SEP_0, maxsplit=1) + if cmd_name == _MARK_ANCHOR: + continue + args_ = list(self._args_for_cmd(cmd_name, remains)) + args_[0] = args[2] + insert = _SEP_0.join([cmd_name] + args_) inserts += [(index_str + ':r:' + inserted_t[0], insert)] return inserts @@ -227,19 +244,39 @@ class _Playbook: if line_t[1] and not (line_t[1].startswith(_MARK_ANCHOR) or line_t[1].startswith(_MARK_COMMENT))] if self._verbose: + title_idx = 'line number(s)' + title_cmdname = 'command' 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)) - self._max_len_ctx = max(self._max_len_ctx, len(title_ctx)) + self._max_len_cmdname = len(title_cmdname) + self._max_len_midargs = 0 + for line_t in self._lines_t: + cmd_name, args = self._cmdname_and_args_from(line_t[1]) + self._max_len_cmdname = max(len(cmd_name), + self._max_len_cmdname) + self._max_len_midargs = max(len(self._args_verbose(args[:-1])), + self._max_len_midargs) print(self._str_padded_to(title_idx, self._max_len_idx), - self._str_padded_to(title_ctx, self._max_len_ctx), - 'content') + self._str_padded_to(title_cmdname, self._max_len_cmdname), + 'arguments') self._idx = 0 + @staticmethod + def _args_verbose(args: tuple[str, ...]) -> str: + return ' '.join(f'[{arg}]' for arg in args) + + @staticmethod + def _args_for_cmd(cmd_name: str, remains: str) -> tuple[str, ...]: + n_args = _N_ARGS_FOR_CMD[cmd_name] + return ((remains,) if n_args == 1 + else tuple(remains.split(_SEP_0, maxsplit=n_args - 1))) + + @classmethod + def _cmdname_and_args_from(cls, line: str) -> tuple[str, tuple[str, ...]]: + cmd_name, remains = line.split(_SEP_0, maxsplit=1) + return cmd_name, cls._args_for_cmd(cmd_name, remains) + @staticmethod def _str_padded_to(msg: str, length: int) -> str: return msg + ' ' * (length - len(msg)) @@ -260,50 +297,47 @@ class _Playbook: *f_args, **f_kwargs ) -> None: 'Call f with checks before and after against playbook, play it on.' - context, msg = self._current_line[1].split(_SEP_0, maxsplit=1) + cmd_name, args = self._cmdname_and_args_from(self._current_line[1]) if test_before: - test_before(context, msg) + test_before(cmd_name, args) self._idx += 1 next_idx_before = self._idx ret = f(*f_args, **f_kwargs) if test_after: - test_after(context, msg, ret) + test_after(cmd_name, args, ret) if self._idx == next_idx_before: # f may have called ._play_till_test self._play_till_test() # so we avoid jumping over next test def _play_till_test(self) -> None: while True: idx_info, line = self._current_line - context, msg = line.split(_SEP_0, maxsplit=1) + cmd_name, args = self._cmdname_and_args_from(line) 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 == _MARK_PROMPT: + self._str_padded_to(cmd_name, self._max_len_cmdname), + self._str_padded_to(self._args_verbose(args[:-1]), + self._max_len_midargs), + self._args_verbose(args[-1:])) + if cmd_name == _MARK_PROMPT: assert self.put_keypress is not None - for c in msg: + for c in args[0]: self.put_keypress(c) self.put_keypress('KEY_ENTER') break - if context.startswith(_MARK_SERVERMSG): - client = self._get_client(int(context[len(_MARK_SERVERMSG):])) + if cmd_name == _MARK_SERVERMSG: + client = self._get_client(int(args[0])) assert isinstance(client.conn, _FakeIrcConnection), client.conn - client.conn.put_server_msg(msg) + client.conn.put_server_msg(args[1]) break - if context.startswith(_MARK_SCREENLINE): + if cmd_name == _MARK_LOG: + break + if cmd_name == _MARK_SCREENLINE: assert self.assert_screen_line is not None assert self.redraw_affected is not None - x_str, attrs_str, msg = msg.split('.', maxsplit=2) self.redraw_affected() - 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.assert_screen_line(int(args[0]), int(args[1]), *args[2:]) + elif cmd_name == _MARK_WAIT: + sleep(int(args[0])) self._idx += 1 @@ -347,7 +381,8 @@ class TestingClientTui(ClientTui): return client def log(self, msg: str, **kwargs) -> None: - def test_after(context: str, expected_msg: str, ret) -> None: + def test_after(cmd_name: str, args: tuple[str, ...], ret) -> None: + assert cmd_name == _MARK_LOG win_ids, logged_msg = ret fmt, time_str, msg_sans_time = logged_msg.split(' ', maxsplit=2) msg_sans_time = fmt + ' ' + msg_sans_time @@ -355,18 +390,17 @@ class TestingClientTui(ClientTui): for c in time_str[:2] + time_str[3:5] + time_str[6:]: assert c.isdigit() assert time_str[2] == ':' and time_str[5] == ':' - expected_win_ids = tuple( - int(idx) for idx in context[len(_MARK_LOG):].split(_SEP_1) - if idx) - info = ('WANTED:', expected_win_ids, expected_msg, + expected_win_ids = tuple(int(idx) for idx in args[0].split(_SEP_1) + if idx) + info = ('WANTED:', expected_win_ids, args[1], 'GOT:', win_ids, msg_sans_time) - assert expected_msg == msg_sans_time, info + assert args[1] == msg_sans_time, info assert expected_win_ids == win_ids, info self._playbook.test_wrap(None, test_after, super().log, msg, **kwargs) def cmd__prompt_enter(self) -> None: - def test_before(context: str, msg: str) -> None: - assert context == _MARK_PROMPT - assert msg == self.window.prompt.input_buffer[:] + def test_before(cmd_name: str, args: tuple[str, ...]) -> None: + assert cmd_name == _MARK_PROMPT + assert args[0] == self.window.prompt.input_buffer[:] self._playbook.test_wrap(test_before, None, super().cmd__prompt_enter) diff --git a/src/tests/_timeout_retries.test b/src/tests/_timeout_retries.test index b08a3f7..232ccdb 100644 --- a/src/tests/_timeout_retries.test +++ b/src/tests/_timeout_retries.test @@ -5,81 +5,81 @@ | clientwin-init-in | isupport-clear-in -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 ..$ 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 -log_1 ..$ caps cleared -log_1 ..$ users cleared -log_1 ..$ channels cleared +log 1 ..$ caps cleared +log 1 ..$ users cleared +log 1 ..$ channels cleared | clientwin-init-out -, ..$ DISCONNECTED -log_1 ..$ hostname set to: [foo.bar.baz] +log , ..$ DISCONNECTED +log 1 ..$ hostname set to: [foo.bar.baz] | conn-init-retries-in -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] +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] -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 +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 -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 +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 -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 +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 -log_1 ..$ connection_state set to: [connecting] -log_1 ..$ connection_state set to: [connected] +log 1 ..$ connection_state set to: [connecting] +log 1 ..$ connection_state set to: [connected] | conn0-out -, ..$ CONNECTED +log , ..$ CONNECTED | conn1-in -log_1 ..> CAP LS :302 -log_1 ..> USER foobarbazquux 0 * :baz -log_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 -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] +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 -log_1 ..$ connection_state set to: [] -, ..$ DISCONNECTED -log_1 .!$ will retry connecting in 1 seconds +log 1 ..$ connection_state set to: [] +log , ..$ DISCONNECTED +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 log_2 -, ..$ DISCONNECTED -log_2 ..$ hostname set to: [baz.bar.foo] -repeat conn-init-retries-in conn-init-retries-out log_2 +repeat clientwin-init-in clientwin-init-out 2 +log , ..$ DISCONNECTED +log 2 ..$ hostname set to: [baz.bar.foo] +repeat conn-init-retries-in conn-init-retries-out 2 > /window 2 > /reconnect -repeat conn0-in conn0-out log_2 -, ..$ CONNECTED -repeat conn1-in conn1-out log_2 +repeat conn0-in conn0-out 2 +log , ..$ CONNECTED +repeat conn1-in conn1-out 2 wait 4 > /disconnect -log_2 ..> QUIT :ircplom says bye +log 2 ..> QUIT :ircplom says bye wait 4 > /quit -log_0 ..< +log 0 ..< diff --git a/src/tests/config.test b/src/tests/config.test index 2f1f0a7..179a5dc 100644 --- a/src/tests/config.test +++ b/src/tests/config.test @@ -1,25 +1,25 @@ -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 -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 -log_1 ..> CAP LS :302 -log_1 *.> USER baz 0 * :quux -log_1 ..> NICK :foo +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 +log , ..$ DISCONNECTED +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] +log , ..$ CONNECTED +log 1 ..> CAP LS :302 +log 1 *.> USER baz 0 * :quux +log 1 ..> NICK :foo > /quit -log_0 .< +log 0 .< diff --git a/src/tests/connect_disconnect_legalities.test b/src/tests/connect_disconnect_legalities.test index 6726fda..c5dd1cb 100644 --- a/src/tests/connect_disconnect_legalities.test +++ b/src/tests/connect_disconnect_legalities.test @@ -1,51 +1,51 @@ # to prepare, initiate connection > /connect foo.bar.baz foo bar:baz | isupport-clear-in -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 ..$ 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 -log_1 ..$ caps cleared -log_1 ..$ users cleared -log_1 ..$ channels cleared -, ..$ DISCONNECTED -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] +log 1 ..$ caps cleared +log 1 ..$ users cleared +log 1 ..$ channels cleared +log , ..$ DISCONNECTED +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 -log_1 ..$ connection_state set to: [connecting] -log_1 ..$ connection_state set to: [connected] -, ..$ CONNECTED -log_1 ..> CAP LS :302 -log_1 ..> USER baz 0 * :bar -log_1 ..> NICK :foo +log 1 ..$ connection_state set to: [connecting] +log 1 ..$ connection_state set to: [connected] +log , ..$ CONNECTED +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 -log_1 .!$ not re-connecting since already connected +log 1 .!$ not re-connecting since already connected # handle /disconnect on being connected > /disconnect -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]] +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 -log_1 ..$ connection_state set to: [] -, ..$ DISCONNECTED +log 1 ..$ connection_state set to: [] +log , ..$ DISCONNECTED # fail to disconnect when already disconnected > /disconnect -log_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 -log_0 ..< +log 0 ..< diff --git a/src/tests/error_disconnects.test b/src/tests/error_disconnects.test index e451ab4..4d96ff9 100644 --- a/src/tests/error_disconnects.test +++ b/src/tests/error_disconnects.test @@ -1,37 +1,37 @@ # to prepare first test, initiate connected state > /connect foo.bar.baz foo bar:baz | isupport-clear-in -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 ..$ 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 -log_1 ..$ caps cleared -log_1 ..$ users cleared -log_1 ..$ channels cleared -, ..$ DISCONNECTED -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] +log 1 ..$ caps cleared +log 1 ..$ users cleared +log 1 ..$ channels cleared +log , ..$ DISCONNECTED +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 -log_1 ..$ connection_state set to: [connecting] -log_1 ..$ connection_state set to: [connected] -, ..$ CONNECTED -log_1 ..> CAP LS :302 -log_1 ..> USER baz 0 * :bar -log_1 ..> NICK :foo +log 1 ..$ connection_state set to: [connecting] +log 1 ..$ connection_state set to: [connected] +log , ..$ CONNECTED +log 1 ..> CAP LS :302 +log 1 ..> USER baz 0 * :bar +log 1 ..> NICK :foo | connecting-out # test default ERROR handling -loggedservermsg_0:1 ..< ERROR :abc def ghi -log_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 -log_1 ..$ connection_state set to: [] -, ..$ DISCONNECTED +log 1 ..$ connection_state set to: [] +log , ..$ DISCONNECTED | disconnecting-out # to prepare next test, get back to connected state @@ -40,11 +40,11 @@ log_1 ..$ connection_state set to: [] repeat connecting-in connecting-out # test "timed out)" ERROR handling -loggedservermsg_0:1 ..< ERROR :Closing link: (Connection timed out) -log_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 -log_1 .!$ will retry connecting in 1 seconds +log 1 .!$ will retry connecting in 1 seconds # over and out > /quit -log_0 ..< +log 0 ..< diff --git a/src/tests/pingpong.test b/src/tests/pingpong.test index d5615db..33466a2 100644 --- a/src/tests/pingpong.test +++ b/src/tests/pingpong.test @@ -1,64 +1,64 @@ > /connect foo.bar.baz foo:bar baz:foobarbazquux | isupport-clear-in -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 ..$ 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 -log_1 ..$ caps cleared -log_1 ..$ users cleared -log_1 ..$ channels cleared -, ..$ DISCONNECTED -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] +log 1 ..$ caps cleared +log 1 ..$ users cleared +log 1 ..$ channels cleared +log , ..$ DISCONNECTED +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 -log_1 ..$ connection_state set to: [connecting] -log_1 ..$ connection_state set to: [connected] +log 1 ..$ connection_state set to: [connecting] +log 1 ..$ connection_state set to: [connected] | conn0-out -, ..$ CONNECTED +log , ..$ CONNECTED | conn1-in -log_1 ..> CAP LS :302 -log_1 ..> USER foobarbazquux 0 * :baz -log_1 ..> NICK :foo +log 1 ..> CAP LS :302 +log 1 ..> USER foobarbazquux 0 * :baz +log 1 ..> NICK :foo | conn1-out # ensure we PONG properly -loggedservermsg_0:1 ..< PING :? -log_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 -servermsg_0 timeout -log_1 ..> PING :what's up? +servermsg 0 timeout +log 1 ..> PING :what's up? | trigger-ping-out -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... +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 -servermsg_0 timeout -servermsg_0 no timely PONG from server -log_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 -log_1 ..$ connection_state set to: [] -log_2 ..$ DISCONNECTED -log_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 -log_2 ..$ CONNECTED +log 2 ..$ CONNECTED repeat conn1-in conn1-out repeat full-timeout-in full-timeout-out > /quit -log_0 ..< +log 0 ..< diff --git a/src/tests/test.test b/src/tests/test.test index 7b940ce..5310321 100644 --- a/src/tests/test.test +++ b/src/tests/test.test @@ -2,405 +2,405 @@ > /connect foo.bar.baz foo:bar baz:foobarbazquux | standard-clears-in | isupport-clear-in -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 ..$ 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 -log_1 ..$ caps cleared -log_1 ..$ users cleared -log_1 ..$ channels cleared +log 1 ..$ caps cleared +log 1 ..$ users cleared +log 1 ..$ channels cleared | standard-clears-out -, ..$ DISCONNECTED +log , ..$ DISCONNECTED # connect with values set by /connect, init CAP negotation -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] +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 -log_1 ..$ connection_state set to: [connecting] -log_1 ..$ connection_state set to: [connected] +log 1 ..$ connection_state set to: [connecting] +log 1 ..$ connection_state set to: [connected] | conn1 -, ..$ CONNECTED +log , ..$ CONNECTED | conn2 -log_1 ..> CAP LS :302 -log_1 ..> USER foobarbazquux 0 * :baz -log_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 -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 :? +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 -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 +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 -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] +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 -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] +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 -log_1 ..> CAP :END +log 1 ..> CAP :END # of all pre-MOTD greeting messages, only process isupports -loggedservermsg_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 -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) +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) -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) - +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 -loggedservermsg_0:1 ..< :foo1 MODE foo1 :+Ziw -log_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 -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. +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 -log_0 .!# invalid prompt command: /join unknown +log 0 .!# invalid prompt command: /join unknown > /list -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 +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 -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 +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 -log_1 ..> NICK :@foo -loggedservermsg_0:1 ..< :*.?.net 432 foo1 @foo :Erroneous nickname -log_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 -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 +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 -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 +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 -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 +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 -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 +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 -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 +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 -loggedservermsg_0:1 ..< :baz!~baz@baz.baz PRIVMSG foo1 :hi there -log_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 -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! +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! -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 +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 -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 +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 -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 +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 -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 +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 -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 +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 -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 +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 -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 +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 -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]] +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 -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 +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 -log_6 .!$ cannot send, connection seems closed +log 6 .!$ cannot send, connection seems closed > /window 1 > /privmsg barbar test -log_1 .!$ cannot send, connection seems closed +log 1 .!$ cannot send, connection seems closed > /privmsg #test test -log_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 log_8 -, ..$ DISCONNECTED -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 -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 -log_8 .!$ nickname refused for bad format, giving up +repeat standard-clears-in standard-clears-out 8 +log , ..$ DISCONNECTED +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 8 +log , ..$ CONNECTED +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 8 +log 8 ..$ connection_state set to: [] +log , ..$ DISCONNECTED +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 log_9 -, ..$ DISCONNECTED -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 -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 -log_9 .!$ will retry connecting in 1 seconds +repeat standard-clears-in standard-clears-out 9 +log , ..$ DISCONNECTED +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 9 +log , ..$ CONNECTED +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 9 +log 9 ..$ connection_state set to: [] +log , ..$ DISCONNECTED +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 -log_1 ..$ connection_state set to: [connecting] -log_1 ..$ connection_state set to: [connected] -log_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 -log_1 ..> JOIN :#testtest +log 1 ..> JOIN :#testtest repeat conn3 conn4 repeat conn5 conn6 > /quit -log_0 ..< +log 0 ..< diff --git a/src/tests/tui_draw.test b/src/tests/tui_draw.test index 28fd39b..3f9d067 100644 --- a/src/tests/tui_draw.test +++ b/src/tests/tui_draw.test @@ -1,35 +1,35 @@ | empty-init-in | lines-to-19-empty-in | line-0-empty-in -line_0 0.on_black. +line 0 0 on_black | line-0-empty-out -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 +repeat line-0-empty-in line-0-empty-out 1 +repeat line-0-empty-in line-0-empty-out 2 +repeat line-0-empty-in line-0-empty-out 3 +repeat line-0-empty-in line-0-empty-out 4 +repeat line-0-empty-in line-0-empty-out 5 +repeat line-0-empty-in line-0-empty-out 6 +repeat line-0-empty-in line-0-empty-out 7 +repeat line-0-empty-in line-0-empty-out 8 +repeat line-0-empty-in line-0-empty-out 9 +repeat line-0-empty-in line-0-empty-out 10 +repeat line-0-empty-in line-0-empty-out 11 +repeat line-0-empty-in line-0-empty-out 12 +repeat line-0-empty-in line-0-empty-out 13 +repeat line-0-empty-in line-0-empty-out 14 +repeat line-0-empty-in line-0-empty-out 15 +repeat line-0-empty-in line-0-empty-out 16 +repeat line-0-empty-in line-0-empty-out 17 +repeat line-0-empty-in line-0-empty-out 18 +repeat line-0-empty-in line-0-empty-out 19 | lines-to-19-empty-out -repeat line-0-empty-in line-0-empty-out line_20 -repeat line-0-empty-in line-0-empty-out line_21 +repeat line-0-empty-in line-0-empty-out 20 +repeat line-0-empty-in line-0-empty-out 21 | status-prompt-empty-in -line_22 0..:start)=====================================================================([0] -line_23 0..> -line_23 2.reverse. -line_23 3.. +line 22 0 :start)=====================================================================([0] +line 23 0 > +line 23 2 reverse +line 23 3 | status-prompt-empty-out | empty-init-out @@ -40,53 +40,53 @@ repeat empty-init-in empty-init-out # non-empty command input starts log at bottom, with date above it | input-foo-in > foo -log_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 line_19 +repeat line-0-empty-in line-0-empty-out 19 | date-at-20-in -line_20 0.on_black.20 -line_20 4.on_black.- -line_20 7.on_black.- -line_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 -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 / +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 -log_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 line_17 -repeat date-at-20-in date-at-20-out line_18 +repeat line-0-empty-in line-0-empty-out 17 +repeat date-at-20-in date-at-20-out 18 | foo-unprefixed-line-19-in -line_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 -line_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 line_21 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 21 # check wrapping > /foo_0123456789_0123456789_01234567 -log_0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown +log 0 .!# invalid prompt command: /foo_0123456789_0123456789_01234567 unknown | unwrapped-at-21-in -line_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 -log_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 -line_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 -line_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 @@ -95,18 +95,18 @@ line_21 0.on_black,bold,bright_red,bright_cyan. unknown repeat lines-to-19-empty-in lines-to-19-empty-out repeat date-at-20-in date-at-20-out | topmost-scroll-out -line_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 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 line-0-empty-in line-0-empty-out 14 +repeat date-at-20-in date-at-20-out 15 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 17 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 18 +repeat unwrapped-at-21-in unwrapped-at-21-out 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 @@ -119,25 +119,25 @@ repeat input-foo-in input-foo-out repeat input-cmd-foo-in input-cmd-foo-out repeat input-foo-in input-foo-out repeat topmost-scroll-in topmost-scroll-out -line_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 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 line-0-empty-in line-0-empty-out 9 +repeat date-at-20-in date-at-20-out 10 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 11 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 12 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 13 +repeat unwrapped-at-21-in unwrapped-at-21-out 14 +repeat wrapped-first-at-20-in wrapped-first-at-20-out 15 +repeat wrapped-second-at-21-in wrapped-second-at-21-out 16 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 17 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 18 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 19 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 20 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 21 repeat status-prompt-empty-in status-prompt-empty-out # check history growing upwards if scrolled down @@ -160,28 +160,28 @@ repeat input-cmd-foo-in input-cmd-foo-out 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 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 foo-unknown-line-20-in foo-unknown-line-20-out 0 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 1 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 2 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 3 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 4 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 5 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 6 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 7 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 8 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 9 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 10 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 11 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 12 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 13 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 14 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 15 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 17 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 19 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 20 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 21 repeat status-prompt-empty-in status-prompt-empty-out | bottom-longer-history-out @@ -189,28 +189,28 @@ repeat status-prompt-empty-in status-prompt-empty-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 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 +repeat line-0-empty-in line-0-empty-out 1 +repeat date-at-20-in date-at-20-out 2 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 3 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 4 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 5 +repeat unwrapped-at-21-in unwrapped-at-21-out 6 +repeat wrapped-first-at-20-in wrapped-first-at-20-out 7 +repeat wrapped-second-at-21-in wrapped-second-at-21-out 8 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 9 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 10 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 11 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 12 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 13 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 14 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 15 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 17 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 19 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 20 | scrolled-up-longer-history-out -line_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 @@ -219,82 +219,82 @@ 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 -line_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 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 foo-unprefixed-line-19-in foo-unprefixed-line-19-out 0 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 1 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 2 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 3 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 4 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 5 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 6 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 7 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 8 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 9 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 10 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 11 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 12 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 13 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 14 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 15 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 16 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 17 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 18 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 19 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 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 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 foo-unknown-line-20-in foo-unknown-line-20-out 0 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 1 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 2 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 3 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 4 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 5 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 6 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 7 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 8 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 9 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 10 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 11 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 12 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 13 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 14 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 15 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 16 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 17 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 19 +repeat wrapped-first-at-20-in wrapped-first-at-20-out 20 +repeat wrapped-second-at-21-in wrapped-second-at-21-out 21 repeat status-prompt-empty-in status-prompt-empty-out > /window.history.scroll up -line_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 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 line-0-empty-in line-0-empty-out 5 +repeat line-0-empty-in line-0-empty-out 10 +repeat date-at-20-in date-at-20-out 11 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 12 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 13 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 14 +repeat unwrapped-at-21-in unwrapped-at-21-out 15 +repeat wrapped-first-at-20-in wrapped-first-at-20-out 16 +repeat wrapped-second-at-21-in wrapped-second-at-21-out 17 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 18 +repeat foo-unknown-line-20-in foo-unknown-line-20-out 19 +repeat foo-unprefixed-line-19-in foo-unprefixed-line-19-out 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 -line_21 0.reverse.vvv [30] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +line 21 0 reverse vvv [30] vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv repeat status-prompt-empty-in status-prompt-empty-out > /quit -log_0 ..< +log 0 ..< diff --git a/src/tests/tui_prompt_basics.test b/src/tests/tui_prompt_basics.test index 28e1450..cd6a05d 100644 --- a/src/tests/tui_prompt_basics.test +++ b/src/tests/tui_prompt_basics.test @@ -5,35 +5,35 @@ # expected complaints on wrong command inputs > foo -log_0 .!# invalid prompt command: not prefixed by / +log 0 .!# invalid prompt command: not prefixed by / > /foo -log_0 .!# invalid prompt command: /foo unknown +log 0 .!# invalid prompt command: /foo unknown > /help foo -log_0 .!# invalid prompt command: /help given argument(s) while none expected +log 0 .!# invalid prompt command: /help given argument(s) while none expected > /window -log_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 -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 +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 -log_0 ..# windows available via /window: -log_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 -log_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 @@ -41,4 +41,4 @@ log_0 .!# invalid prompt command: /prompt_enter would loop into ourselves > /window.paste > /quit -log_0 ..< +log 0 ..<