diff -r ddf15cd9be4a Lib/test/regrtest.py --- a/Lib/test/regrtest.py Thu Jul 26 18:12:07 2012 -0400 +++ b/Lib/test/regrtest.py Sat Jul 28 00:09:27 2012 +0900 @@ -173,6 +173,7 @@ import getopt import io import json +import locale import logging import os import platform @@ -992,7 +993,7 @@ 'sys.warnoptions', 'threading._dangling', 'multiprocessing.process._dangling', 'sysconfig._CONFIG_VARS', 'sysconfig._INSTALL_SCHEMES', - 'support.TESTFN', + 'support.TESTFN', 'locale', ) def get_sys_argv(self): @@ -1161,6 +1162,17 @@ elif os.path.isdir(support.TESTFN): shutil.rmtree(support.TESTFN) + _locale_categories = [locale.LC_COLLATE, locale.LC_CTYPE, + locale.LC_MONETARY, locale.LC_NUMERIC, locale.LC_TIME] + if hasattr(locale, 'LC_MESSAGES'): + _locale_categories.append(locale.LC_MESSAGES) + + def get_locale(self): + return [locale.getlocale(cat) for cat in self._locale_categories] + def restore_locale(self, saved_value): + for cat, value in zip(self._locale_categories, saved_value): + locale.setlocale(cat, value) + def resource_info(self): for name in self.resources: method_suffix = name.replace('.', '_') diff -r ddf15cd9be4a Lib/test/test___all__.py --- a/Lib/test/test___all__.py Thu Jul 26 18:12:07 2012 -0400 +++ b/Lib/test/test___all__.py Sat Jul 28 00:09:27 2012 +0900 @@ -69,13 +69,14 @@ # rlcompleter needs special consideration; it import readline which # initializes GNU readline which calls setlocale(LC_CTYPE, "")... :-( + import locale + org_locale = locale.getlocale(locale.LC_CTYPE) try: import rlcompleter - import locale except ImportError: pass else: - locale.setlocale(locale.LC_CTYPE, 'C') + locale.setlocale(locale.LC_CTYPE, org_locale) ignored = [] failed_imports = [] diff -r ddf15cd9be4a Lib/test/test_regrtest.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/test/test_regrtest.py Sat Jul 28 00:09:27 2012 +0900 @@ -0,0 +1,38 @@ +from test.support import run_unittest, verbose +import locale, unittest +import test.test_locale +from test.regrtest import saved_test_environment + +class TestSavedTestEnvironment(unittest.TestCase): + """Tests for regrtest.saved_test_environment""" + + def test_locale_not_changed(self): + org = locale.setlocale(locale.LC_ALL) + try: + with saved_test_environment('dummytest', quiet=True) as env: + pass + self.assertFalse(env.changed) + finally: + locale.setlocale(locale.LC_ALL, org) + + def test_locale_changed(self): + org = locale.setlocale(locale.LC_ALL) + try: + with saved_test_environment('dummytest', quiet=True) as env: + locale.setlocale(locale.LC_ALL, test.test_locale.enUS_locale) + self.assertTrue(env.changed) + finally: + locale.setlocale(locale.LC_ALL, org) + +def test_main(): + # SkipTest can't be raised inside unittests, handle it manually instead + try: + test.test_locale.get_enUS_locale() + except unittest.SkipTest as e: + if verbose: + print("Some tests will be disabled: %s" % e) + else: + run_unittest(TestSavedTestEnvironment) + +if __name__ == '__main__': + test_main()