blob: 2737e8136760a5f471845f0b3695d502aed1b09f [file] [log] [blame]
Barry Warsaw9e035922000-08-25 19:14:25 +00001import os
Barry Warsawff6d8132000-08-25 19:50:38 +00002import base64
Barry Warsawa1ce93f2003-04-11 18:36:43 +00003import shutil
Barry Warsaw9e035922000-08-25 19:14:25 +00004import gettext
Martin v. Löwisd8996052002-11-21 21:45:32 +00005import unittest
Barry Warsawa1ce93f2003-04-11 18:36:43 +00006
Benjamin Petersonee8712c2008-05-20 21:35:26 +00007from test import support
Barry Warsawa1ce93f2003-04-11 18:36:43 +00008
Fred Drake004d5e62000-10-23 17:22:08 +00009
Martin v. Löwisd8996052002-11-21 21:45:32 +000010# TODO:
11# - Add new tests, for example for "dgettext"
12# - Remove dummy tests, for example testing for single and double quotes
13# has no sense, it would have if we were testing a parser (i.e. pygettext)
14# - Tests should have only one assert.
Barry Warsaw64dab462000-08-30 03:32:07 +000015
Guido van Rossum39478e82007-08-27 17:23:59 +000016GNU_MO_DATA = b'''\
Martin v. Löwisd8996052002-11-21 21:45:32 +0000173hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
18AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
19AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
20eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
21aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
22CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
23Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
24ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
25MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
26YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
27SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
28NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
29ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
30d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
31eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
32IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
33ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
Barry Warsawff6d8132000-08-25 19:50:38 +000034'''
35
Guido van Rossum39478e82007-08-27 17:23:59 +000036UMO_DATA = b'''\
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000373hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
38AQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
39ZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
40eSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
41ZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
42bjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
43ZC1CeTogbWFudWFsbHkKAMKkeXoA
44'''
Fred Drake004d5e62000-10-23 17:22:08 +000045
Guido van Rossum39478e82007-08-27 17:23:59 +000046MMO_DATA = b'''\
Barry Warsawe960e222003-05-20 17:28:54 +0000473hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
48UHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
49IERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
50NTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
51ZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
52cGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
53c2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
54bGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
55'''
56
Barry Warsawff6d8132000-08-25 19:50:38 +000057LOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
58MOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
Barry Warsawa1ce93f2003-04-11 18:36:43 +000059UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
Barry Warsawe960e222003-05-20 17:28:54 +000060MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
Barry Warsawff6d8132000-08-25 19:50:38 +000061
62
Barry Warsawa1ce93f2003-04-11 18:36:43 +000063class GettextBaseTest(unittest.TestCase):
Martin v. Löwisd8996052002-11-21 21:45:32 +000064 def setUp(self):
Neal Norwitza0e0cd32004-07-19 00:08:59 +000065 if not os.path.isdir(LOCALEDIR):
66 os.makedirs(LOCALEDIR)
Éric Araujo7fa886d2010-11-06 04:11:59 +000067 with open(MOFILE, 'wb') as fp:
68 fp.write(base64.decodebytes(GNU_MO_DATA))
69 with open(UMOFILE, 'wb') as fp:
70 fp.write(base64.decodebytes(UMO_DATA))
71 with open(MMOFILE, 'wb') as fp:
72 fp.write(base64.decodebytes(MMO_DATA))
Walter Dörwald155374d2009-05-01 19:58:58 +000073 self.env = support.EnvironmentVarGuard()
74 self.env['LANGUAGE'] = 'xx'
Éric Araujo37a89332010-11-06 04:09:29 +000075 gettext._translations.clear()
Barry Warsawa1ce93f2003-04-11 18:36:43 +000076
77 def tearDown(self):
Walter Dörwald155374d2009-05-01 19:58:58 +000078 self.env.__exit__()
79 del self.env
Victor Stinnercdb2c602014-07-24 12:07:45 +020080 support.rmtree(os.path.split(LOCALEDIR)[0])
Barry Warsawa1ce93f2003-04-11 18:36:43 +000081
Andrew Kuchling8b963c52015-04-13 10:38:56 -040082GNU_MO_DATA_ISSUE_17898 = b'''\
833hIElQAAAAABAAAAHAAAACQAAAAAAAAAAAAAAAAAAAAsAAAAggAAAC0AAAAAUGx1cmFsLUZvcm1z
84OiBucGx1cmFscz0yOyBwbHVyYWw9KG4gIT0gMSk7CiMtIy0jLSMtIyAgbWVzc2FnZXMucG8gKEVk
85WCBTdHVkaW8pICAjLSMtIy0jLSMKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PVVU
86Ri04CgA=
87'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +000088
89class GettextTestCase1(GettextBaseTest):
90 def setUp(self):
91 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +000092 self.localedir = os.curdir
93 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +000094 gettext.install('gettext', self.localedir)
95
Martin v. Löwisd8996052002-11-21 21:45:32 +000096 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000097 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000098 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +000099 eq(_('albatross'), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000100 eq(_('mullusk'), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000101 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000102 eq(_(r'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000103
104 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000105 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000106 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000107 eq(_("albatross"), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000108 eq(_("mullusk"), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000109 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000110 eq(_(r"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000111
112 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000113 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000114 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000115 eq(_('''albatross'''), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000116 eq(_('''mullusk'''), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000117 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000118 eq(_(r'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000119
120 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000121 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000122 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000123 eq(_("""albatross"""), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000124 eq(_("""mullusk"""), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000125 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000126 eq(_(r"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000127
128 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000129 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000130 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000131 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000132support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000133gettext message catalog library.'''),
134 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000135fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000136trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000137
138 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000139 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000140 # test the alternative interface
Éric Araujo7fa886d2010-11-06 04:11:59 +0000141 with open(self.mofile, 'rb') as fp:
142 t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000143 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000144 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000145 eq(_('nudge nudge'), 'wink wink')
146 # Try unicode return type
Benjamin Peterson801844d2008-07-14 14:32:15 +0000147 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000148 eq(_('mullusk'), 'bacon')
Georg Brandl602b9ba2006-02-19 13:26:36 +0000149 # Test installation of other methods
Georg Brandl1a3284e2007-12-02 09:40:06 +0000150 import builtins
Benjamin Peterson801844d2008-07-14 14:32:15 +0000151 t.install(names=["gettext", "lgettext"])
152 eq(_, t.gettext)
153 eq(builtins.gettext, t.gettext)
Georg Brandl602b9ba2006-02-19 13:26:36 +0000154 eq(lgettext, t.lgettext)
Georg Brandl1a3284e2007-12-02 09:40:06 +0000155 del builtins.gettext
156 del builtins.lgettext
Martin v. Löwisd8996052002-11-21 21:45:32 +0000157
158
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000159class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000160 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000161 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000162 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000163 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000164 gettext.bindtextdomain('gettext', self.localedir)
165 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000166 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000167 self._ = gettext.gettext
168
Martin v. Löwisd8996052002-11-21 21:45:32 +0000169 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000170 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000171
172 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000173 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000174
175 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000176 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000177 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000178 eq(self._('albatross'), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000179 eq(self._('mullusk'), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000180 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000181 eq(self._(r'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000182
183 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000184 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000185 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000186 eq(self._("albatross"), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000187 eq(self._("mullusk"), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000188 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000189 eq(self._(r"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000190
191 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000192 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000193 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000194 eq(self._('''albatross'''), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000195 eq(self._('''mullusk'''), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000196 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000197 eq(self._(r'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000198
199 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000200 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000201 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000202 eq(self._("""albatross"""), 'albatross')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000203 eq(self._("""mullusk"""), 'bacon')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000204 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000205 eq(self._(r"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000206
207 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000208 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000209 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000210 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000211support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000212gettext message catalog library.'''),
213 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000214fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000215trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000216
217
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000218class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000219 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000220 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000221 self.mofile = MOFILE
222
223 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000224 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000225 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000226 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000227 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000228 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000229
230 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000231 eq = self.assertEqual
Éric Araujo7fa886d2010-11-06 04:11:59 +0000232 with open(self.mofile, 'rb') as fp:
233 t = gettext.GNUTranslations(fp)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000234 x = t.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000235 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000236 x = t.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000237 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000238
239 def test_hu(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000240 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000241 f = gettext.c2py('0')
242 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000243 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000244
245 def test_de(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000246 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000247 f = gettext.c2py('n != 1')
248 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000249 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000250
251 def test_fr(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000252 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000253 f = gettext.c2py('n>1')
254 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000255 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000256
257 def test_gd(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000258 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000259 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
260 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000261 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000262
263 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000264 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000265 # Tests the combination of parentheses and "?:"
266 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
267 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000268 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000269
270 def test_lt(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000271 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000272 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
273 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000274 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000275
276 def test_ru(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000277 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000278 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
279 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000280 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000281
282 def test_pl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000283 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000284 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
285 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000286 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000287
288 def test_sl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000289 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000290 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
291 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000292 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000293
294 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000295 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000296 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000297 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000298
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400299class GNUTranslationParsingTest(GettextBaseTest):
300 def test_plural_form_error_issue17898(self):
301 with open(MOFILE, 'wb') as fp:
302 fp.write(base64.decodebytes(GNU_MO_DATA_ISSUE_17898))
303 with open(MOFILE, 'rb') as fp:
304 # If this runs cleanly, the bug is fixed.
305 t = gettext.GNUTranslations(fp)
306
Martin v. Löwisd8996052002-11-21 21:45:32 +0000307
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000308class UnicodeTranslationsTest(GettextBaseTest):
309 def setUp(self):
310 GettextBaseTest.setUp(self)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000311 with open(UMOFILE, 'rb') as fp:
Barry Warsawedb155f2003-04-24 18:08:13 +0000312 self.t = gettext.GNUTranslations(fp)
Benjamin Peterson801844d2008-07-14 14:32:15 +0000313 self._ = self.t.gettext
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000314
315 def test_unicode_msgid(self):
Benjamin Petersonc9c0f202009-06-30 23:06:06 +0000316 unless = self.assertTrue
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000317 unless(isinstance(self._(''), str))
318 unless(isinstance(self._(''), str))
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000319
320 def test_unicode_msgstr(self):
321 eq = self.assertEqual
Guido van Rossumef87d6e2007-05-02 19:09:54 +0000322 eq(self._('ab\xde'), '\xa4yz')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000323
324
Barry Warsawe960e222003-05-20 17:28:54 +0000325class WeirdMetadataTest(GettextBaseTest):
326 def setUp(self):
327 GettextBaseTest.setUp(self)
Éric Araujo7fa886d2010-11-06 04:11:59 +0000328 with open(MMOFILE, 'rb') as fp:
Barry Warsawe960e222003-05-20 17:28:54 +0000329 try:
330 self.t = gettext.GNUTranslations(fp)
331 except:
332 self.tearDown()
333 raise
Barry Warsawe960e222003-05-20 17:28:54 +0000334
335 def test_weird_metadata(self):
336 info = self.t.info()
Christian Heimes6ae5d7f2007-10-31 18:53:44 +0000337 self.assertEqual(len(info), 9)
Barry Warsawe960e222003-05-20 17:28:54 +0000338 self.assertEqual(info['last-translator'],
339 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
340
341
Éric Araujo6108bf52010-10-04 23:52:37 +0000342class DummyGNUTranslations(gettext.GNUTranslations):
343 def foo(self):
344 return 'foo'
345
346
347class GettextCacheTestCase(GettextBaseTest):
348 def test_cache(self):
349 self.localedir = os.curdir
350 self.mofile = MOFILE
351
352 self.assertEqual(len(gettext._translations), 0)
353
354 t = gettext.translation('gettext', self.localedir)
355
356 self.assertEqual(len(gettext._translations), 1)
357
358 t = gettext.translation('gettext', self.localedir,
359 class_=DummyGNUTranslations)
360
361 self.assertEqual(len(gettext._translations), 2)
362 self.assertEqual(t.__class__, DummyGNUTranslations)
363
364 # Calling it again doesn't add to the cache
365
366 t = gettext.translation('gettext', self.localedir,
367 class_=DummyGNUTranslations)
368
369 self.assertEqual(len(gettext._translations), 2)
370 self.assertEqual(t.__class__, DummyGNUTranslations)
371
372
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000373def test_main():
Benjamin Petersonee8712c2008-05-20 21:35:26 +0000374 support.run_unittest(__name__)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000375
376if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000377 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000378
Barry Warsawff6d8132000-08-25 19:50:38 +0000379
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000380# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000381#
382# The original version was automatically generated from the sources with
383# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000384
Barry Warsaw64dab462000-08-30 03:32:07 +0000385'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000386# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000387# Copyright (C) 2001 Python Software Foundation
388# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000389#
390msgid ""
391msgstr ""
392"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000393"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000394"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000395"Language-Team: XX <python-dev@python.org>\n"
396"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000397"Content-Type: text/plain; charset=iso-8859-1\n"
398"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000399"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000400"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000401
Barry Warsaw64dab462000-08-30 03:32:07 +0000402#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
403#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
404#: test_gettext.py:98
405msgid "nudge nudge"
406msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000407
Barry Warsaw64dab462000-08-30 03:32:07 +0000408#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
409#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
410msgid "albatross"
411msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000412
Barry Warsaw64dab462000-08-30 03:32:07 +0000413#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
414#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
415msgid "Raymond Luxury Yach-t"
416msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000417
Barry Warsaw64dab462000-08-30 03:32:07 +0000418#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
419#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
420#: test_gettext.py:96
421msgid "mullusk"
422msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000423
Barry Warsaw64dab462000-08-30 03:32:07 +0000424#: test_gettext.py:40 test_gettext.py:101
425msgid ""
426"This module provides internationalization and localization\n"
427"support for your Python programs by providing an interface to the GNU\n"
428"gettext message catalog library."
429msgstr ""
430"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
431"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
432"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000433
434# Manually added, as neither pygettext nor xgettext support plural forms
435# in Python.
436msgid "There is %s file"
437msgid_plural "There are %s files"
438msgstr[0] "Hay %s fichero"
439msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000440'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000441
442# Here's the second example po file example, used to generate the UMO_DATA
443# containing utf-8 encoded Unicode strings
444
445'''
446# Dummy translation for the Python test_gettext.py module.
447# Copyright (C) 2001 Python Software Foundation
448# Barry Warsaw <barry@python.org>, 2000.
449#
450msgid ""
451msgstr ""
452"Project-Id-Version: 2.0\n"
453"PO-Revision-Date: 2003-04-11 12:42-0400\n"
454"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
455"Language-Team: XX <python-dev@python.org>\n"
456"MIME-Version: 1.0\n"
457"Content-Type: text/plain; charset=utf-8\n"
458"Content-Transfer-Encoding: 7bit\n"
459"Generated-By: manually\n"
460
461#: nofile:0
462msgid "ab\xc3\x9e"
463msgstr "\xc2\xa4yz"
464'''
Barry Warsawe960e222003-05-20 17:28:54 +0000465
466# Here's the third example po file, used to generate MMO_DATA
467
468'''
469msgid ""
470msgstr ""
471"Project-Id-Version: No Project 0.0\n"
472"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
473"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
474"Last-Translator: John Doe <jdoe@example.com>\n"
475"Jane Foobar <jfoobar@example.com>\n"
476"Language-Team: xx <xx@example.com>\n"
477"MIME-Version: 1.0\n"
478"Content-Type: text/plain; charset=iso-8859-15\n"
479"Content-Transfer-Encoding: quoted-printable\n"
480"Generated-By: pygettext.py 1.3\n"
481'''
Andrew Kuchling8b963c52015-04-13 10:38:56 -0400482
483#
484# messages.po, used for bug 17898
485#
486
487'''
488# test file for http://bugs.python.org/issue17898
489msgid ""
490msgstr ""
491"Plural-Forms: nplurals=2; plural=(n != 1);\n"
492"#-#-#-#-# messages.po (EdX Studio) #-#-#-#-#\n"
493"Content-Type: text/plain; charset=UTF-8\n"
494'''