17db96d56Sopenharmony_cifrom decimal import Decimal
27db96d56Sopenharmony_cifrom test.support import verbose, is_android, is_emscripten, is_wasi
37db96d56Sopenharmony_cifrom test.support.warnings_helper import check_warnings
47db96d56Sopenharmony_ciimport unittest
57db96d56Sopenharmony_ciimport locale
67db96d56Sopenharmony_ciimport sys
77db96d56Sopenharmony_ciimport codecs
87db96d56Sopenharmony_ci
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ciclass BaseLocalizedTest(unittest.TestCase):
117db96d56Sopenharmony_ci    #
127db96d56Sopenharmony_ci    # Base class for tests using a real locale
137db96d56Sopenharmony_ci    #
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci    @classmethod
167db96d56Sopenharmony_ci    def setUpClass(cls):
177db96d56Sopenharmony_ci        if sys.platform == 'darwin':
187db96d56Sopenharmony_ci            import os
197db96d56Sopenharmony_ci            tlocs = ("en_US.UTF-8", "en_US.ISO8859-1", "en_US")
207db96d56Sopenharmony_ci            if int(os.uname().release.split('.')[0]) < 10:
217db96d56Sopenharmony_ci                # The locale test work fine on OSX 10.6, I (ronaldoussoren)
227db96d56Sopenharmony_ci                # haven't had time yet to verify if tests work on OSX 10.5
237db96d56Sopenharmony_ci                # (10.4 is known to be bad)
247db96d56Sopenharmony_ci                raise unittest.SkipTest("Locale support on MacOSX is minimal")
257db96d56Sopenharmony_ci        elif sys.platform.startswith("win"):
267db96d56Sopenharmony_ci            tlocs = ("En", "English")
277db96d56Sopenharmony_ci        else:
287db96d56Sopenharmony_ci            tlocs = ("en_US.UTF-8", "en_US.ISO8859-1",
297db96d56Sopenharmony_ci                     "en_US.US-ASCII", "en_US")
307db96d56Sopenharmony_ci        try:
317db96d56Sopenharmony_ci            oldlocale = locale.setlocale(locale.LC_NUMERIC)
327db96d56Sopenharmony_ci            for tloc in tlocs:
337db96d56Sopenharmony_ci                try:
347db96d56Sopenharmony_ci                    locale.setlocale(locale.LC_NUMERIC, tloc)
357db96d56Sopenharmony_ci                except locale.Error:
367db96d56Sopenharmony_ci                    continue
377db96d56Sopenharmony_ci                break
387db96d56Sopenharmony_ci            else:
397db96d56Sopenharmony_ci                raise unittest.SkipTest("Test locale not supported "
407db96d56Sopenharmony_ci                                        "(tried %s)" % (', '.join(tlocs)))
417db96d56Sopenharmony_ci            cls.enUS_locale = tloc
427db96d56Sopenharmony_ci        finally:
437db96d56Sopenharmony_ci            locale.setlocale(locale.LC_NUMERIC, oldlocale)
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci    def setUp(self):
467db96d56Sopenharmony_ci        oldlocale = locale.setlocale(self.locale_type)
477db96d56Sopenharmony_ci        self.addCleanup(locale.setlocale, self.locale_type, oldlocale)
487db96d56Sopenharmony_ci        locale.setlocale(self.locale_type, self.enUS_locale)
497db96d56Sopenharmony_ci        if verbose:
507db96d56Sopenharmony_ci            print("testing with %r..." % self.enUS_locale, end=' ', flush=True)
517db96d56Sopenharmony_ci
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_ciclass BaseCookedTest(unittest.TestCase):
547db96d56Sopenharmony_ci    #
557db96d56Sopenharmony_ci    # Base class for tests using cooked localeconv() values
567db96d56Sopenharmony_ci    #
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci    def setUp(self):
597db96d56Sopenharmony_ci        locale._override_localeconv = self.cooked_values
607db96d56Sopenharmony_ci
617db96d56Sopenharmony_ci    def tearDown(self):
627db96d56Sopenharmony_ci        locale._override_localeconv = {}
637db96d56Sopenharmony_ci
647db96d56Sopenharmony_ciclass CCookedTest(BaseCookedTest):
657db96d56Sopenharmony_ci    # A cooked "C" locale
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    cooked_values = {
687db96d56Sopenharmony_ci        'currency_symbol': '',
697db96d56Sopenharmony_ci        'decimal_point': '.',
707db96d56Sopenharmony_ci        'frac_digits': 127,
717db96d56Sopenharmony_ci        'grouping': [],
727db96d56Sopenharmony_ci        'int_curr_symbol': '',
737db96d56Sopenharmony_ci        'int_frac_digits': 127,
747db96d56Sopenharmony_ci        'mon_decimal_point': '',
757db96d56Sopenharmony_ci        'mon_grouping': [],
767db96d56Sopenharmony_ci        'mon_thousands_sep': '',
777db96d56Sopenharmony_ci        'n_cs_precedes': 127,
787db96d56Sopenharmony_ci        'n_sep_by_space': 127,
797db96d56Sopenharmony_ci        'n_sign_posn': 127,
807db96d56Sopenharmony_ci        'negative_sign': '',
817db96d56Sopenharmony_ci        'p_cs_precedes': 127,
827db96d56Sopenharmony_ci        'p_sep_by_space': 127,
837db96d56Sopenharmony_ci        'p_sign_posn': 127,
847db96d56Sopenharmony_ci        'positive_sign': '',
857db96d56Sopenharmony_ci        'thousands_sep': ''
867db96d56Sopenharmony_ci    }
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ciclass EnUSCookedTest(BaseCookedTest):
897db96d56Sopenharmony_ci    # A cooked "en_US" locale
907db96d56Sopenharmony_ci
917db96d56Sopenharmony_ci    cooked_values = {
927db96d56Sopenharmony_ci        'currency_symbol': '$',
937db96d56Sopenharmony_ci        'decimal_point': '.',
947db96d56Sopenharmony_ci        'frac_digits': 2,
957db96d56Sopenharmony_ci        'grouping': [3, 3, 0],
967db96d56Sopenharmony_ci        'int_curr_symbol': 'USD ',
977db96d56Sopenharmony_ci        'int_frac_digits': 2,
987db96d56Sopenharmony_ci        'mon_decimal_point': '.',
997db96d56Sopenharmony_ci        'mon_grouping': [3, 3, 0],
1007db96d56Sopenharmony_ci        'mon_thousands_sep': ',',
1017db96d56Sopenharmony_ci        'n_cs_precedes': 1,
1027db96d56Sopenharmony_ci        'n_sep_by_space': 0,
1037db96d56Sopenharmony_ci        'n_sign_posn': 1,
1047db96d56Sopenharmony_ci        'negative_sign': '-',
1057db96d56Sopenharmony_ci        'p_cs_precedes': 1,
1067db96d56Sopenharmony_ci        'p_sep_by_space': 0,
1077db96d56Sopenharmony_ci        'p_sign_posn': 1,
1087db96d56Sopenharmony_ci        'positive_sign': '',
1097db96d56Sopenharmony_ci        'thousands_sep': ','
1107db96d56Sopenharmony_ci    }
1117db96d56Sopenharmony_ci
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ciclass FrFRCookedTest(BaseCookedTest):
1147db96d56Sopenharmony_ci    # A cooked "fr_FR" locale with a space character as decimal separator
1157db96d56Sopenharmony_ci    # and a non-ASCII currency symbol.
1167db96d56Sopenharmony_ci
1177db96d56Sopenharmony_ci    cooked_values = {
1187db96d56Sopenharmony_ci        'currency_symbol': '\u20ac',
1197db96d56Sopenharmony_ci        'decimal_point': ',',
1207db96d56Sopenharmony_ci        'frac_digits': 2,
1217db96d56Sopenharmony_ci        'grouping': [3, 3, 0],
1227db96d56Sopenharmony_ci        'int_curr_symbol': 'EUR ',
1237db96d56Sopenharmony_ci        'int_frac_digits': 2,
1247db96d56Sopenharmony_ci        'mon_decimal_point': ',',
1257db96d56Sopenharmony_ci        'mon_grouping': [3, 3, 0],
1267db96d56Sopenharmony_ci        'mon_thousands_sep': ' ',
1277db96d56Sopenharmony_ci        'n_cs_precedes': 0,
1287db96d56Sopenharmony_ci        'n_sep_by_space': 1,
1297db96d56Sopenharmony_ci        'n_sign_posn': 1,
1307db96d56Sopenharmony_ci        'negative_sign': '-',
1317db96d56Sopenharmony_ci        'p_cs_precedes': 0,
1327db96d56Sopenharmony_ci        'p_sep_by_space': 1,
1337db96d56Sopenharmony_ci        'p_sign_posn': 1,
1347db96d56Sopenharmony_ci        'positive_sign': '',
1357db96d56Sopenharmony_ci        'thousands_sep': ' '
1367db96d56Sopenharmony_ci    }
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci
1397db96d56Sopenharmony_ciclass BaseFormattingTest(object):
1407db96d56Sopenharmony_ci    #
1417db96d56Sopenharmony_ci    # Utility functions for formatting tests
1427db96d56Sopenharmony_ci    #
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci    def _test_formatfunc(self, format, value, out, func, **format_opts):
1457db96d56Sopenharmony_ci        self.assertEqual(
1467db96d56Sopenharmony_ci            func(format, value, **format_opts), out)
1477db96d56Sopenharmony_ci
1487db96d56Sopenharmony_ci    def _test_format(self, format, value, out, **format_opts):
1497db96d56Sopenharmony_ci        with check_warnings(('', DeprecationWarning)):
1507db96d56Sopenharmony_ci            self._test_formatfunc(format, value, out,
1517db96d56Sopenharmony_ci                func=locale.format, **format_opts)
1527db96d56Sopenharmony_ci
1537db96d56Sopenharmony_ci    def _test_format_string(self, format, value, out, **format_opts):
1547db96d56Sopenharmony_ci        self._test_formatfunc(format, value, out,
1557db96d56Sopenharmony_ci            func=locale.format_string, **format_opts)
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci    def _test_currency(self, value, out, **format_opts):
1587db96d56Sopenharmony_ci        self.assertEqual(locale.currency(value, **format_opts), out)
1597db96d56Sopenharmony_ci
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ciclass EnUSNumberFormatting(BaseFormattingTest):
1627db96d56Sopenharmony_ci    # XXX there is a grouping + padding bug when the thousands separator
1637db96d56Sopenharmony_ci    # is empty but the grouping array contains values (e.g. Solaris 10)
1647db96d56Sopenharmony_ci
1657db96d56Sopenharmony_ci    def setUp(self):
1667db96d56Sopenharmony_ci        self.sep = locale.localeconv()['thousands_sep']
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci    def test_grouping(self):
1697db96d56Sopenharmony_ci        self._test_format("%f", 1024, grouping=1, out='1%s024.000000' % self.sep)
1707db96d56Sopenharmony_ci        self._test_format("%f", 102, grouping=1, out='102.000000')
1717db96d56Sopenharmony_ci        self._test_format("%f", -42, grouping=1, out='-42.000000')
1727db96d56Sopenharmony_ci        self._test_format("%+f", -42, grouping=1, out='-42.000000')
1737db96d56Sopenharmony_ci
1747db96d56Sopenharmony_ci    def test_grouping_and_padding(self):
1757db96d56Sopenharmony_ci        self._test_format("%20.f", -42, grouping=1, out='-42'.rjust(20))
1767db96d56Sopenharmony_ci        if self.sep:
1777db96d56Sopenharmony_ci            self._test_format("%+10.f", -4200, grouping=1,
1787db96d56Sopenharmony_ci                out=('-4%s200' % self.sep).rjust(10))
1797db96d56Sopenharmony_ci            self._test_format("%-10.f", -4200, grouping=1,
1807db96d56Sopenharmony_ci                out=('-4%s200' % self.sep).ljust(10))
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci    def test_integer_grouping(self):
1837db96d56Sopenharmony_ci        self._test_format("%d", 4200, grouping=True, out='4%s200' % self.sep)
1847db96d56Sopenharmony_ci        self._test_format("%+d", 4200, grouping=True, out='+4%s200' % self.sep)
1857db96d56Sopenharmony_ci        self._test_format("%+d", -4200, grouping=True, out='-4%s200' % self.sep)
1867db96d56Sopenharmony_ci
1877db96d56Sopenharmony_ci    def test_integer_grouping_and_padding(self):
1887db96d56Sopenharmony_ci        self._test_format("%10d", 4200, grouping=True,
1897db96d56Sopenharmony_ci            out=('4%s200' % self.sep).rjust(10))
1907db96d56Sopenharmony_ci        self._test_format("%-10d", -4200, grouping=True,
1917db96d56Sopenharmony_ci            out=('-4%s200' % self.sep).ljust(10))
1927db96d56Sopenharmony_ci
1937db96d56Sopenharmony_ci    def test_simple(self):
1947db96d56Sopenharmony_ci        self._test_format("%f", 1024, grouping=0, out='1024.000000')
1957db96d56Sopenharmony_ci        self._test_format("%f", 102, grouping=0, out='102.000000')
1967db96d56Sopenharmony_ci        self._test_format("%f", -42, grouping=0, out='-42.000000')
1977db96d56Sopenharmony_ci        self._test_format("%+f", -42, grouping=0, out='-42.000000')
1987db96d56Sopenharmony_ci
1997db96d56Sopenharmony_ci    def test_padding(self):
2007db96d56Sopenharmony_ci        self._test_format("%20.f", -42, grouping=0, out='-42'.rjust(20))
2017db96d56Sopenharmony_ci        self._test_format("%+10.f", -4200, grouping=0, out='-4200'.rjust(10))
2027db96d56Sopenharmony_ci        self._test_format("%-10.f", 4200, grouping=0, out='4200'.ljust(10))
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci    def test_format_deprecation(self):
2057db96d56Sopenharmony_ci        with self.assertWarns(DeprecationWarning):
2067db96d56Sopenharmony_ci            locale.format("%-10.f", 4200, grouping=True)
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci    def test_complex_formatting(self):
2097db96d56Sopenharmony_ci        # Spaces in formatting string
2107db96d56Sopenharmony_ci        self._test_format_string("One million is %i", 1000000, grouping=1,
2117db96d56Sopenharmony_ci            out='One million is 1%s000%s000' % (self.sep, self.sep))
2127db96d56Sopenharmony_ci        self._test_format_string("One  million is %i", 1000000, grouping=1,
2137db96d56Sopenharmony_ci            out='One  million is 1%s000%s000' % (self.sep, self.sep))
2147db96d56Sopenharmony_ci        # Dots in formatting string
2157db96d56Sopenharmony_ci        self._test_format_string(".%f.", 1000.0, out='.1000.000000.')
2167db96d56Sopenharmony_ci        # Padding
2177db96d56Sopenharmony_ci        if self.sep:
2187db96d56Sopenharmony_ci            self._test_format_string("-->  %10.2f", 4200, grouping=1,
2197db96d56Sopenharmony_ci                out='-->  ' + ('4%s200.00' % self.sep).rjust(10))
2207db96d56Sopenharmony_ci        # Asterisk formats
2217db96d56Sopenharmony_ci        self._test_format_string("%10.*f", (2, 1000), grouping=0,
2227db96d56Sopenharmony_ci            out='1000.00'.rjust(10))
2237db96d56Sopenharmony_ci        if self.sep:
2247db96d56Sopenharmony_ci            self._test_format_string("%*.*f", (10, 2, 1000), grouping=1,
2257db96d56Sopenharmony_ci                out=('1%s000.00' % self.sep).rjust(10))
2267db96d56Sopenharmony_ci        # Test more-in-one
2277db96d56Sopenharmony_ci        if self.sep:
2287db96d56Sopenharmony_ci            self._test_format_string("int %i float %.2f str %s",
2297db96d56Sopenharmony_ci                (1000, 1000.0, 'str'), grouping=1,
2307db96d56Sopenharmony_ci                out='int 1%s000 float 1%s000.00 str str' %
2317db96d56Sopenharmony_ci                (self.sep, self.sep))
2327db96d56Sopenharmony_ci
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ciclass TestFormatPatternArg(unittest.TestCase):
2357db96d56Sopenharmony_ci    # Test handling of pattern argument of format
2367db96d56Sopenharmony_ci
2377db96d56Sopenharmony_ci    def test_onlyOnePattern(self):
2387db96d56Sopenharmony_ci        with check_warnings(('', DeprecationWarning)):
2397db96d56Sopenharmony_ci            # Issue 2522: accept exactly one % pattern, and no extra chars.
2407db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, "%f\n", 'foo')
2417db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, "%f\r", 'foo')
2427db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, "%f\r\n", 'foo')
2437db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, " %f", 'foo')
2447db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, "%fg", 'foo')
2457db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, "%^g", 'foo')
2467db96d56Sopenharmony_ci            self.assertRaises(ValueError, locale.format, "%f%%", 'foo')
2477db96d56Sopenharmony_ci
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ciclass TestLocaleFormatString(unittest.TestCase):
2507db96d56Sopenharmony_ci    """General tests on locale.format_string"""
2517db96d56Sopenharmony_ci
2527db96d56Sopenharmony_ci    def test_percent_escape(self):
2537db96d56Sopenharmony_ci        self.assertEqual(locale.format_string('%f%%', 1.0), '%f%%' % 1.0)
2547db96d56Sopenharmony_ci        self.assertEqual(locale.format_string('%d %f%%d', (1, 1.0)),
2557db96d56Sopenharmony_ci            '%d %f%%d' % (1, 1.0))
2567db96d56Sopenharmony_ci        self.assertEqual(locale.format_string('%(foo)s %%d', {'foo': 'bar'}),
2577db96d56Sopenharmony_ci            ('%(foo)s %%d' % {'foo': 'bar'}))
2587db96d56Sopenharmony_ci
2597db96d56Sopenharmony_ci    def test_mapping(self):
2607db96d56Sopenharmony_ci        self.assertEqual(locale.format_string('%(foo)s bing.', {'foo': 'bar'}),
2617db96d56Sopenharmony_ci            ('%(foo)s bing.' % {'foo': 'bar'}))
2627db96d56Sopenharmony_ci        self.assertEqual(locale.format_string('%(foo)s', {'foo': 'bar'}),
2637db96d56Sopenharmony_ci            ('%(foo)s' % {'foo': 'bar'}))
2647db96d56Sopenharmony_ci
2657db96d56Sopenharmony_ci
2667db96d56Sopenharmony_ci
2677db96d56Sopenharmony_ciclass TestNumberFormatting(BaseLocalizedTest, EnUSNumberFormatting):
2687db96d56Sopenharmony_ci    # Test number formatting with a real English locale.
2697db96d56Sopenharmony_ci
2707db96d56Sopenharmony_ci    locale_type = locale.LC_NUMERIC
2717db96d56Sopenharmony_ci
2727db96d56Sopenharmony_ci    def setUp(self):
2737db96d56Sopenharmony_ci        BaseLocalizedTest.setUp(self)
2747db96d56Sopenharmony_ci        EnUSNumberFormatting.setUp(self)
2757db96d56Sopenharmony_ci
2767db96d56Sopenharmony_ci
2777db96d56Sopenharmony_ciclass TestEnUSNumberFormatting(EnUSCookedTest, EnUSNumberFormatting):
2787db96d56Sopenharmony_ci    # Test number formatting with a cooked "en_US" locale.
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci    def setUp(self):
2817db96d56Sopenharmony_ci        EnUSCookedTest.setUp(self)
2827db96d56Sopenharmony_ci        EnUSNumberFormatting.setUp(self)
2837db96d56Sopenharmony_ci
2847db96d56Sopenharmony_ci    def test_currency(self):
2857db96d56Sopenharmony_ci        self._test_currency(50000, "$50000.00")
2867db96d56Sopenharmony_ci        self._test_currency(50000, "$50,000.00", grouping=True)
2877db96d56Sopenharmony_ci        self._test_currency(50000, "USD 50,000.00",
2887db96d56Sopenharmony_ci            grouping=True, international=True)
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci
2917db96d56Sopenharmony_ciclass TestCNumberFormatting(CCookedTest, BaseFormattingTest):
2927db96d56Sopenharmony_ci    # Test number formatting with a cooked "C" locale.
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci    def test_grouping(self):
2957db96d56Sopenharmony_ci        self._test_format("%.2f", 12345.67, grouping=True, out='12345.67')
2967db96d56Sopenharmony_ci
2977db96d56Sopenharmony_ci    def test_grouping_and_padding(self):
2987db96d56Sopenharmony_ci        self._test_format("%9.2f", 12345.67, grouping=True, out=' 12345.67')
2997db96d56Sopenharmony_ci
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ciclass TestFrFRNumberFormatting(FrFRCookedTest, BaseFormattingTest):
3027db96d56Sopenharmony_ci    # Test number formatting with a cooked "fr_FR" locale.
3037db96d56Sopenharmony_ci
3047db96d56Sopenharmony_ci    def test_decimal_point(self):
3057db96d56Sopenharmony_ci        self._test_format("%.2f", 12345.67, out='12345,67')
3067db96d56Sopenharmony_ci
3077db96d56Sopenharmony_ci    def test_grouping(self):
3087db96d56Sopenharmony_ci        self._test_format("%.2f", 345.67, grouping=True, out='345,67')
3097db96d56Sopenharmony_ci        self._test_format("%.2f", 12345.67, grouping=True, out='12 345,67')
3107db96d56Sopenharmony_ci
3117db96d56Sopenharmony_ci    def test_grouping_and_padding(self):
3127db96d56Sopenharmony_ci        self._test_format("%6.2f", 345.67, grouping=True, out='345,67')
3137db96d56Sopenharmony_ci        self._test_format("%7.2f", 345.67, grouping=True, out=' 345,67')
3147db96d56Sopenharmony_ci        self._test_format("%8.2f", 12345.67, grouping=True, out='12 345,67')
3157db96d56Sopenharmony_ci        self._test_format("%9.2f", 12345.67, grouping=True, out='12 345,67')
3167db96d56Sopenharmony_ci        self._test_format("%10.2f", 12345.67, grouping=True, out=' 12 345,67')
3177db96d56Sopenharmony_ci        self._test_format("%-6.2f", 345.67, grouping=True, out='345,67')
3187db96d56Sopenharmony_ci        self._test_format("%-7.2f", 345.67, grouping=True, out='345,67 ')
3197db96d56Sopenharmony_ci        self._test_format("%-8.2f", 12345.67, grouping=True, out='12 345,67')
3207db96d56Sopenharmony_ci        self._test_format("%-9.2f", 12345.67, grouping=True, out='12 345,67')
3217db96d56Sopenharmony_ci        self._test_format("%-10.2f", 12345.67, grouping=True, out='12 345,67 ')
3227db96d56Sopenharmony_ci
3237db96d56Sopenharmony_ci    def test_integer_grouping(self):
3247db96d56Sopenharmony_ci        self._test_format("%d", 200, grouping=True, out='200')
3257db96d56Sopenharmony_ci        self._test_format("%d", 4200, grouping=True, out='4 200')
3267db96d56Sopenharmony_ci
3277db96d56Sopenharmony_ci    def test_integer_grouping_and_padding(self):
3287db96d56Sopenharmony_ci        self._test_format("%4d", 4200, grouping=True, out='4 200')
3297db96d56Sopenharmony_ci        self._test_format("%5d", 4200, grouping=True, out='4 200')
3307db96d56Sopenharmony_ci        self._test_format("%10d", 4200, grouping=True, out='4 200'.rjust(10))
3317db96d56Sopenharmony_ci        self._test_format("%-4d", 4200, grouping=True, out='4 200')
3327db96d56Sopenharmony_ci        self._test_format("%-5d", 4200, grouping=True, out='4 200')
3337db96d56Sopenharmony_ci        self._test_format("%-10d", 4200, grouping=True, out='4 200'.ljust(10))
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci    def test_currency(self):
3367db96d56Sopenharmony_ci        euro = '\u20ac'
3377db96d56Sopenharmony_ci        self._test_currency(50000, "50000,00 " + euro)
3387db96d56Sopenharmony_ci        self._test_currency(50000, "50 000,00 " + euro, grouping=True)
3397db96d56Sopenharmony_ci        self._test_currency(50000, "50 000,00 EUR",
3407db96d56Sopenharmony_ci            grouping=True, international=True)
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci
3437db96d56Sopenharmony_ciclass TestCollation(unittest.TestCase):
3447db96d56Sopenharmony_ci    # Test string collation functions
3457db96d56Sopenharmony_ci
3467db96d56Sopenharmony_ci    def test_strcoll(self):
3477db96d56Sopenharmony_ci        self.assertLess(locale.strcoll('a', 'b'), 0)
3487db96d56Sopenharmony_ci        self.assertEqual(locale.strcoll('a', 'a'), 0)
3497db96d56Sopenharmony_ci        self.assertGreater(locale.strcoll('b', 'a'), 0)
3507db96d56Sopenharmony_ci        # embedded null character
3517db96d56Sopenharmony_ci        self.assertRaises(ValueError, locale.strcoll, 'a\0', 'a')
3527db96d56Sopenharmony_ci        self.assertRaises(ValueError, locale.strcoll, 'a', 'a\0')
3537db96d56Sopenharmony_ci
3547db96d56Sopenharmony_ci    def test_strxfrm(self):
3557db96d56Sopenharmony_ci        self.assertLess(locale.strxfrm('a'), locale.strxfrm('b'))
3567db96d56Sopenharmony_ci        # embedded null character
3577db96d56Sopenharmony_ci        self.assertRaises(ValueError, locale.strxfrm, 'a\0')
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ci
3607db96d56Sopenharmony_ciclass TestEnUSCollation(BaseLocalizedTest, TestCollation):
3617db96d56Sopenharmony_ci    # Test string collation functions with a real English locale
3627db96d56Sopenharmony_ci
3637db96d56Sopenharmony_ci    locale_type = locale.LC_ALL
3647db96d56Sopenharmony_ci
3657db96d56Sopenharmony_ci    def setUp(self):
3667db96d56Sopenharmony_ci        enc = codecs.lookup(locale.getencoding() or 'ascii').name
3677db96d56Sopenharmony_ci        if enc not in ('utf-8', 'iso8859-1', 'cp1252'):
3687db96d56Sopenharmony_ci            raise unittest.SkipTest('encoding not suitable')
3697db96d56Sopenharmony_ci        if enc != 'iso8859-1' and (sys.platform == 'darwin' or is_android or
3707db96d56Sopenharmony_ci                                   sys.platform.startswith('freebsd')):
3717db96d56Sopenharmony_ci            raise unittest.SkipTest('wcscoll/wcsxfrm have known bugs')
3727db96d56Sopenharmony_ci        BaseLocalizedTest.setUp(self)
3737db96d56Sopenharmony_ci
3747db96d56Sopenharmony_ci    @unittest.skipIf(sys.platform.startswith('aix'),
3757db96d56Sopenharmony_ci                     'bpo-29972: broken test on AIX')
3767db96d56Sopenharmony_ci    @unittest.skipIf(
3777db96d56Sopenharmony_ci        is_emscripten or is_wasi,
3787db96d56Sopenharmony_ci        "musl libc issue on Emscripten/WASI, bpo-46390"
3797db96d56Sopenharmony_ci    )
3807db96d56Sopenharmony_ci    def test_strcoll_with_diacritic(self):
3817db96d56Sopenharmony_ci        self.assertLess(locale.strcoll('à', 'b'), 0)
3827db96d56Sopenharmony_ci
3837db96d56Sopenharmony_ci    @unittest.skipIf(sys.platform.startswith('aix'),
3847db96d56Sopenharmony_ci                     'bpo-29972: broken test on AIX')
3857db96d56Sopenharmony_ci    @unittest.skipIf(
3867db96d56Sopenharmony_ci        is_emscripten or is_wasi,
3877db96d56Sopenharmony_ci        "musl libc issue on Emscripten/WASI, bpo-46390"
3887db96d56Sopenharmony_ci    )
3897db96d56Sopenharmony_ci    def test_strxfrm_with_diacritic(self):
3907db96d56Sopenharmony_ci        self.assertLess(locale.strxfrm('à'), locale.strxfrm('b'))
3917db96d56Sopenharmony_ci
3927db96d56Sopenharmony_ci
3937db96d56Sopenharmony_ciclass NormalizeTest(unittest.TestCase):
3947db96d56Sopenharmony_ci    def check(self, localename, expected):
3957db96d56Sopenharmony_ci        self.assertEqual(locale.normalize(localename), expected, msg=localename)
3967db96d56Sopenharmony_ci
3977db96d56Sopenharmony_ci    def test_locale_alias(self):
3987db96d56Sopenharmony_ci        for localename, alias in locale.locale_alias.items():
3997db96d56Sopenharmony_ci            with self.subTest(locale=(localename, alias)):
4007db96d56Sopenharmony_ci                self.check(localename, alias)
4017db96d56Sopenharmony_ci
4027db96d56Sopenharmony_ci    def test_empty(self):
4037db96d56Sopenharmony_ci        self.check('', '')
4047db96d56Sopenharmony_ci
4057db96d56Sopenharmony_ci    def test_c(self):
4067db96d56Sopenharmony_ci        self.check('c', 'C')
4077db96d56Sopenharmony_ci        self.check('posix', 'C')
4087db96d56Sopenharmony_ci
4097db96d56Sopenharmony_ci    def test_english(self):
4107db96d56Sopenharmony_ci        self.check('en', 'en_US.ISO8859-1')
4117db96d56Sopenharmony_ci        self.check('EN', 'en_US.ISO8859-1')
4127db96d56Sopenharmony_ci        self.check('en.iso88591', 'en_US.ISO8859-1')
4137db96d56Sopenharmony_ci        self.check('en_US', 'en_US.ISO8859-1')
4147db96d56Sopenharmony_ci        self.check('en_us', 'en_US.ISO8859-1')
4157db96d56Sopenharmony_ci        self.check('en_GB', 'en_GB.ISO8859-1')
4167db96d56Sopenharmony_ci        self.check('en_US.UTF-8', 'en_US.UTF-8')
4177db96d56Sopenharmony_ci        self.check('en_US.utf8', 'en_US.UTF-8')
4187db96d56Sopenharmony_ci        self.check('en_US:UTF-8', 'en_US.UTF-8')
4197db96d56Sopenharmony_ci        self.check('en_US.ISO8859-1', 'en_US.ISO8859-1')
4207db96d56Sopenharmony_ci        self.check('en_US.US-ASCII', 'en_US.ISO8859-1')
4217db96d56Sopenharmony_ci        self.check('en_US.88591', 'en_US.ISO8859-1')
4227db96d56Sopenharmony_ci        self.check('en_US.885915', 'en_US.ISO8859-15')
4237db96d56Sopenharmony_ci        self.check('english', 'en_EN.ISO8859-1')
4247db96d56Sopenharmony_ci        self.check('english_uk.ascii', 'en_GB.ISO8859-1')
4257db96d56Sopenharmony_ci
4267db96d56Sopenharmony_ci    def test_hyphenated_encoding(self):
4277db96d56Sopenharmony_ci        self.check('az_AZ.iso88599e', 'az_AZ.ISO8859-9E')
4287db96d56Sopenharmony_ci        self.check('az_AZ.ISO8859-9E', 'az_AZ.ISO8859-9E')
4297db96d56Sopenharmony_ci        self.check('tt_RU.koi8c', 'tt_RU.KOI8-C')
4307db96d56Sopenharmony_ci        self.check('tt_RU.KOI8-C', 'tt_RU.KOI8-C')
4317db96d56Sopenharmony_ci        self.check('lo_LA.cp1133', 'lo_LA.IBM-CP1133')
4327db96d56Sopenharmony_ci        self.check('lo_LA.ibmcp1133', 'lo_LA.IBM-CP1133')
4337db96d56Sopenharmony_ci        self.check('lo_LA.IBM-CP1133', 'lo_LA.IBM-CP1133')
4347db96d56Sopenharmony_ci        self.check('uk_ua.microsoftcp1251', 'uk_UA.CP1251')
4357db96d56Sopenharmony_ci        self.check('uk_ua.microsoft-cp1251', 'uk_UA.CP1251')
4367db96d56Sopenharmony_ci        self.check('ka_ge.georgianacademy', 'ka_GE.GEORGIAN-ACADEMY')
4377db96d56Sopenharmony_ci        self.check('ka_GE.GEORGIAN-ACADEMY', 'ka_GE.GEORGIAN-ACADEMY')
4387db96d56Sopenharmony_ci        self.check('cs_CZ.iso88592', 'cs_CZ.ISO8859-2')
4397db96d56Sopenharmony_ci        self.check('cs_CZ.ISO8859-2', 'cs_CZ.ISO8859-2')
4407db96d56Sopenharmony_ci
4417db96d56Sopenharmony_ci    def test_euro_modifier(self):
4427db96d56Sopenharmony_ci        self.check('de_DE@euro', 'de_DE.ISO8859-15')
4437db96d56Sopenharmony_ci        self.check('en_US.ISO8859-15@euro', 'en_US.ISO8859-15')
4447db96d56Sopenharmony_ci        self.check('de_DE.utf8@euro', 'de_DE.UTF-8')
4457db96d56Sopenharmony_ci
4467db96d56Sopenharmony_ci    def test_latin_modifier(self):
4477db96d56Sopenharmony_ci        self.check('be_BY.UTF-8@latin', 'be_BY.UTF-8@latin')
4487db96d56Sopenharmony_ci        self.check('sr_RS.UTF-8@latin', 'sr_RS.UTF-8@latin')
4497db96d56Sopenharmony_ci        self.check('sr_RS.UTF-8@latn', 'sr_RS.UTF-8@latin')
4507db96d56Sopenharmony_ci
4517db96d56Sopenharmony_ci    def test_valencia_modifier(self):
4527db96d56Sopenharmony_ci        self.check('ca_ES.UTF-8@valencia', 'ca_ES.UTF-8@valencia')
4537db96d56Sopenharmony_ci        self.check('ca_ES@valencia', 'ca_ES.UTF-8@valencia')
4547db96d56Sopenharmony_ci        self.check('ca@valencia', 'ca_ES.ISO8859-1@valencia')
4557db96d56Sopenharmony_ci
4567db96d56Sopenharmony_ci    def test_devanagari_modifier(self):
4577db96d56Sopenharmony_ci        self.check('ks_IN.UTF-8@devanagari', 'ks_IN.UTF-8@devanagari')
4587db96d56Sopenharmony_ci        self.check('ks_IN@devanagari', 'ks_IN.UTF-8@devanagari')
4597db96d56Sopenharmony_ci        self.check('ks@devanagari', 'ks_IN.UTF-8@devanagari')
4607db96d56Sopenharmony_ci        self.check('ks_IN.UTF-8', 'ks_IN.UTF-8')
4617db96d56Sopenharmony_ci        self.check('ks_IN', 'ks_IN.UTF-8')
4627db96d56Sopenharmony_ci        self.check('ks', 'ks_IN.UTF-8')
4637db96d56Sopenharmony_ci        self.check('sd_IN.UTF-8@devanagari', 'sd_IN.UTF-8@devanagari')
4647db96d56Sopenharmony_ci        self.check('sd_IN@devanagari', 'sd_IN.UTF-8@devanagari')
4657db96d56Sopenharmony_ci        self.check('sd@devanagari', 'sd_IN.UTF-8@devanagari')
4667db96d56Sopenharmony_ci        self.check('sd_IN.UTF-8', 'sd_IN.UTF-8')
4677db96d56Sopenharmony_ci        self.check('sd_IN', 'sd_IN.UTF-8')
4687db96d56Sopenharmony_ci        self.check('sd', 'sd_IN.UTF-8')
4697db96d56Sopenharmony_ci
4707db96d56Sopenharmony_ci    def test_euc_encoding(self):
4717db96d56Sopenharmony_ci        self.check('ja_jp.euc', 'ja_JP.eucJP')
4727db96d56Sopenharmony_ci        self.check('ja_jp.eucjp', 'ja_JP.eucJP')
4737db96d56Sopenharmony_ci        self.check('ko_kr.euc', 'ko_KR.eucKR')
4747db96d56Sopenharmony_ci        self.check('ko_kr.euckr', 'ko_KR.eucKR')
4757db96d56Sopenharmony_ci        self.check('zh_cn.euc', 'zh_CN.eucCN')
4767db96d56Sopenharmony_ci        self.check('zh_tw.euc', 'zh_TW.eucTW')
4777db96d56Sopenharmony_ci        self.check('zh_tw.euctw', 'zh_TW.eucTW')
4787db96d56Sopenharmony_ci
4797db96d56Sopenharmony_ci    def test_japanese(self):
4807db96d56Sopenharmony_ci        self.check('ja', 'ja_JP.eucJP')
4817db96d56Sopenharmony_ci        self.check('ja.jis', 'ja_JP.JIS7')
4827db96d56Sopenharmony_ci        self.check('ja.sjis', 'ja_JP.SJIS')
4837db96d56Sopenharmony_ci        self.check('ja_jp', 'ja_JP.eucJP')
4847db96d56Sopenharmony_ci        self.check('ja_jp.ajec', 'ja_JP.eucJP')
4857db96d56Sopenharmony_ci        self.check('ja_jp.euc', 'ja_JP.eucJP')
4867db96d56Sopenharmony_ci        self.check('ja_jp.eucjp', 'ja_JP.eucJP')
4877db96d56Sopenharmony_ci        self.check('ja_jp.iso-2022-jp', 'ja_JP.JIS7')
4887db96d56Sopenharmony_ci        self.check('ja_jp.iso2022jp', 'ja_JP.JIS7')
4897db96d56Sopenharmony_ci        self.check('ja_jp.jis', 'ja_JP.JIS7')
4907db96d56Sopenharmony_ci        self.check('ja_jp.jis7', 'ja_JP.JIS7')
4917db96d56Sopenharmony_ci        self.check('ja_jp.mscode', 'ja_JP.SJIS')
4927db96d56Sopenharmony_ci        self.check('ja_jp.pck', 'ja_JP.SJIS')
4937db96d56Sopenharmony_ci        self.check('ja_jp.sjis', 'ja_JP.SJIS')
4947db96d56Sopenharmony_ci        self.check('ja_jp.ujis', 'ja_JP.eucJP')
4957db96d56Sopenharmony_ci        self.check('ja_jp.utf8', 'ja_JP.UTF-8')
4967db96d56Sopenharmony_ci        self.check('japan', 'ja_JP.eucJP')
4977db96d56Sopenharmony_ci        self.check('japanese', 'ja_JP.eucJP')
4987db96d56Sopenharmony_ci        self.check('japanese-euc', 'ja_JP.eucJP')
4997db96d56Sopenharmony_ci        self.check('japanese.euc', 'ja_JP.eucJP')
5007db96d56Sopenharmony_ci        self.check('japanese.sjis', 'ja_JP.SJIS')
5017db96d56Sopenharmony_ci        self.check('jp_jp', 'ja_JP.eucJP')
5027db96d56Sopenharmony_ci
5037db96d56Sopenharmony_ci
5047db96d56Sopenharmony_ciclass TestMiscellaneous(unittest.TestCase):
5057db96d56Sopenharmony_ci    def test_defaults_UTF8(self):
5067db96d56Sopenharmony_ci        # Issue #18378: on (at least) macOS setting LC_CTYPE to "UTF-8" is
5077db96d56Sopenharmony_ci        # valid. Furthermore LC_CTYPE=UTF is used by the UTF-8 locale coercing
5087db96d56Sopenharmony_ci        # during interpreter startup (on macOS).
5097db96d56Sopenharmony_ci        import _locale
5107db96d56Sopenharmony_ci        import os
5117db96d56Sopenharmony_ci
5127db96d56Sopenharmony_ci        self.assertEqual(locale._parse_localename('UTF-8'), (None, 'UTF-8'))
5137db96d56Sopenharmony_ci
5147db96d56Sopenharmony_ci        if hasattr(_locale, '_getdefaultlocale'):
5157db96d56Sopenharmony_ci            orig_getlocale = _locale._getdefaultlocale
5167db96d56Sopenharmony_ci            del _locale._getdefaultlocale
5177db96d56Sopenharmony_ci        else:
5187db96d56Sopenharmony_ci            orig_getlocale = None
5197db96d56Sopenharmony_ci
5207db96d56Sopenharmony_ci        orig_env = {}
5217db96d56Sopenharmony_ci        try:
5227db96d56Sopenharmony_ci            for key in ('LC_ALL', 'LC_CTYPE', 'LANG', 'LANGUAGE'):
5237db96d56Sopenharmony_ci                if key in os.environ:
5247db96d56Sopenharmony_ci                    orig_env[key] = os.environ[key]
5257db96d56Sopenharmony_ci                    del os.environ[key]
5267db96d56Sopenharmony_ci
5277db96d56Sopenharmony_ci            os.environ['LC_CTYPE'] = 'UTF-8'
5287db96d56Sopenharmony_ci
5297db96d56Sopenharmony_ci            with check_warnings(('', DeprecationWarning)):
5307db96d56Sopenharmony_ci                self.assertEqual(locale.getdefaultlocale(), (None, 'UTF-8'))
5317db96d56Sopenharmony_ci
5327db96d56Sopenharmony_ci        finally:
5337db96d56Sopenharmony_ci            for k in orig_env:
5347db96d56Sopenharmony_ci                os.environ[k] = orig_env[k]
5357db96d56Sopenharmony_ci
5367db96d56Sopenharmony_ci            if 'LC_CTYPE' not in orig_env:
5377db96d56Sopenharmony_ci                del os.environ['LC_CTYPE']
5387db96d56Sopenharmony_ci
5397db96d56Sopenharmony_ci            if orig_getlocale is not None:
5407db96d56Sopenharmony_ci                _locale._getdefaultlocale = orig_getlocale
5417db96d56Sopenharmony_ci
5427db96d56Sopenharmony_ci    def test_getencoding(self):
5437db96d56Sopenharmony_ci        # Invoke getencoding to make sure it does not cause exceptions.
5447db96d56Sopenharmony_ci        enc = locale.getencoding()
5457db96d56Sopenharmony_ci        self.assertIsInstance(enc, str)
5467db96d56Sopenharmony_ci        self.assertNotEqual(enc, "")
5477db96d56Sopenharmony_ci        # make sure it is valid
5487db96d56Sopenharmony_ci        codecs.lookup(enc)
5497db96d56Sopenharmony_ci
5507db96d56Sopenharmony_ci    def test_getpreferredencoding(self):
5517db96d56Sopenharmony_ci        # Invoke getpreferredencoding to make sure it does not cause exceptions.
5527db96d56Sopenharmony_ci        enc = locale.getpreferredencoding()
5537db96d56Sopenharmony_ci        if enc:
5547db96d56Sopenharmony_ci            # If encoding non-empty, make sure it is valid
5557db96d56Sopenharmony_ci            codecs.lookup(enc)
5567db96d56Sopenharmony_ci
5577db96d56Sopenharmony_ci    def test_strcoll_3303(self):
5587db96d56Sopenharmony_ci        # test crasher from bug #3303
5597db96d56Sopenharmony_ci        self.assertRaises(TypeError, locale.strcoll, "a", None)
5607db96d56Sopenharmony_ci        self.assertRaises(TypeError, locale.strcoll, b"a", None)
5617db96d56Sopenharmony_ci
5627db96d56Sopenharmony_ci    def test_setlocale_category(self):
5637db96d56Sopenharmony_ci        locale.setlocale(locale.LC_ALL)
5647db96d56Sopenharmony_ci        locale.setlocale(locale.LC_TIME)
5657db96d56Sopenharmony_ci        locale.setlocale(locale.LC_CTYPE)
5667db96d56Sopenharmony_ci        locale.setlocale(locale.LC_COLLATE)
5677db96d56Sopenharmony_ci        locale.setlocale(locale.LC_MONETARY)
5687db96d56Sopenharmony_ci        locale.setlocale(locale.LC_NUMERIC)
5697db96d56Sopenharmony_ci
5707db96d56Sopenharmony_ci        # crasher from bug #7419
5717db96d56Sopenharmony_ci        self.assertRaises(locale.Error, locale.setlocale, 12345)
5727db96d56Sopenharmony_ci
5737db96d56Sopenharmony_ci    def test_getsetlocale_issue1813(self):
5747db96d56Sopenharmony_ci        # Issue #1813: setting and getting the locale under a Turkish locale
5757db96d56Sopenharmony_ci        oldlocale = locale.setlocale(locale.LC_CTYPE)
5767db96d56Sopenharmony_ci        self.addCleanup(locale.setlocale, locale.LC_CTYPE, oldlocale)
5777db96d56Sopenharmony_ci        try:
5787db96d56Sopenharmony_ci            locale.setlocale(locale.LC_CTYPE, 'tr_TR')
5797db96d56Sopenharmony_ci        except locale.Error:
5807db96d56Sopenharmony_ci            # Unsupported locale on this system
5817db96d56Sopenharmony_ci            self.skipTest('test needs Turkish locale')
5827db96d56Sopenharmony_ci        loc = locale.getlocale(locale.LC_CTYPE)
5837db96d56Sopenharmony_ci        if verbose:
5847db96d56Sopenharmony_ci            print('testing with %a' % (loc,), end=' ', flush=True)
5857db96d56Sopenharmony_ci        try:
5867db96d56Sopenharmony_ci            locale.setlocale(locale.LC_CTYPE, loc)
5877db96d56Sopenharmony_ci        except locale.Error as exc:
5887db96d56Sopenharmony_ci            # bpo-37945: setlocale(LC_CTYPE) fails with getlocale(LC_CTYPE)
5897db96d56Sopenharmony_ci            # and the tr_TR locale on Windows. getlocale() builds a locale
5907db96d56Sopenharmony_ci            # which is not recognize by setlocale().
5917db96d56Sopenharmony_ci            self.skipTest(f"setlocale(LC_CTYPE, {loc!r}) failed: {exc!r}")
5927db96d56Sopenharmony_ci        self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE))
5937db96d56Sopenharmony_ci
5947db96d56Sopenharmony_ci    def test_invalid_locale_format_in_localetuple(self):
5957db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
5967db96d56Sopenharmony_ci            locale.setlocale(locale.LC_ALL, b'fi_FI')
5977db96d56Sopenharmony_ci
5987db96d56Sopenharmony_ci    def test_invalid_iterable_in_localetuple(self):
5997db96d56Sopenharmony_ci        with self.assertRaises(TypeError):
6007db96d56Sopenharmony_ci            locale.setlocale(locale.LC_ALL, (b'not', b'valid'))
6017db96d56Sopenharmony_ci
6027db96d56Sopenharmony_ci
6037db96d56Sopenharmony_ciclass BaseDelocalizeTest(BaseLocalizedTest):
6047db96d56Sopenharmony_ci
6057db96d56Sopenharmony_ci    def _test_delocalize(self, value, out):
6067db96d56Sopenharmony_ci        self.assertEqual(locale.delocalize(value), out)
6077db96d56Sopenharmony_ci
6087db96d56Sopenharmony_ci    def _test_atof(self, value, out):
6097db96d56Sopenharmony_ci        self.assertEqual(locale.atof(value), out)
6107db96d56Sopenharmony_ci
6117db96d56Sopenharmony_ci    def _test_atoi(self, value, out):
6127db96d56Sopenharmony_ci        self.assertEqual(locale.atoi(value), out)
6137db96d56Sopenharmony_ci
6147db96d56Sopenharmony_ci
6157db96d56Sopenharmony_ciclass TestEnUSDelocalize(EnUSCookedTest, BaseDelocalizeTest):
6167db96d56Sopenharmony_ci
6177db96d56Sopenharmony_ci    def test_delocalize(self):
6187db96d56Sopenharmony_ci        self._test_delocalize('50000.00', '50000.00')
6197db96d56Sopenharmony_ci        self._test_delocalize('50,000.00', '50000.00')
6207db96d56Sopenharmony_ci
6217db96d56Sopenharmony_ci    def test_atof(self):
6227db96d56Sopenharmony_ci        self._test_atof('50000.00', 50000.)
6237db96d56Sopenharmony_ci        self._test_atof('50,000.00', 50000.)
6247db96d56Sopenharmony_ci
6257db96d56Sopenharmony_ci    def test_atoi(self):
6267db96d56Sopenharmony_ci        self._test_atoi('50000', 50000)
6277db96d56Sopenharmony_ci        self._test_atoi('50,000', 50000)
6287db96d56Sopenharmony_ci
6297db96d56Sopenharmony_ci
6307db96d56Sopenharmony_ciclass TestCDelocalizeTest(CCookedTest, BaseDelocalizeTest):
6317db96d56Sopenharmony_ci
6327db96d56Sopenharmony_ci    def test_delocalize(self):
6337db96d56Sopenharmony_ci        self._test_delocalize('50000.00', '50000.00')
6347db96d56Sopenharmony_ci
6357db96d56Sopenharmony_ci    def test_atof(self):
6367db96d56Sopenharmony_ci        self._test_atof('50000.00', 50000.)
6377db96d56Sopenharmony_ci
6387db96d56Sopenharmony_ci    def test_atoi(self):
6397db96d56Sopenharmony_ci        self._test_atoi('50000', 50000)
6407db96d56Sopenharmony_ci
6417db96d56Sopenharmony_ci
6427db96d56Sopenharmony_ciclass TestfrFRDelocalizeTest(FrFRCookedTest, BaseDelocalizeTest):
6437db96d56Sopenharmony_ci
6447db96d56Sopenharmony_ci    def test_delocalize(self):
6457db96d56Sopenharmony_ci        self._test_delocalize('50000,00', '50000.00')
6467db96d56Sopenharmony_ci        self._test_delocalize('50 000,00', '50000.00')
6477db96d56Sopenharmony_ci
6487db96d56Sopenharmony_ci    def test_atof(self):
6497db96d56Sopenharmony_ci        self._test_atof('50000,00', 50000.)
6507db96d56Sopenharmony_ci        self._test_atof('50 000,00', 50000.)
6517db96d56Sopenharmony_ci
6527db96d56Sopenharmony_ci    def test_atoi(self):
6537db96d56Sopenharmony_ci        self._test_atoi('50000', 50000)
6547db96d56Sopenharmony_ci        self._test_atoi('50 000', 50000)
6557db96d56Sopenharmony_ci
6567db96d56Sopenharmony_ci
6577db96d56Sopenharmony_ciclass BaseLocalizeTest(BaseLocalizedTest):
6587db96d56Sopenharmony_ci
6597db96d56Sopenharmony_ci    def _test_localize(self, value, out, grouping=False):
6607db96d56Sopenharmony_ci        self.assertEqual(locale.localize(value, grouping=grouping), out)
6617db96d56Sopenharmony_ci
6627db96d56Sopenharmony_ci
6637db96d56Sopenharmony_ciclass TestEnUSLocalize(EnUSCookedTest, BaseLocalizeTest):
6647db96d56Sopenharmony_ci
6657db96d56Sopenharmony_ci    def test_localize(self):
6667db96d56Sopenharmony_ci        self._test_localize('50000.00', '50000.00')
6677db96d56Sopenharmony_ci        self._test_localize(
6687db96d56Sopenharmony_ci            '{0:.16f}'.format(Decimal('1.15')), '1.1500000000000000')
6697db96d56Sopenharmony_ci
6707db96d56Sopenharmony_ci
6717db96d56Sopenharmony_ciclass TestCLocalize(CCookedTest, BaseLocalizeTest):
6727db96d56Sopenharmony_ci
6737db96d56Sopenharmony_ci    def test_localize(self):
6747db96d56Sopenharmony_ci        self._test_localize('50000.00', '50000.00')
6757db96d56Sopenharmony_ci
6767db96d56Sopenharmony_ci
6777db96d56Sopenharmony_ciclass TestfrFRLocalize(FrFRCookedTest, BaseLocalizeTest):
6787db96d56Sopenharmony_ci
6797db96d56Sopenharmony_ci    def test_localize(self):
6807db96d56Sopenharmony_ci        self._test_localize('50000.00', '50000,00')
6817db96d56Sopenharmony_ci        self._test_localize('50000.00', '50 000,00', grouping=True)
6827db96d56Sopenharmony_ci
6837db96d56Sopenharmony_ci
6847db96d56Sopenharmony_ciif __name__ == '__main__':
6857db96d56Sopenharmony_ci    unittest.main()
686