[tests] Workaround Python 2 “narrow” builds
authorKhaled Hosny <khaledhosny@eglug.org>
Sat, 18 Jun 2016 19:12:19 +0000 (21:12 +0200)
committerKhaled Hosny <khaledhosny@eglug.org>
Sat, 18 Jun 2016 21:01:58 +0000 (23:01 +0200)
The so-called Python 2 “narrow” builds support UCS2 only, this is a
workaround to allow unichr to work with any Unicode character in such
builds. This fixes Travis-CI failure as it has narrow Python 2 builds.

Copied from:
https://github.com/behdad/fonttools/blob/master/Lib/fontTools/misc/py23.py

test/shaping/hb_test_tools.py

index 747699b..7473982 100644 (file)
@@ -7,7 +7,43 @@ from itertools import *
 diff_symbols = "-+=*&^%$#@!~/"
 diff_colors = ['red', 'green', 'blue']
 
-if sys.version_info[0] >= 3:
+try:
+       unichr = unichr
+
+       if sys.maxunicode < 0x10FFFF:
+               # workarounds for Python 2 "narrow" builds with UCS2-only support.
+
+               _narrow_unichr = unichr
+
+               def unichr(i):
+                       """
+                       Return the unicode character whose Unicode code is the integer 'i'.
+                       The valid range is 0 to 0x10FFFF inclusive.
+
+                       >>> _narrow_unichr(0xFFFF + 1)
+                       Traceback (most recent call last):
+                         File "<stdin>", line 1, in ?
+                       ValueError: unichr() arg not in range(0x10000) (narrow Python build)
+                       >>> unichr(0xFFFF + 1) == u'\U00010000'
+                       True
+                       >>> unichr(1114111) == u'\U0010FFFF'
+                       True
+                       >>> unichr(0x10FFFF + 1)
+                       Traceback (most recent call last):
+                         File "<stdin>", line 1, in ?
+                       ValueError: unichr() arg not in range(0x110000)
+                       """
+                       try:
+                               return _narrow_unichr(i)
+                       except ValueError:
+                               try:
+                                       padded_hex_str = hex(i)[2:].zfill(8)
+                                       escape_str = "\\U" + padded_hex_str
+                                       return escape_str.decode("unicode-escape")
+                               except UnicodeDecodeError:
+                                       raise ValueError('unichr() arg not in range(0x110000)')
+
+except NameError:
        unichr = chr
 
 class ColorFormatter: