1010 set_locale ,
1111)
1212
13- from pandas .compat import is_platform_windows
14-
1513import pandas as pd
1614
1715_all_locales = get_locales () or []
18- _current_locale = locale .getlocale ()
16+ _current_locale = locale .setlocale ( locale . LC_ALL ) # getlocale() is wrong, see GH#46595
1917
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" )
2420
2521_skip_if_only_one_locale = pytest .mark .skipif (
2622 len (_all_locales ) <= 1 , reason = "Need multiple locales for meaningful test"
2723)
2824
2925
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 ):
3142 # 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
3347
3448
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 ):
3651 # 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
3874
3975
4076def test_can_set_locale_invalid_get (monkeypatch ):
@@ -72,10 +108,7 @@ def test_get_locales_prefix():
72108 ],
73109)
74110def 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 ()
79112
80113 enc = codecs .lookup (enc ).name
81114 new_locale = lang , enc
@@ -95,8 +128,8 @@ def test_set_locale(lang, enc):
95128 assert normalized_locale == new_locale
96129
97130 # 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
100133
101134
102135def test_encoding_detected ():
0 commit comments