10
10
set_locale ,
11
11
)
12
12
13
- from pandas .compat import is_platform_windows
14
-
15
13
import pandas as pd
16
14
17
15
_all_locales = get_locales () or []
18
- _current_locale = locale .getlocale ()
16
+ _current_locale = locale .setlocale ( locale . LC_ALL ) # getlocale() is wrong, see GH#46595
19
17
20
- # Don't run any of these tests if we are on Windows or have no locales.
21
- pytestmark = pytest .mark .skipif (
22
- is_platform_windows () or not _all_locales , reason = "Need non-Windows and locales"
23
- )
18
+ # Don't run any of these tests if we have no locales.
19
+ pytestmark = pytest .mark .skipif (not _all_locales , reason = "Need locales" )
24
20
25
21
_skip_if_only_one_locale = pytest .mark .skipif (
26
22
len (_all_locales ) <= 1 , reason = "Need multiple locales for meaningful test"
27
23
)
28
24
29
25
30
- def test_can_set_locale_valid_set ():
26
+ def _get_current_locale (lc_var : int = locale .LC_ALL ) -> str :
27
+ # getlocale is not always compliant with setlocale, use setlocale. GH#46595
28
+ return locale .setlocale (lc_var )
29
+
30
+
31
+ @pytest .mark .parametrize ("lc_var" , (locale .LC_ALL , locale .LC_CTYPE , locale .LC_TIME ))
32
+ def test_can_set_current_locale (lc_var ):
33
+ # Can set the current locale
34
+ before_locale = _get_current_locale (lc_var )
35
+ assert can_set_locale (before_locale , lc_var = lc_var )
36
+ after_locale = _get_current_locale (lc_var )
37
+ assert before_locale == after_locale
38
+
39
+
40
+ @pytest .mark .parametrize ("lc_var" , (locale .LC_ALL , locale .LC_CTYPE , locale .LC_TIME ))
41
+ def test_can_set_locale_valid_set (lc_var ):
31
42
# Can set the default locale.
32
- assert can_set_locale ("" )
43
+ before_locale = _get_current_locale (lc_var )
44
+ assert can_set_locale ("" , lc_var = lc_var )
45
+ after_locale = _get_current_locale (lc_var )
46
+ assert before_locale == after_locale
33
47
34
48
35
- def test_can_set_locale_invalid_set ():
49
+ @pytest .mark .parametrize ("lc_var" , (locale .LC_ALL , locale .LC_CTYPE , locale .LC_TIME ))
50
+ def test_can_set_locale_invalid_set (lc_var ):
36
51
# Cannot set an invalid locale.
37
- assert not can_set_locale ("non-existent_locale" )
52
+ before_locale = _get_current_locale (lc_var )
53
+ assert not can_set_locale ("non-existent_locale" , lc_var = lc_var )
54
+ after_locale = _get_current_locale (lc_var )
55
+ assert before_locale == after_locale
56
+
57
+
58
+ @pytest .mark .parametrize (
59
+ "lang,enc" ,
60
+ [
61
+ ("it_CH" , "UTF-8" ),
62
+ ("en_US" , "ascii" ),
63
+ ("zh_CN" , "GB2312" ),
64
+ ("it_IT" , "ISO-8859-1" ),
65
+ ],
66
+ )
67
+ @pytest .mark .parametrize ("lc_var" , (locale .LC_ALL , locale .LC_CTYPE , locale .LC_TIME ))
68
+ def test_can_set_locale_no_leak (lang , enc , lc_var ):
69
+ # Test that can_set_locale does not leak even when returning False. See GH#46595
70
+ before_locale = _get_current_locale (lc_var )
71
+ can_set_locale ((lang , enc ), locale .LC_ALL )
72
+ after_locale = _get_current_locale (lc_var )
73
+ assert before_locale == after_locale
38
74
39
75
40
76
def test_can_set_locale_invalid_get (monkeypatch ):
@@ -72,10 +108,7 @@ def test_get_locales_prefix():
72
108
],
73
109
)
74
110
def test_set_locale (lang , enc ):
75
- if all (x is None for x in _current_locale ):
76
- # Not sure why, but on some Travis runs with pytest,
77
- # getlocale() returned (None, None).
78
- pytest .skip ("Current locale is not set." )
111
+ before_locale = _get_current_locale ()
79
112
80
113
enc = codecs .lookup (enc ).name
81
114
new_locale = lang , enc
@@ -95,8 +128,8 @@ def test_set_locale(lang, enc):
95
128
assert normalized_locale == new_locale
96
129
97
130
# Once we exit the "with" statement, locale should be back to what it was.
98
- current_locale = locale . getlocale ()
99
- assert current_locale == _current_locale
131
+ after_locale = _get_current_locale ()
132
+ assert before_locale == after_locale
100
133
101
134
102
135
def test_encoding_detected ():
0 commit comments