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