def test_dcs_codes(self): s = self.create_screen() c = s.callbacks pb = partial(self.parse_bytes_dump, s) q = hexlify(b'kind').decode('ascii') pb('a\033P+q{}\x9cbcde'.format(q), 'a', ('screen_request_capabilities', 43, q), 'bcde') self.ae(str(s.line(0)), 'abcde') self.ae(c.wtcbuf, '1+r{}={}'.format(q, '1b5b313b3242').encode('ascii')) c.clear() pb('\033P$q q\033\\', ('screen_request_capabilities', ord('$'), ' q')) self.ae(c.wtcbuf, b'\033P1$r1 q\033\\') c.clear() pb('\033P$qm\033\\', ('screen_request_capabilities', ord('$'), 'm')) self.ae(c.wtcbuf, b'\033P1$rm\033\\') for sgr in '0;34;102;1;2;3;4 0;38:5:200;58:2:10:11:12'.split(): expected = set(sgr.split(';')) - {'0'} c.clear() parse_bytes(s, '\033[{}m\033P$qm\033\\'.format(sgr).encode('ascii')) r = c.wtcbuf.decode('ascii').partition('r')[2].partition('m')[0] self.ae(expected, set(r.split(';'))) c.clear() pb('\033P$qr\033\\', ('screen_request_capabilities', ord('$'), 'r')) self.ae( c.wtcbuf, '\033P1$r{};{}r\033\\'.format(s.margin_top + 1, s.margin_bottom + 1).encode('ascii'))
def process_input_from_child(self, timeout=10): rd, wd, err = select.select([self.master_fd], [self.master_fd] if self.write_buf else [], [self.master_fd], timeout) if err: raise OSError('master_fd is in error condition') while wd: try: n = os.write(self.master_fd, self.write_buf) except (BlockingIOError, OSError): n = 0 if not n: break self.write_buf = self.write_buf[n:] bytes_read = 0 while rd: try: data = os.read(self.master_fd, io.DEFAULT_BUFFER_SIZE) except (BlockingIOError, OSError): data = b'' if not data: break bytes_read += len(data) self.received_bytes += data parse_bytes(self.screen, data) return bytes_read
def t(q, use_pending_mode, *expected): c.clear() if use_pending_mode: parse_bytes(s, b'\033[?2026h') send(q) if use_pending_mode: self.ae(c.cc_buf, []) parse_bytes(s, b'\033[?2026l') self.ae(c.cc_buf, list(expected))
def send_command(screen, cmd, payload=b''): cmd = '\033_G' + cmd if payload: if isinstance(payload, str): payload = payload.encode('utf-8') payload = standard_b64encode(payload).decode('ascii') cmd += ';' + payload cmd += '\033\\' c = screen.callbacks c.clear() parse_bytes(screen, cmd.encode('ascii')) return c.wtcbuf
def test_simple_parsing(self): s = self.create_screen() pb = partial(self.parse_bytes_dump, s) pb('12', '12') self.ae(str(s.line(0)), '12') self.ae(s.cursor.x, 2) pb('3456', '3456') self.ae(str(s.line(0)), '12345') self.ae(str(s.line(1)), '6') pb(b'\n123\n\r45', ('screen_linefeed',), '123', ('screen_linefeed',), ('screen_carriage_return',), '45') self.ae(str(s.line(1)), '6') self.ae(str(s.line(2)), ' 123') self.ae(str(s.line(3)), '45') parse_bytes(s, b'\rabcde') self.ae(str(s.line(3)), 'abcde') pb('\rßxyz1', ('screen_carriage_return',), 'ßxyz1') self.ae(str(s.line(3)), 'ßxyz1') pb('ニチ ', 'ニチ ') self.ae(str(s.line(4)), 'ニチ ')
def test_rep(self): s = self.create_screen() s.draw('a') parse_bytes(s, b'\x1b[b') self.ae(str(s.line(0)), 'aa') parse_bytes(s, b'\x1b[3b') self.ae(str(s.line(0)), 'a' * 5) s.draw(' ') parse_bytes(s, b'\x1b[3b') self.ae(str(s.line(1)), ' ' * 4)
def set_link(url=None, id=None): parse_bytes(s, '\x1b]8;id={};{}\x1b\\'.format(id or '', url or '').encode('utf-8'))
def w(code): return parse_bytes(s, ('\033[' + code).encode('ascii'))
def ac(flags): parse_bytes(s, '\033[?u'.encode('ascii')) self.ae(c.wtcbuf, f'\033[?{flags}u'.encode('ascii')) c.clear()
def w(code, p1='', p2=''): p = f'{p1}' if p2: p += f';{p2}' return parse_bytes(s, f'\033[{code}{p}u'.encode('ascii'))
def mark_output(): parse_bytes(s, b'\033]133;C\007')
def mark_prompt(): parse_bytes(s, b'\033]133;A\007')
def send(what: str): return parse_bytes(s, f'\033]52;p;{what}\a'.encode('ascii'))
def mark_output(): parse_bytes(s, '\033]133;C\007'.encode('ascii'))
def mark_prompt(): parse_bytes(s, '\033]133;A\007'.encode('ascii'))