From 16165b5ab171f83087d771043fb58abf34eacb1a Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Fri, 23 May 2025 17:49:26 +0500 Subject: [PATCH 1/3] gh-134593: add tests for dgettext --- Lib/test/test_gettext.py | 48 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 33b7d75e3ff203..8c4d9874db6a27 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -4,6 +4,8 @@ import unittest import unittest.mock from functools import partial +import tempfile +import shutil from test import support from test.support import cpython_only, os_helper @@ -11,7 +13,6 @@ # TODO: -# - Add new tests, for example for "dgettext" # - Tests should have only one assert. GNU_MO_DATA = b'''\ @@ -937,6 +938,51 @@ def test_lazy_import(self): ensure_lazy_imports("gettext", {"re", "warnings", "locale"}) +class DGettextTest(unittest.TestCase): + """Test dgettext() function, which allows translations from specific domains.""" + + def setUp(self): + """Set up a specific test domain and environment for dgettext tests.""" + self.localedir = tempfile.mkdtemp() + self.addCleanup(shutil.rmtree, self.localedir) + self.domain = 'gettext_domain' + self.mofile = self.setup_dgettext_test_env() + + def setup_dgettext_test_env(self): + """Create a mo file for dgettext testing.""" + os.makedirs(os.path.join(self.localedir, 'en', 'LC_MESSAGES'), exist_ok=True) + mofile = os.path.join(self.localedir, 'en', 'LC_MESSAGES', f'{self.domain}.mo') + with open(mofile, 'wb') as fp: + fp.write(b'\x00\x00\x00\x00') + return mofile + + def test_dgettext_found_translation(self): + """Test dgettext finds translation in specified domain.""" + gettext.bindtextdomain(self.domain, self.localedir) + with unittest.mock.patch('gettext.dgettext') as mock_dgettext: + mock_dgettext.return_value = 'test message translation' + result = gettext.dgettext(self.domain, 'test message') + self.assertEqual(result, 'test message translation') + + def test_dgettext_missing_translation(self): + """Test dgettext returns msgid when translation is missing.""" + gettext.bindtextdomain(self.domain, self.localedir) + result = gettext.dgettext(self.domain, 'missing message') + self.assertEqual(result, 'missing message') + + def test_dgettext_non_existent_domain(self): + """Test dgettext returns msgid when domain doesn't exist.""" + result = gettext.dgettext('nonexistent_domain', 'test message') + self.assertEqual(result, 'test message') + + def test_dgettext_empty_domain(self): + """Test dgettext behavior with empty domain.""" + current_domain = gettext.textdomain() + result = gettext.dgettext('', 'test message') + expected = gettext.gettext('test message') + self.assertEqual(result, expected) + + if __name__ == '__main__': unittest.main() From c4fb7ac2ab5f8dd643ecaf5f432960f17b7da240 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Fri, 23 May 2025 23:48:55 +0500 Subject: [PATCH 2/3] fix comments --- Lib/test/test_gettext.py | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index 8c4d9874db6a27..cbb6374cf7d57f 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -4,8 +4,6 @@ import unittest import unittest.mock from functools import partial -import tempfile -import shutil from test import support from test.support import cpython_only, os_helper @@ -939,17 +937,13 @@ def test_lazy_import(self): class DGettextTest(unittest.TestCase): - """Test dgettext() function, which allows translations from specific domains.""" def setUp(self): - """Set up a specific test domain and environment for dgettext tests.""" - self.localedir = tempfile.mkdtemp() - self.addCleanup(shutil.rmtree, self.localedir) + self.localedir = self.enterContext(os_helper.temp_dir()) self.domain = 'gettext_domain' self.mofile = self.setup_dgettext_test_env() def setup_dgettext_test_env(self): - """Create a mo file for dgettext testing.""" os.makedirs(os.path.join(self.localedir, 'en', 'LC_MESSAGES'), exist_ok=True) mofile = os.path.join(self.localedir, 'en', 'LC_MESSAGES', f'{self.domain}.mo') with open(mofile, 'wb') as fp: @@ -957,7 +951,6 @@ def setup_dgettext_test_env(self): return mofile def test_dgettext_found_translation(self): - """Test dgettext finds translation in specified domain.""" gettext.bindtextdomain(self.domain, self.localedir) with unittest.mock.patch('gettext.dgettext') as mock_dgettext: mock_dgettext.return_value = 'test message translation' @@ -965,19 +958,15 @@ def test_dgettext_found_translation(self): self.assertEqual(result, 'test message translation') def test_dgettext_missing_translation(self): - """Test dgettext returns msgid when translation is missing.""" gettext.bindtextdomain(self.domain, self.localedir) result = gettext.dgettext(self.domain, 'missing message') self.assertEqual(result, 'missing message') def test_dgettext_non_existent_domain(self): - """Test dgettext returns msgid when domain doesn't exist.""" result = gettext.dgettext('nonexistent_domain', 'test message') self.assertEqual(result, 'test message') def test_dgettext_empty_domain(self): - """Test dgettext behavior with empty domain.""" - current_domain = gettext.textdomain() result = gettext.dgettext('', 'test message') expected = gettext.gettext('test message') self.assertEqual(result, expected) From 77ffbe6ba2b7294113a82893b184e81b82c0a4b4 Mon Sep 17 00:00:00 2001 From: Alexey Semenyuk Date: Sun, 25 May 2025 15:24:11 +0500 Subject: [PATCH 3/3] fix comments --- Lib/test/test_gettext.py | 66 ++++++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/Lib/test/test_gettext.py b/Lib/test/test_gettext.py index cbb6374cf7d57f..746adcc223fea1 100644 --- a/Lib/test/test_gettext.py +++ b/Lib/test/test_gettext.py @@ -936,39 +936,47 @@ def test_lazy_import(self): ensure_lazy_imports("gettext", {"re", "warnings", "locale"}) -class DGettextTest(unittest.TestCase): +class DGettextTest(GettextBaseTest): def setUp(self): - self.localedir = self.enterContext(os_helper.temp_dir()) - self.domain = 'gettext_domain' - self.mofile = self.setup_dgettext_test_env() - - def setup_dgettext_test_env(self): - os.makedirs(os.path.join(self.localedir, 'en', 'LC_MESSAGES'), exist_ok=True) - mofile = os.path.join(self.localedir, 'en', 'LC_MESSAGES', f'{self.domain}.mo') - with open(mofile, 'wb') as fp: - fp.write(b'\x00\x00\x00\x00') - return mofile + GettextBaseTest.setUp(self) + gettext.bindtextdomain('gettext', os.curdir) def test_dgettext_found_translation(self): - gettext.bindtextdomain(self.domain, self.localedir) - with unittest.mock.patch('gettext.dgettext') as mock_dgettext: - mock_dgettext.return_value = 'test message translation' - result = gettext.dgettext(self.domain, 'test message') - self.assertEqual(result, 'test message translation') - - def test_dgettext_missing_translation(self): - gettext.bindtextdomain(self.domain, self.localedir) - result = gettext.dgettext(self.domain, 'missing message') - self.assertEqual(result, 'missing message') - - def test_dgettext_non_existent_domain(self): - result = gettext.dgettext('nonexistent_domain', 'test message') - self.assertEqual(result, 'test message') - - def test_dgettext_empty_domain(self): - result = gettext.dgettext('', 'test message') - expected = gettext.gettext('test message') + result = gettext.dgettext('gettext', 'mullusk') + self.assertEqual(result, 'bacon') + + def test_dgettext_fallback_cases(self): + test_cases = [ + ('gettext', 'missing message'), + ('nonexistent_domain', 'mullusk'), + ('', 'mullusk'), + ] + for domain, message in test_cases: + with self.subTest(domain=domain, message=message): + result = gettext.dgettext(domain, message) + if domain == '': + expected = gettext.gettext(message) + else: + expected = message + self.assertEqual(result, expected) + + def test_dgettext_luxury_yacht_translation(self): + result = gettext.dgettext('gettext', 'Raymond Luxury Yach-t') + self.assertEqual(result, 'Throatwobbler Mangrove') + + def test_dgettext_nudge_nudge_translation(self): + result = gettext.dgettext('gettext', 'nudge nudge') + self.assertEqual(result, 'wink wink') + + def test_dgettext_multiline_translation(self): + message = '''This module provides internationalization and localization +support for your Python programs by providing an interface to the GNU +gettext message catalog library.''' + expected = '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba +fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH +trggrkg zrffntr pngnybt yvoenel.''' + result = gettext.dgettext('gettext', message) self.assertEqual(result, expected)