def test_utils(self): def w(x): return wcwidth(ord(x)) self.ae(tuple(map(w, 'a1\0コニチ ✔')), (1, 1, 0, 2, 2, 2, 1, 1)) self.ae(wcswidth('\u2716\u2716\ufe0f\U0001f337'), 5) self.ae(wcswidth('\033a\033[2mb'), 2) self.ae(wcswidth('\u25b6\ufe0f'), 2) self.ae(wcswidth('\U0001f610\ufe0e'), 1) # Regional indicator symbols (unicode flags) are defined as having # Emoji_Presentation so must have width 2 self.ae(tuple(map(w, '\U0001f1ee\U0001f1f3')), (2, 2)) tpl = truncate_point_for_length self.ae(tpl('abc', 4), 3) self.ae(tpl('abc', 2), 2) self.ae(tpl('abc', 0), 0) self.ae(tpl('a\U0001f337', 2), 1) self.ae(tpl('a\U0001f337', 3), 2) self.ae(tpl('a\U0001f337b', 4), 3) self.ae(sanitize_title('a\0\01 \t\n\f\rb'), 'a b') self.ae(tpl('a\x1b[31mbc', 2), 7) def tp(*data, leftover='', text='', csi='', apc='', ibp=False): text_r, csi_r, apc_r, rest = [], [], [], [] left = '' in_bp = ibp def on_csi(x): nonlocal in_bp if x == '200~': in_bp = True elif x == '201~': in_bp = False csi_r.append(x) for d in data: left = parse_input_from_terminal(text_r.append, rest.append, on_csi, rest.append, rest.append, apc_r.append, left + d, in_bp) self.ae(left, leftover) self.ae(text, ' '.join(text_r)) self.ae(csi, ' '.join(csi_r)) self.ae(apc, ' '.join(apc_r)) self.assertFalse(rest) tp('a\033[200~\033[32mxy\033[201~\033[33ma', text='a \033[32m xy a', csi='200~ 201~ 33m') tp('abc', text='abc') tp('a\033[38:5:12:32mb', text='a b', csi='38:5:12:32m') tp('a\033_x,;(\033\\b', text='a b', apc='x,;(') tp('a\033', '[', 'mb', text='a b', csi='m') tp('a\033[', 'mb', text='a b', csi='m') tp('a\033', '_', 'x\033', '\\b', text='a b', apc='x') tp('a\033_', 'x', '\033', '\\', 'b', text='a b', apc='x') for prefix in ('/tmp', tempfile.gettempdir()): for path in ('a.png', 'x/b.jpg', 'y/../c.jpg'): self.assertTrue(is_path_in_temp_dir(os.path.join(prefix, path))) for path in ('/home/xy/d.png', '/tmp/../home/x.jpg'): self.assertFalse(is_path_in_temp_dir(os.path.join(path)))
def test_utils(self): def w(x): return wcwidth(ord(x)) self.ae(tuple(map(w, 'a1\0コニチ ✔')), (1, 1, 0, 2, 2, 2, 1, 1)) self.ae(wcswidth('\u2716\u2716\ufe0f\U0001f337'), 5) self.ae(wcswidth('\033a\033[2mb'), 2) tpl = truncate_point_for_length self.ae(tpl('abc', 4), 3) self.ae(tpl('abc', 2), 2) self.ae(tpl('abc', 0), 0) self.ae(tpl('a\U0001f337', 2), 1) self.ae(tpl('a\U0001f337', 3), 2) self.ae(tpl('a\U0001f337b', 4), 3) self.ae(sanitize_title('a\0\01 \t\n\f\rb'), 'a b') self.ae(tpl('a\x1b[31mbc', 2), 7) def tp(*data, leftover='', text='', csi='', apc='', ibp=False): text_r, csi_r, apc_r, rest = [], [], [], [] left = '' in_bp = ibp def on_csi(x): nonlocal in_bp if x == '200~': in_bp = True elif x == '201~': in_bp = False csi_r.append(x) for d in data: left = parse_input_from_terminal(text_r.append, rest.append, on_csi, rest.append, rest.append, apc_r.append, left + d, in_bp) self.ae(left, leftover) self.ae(text, ' '.join(text_r)) self.ae(csi, ' '.join(csi_r)) self.ae(apc, ' '.join(apc_r)) self.assertFalse(rest) tp('a\033[200~\033[32mxy\033[201~\033[33ma', text='a \033[32m xy a', csi='200~ 201~ 33m') tp('abc', text='abc') tp('a\033[38:5:12:32mb', text='a b', csi='38:5:12:32m') tp('a\033_x,;(\033\\b', text='a b', apc='x,;(') tp('a\033', '[', 'mb', text='a b', csi='m') tp('a\033[', 'mb', text='a b', csi='m') tp('a\033', '_', 'x\033', '\\b', text='a b', apc='x') tp('a\033_', 'x', '\033', '\\', 'b', text='a b', apc='x')
def test_utils(self): self.ae(tuple(map(wcwidth, 'a1\0コニチ ')), (1, 1, 0, 2, 2, 2, 1)) self.assertEqual(sanitize_title('a\0\01 \t\n\f\rb'), 'a b')