[Python-checkins] cpython (merge 3.4 -> default): Issue #23474: Enhanced locale testing.

serhiy.storchaka python-checkins at python.org
Wed Feb 18 07:05:46 CET 2015


https://hg.python.org/cpython/rev/4f7c5349e801
changeset:   94676:4f7c5349e801
parent:      94673:6e3e252cf047
parent:      94675:b53aadd9cf85
user:        Serhiy Storchaka <storchaka at gmail.com>
date:        Wed Feb 18 08:05:05 2015 +0200
summary:
  Issue #23474: Enhanced locale testing.

files:
  Lib/test/test__locale.py |  97 +++++++++++++++++----------
  Lib/test/test_locale.py  |   2 +-
  2 files changed, 60 insertions(+), 39 deletions(-)


diff --git a/Lib/test/test__locale.py b/Lib/test/test__locale.py
--- a/Lib/test/test__locale.py
+++ b/Lib/test/test__locale.py
@@ -9,7 +9,6 @@
 import sys
 import unittest
 from platform import uname
-from test.support import run_unittest
 
 if uname().system == "Darwin":
     maj, min, mic = [int(part) for part in uname().release.split(".")]
@@ -24,45 +23,52 @@
     'da_DK', 'nn_NO', 'cs_CZ', 'de_LU', 'es_BO', 'sq_AL', 'sk_SK', 'fr_CH',
     'de_DE', 'sr_YU', 'br_FR', 'nl_BE', 'sv_FI', 'pl_PL', 'fr_CA', 'fo_FO',
     'bs_BA', 'fr_LU', 'kl_GL', 'fa_IR', 'de_BE', 'sv_SE', 'it_CH', 'uk_UA',
-    'eu_ES', 'vi_VN', 'af_ZA', 'nb_NO', 'en_DK', 'tg_TJ', 'en_US',
+    'eu_ES', 'vi_VN', 'af_ZA', 'nb_NO', 'en_DK', 'tg_TJ', 'ps_AF', 'en_US',
     'es_ES.ISO8859-1', 'fr_FR.ISO8859-15', 'ru_RU.KOI8-R', 'ko_KR.eucKR']
 
-# Issue #13441: Skip some locales (e.g. cs_CZ and hu_HU) on Solaris to
-# workaround a mbstowcs() bug. For example, on Solaris, the hu_HU locale uses
-# the locale encoding ISO-8859-2, the thousauds separator is b'\xA0' and it is
-# decoded as U+30000020 (an invalid character) by mbstowcs().
-if sys.platform == 'sunos5':
-    old_locale = locale.setlocale(locale.LC_ALL)
-    try:
-        locales = []
-        for loc in candidate_locales:
-            try:
-                locale.setlocale(locale.LC_ALL, loc)
-            except Error:
-                continue
-            encoding = locale.getpreferredencoding(False)
-            try:
-                localeconv()
-            except Exception as err:
-                print("WARNING: Skip locale %s (encoding %s): [%s] %s"
-                      % (loc, encoding, type(err), err))
-            else:
-                locales.append(loc)
-        candidate_locales = locales
-    finally:
-        locale.setlocale(locale.LC_ALL, old_locale)
+def setUpModule():
+    global candidate_locales
+    # Issue #13441: Skip some locales (e.g. cs_CZ and hu_HU) on Solaris to
+    # workaround a mbstowcs() bug. For example, on Solaris, the hu_HU locale uses
+    # the locale encoding ISO-8859-2, the thousauds separator is b'\xA0' and it is
+    # decoded as U+30000020 (an invalid character) by mbstowcs().
+    if sys.platform == 'sunos5':
+        old_locale = locale.setlocale(locale.LC_ALL)
+        try:
+            locales = []
+            for loc in candidate_locales:
+                try:
+                    locale.setlocale(locale.LC_ALL, loc)
+                except Error:
+                    continue
+                encoding = locale.getpreferredencoding(False)
+                try:
+                    localeconv()
+                except Exception as err:
+                    print("WARNING: Skip locale %s (encoding %s): [%s] %s"
+                        % (loc, encoding, type(err), err))
+                else:
+                    locales.append(loc)
+            candidate_locales = locales
+        finally:
+            locale.setlocale(locale.LC_ALL, old_locale)
 
-# Workaround for MSVC6(debug) crash bug
-if "MSC v.1200" in sys.version:
-    def accept(loc):
-        a = loc.split(".")
-        return not(len(a) == 2 and len(a[-1]) >= 9)
-    candidate_locales = [loc for loc in candidate_locales if accept(loc)]
+    # Workaround for MSVC6(debug) crash bug
+    if "MSC v.1200" in sys.version:
+        def accept(loc):
+            a = loc.split(".")
+            return not(len(a) == 2 and len(a[-1]) >= 9)
+        candidate_locales = [loc for loc in candidate_locales if accept(loc)]
 
 # List known locale values to test against when available.
 # Dict formatted as ``<locale> : (<decimal_point>, <thousands_sep>)``.  If a
 # value is not known, use '' .
-known_numerics = {'fr_FR' : (',', ''), 'en_US':('.', ',')}
+known_numerics = {
+    'en_US': ('.', ','),
+    'fr_FR' : (',', ' '),
+    'de_DE' : (',', '.'),
+    'ps_AF': ('\u066b', '\u066c'),
+}
 
 class _LocaleTests(unittest.TestCase):
 
@@ -91,10 +97,12 @@
                                     calc_value, known_value,
                                     calc_type, data_type, set_locale,
                                     used_locale))
+            return True
 
     @unittest.skipUnless(nl_langinfo, "nl_langinfo is not available")
     def test_lc_numeric_nl_langinfo(self):
         # Test nl_langinfo against known values
+        tested = False
         for loc in candidate_locales:
             try:
                 setlocale(LC_NUMERIC, loc)
@@ -103,10 +111,14 @@
                 continue
             for li, lc in ((RADIXCHAR, "decimal_point"),
                             (THOUSEP, "thousands_sep")):
-                self.numeric_tester('nl_langinfo', nl_langinfo(li), lc, loc)
+                if self.numeric_tester('nl_langinfo', nl_langinfo(li), lc, loc):
+                    tested = True
+        if not tested:
+            self.skipTest('no suitable locales')
 
     def test_lc_numeric_localeconv(self):
         # Test localeconv against known values
+        tested = False
         for loc in candidate_locales:
             try:
                 setlocale(LC_NUMERIC, loc)
@@ -116,11 +128,15 @@
             formatting = localeconv()
             for lc in ("decimal_point",
                         "thousands_sep"):
-                self.numeric_tester('localeconv', formatting[lc], lc, loc)
+                if self.numeric_tester('localeconv', formatting[lc], lc, loc):
+                    tested = True
+        if not tested:
+            self.skipTest('no suitable locales')
 
     @unittest.skipUnless(nl_langinfo, "nl_langinfo is not available")
     def test_lc_numeric_basic(self):
         # Test nl_langinfo against localeconv
+        tested = False
         for loc in candidate_locales:
             try:
                 setlocale(LC_NUMERIC, loc)
@@ -140,10 +156,14 @@
                                 "(set to %s, using %s)" % (
                                                 nl_radixchar, li_radixchar,
                                                 loc, set_locale))
+                tested = True
+        if not tested:
+            self.skipTest('no suitable locales')
 
     def test_float_parsing(self):
         # Bug #1391872: Test whether float parsing is okay on European
         # locales.
+        tested = False
         for loc in candidate_locales:
             try:
                 setlocale(LC_NUMERIC, loc)
@@ -162,9 +182,10 @@
             if localeconv()['decimal_point'] != '.':
                 self.assertRaises(ValueError, float,
                                   localeconv()['decimal_point'].join(['1', '23']))
+            tested = True
+        if not tested:
+            self.skipTest('no suitable locales')
 
-def test_main():
-    run_unittest(_LocaleTests)
 
 if __name__ == '__main__':
-    test_main()
+    unittest.main()
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -511,7 +511,7 @@
             self.skipTest('test needs Turkish locale')
         loc = locale.getlocale(locale.LC_CTYPE)
         if verbose:
-            print('got locale %a' % (loc,))
+            print('testing with %a' % (loc,), end=' ', flush=True)
         locale.setlocale(locale.LC_CTYPE, loc)
         self.assertEqual(loc, locale.getlocale(locale.LC_CTYPE))
 

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list