|
28 | 28 | import traceback |
29 | 29 | from functools import partial |
30 | 30 | from pathlib import Path |
| 31 | +from traceback import _str_width, _wlen |
31 | 32 | import _colorize |
32 | 33 |
|
33 | 34 | MODULE_PREFIX = f'{__name__}.' if __name__ == '__main__' else '' |
@@ -1787,6 +1788,50 @@ def f(): |
1787 | 1788 | ] |
1788 | 1789 | self.assertEqual(result_lines, expected) |
1789 | 1790 |
|
| 1791 | + def test_str_width(self): |
| 1792 | + characters = [ |
| 1793 | + 'a', |
| 1794 | + '1', |
| 1795 | + '_', |
| 1796 | + '!', |
| 1797 | + '\x1a', |
| 1798 | + '\u263A', |
| 1799 | + '\uffb9', |
| 1800 | + '\N{LATIN SMALL LETTER E WITH ACUTE}', # é |
| 1801 | + '\N{LATIN SMALL LETTER E WITH CEDILLA}', # ȩ |
| 1802 | + '\u00ad', |
| 1803 | + ] |
| 1804 | + for c in characters: |
| 1805 | + self.assertEqual(_str_width(c), 1) |
| 1806 | + |
| 1807 | + zero_width_characters = [ |
| 1808 | + '\N{COMBINING ACUTE ACCENT}', |
| 1809 | + '\N{ZERO WIDTH JOINER}', |
| 1810 | + ] |
| 1811 | + for c in zero_width_characters: |
| 1812 | + with self.subTest(character=c): |
| 1813 | + self.assertEqual(_str_width(c), 0) |
| 1814 | + |
| 1815 | + characters = [chr(99989), chr(99999)] |
| 1816 | + for c in characters: |
| 1817 | + self.assertEqual(_str_width(c), 2) |
| 1818 | + |
| 1819 | + def test_wlen(self): |
| 1820 | + for c in ['a', 'b', '1', '!', '_']: |
| 1821 | + self.assertEqual(_wlen(c), 1) |
| 1822 | + self.assertEqual(_wlen('\x1a'), 2) |
| 1823 | + |
| 1824 | + char_east_asian_width_N = chr(3800) |
| 1825 | + self.assertEqual(_wlen(char_east_asian_width_N), 1) |
| 1826 | + char_east_asian_width_W = chr(4352) |
| 1827 | + self.assertEqual(_wlen(char_east_asian_width_W), 2) |
| 1828 | + |
| 1829 | + self.assertEqual(_wlen('hello'), 5) |
| 1830 | + self.assertEqual(_wlen('hello' + '\x1a'), 7) |
| 1831 | + self.assertEqual(_wlen('e\N{COMBINING ACUTE ACCENT}'), 1) |
| 1832 | + self.assertEqual(_wlen('a\N{ZERO WIDTH JOINER}b'), 2) |
| 1833 | + |
| 1834 | + |
1790 | 1835 | class TestKeywordTypoSuggestions(unittest.TestCase): |
1791 | 1836 | TYPO_CASES = [ |
1792 | 1837 | ("with block ad something:\n pass", "and"), |
|
0 commit comments