|
1 | 1 | import unittest
|
| 2 | +import locale |
2 | 3 | import re
|
3 | 4 | import subprocess
|
4 | 5 | import sys
|
@@ -61,6 +62,10 @@ def test_eval_null_in_result(self):
|
61 | 62 | tcl = self.interp
|
62 | 63 | self.assertEqual(tcl.eval('set a "a\\0b"'), 'a\x00b')
|
63 | 64 |
|
| 65 | + def test_eval_surrogates_in_result(self): |
| 66 | + tcl = self.interp |
| 67 | + self.assertIn(tcl.eval(r'set a "<\ud83d\udcbb>"'), '<\U0001f4bb>') |
| 68 | + |
64 | 69 | def testEvalException(self):
|
65 | 70 | tcl = self.interp
|
66 | 71 | self.assertRaises(TclError,tcl.eval,'set a')
|
@@ -193,29 +198,48 @@ def test_getboolean(self):
|
193 | 198 |
|
194 | 199 | def testEvalFile(self):
|
195 | 200 | tcl = self.interp
|
196 |
| - with open(os_helper.TESTFN, 'w') as f: |
197 |
| - self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 201 | + filename = os_helper.TESTFN_ASCII |
| 202 | + self.addCleanup(os_helper.unlink, filename) |
| 203 | + with open(filename, 'w') as f: |
198 | 204 | f.write("""set a 1
|
199 | 205 | set b 2
|
200 | 206 | set c [ expr $a + $b ]
|
201 | 207 | """)
|
202 |
| - tcl.evalfile(os_helper.TESTFN) |
| 208 | + tcl.evalfile(filename) |
203 | 209 | self.assertEqual(tcl.eval('set a'),'1')
|
204 | 210 | self.assertEqual(tcl.eval('set b'),'2')
|
205 | 211 | self.assertEqual(tcl.eval('set c'),'3')
|
206 | 212 |
|
207 | 213 | def test_evalfile_null_in_result(self):
|
208 | 214 | tcl = self.interp
|
209 |
| - with open(os_helper.TESTFN, 'w') as f: |
210 |
| - self.addCleanup(os_helper.unlink, os_helper.TESTFN) |
| 215 | + filename = os_helper.TESTFN_ASCII |
| 216 | + self.addCleanup(os_helper.unlink, filename) |
| 217 | + with open(filename, 'w') as f: |
211 | 218 | f.write("""
|
212 | 219 | set a "a\0b"
|
213 | 220 | set b "a\\0b"
|
214 | 221 | """)
|
215 |
| - tcl.evalfile(os_helper.TESTFN) |
| 222 | + tcl.evalfile(filename) |
216 | 223 | self.assertEqual(tcl.eval('set a'), 'a\x00b')
|
217 | 224 | self.assertEqual(tcl.eval('set b'), 'a\x00b')
|
218 | 225 |
|
| 226 | + def test_evalfile_surrogates_in_result(self): |
| 227 | + tcl = self.interp |
| 228 | + encoding = tcl.call('encoding', 'system') |
| 229 | + self.addCleanup(tcl.call, 'encoding', 'system', encoding) |
| 230 | + tcl.call('encoding', 'system', 'utf-8') |
| 231 | + |
| 232 | + filename = os_helper.TESTFN_ASCII |
| 233 | + self.addCleanup(os_helper.unlink, filename) |
| 234 | + with open(filename, 'wb') as f: |
| 235 | + f.write(b""" |
| 236 | + set a "<\xed\xa0\xbd\xed\xb2\xbb>" |
| 237 | + set b "<\\ud83d\\udcbb>" |
| 238 | + """) |
| 239 | + tcl.evalfile(filename) |
| 240 | + self.assertEqual(tcl.eval('set a'), '<\U0001f4bb>') |
| 241 | + self.assertEqual(tcl.eval('set b'), '<\U0001f4bb>') |
| 242 | + |
219 | 243 | def testEvalFileException(self):
|
220 | 244 | tcl = self.interp
|
221 | 245 | filename = "doesnotexists"
|
@@ -438,6 +462,11 @@ def passValue(value):
|
438 | 462 | self.assertEqual(passValue('str\x00ing\u20ac'), 'str\x00ing\u20ac')
|
439 | 463 | self.assertEqual(passValue('str\x00ing\U0001f4bb'),
|
440 | 464 | 'str\x00ing\U0001f4bb')
|
| 465 | + if sys.platform != 'win32': |
| 466 | + self.assertEqual(passValue('<\udce2\udc82\udcac>'), |
| 467 | + '<\u20ac>') |
| 468 | + self.assertEqual(passValue('<\udced\udca0\udcbd\udced\udcb2\udcbb>'), |
| 469 | + '<\U0001f4bb>') |
441 | 470 | self.assertEqual(passValue(b'str\x00ing'),
|
442 | 471 | b'str\x00ing' if self.wantobjects else 'str\x00ing')
|
443 | 472 | self.assertEqual(passValue(b'str\xc0\x80ing'),
|
@@ -497,6 +526,9 @@ def float_eq(actual, expected):
|
497 | 526 | check('string\xbd')
|
498 | 527 | check('string\u20ac')
|
499 | 528 | check('string\U0001f4bb')
|
| 529 | + if sys.platform != 'win32': |
| 530 | + check('<\udce2\udc82\udcac>', '<\u20ac>') |
| 531 | + check('<\udced\udca0\udcbd\udced\udcb2\udcbb>', '<\U0001f4bb>') |
500 | 532 | check('')
|
501 | 533 | check(b'string', 'string')
|
502 | 534 | check(b'string\xe2\x82\xac', 'string\xe2\x82\xac')
|
@@ -540,6 +572,8 @@ def test_splitlist(self):
|
540 | 572 | ('a \u20ac', ('a', '\u20ac')),
|
541 | 573 | ('a \U0001f4bb', ('a', '\U0001f4bb')),
|
542 | 574 | (b'a \xe2\x82\xac', ('a', '\u20ac')),
|
| 575 | + (b'a \xf0\x9f\x92\xbb', ('a', '\U0001f4bb')), |
| 576 | + (b'a \xed\xa0\xbd\xed\xb2\xbb', ('a', '\U0001f4bb')), |
543 | 577 | (b'a\xc0\x80b c\xc0\x80d', ('a\x00b', 'c\x00d')),
|
544 | 578 | ('a {b c}', ('a', 'b c')),
|
545 | 579 | (r'a b\ c', ('a', 'b c')),
|
|
0 commit comments