test_locale.py 4.45 KB
Newer Older
1
from test.test_support import verbose, TestSkipped
2
import locale
3
import sys
4

5
if sys.platform == 'darwin':
6 7
    raise TestSkipped(
            "Locale support on MacOSX is minimal and cannot be tested")
8 9
oldlocale = locale.setlocale(locale.LC_NUMERIC)

10
if sys.platform.startswith("win"):
11
    tlocs = ("En", "English")
12
else:
13
    tlocs = ("en_US.UTF-8", "en_US.US-ASCII", "en_US")
14

15 16 17 18 19 20 21
for tloc in tlocs:
    try:
        locale.setlocale(locale.LC_NUMERIC, tloc)
        break
    except locale.Error:
        continue
else:
22 23
    raise ImportError(
            "test locale not supported (tried %s)" % (', '.join(tlocs)))
24

25
def testformat(formatstr, value, grouping = 0, output=None, func=locale.format):
26 27
    if verbose:
        if output:
28 29
            print("%s %% %s =? %s ..." %
                  (repr(formatstr), repr(value), repr(output)), end=' ')
30
        else:
31 32
            print("%s %% %s works? ..." % (repr(formatstr), repr(value)),
                  end=' ')
33
    result = func(formatstr, value, grouping = grouping)
34 35
    if output and result != output:
        if verbose:
36
            print('no')
37
        print("%s %% %s == %s != %s" %
38
              (repr(formatstr), repr(value), repr(result), repr(output)))
39 40
    else:
        if verbose:
41
            print("yes")
42 43

try:
44 45 46
    # On Solaris 10, the thousands_sep is the empty string
    sep = locale.localeconv()['thousands_sep']
    testformat("%f", 1024, grouping=1, output='1%s024.000000' % sep)
47 48 49 50
    testformat("%f", 102, grouping=1, output='102.000000')
    testformat("%f", -42, grouping=1, output='-42.000000')
    testformat("%+f", -42, grouping=1, output='-42.000000')
    testformat("%20.f", -42, grouping=1, output='                 -42')
51 52
    testformat("%+10.f", -4200, grouping=1, output='    -4%s200' % sep)
    testformat("%-10.f", 4200, grouping=1, output='4%s200     ' % sep)
53 54
    # Invoke getpreferredencoding to make sure it does not cause exceptions,
    locale.getpreferredencoding()
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

    # === Test format() with more complex formatting strings
    # test if grouping is independent from other characters in formatting string
    testformat("One million is %i", 1000000, grouping=1,
               output='One million is 1%s000%s000' % (sep, sep),
               func=locale.format_string)
    testformat("One  million is %i", 1000000, grouping=1,
               output='One  million is 1%s000%s000' % (sep, sep),
               func=locale.format_string)
    # test dots in formatting string
    testformat(".%f.", 1000.0, output='.1000.000000.', func=locale.format_string)
    # test floats
    testformat("--> %10.2f", 1000.0, grouping=1, output='-->   1%s000.00' % sep,
               func=locale.format_string)
    # test asterisk formats
    testformat("%10.*f", (2, 1000.0), grouping=0, output='   1000.00',
               func=locale.format_string)
    testformat("%*.*f", (10, 2, 1000.0), grouping=1, output='  1%s000.00' % sep,
               func=locale.format_string)
    # test more-in-one
    testformat("int %i float %.2f str %s", (1000, 1000.0, 'str'), grouping=1,
               output='int 1%s000 float 1%s000.00 str str' % (sep, sep),
               func=locale.format_string)

79 80
finally:
    locale.setlocale(locale.LC_NUMERIC, oldlocale)
81 82 83 84


# Test BSD Rune locale's bug for isctype functions.
def teststrop(s, method, output):
85
    s = str8(s)
86
    if verbose:
87
        print("%s.%s() =? %s ..." % (repr(s), method, repr(output)), end=' ')
88 89 90
    result = getattr(s, method)()
    if result != output:
        if verbose:
91 92 93
            print("no")
        print("%s.%s() == %s != %s" % (repr(s), method, repr(result),
                                       repr(output)))
94
    elif verbose:
95
        print("yes")
96 97

try:
98 99 100
    if sys.platform == 'sunos5':
        # On Solaris, in en_US.UTF-8, \xa0 is a space
        raise locale.Error
101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    oldlocale = locale.setlocale(locale.LC_CTYPE)
    locale.setlocale(locale.LC_CTYPE, 'en_US.UTF-8')
except locale.Error:
    pass
else:
    try:
        teststrop('\x20', 'isspace', True)
        teststrop('\xa0', 'isspace', False)
        teststrop('\xa1', 'isspace', False)
        teststrop('\xc0', 'isalpha', False)
        teststrop('\xc0', 'isalnum', False)
        teststrop('\xc0', 'isupper', False)
        teststrop('\xc0', 'islower', False)
        teststrop('\xec\xa0\xbc', 'split', ['\xec\xa0\xbc'])
        teststrop('\xed\x95\xa0', 'strip', '\xed\x95\xa0')
        teststrop('\xcc\x85', 'lower', '\xcc\x85')
        teststrop('\xed\x95\xa0', 'upper', '\xed\x95\xa0')
    finally:
        locale.setlocale(locale.LC_CTYPE, oldlocale)