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