from unittest import TestCase from _pyrepl.utils import str_width, wlen, prev_next_window class TestUtils(TestCase): def test_str_width(self): characters = ['a', '1', '_', '!', '\x1a', '\u263A', '\uffb9'] for c in characters: self.assertEqual(str_width(c), 1) characters = [chr(99989), chr(99999)] for c in characters: self.assertEqual(str_width(c), 2) def test_wlen(self): for c in ['a', 'b', '1', '!', '_']: self.assertEqual(wlen(c), 1) self.assertEqual(wlen('\x1a'), 2) char_east_asian_width_N = chr(3800) self.assertEqual(wlen(char_east_asian_width_N), 1) char_east_asian_width_W = chr(4352) self.assertEqual(wlen(char_east_asian_width_W), 2) self.assertEqual(wlen('hello'), 5) self.assertEqual(wlen('hello' + '\x1a'), 7) def test_prev_next_window(self): def gen_normal(): yield 1 yield 2 yield 3 yield 4 pnw = prev_next_window(gen_normal()) self.assertEqual(next(pnw), (None, 1, 2)) self.assertEqual(next(pnw), (1, 2, 3)) self.assertEqual(next(pnw), (2, 3, 4)) self.assertEqual(next(pnw), (3, 4, None)) with self.assertRaises(StopIteration): next(pnw) def gen_short(): yield 1 pnw = prev_next_window(gen_short()) self.assertEqual(next(pnw), (None, 1, None)) with self.assertRaises(StopIteration): next(pnw) def gen_raise(): yield from gen_normal() 1/0 pnw = prev_next_window(gen_raise()) self.assertEqual(next(pnw), (None, 1, 2)) self.assertEqual(next(pnw), (1, 2, 3)) self.assertEqual(next(pnw), (2, 3, 4)) self.assertEqual(next(pnw), (3, 4, None)) with self.assertRaises(ZeroDivisionError): next(pnw)