blob: 2dd6510887e43beb240fc7775b9f04fa76b0b903 [file] [log] [blame]
Jack Jansen06f0cef2002-12-30 23:02:55 +00001from test.test_support import verbose, TestSkipped
Martin v. Löwis88ad12a2001-04-13 08:09:50 +00002import locale
Guido van Rossumfc349862001-04-15 13:15:56 +00003import sys
Martin v. Löwis88ad12a2001-04-13 08:09:50 +00004
Jack Jansen06f0cef2002-12-30 23:02:55 +00005if sys.platform == 'darwin':
Tim Petersf2715e02003-02-19 02:35:07 +00006 raise TestSkipped("Locale support on MacOSX is minimal and cannot be tested")
Martin v. Löwis88ad12a2001-04-13 08:09:50 +00007oldlocale = locale.setlocale(locale.LC_NUMERIC)
8
Hye-Shik Chang8d2e08d2003-12-19 01:16:03 +00009if sys.platform.startswith("win"):
Guido van Rossumd8faa362007-04-27 19:54:29 +000010 tlocs = ("En", "English")
Hye-Shik Chang8d2e08d2003-12-19 01:16:03 +000011else:
Anthony Baxter451ae182005-06-03 15:04:15 +000012 tlocs = ("en_US.UTF-8", "en_US.US-ASCII", "en_US")
Guido van Rossumfc349862001-04-15 13:15:56 +000013
Anthony Baxter451ae182005-06-03 15:04:15 +000014for tloc in tlocs:
15 try:
16 locale.setlocale(locale.LC_NUMERIC, tloc)
17 break
18 except locale.Error:
19 continue
20else:
21 raise ImportError, "test locale not supported (tried %s)"%(', '.join(tlocs))
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000022
Thomas Wouters477c8d52006-05-27 19:21:47 +000023def testformat(formatstr, value, grouping = 0, output=None, func=locale.format):
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000024 if verbose:
25 if output:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000026 print("%s %% %s =? %s ..." %\
27 (repr(formatstr), repr(value), repr(output)), end=' ')
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000028 else:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000029 print("%s %% %s works? ..." % (repr(formatstr), repr(value)), end=' ')
Thomas Wouters477c8d52006-05-27 19:21:47 +000030 result = func(formatstr, value, grouping = grouping)
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000031 if output and result != output:
32 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000033 print('no')
34 print("%s %% %s == %s != %s" %\
35 (repr(formatstr), repr(value), repr(result), repr(output)))
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000036 else:
37 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000038 print("yes")
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000039
40try:
Martin v. Löwis4cfa1362005-12-30 12:51:45 +000041 # On Solaris 10, the thousands_sep is the empty string
42 sep = locale.localeconv()['thousands_sep']
43 testformat("%f", 1024, grouping=1, output='1%s024.000000' % sep)
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000044 testformat("%f", 102, grouping=1, output='102.000000')
45 testformat("%f", -42, grouping=1, output='-42.000000')
46 testformat("%+f", -42, grouping=1, output='-42.000000')
47 testformat("%20.f", -42, grouping=1, output=' -42')
Martin v. Löwis4cfa1362005-12-30 12:51:45 +000048 testformat("%+10.f", -4200, grouping=1, output=' -4%s200' % sep)
49 testformat("%-10.f", 4200, grouping=1, output='4%s200 ' % sep)
Martin v. Löwisf0a46682002-11-03 17:20:12 +000050 # Invoke getpreferredencoding to make sure it does not cause exceptions,
51 locale.getpreferredencoding()
Thomas Wouters477c8d52006-05-27 19:21:47 +000052
53 # === Test format() with more complex formatting strings
54 # test if grouping is independent from other characters in formatting string
55 testformat("One million is %i", 1000000, grouping=1,
56 output='One million is 1%s000%s000' % (sep, sep),
57 func=locale.format_string)
58 testformat("One million is %i", 1000000, grouping=1,
59 output='One million is 1%s000%s000' % (sep, sep),
60 func=locale.format_string)
61 # test dots in formatting string
62 testformat(".%f.", 1000.0, output='.1000.000000.', func=locale.format_string)
63 # test floats
64 testformat("--> %10.2f", 1000.0, grouping=1, output='--> 1%s000.00' % sep,
65 func=locale.format_string)
66 # test asterisk formats
67 testformat("%10.*f", (2, 1000.0), grouping=0, output=' 1000.00',
68 func=locale.format_string)
69 testformat("%*.*f", (10, 2, 1000.0), grouping=1, output=' 1%s000.00' % sep,
70 func=locale.format_string)
71 # test more-in-one
72 testformat("int %i float %.2f str %s", (1000, 1000.0, 'str'), grouping=1,
73 output='int 1%s000 float 1%s000.00 str str' % (sep, sep),
74 func=locale.format_string)
75
Martin v. Löwis88ad12a2001-04-13 08:09:50 +000076finally:
77 locale.setlocale(locale.LC_NUMERIC, oldlocale)
Hye-Shik Changb5047fd2004-08-04 06:33:51 +000078
79
80# Test BSD Rune locale's bug for isctype functions.
81def teststrop(s, method, output):
Guido van Rossum1a1f61b2007-05-17 21:11:47 +000082 s = str8(s)
Hye-Shik Changb5047fd2004-08-04 06:33:51 +000083 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000084 print("%s.%s() =? %s ..." % (repr(s), method, repr(output)), end=' ')
Hye-Shik Changb5047fd2004-08-04 06:33:51 +000085 result = getattr(s, method)()
86 if result != output:
87 if verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000088 print("no")
89 print("%s.%s() == %s != %s" % (repr(s), method, repr(result),
90 repr(output)))
Hye-Shik Changb5047fd2004-08-04 06:33:51 +000091 elif verbose:
Guido van Rossumbe19ed72007-02-09 05:37:30 +000092 print("yes")
Hye-Shik Changb5047fd2004-08-04 06:33:51 +000093
94try:
Martin v. Löwis4cfa1362005-12-30 12:51:45 +000095 if sys.platform == 'sunos5':
96 # On Solaris, in en_US.UTF-8, \xa0 is a space
97 raise locale.Error
Hye-Shik Changb5047fd2004-08-04 06:33:51 +000098 oldlocale = locale.setlocale(locale.LC_CTYPE)
99 locale.setlocale(locale.LC_CTYPE, 'en_US.UTF-8')
100except locale.Error:
101 pass
102else:
103 try:
104 teststrop('\x20', 'isspace', True)
105 teststrop('\xa0', 'isspace', False)
106 teststrop('\xa1', 'isspace', False)
107 teststrop('\xc0', 'isalpha', False)
108 teststrop('\xc0', 'isalnum', False)
109 teststrop('\xc0', 'isupper', False)
110 teststrop('\xc0', 'islower', False)
111 teststrop('\xec\xa0\xbc', 'split', ['\xec\xa0\xbc'])
112 teststrop('\xed\x95\xa0', 'strip', '\xed\x95\xa0')
113 teststrop('\xcc\x85', 'lower', '\xcc\x85')
114 teststrop('\xed\x95\xa0', 'upper', '\xed\x95\xa0')
115 finally:
116 locale.setlocale(locale.LC_CTYPE, oldlocale)