|
1 | 1 | from decimal import Decimal
|
| 2 | +from test import support |
2 | 3 | from test.support import cpython_only, verbose, is_android, linked_to_musl, os_helper
|
3 | 4 | from test.support.warnings_helper import check_warnings
|
4 | 5 | from test.support.import_helper import ensure_lazy_imports, import_fresh_module
|
@@ -424,8 +425,8 @@ def test_hyphenated_encoding(self):
|
424 | 425 | self.check('cs_CZ.ISO8859-2', 'cs_CZ.ISO8859-2')
|
425 | 426 |
|
426 | 427 | def test_euro_modifier(self):
|
427 |
| - self.check('de_DE@euro', 'de_DE.ISO8859-15') |
428 |
| - self.check('en_US.ISO8859-15@euro', 'en_US.ISO8859-15') |
| 428 | + self.check('de_DE@euro', 'de_DE.ISO8859-15@euro') |
| 429 | + self.check('en_US.ISO8859-15@euro', 'en_US.ISO8859-15@euro') |
429 | 430 | self.check('de_DE.utf8@euro', 'de_DE.UTF-8')
|
430 | 431 |
|
431 | 432 | def test_latin_modifier(self):
|
@@ -486,6 +487,132 @@ def test_japanese(self):
|
486 | 487 | self.check('jp_jp', 'ja_JP.eucJP')
|
487 | 488 |
|
488 | 489 |
|
| 490 | +class TestRealLocales(unittest.TestCase): |
| 491 | + locale_type = locale.LC_CTYPE |
| 492 | + |
| 493 | + def setUp(self): |
| 494 | + oldlocale = locale.setlocale(locale.LC_CTYPE) |
| 495 | + self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) |
| 496 | + |
| 497 | + def test_getsetlocale_issue1813(self): |
| 498 | + # Issue #1813: setting and getting the locale under a Turkish locale |
| 499 | + try: |
| 500 | + locale.setlocale(locale.LC_CTYPE, 'tr_TR') |
| 501 | + except locale.Error: |
| 502 | + # Unsupported locale on this system |
| 503 | + self.skipTest('test needs Turkish locale') |
| 504 | + loc = locale.getlocale(locale.LC_CTYPE) |
| 505 | + if verbose: |
| 506 | + print('testing with %a' % (loc,), end=' ', flush=True) |
| 507 | + try: |
| 508 | + locale.setlocale(locale.LC_CTYPE, loc) |
| 509 | + except locale.Error as exc: |
| 510 | + # bpo-37945: setlocale(LC_CTYPE) fails with getlocale(LC_CTYPE) |
| 511 | + # and the tr_TR locale on Windows. getlocale() builds a locale |
| 512 | + # which is not recognize by setlocale(). |
| 513 | + self.skipTest(f"setlocale(LC_CTYPE, {loc!r}) failed: {exc!r}") |
| 514 | + self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE)) |
| 515 | + |
| 516 | + @support.subTests('localename,localetuple', [ |
| 517 | + ('fr_FR.ISO8859-15@euro', ('fr_FR@euro', 'iso885915')), |
| 518 | + ('fr_FR.ISO8859-15@euro', ('fr_FR@euro', 'iso88591')), |
| 519 | + ('fr_FR.ISO8859-15@euro', ('fr_FR@euro', 'ISO8859-15')), |
| 520 | + ('fr_FR.ISO8859-15@euro', ('fr_FR@euro', 'ISO8859-1')), |
| 521 | + ('fr_FR.ISO8859-15@euro', ('fr_FR@euro', None)), |
| 522 | + ('de_DE.ISO8859-15@euro', ('de_DE@euro', 'iso885915')), |
| 523 | + ('de_DE.ISO8859-15@euro', ('de_DE@euro', 'iso88591')), |
| 524 | + ('de_DE.ISO8859-15@euro', ('de_DE@euro', 'ISO8859-15')), |
| 525 | + ('de_DE.ISO8859-15@euro', ('de_DE@euro', 'ISO8859-1')), |
| 526 | + ('de_DE.ISO8859-15@euro', ('de_DE@euro', None)), |
| 527 | + ('el_GR.ISO8859-7@euro', ('el_GR@euro', 'iso88597')), |
| 528 | + ('el_GR.ISO8859-7@euro', ('el_GR@euro', 'ISO8859-7')), |
| 529 | + ('el_GR.ISO8859-7@euro', ('el_GR@euro', None)), |
| 530 | + ('ca_ES.ISO8859-15@euro', ('ca_ES@euro', 'iso885915')), |
| 531 | + ('ca_ES.ISO8859-15@euro', ('ca_ES@euro', 'iso88591')), |
| 532 | + ('ca_ES.ISO8859-15@euro', ('ca_ES@euro', 'ISO8859-15')), |
| 533 | + ('ca_ES.ISO8859-15@euro', ('ca_ES@euro', 'ISO8859-1')), |
| 534 | + ('ca_ES.ISO8859-15@euro', ('ca_ES@euro', None)), |
| 535 | + ('ca_ES.UTF-8@valencia', ('ca_ES@valencia', 'utf8')), |
| 536 | + ('ca_ES.UTF-8@valencia', ('ca_ES@valencia', 'UTF-8')), |
| 537 | + ('ca_ES.UTF-8@valencia', ('ca_ES@valencia', None)), |
| 538 | + ('ks_IN.UTF-8@devanagari', ('ks_IN@devanagari', 'utf8')), |
| 539 | + ('ks_IN.UTF-8@devanagari', ('ks_IN@devanagari', 'UTF-8')), |
| 540 | + ('ks_IN.UTF-8@devanagari', ('ks_IN@devanagari', None)), |
| 541 | + ('sd_IN.UTF-8@devanagari', ('sd_IN@devanagari', 'utf8')), |
| 542 | + ('sd_IN.UTF-8@devanagari', ('sd_IN@devanagari', 'UTF-8')), |
| 543 | + ('sd_IN.UTF-8@devanagari', ('sd_IN@devanagari', None)), |
| 544 | + ('be_BY.UTF-8@latin', ('be_BY@latin', 'utf8')), |
| 545 | + ('be_BY.UTF-8@latin', ('be_BY@latin', 'UTF-8')), |
| 546 | + ('be_BY.UTF-8@latin', ('be_BY@latin', None)), |
| 547 | + ('sr_RS.UTF-8@latin', ('sr_RS@latin', 'utf8')), |
| 548 | + ('sr_RS.UTF-8@latin', ('sr_RS@latin', 'UTF-8')), |
| 549 | + ('sr_RS.UTF-8@latin', ('sr_RS@latin', None)), |
| 550 | + ('ug_CN.UTF-8@latin', ('ug_CN@latin', 'utf8')), |
| 551 | + ('ug_CN.UTF-8@latin', ('ug_CN@latin', 'UTF-8')), |
| 552 | + ('ug_CN.UTF-8@latin', ('ug_CN@latin', None)), |
| 553 | + ('uz_UZ.UTF-8@cyrillic', ('uz_UZ@cyrillic', 'utf8')), |
| 554 | + ('uz_UZ.UTF-8@cyrillic', ('uz_UZ@cyrillic', 'UTF-8')), |
| 555 | + ('uz_UZ.UTF-8@cyrillic', ('uz_UZ@cyrillic', None)), |
| 556 | + ]) |
| 557 | + def test_setlocale_with_modifier(self, localename, localetuple): |
| 558 | + try: |
| 559 | + locale.setlocale(locale.LC_CTYPE, localename) |
| 560 | + except locale.Error as exc: |
| 561 | + self.skipTest(str(exc)) |
| 562 | + loc = locale.setlocale(locale.LC_CTYPE, localetuple) |
| 563 | + self.assertEqual(loc, localename) |
| 564 | + |
| 565 | + loctuple = locale.getlocale(locale.LC_CTYPE) |
| 566 | + loc = locale.setlocale(locale.LC_CTYPE, loctuple) |
| 567 | + self.assertEqual(loc, localename) |
| 568 | + |
| 569 | + @support.subTests('localename,localetuple', [ |
| 570 | + ('fr_FR.iso885915@euro', ('fr_FR@euro', 'ISO8859-15')), |
| 571 | + ('fr_FR.ISO8859-15@euro', ('fr_FR@euro', 'ISO8859-15')), |
| 572 | + ('fr_FR@euro', ('fr_FR@euro', 'ISO8859-15')), |
| 573 | + ('de_DE.iso885915@euro', ('de_DE@euro', 'ISO8859-15')), |
| 574 | + ('de_DE.ISO8859-15@euro', ('de_DE@euro', 'ISO8859-15')), |
| 575 | + ('de_DE@euro', ('de_DE@euro', 'ISO8859-15')), |
| 576 | + ('el_GR.iso88597@euro', ('el_GR@euro', 'ISO8859-7')), |
| 577 | + ('el_GR.ISO8859-7@euro', ('el_GR@euro', 'ISO8859-7')), |
| 578 | + ('el_GR@euro', ('el_GR@euro', 'ISO8859-7')), |
| 579 | + ('ca_ES.iso885915@euro', ('ca_ES@euro', 'ISO8859-15')), |
| 580 | + ('ca_ES.ISO8859-15@euro', ('ca_ES@euro', 'ISO8859-15')), |
| 581 | + ('ca_ES@euro', ('ca_ES@euro', 'ISO8859-15')), |
| 582 | + ('ca_ES.utf8@valencia', ('ca_ES@valencia', 'UTF-8')), |
| 583 | + ('ca_ES.UTF-8@valencia', ('ca_ES@valencia', 'UTF-8')), |
| 584 | + ('ca_ES@valencia', ('ca_ES@valencia', 'UTF-8')), |
| 585 | + ('ks_IN.utf8@devanagari', ('ks_IN@devanagari', 'UTF-8')), |
| 586 | + ('ks_IN.UTF-8@devanagari', ('ks_IN@devanagari', 'UTF-8')), |
| 587 | + ('ks_IN@devanagari', ('ks_IN@devanagari', 'UTF-8')), |
| 588 | + ('sd_IN.utf8@devanagari', ('sd_IN@devanagari', 'UTF-8')), |
| 589 | + ('sd_IN.UTF-8@devanagari', ('sd_IN@devanagari', 'UTF-8')), |
| 590 | + ('sd_IN@devanagari', ('sd_IN@devanagari', 'UTF-8')), |
| 591 | + ('be_BY.utf8@latin', ('be_BY@latin', 'UTF-8')), |
| 592 | + ('be_BY.UTF-8@latin', ('be_BY@latin', 'UTF-8')), |
| 593 | + ('be_BY@latin', ('be_BY@latin', 'UTF-8')), |
| 594 | + ('sr_RS.utf8@latin', ('sr_RS@latin', 'UTF-8')), |
| 595 | + ('sr_RS.UTF-8@latin', ('sr_RS@latin', 'UTF-8')), |
| 596 | + ('sr_RS@latin', ('sr_RS@latin', 'UTF-8')), |
| 597 | + ('ug_CN.utf8@latin', ('ug_CN@latin', 'UTF-8')), |
| 598 | + ('ug_CN.UTF-8@latin', ('ug_CN@latin', 'UTF-8')), |
| 599 | + ('ug_CN@latin', ('ug_CN@latin', 'UTF-8')), |
| 600 | + ('uz_UZ.utf8@cyrillic', ('uz_UZ@cyrillic', 'UTF-8')), |
| 601 | + ('uz_UZ.UTF-8@cyrillic', ('uz_UZ@cyrillic', 'UTF-8')), |
| 602 | + ('uz_UZ@cyrillic', ('uz_UZ@cyrillic', 'UTF-8')), |
| 603 | + ]) |
| 604 | + def test_getlocale_with_modifier(self, localename, localetuple): |
| 605 | + try: |
| 606 | + locale.setlocale(locale.LC_CTYPE, localename) |
| 607 | + except locale.Error as exc: |
| 608 | + self.skipTest(str(exc)) |
| 609 | + loctuple = locale.getlocale(locale.LC_CTYPE) |
| 610 | + self.assertEqual(loctuple, localetuple) |
| 611 | + |
| 612 | + locale.setlocale(locale.LC_CTYPE, loctuple) |
| 613 | + self.assertEqual(locale.getlocale(locale.LC_CTYPE), localetuple) |
| 614 | + |
| 615 | + |
489 | 616 | class TestMiscellaneous(unittest.TestCase):
|
490 | 617 | def test_defaults_UTF8(self):
|
491 | 618 | # Issue #18378: on (at least) macOS setting LC_CTYPE to "UTF-8" is
|
@@ -552,27 +679,6 @@ def test_setlocale_category(self):
|
552 | 679 | # crasher from bug #7419
|
553 | 680 | self.assertRaises(locale.Error, locale.setlocale, 12345)
|
554 | 681 |
|
555 |
| - def test_getsetlocale_issue1813(self): |
556 |
| - # Issue #1813: setting and getting the locale under a Turkish locale |
557 |
| - oldlocale = locale.setlocale(locale.LC_CTYPE) |
558 |
| - self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale) |
559 |
| - try: |
560 |
| - locale.setlocale(locale.LC_CTYPE, 'tr_TR') |
561 |
| - except locale.Error: |
562 |
| - # Unsupported locale on this system |
563 |
| - self.skipTest('test needs Turkish locale') |
564 |
| - loc = locale.getlocale(locale.LC_CTYPE) |
565 |
| - if verbose: |
566 |
| - print('testing with %a' % (loc,), end=' ', flush=True) |
567 |
| - try: |
568 |
| - locale.setlocale(locale.LC_CTYPE, loc) |
569 |
| - except locale.Error as exc: |
570 |
| - # bpo-37945: setlocale(LC_CTYPE) fails with getlocale(LC_CTYPE) |
571 |
| - # and the tr_TR locale on Windows. getlocale() builds a locale |
572 |
| - # which is not recognize by setlocale(). |
573 |
| - self.skipTest(f"setlocale(LC_CTYPE, {loc!r}) failed: {exc!r}") |
574 |
| - self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE)) |
575 |
| - |
576 | 682 | def test_invalid_locale_format_in_localetuple(self):
|
577 | 683 | with self.assertRaises(TypeError):
|
578 | 684 | locale.setlocale(locale.LC_ALL, b'fi_FI')
|
|
0 commit comments