blob: f0369543e0fea2b606b27ec8e9c48671977274ba [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
Collin Winterc2898c52007-04-25 17:29:52 +00007from test import test_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
Barry Warsawff6d8132000-08-25 19:50:38 +000016GNU_MO_DATA = '''\
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
Barry Warsawa1ce93f2003-04-11 18:36:43 +000036UMO_DATA = '''\
373hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
38AQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
39ZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
40eSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
41ZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
42bjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
43ZC1CeTogbWFudWFsbHkKAMKkeXoA
44'''
Fred Drake004d5e62000-10-23 17:22:08 +000045
Barry Warsawe960e222003-05-20 17:28:54 +000046MMO_DATA = '''\
473hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
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 Araujo54274ad2011-02-03 00:12:18 +000067 with open(MOFILE, 'wb') as fp:
68 fp.write(base64.decodestring(GNU_MO_DATA))
69 with open(UMOFILE, 'wb') as fp:
70 fp.write(base64.decodestring(UMO_DATA))
71 with open(MMOFILE, 'wb') as fp:
72 fp.write(base64.decodestring(MMO_DATA))
73
Walter Dörwald6733bed2009-05-01 17:35:37 +000074 self.env = test_support.EnvironmentVarGuard()
75 self.env['LANGUAGE'] = 'xx'
Éric Araujoe28665a2010-11-06 04:36:28 +000076 gettext._translations.clear()
Barry Warsawa1ce93f2003-04-11 18:36:43 +000077
78 def tearDown(self):
Walter Dörwald6733bed2009-05-01 17:35:37 +000079 self.env.__exit__()
80 del self.env
Brett Cannon4aebbb02003-04-27 19:42:41 +000081 shutil.rmtree(os.path.split(LOCALEDIR)[0])
Barry Warsawa1ce93f2003-04-11 18:36:43 +000082
83
84class GettextTestCase1(GettextBaseTest):
85 def setUp(self):
86 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +000087 self.localedir = os.curdir
88 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +000089 gettext.install('gettext', self.localedir)
90
Martin v. Löwisd8996052002-11-21 21:45:32 +000091 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000092 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000093 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +000094 eq(_('albatross'), 'albatross')
95 eq(_(u'mullusk'), 'bacon')
96 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
97 eq(_(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +000098
99 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000100 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000101 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000102 eq(_("albatross"), 'albatross')
103 eq(_(u"mullusk"), 'bacon')
104 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
105 eq(_(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000106
107 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000108 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000109 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000110 eq(_('''albatross'''), 'albatross')
111 eq(_(u'''mullusk'''), 'bacon')
112 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
113 eq(_(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000114
115 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000116 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000117 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000118 eq(_("""albatross"""), 'albatross')
119 eq(_(u"""mullusk"""), 'bacon')
120 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
121 eq(_(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000122
123 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000124 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000125 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000126 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000127support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000128gettext message catalog library.'''),
129 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000130fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000131trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000132
133 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000134 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000135 # test the alternative interface
Éric Araujo54274ad2011-02-03 00:12:18 +0000136 with open(self.mofile, 'rb') as fp:
137 t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000138 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000139 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000140 eq(_('nudge nudge'), 'wink wink')
141 # Try unicode return type
142 t.install(unicode=True)
143 eq(_('mullusk'), 'bacon')
Georg Brandl602b9ba2006-02-19 13:26:36 +0000144 # Test installation of other methods
145 import __builtin__
146 t.install(unicode=True, names=["gettext", "lgettext"])
147 eq(_, t.ugettext)
148 eq(__builtin__.gettext, t.ugettext)
149 eq(lgettext, t.lgettext)
150 del __builtin__.gettext
151 del __builtin__.lgettext
Martin v. Löwisd8996052002-11-21 21:45:32 +0000152
153
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000154class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000155 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000156 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000157 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000158 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000159 gettext.bindtextdomain('gettext', self.localedir)
160 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000161 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000162 self._ = gettext.gettext
163
Martin v. Löwisd8996052002-11-21 21:45:32 +0000164 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000165 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000166
167 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000168 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000169
170 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000171 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000172 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000173 eq(self._('albatross'), 'albatross')
174 eq(self._(u'mullusk'), 'bacon')
175 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
176 eq(self._(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000177
178 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000179 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000180 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000181 eq(self._("albatross"), 'albatross')
182 eq(self._(u"mullusk"), 'bacon')
183 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
184 eq(self._(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000185
186 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000187 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000188 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000189 eq(self._('''albatross'''), 'albatross')
190 eq(self._(u'''mullusk'''), 'bacon')
191 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
192 eq(self._(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000193
194 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000195 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000196 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000197 eq(self._("""albatross"""), 'albatross')
198 eq(self._(u"""mullusk"""), 'bacon')
199 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
200 eq(self._(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000201
202 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000203 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000204 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000205 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000206support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000207gettext message catalog library.'''),
208 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000209fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000210trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000211
212
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000213class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000214 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000215 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000216 self.mofile = MOFILE
217
218 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000219 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000220 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000221 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000222 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000223 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000224
225 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000226 eq = self.assertEqual
Éric Araujo54274ad2011-02-03 00:12:18 +0000227 with open(self.mofile, 'rb') as fp:
228 t = gettext.GNUTranslations(fp)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000229 x = t.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000230 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000231 x = t.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000232 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000233
234 def test_hu(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000235 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000236 f = gettext.c2py('0')
237 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000238 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000239
240 def test_de(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000241 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000242 f = gettext.c2py('n != 1')
243 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000244 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000245
246 def test_fr(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000247 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000248 f = gettext.c2py('n>1')
249 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000250 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000251
252 def test_gd(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000253 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000254 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
255 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000256 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000257
258 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000259 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000260 # Tests the combination of parentheses and "?:"
261 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
262 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000263 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000264
265 def test_lt(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000266 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000267 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
268 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000269 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000270
271 def test_ru(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000272 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000273 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
274 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000275 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000276
277 def test_pl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000278 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000279 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
280 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000281 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000282
283 def test_sl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000284 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000285 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
286 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000287 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000288
289 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000290 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000291 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000292 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000293
294
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000295class UnicodeTranslationsTest(GettextBaseTest):
296 def setUp(self):
297 GettextBaseTest.setUp(self)
Éric Araujo54274ad2011-02-03 00:12:18 +0000298 with open(UMOFILE, 'rb') as fp:
Barry Warsawedb155f2003-04-24 18:08:13 +0000299 self.t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000300 self._ = self.t.ugettext
301
302 def test_unicode_msgid(self):
Benjamin Peterson5c8da862009-06-30 22:57:08 +0000303 unless = self.assertTrue
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000304 unless(isinstance(self._(''), unicode))
305 unless(isinstance(self._(u''), unicode))
306
307 def test_unicode_msgstr(self):
308 eq = self.assertEqual
309 eq(self._(u'ab\xde'), u'\xa4yz')
310
311
Barry Warsawe960e222003-05-20 17:28:54 +0000312class WeirdMetadataTest(GettextBaseTest):
313 def setUp(self):
314 GettextBaseTest.setUp(self)
Éric Araujo54274ad2011-02-03 00:12:18 +0000315 with open(MMOFILE, 'rb') as fp:
Barry Warsawe960e222003-05-20 17:28:54 +0000316 try:
317 self.t = gettext.GNUTranslations(fp)
318 except:
319 self.tearDown()
320 raise
Barry Warsawe960e222003-05-20 17:28:54 +0000321
322 def test_weird_metadata(self):
323 info = self.t.info()
324 self.assertEqual(info['last-translator'],
325 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
326
327
Éric Araujoc17776f2010-10-04 23:59:35 +0000328class DummyGNUTranslations(gettext.GNUTranslations):
329 def foo(self):
330 return 'foo'
331
332
333class GettextCacheTestCase(GettextBaseTest):
334 def test_cache(self):
335 self.localedir = os.curdir
336 self.mofile = MOFILE
337
338 self.assertEqual(len(gettext._translations), 0)
339
340 t = gettext.translation('gettext', self.localedir)
341
342 self.assertEqual(len(gettext._translations), 1)
343
344 t = gettext.translation('gettext', self.localedir,
345 class_=DummyGNUTranslations)
346
347 self.assertEqual(len(gettext._translations), 2)
348 self.assertEqual(t.__class__, DummyGNUTranslations)
349
350 # Calling it again doesn't add to the cache
351
352 t = gettext.translation('gettext', self.localedir,
353 class_=DummyGNUTranslations)
354
355 self.assertEqual(len(gettext._translations), 2)
356 self.assertEqual(t.__class__, DummyGNUTranslations)
357
358
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000359def test_main():
Collin Winterc2898c52007-04-25 17:29:52 +0000360 test_support.run_unittest(__name__)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000361
362if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000363 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000364
Barry Warsawff6d8132000-08-25 19:50:38 +0000365
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000366# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000367#
368# The original version was automatically generated from the sources with
369# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000370
Barry Warsaw64dab462000-08-30 03:32:07 +0000371'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000372# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000373# Copyright (C) 2001 Python Software Foundation
374# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000375#
376msgid ""
377msgstr ""
378"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000379"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000380"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000381"Language-Team: XX <python-dev@python.org>\n"
382"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000383"Content-Type: text/plain; charset=iso-8859-1\n"
384"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000385"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000386"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000387
Barry Warsaw64dab462000-08-30 03:32:07 +0000388#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
389#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
390#: test_gettext.py:98
391msgid "nudge nudge"
392msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000393
Barry Warsaw64dab462000-08-30 03:32:07 +0000394#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
395#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
396msgid "albatross"
397msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000398
Barry Warsaw64dab462000-08-30 03:32:07 +0000399#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
400#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
401msgid "Raymond Luxury Yach-t"
402msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000403
Barry Warsaw64dab462000-08-30 03:32:07 +0000404#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
405#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
406#: test_gettext.py:96
407msgid "mullusk"
408msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000409
Barry Warsaw64dab462000-08-30 03:32:07 +0000410#: test_gettext.py:40 test_gettext.py:101
411msgid ""
412"This module provides internationalization and localization\n"
413"support for your Python programs by providing an interface to the GNU\n"
414"gettext message catalog library."
415msgstr ""
416"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
417"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
418"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000419
420# Manually added, as neither pygettext nor xgettext support plural forms
421# in Python.
422msgid "There is %s file"
423msgid_plural "There are %s files"
424msgstr[0] "Hay %s fichero"
425msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000426'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000427
428# Here's the second example po file example, used to generate the UMO_DATA
429# containing utf-8 encoded Unicode strings
430
431'''
432# Dummy translation for the Python test_gettext.py module.
433# Copyright (C) 2001 Python Software Foundation
434# Barry Warsaw <barry@python.org>, 2000.
435#
436msgid ""
437msgstr ""
438"Project-Id-Version: 2.0\n"
439"PO-Revision-Date: 2003-04-11 12:42-0400\n"
440"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
441"Language-Team: XX <python-dev@python.org>\n"
442"MIME-Version: 1.0\n"
443"Content-Type: text/plain; charset=utf-8\n"
444"Content-Transfer-Encoding: 7bit\n"
445"Generated-By: manually\n"
446
447#: nofile:0
448msgid "ab\xc3\x9e"
449msgstr "\xc2\xa4yz"
450'''
Barry Warsawe960e222003-05-20 17:28:54 +0000451
452# Here's the third example po file, used to generate MMO_DATA
453
454'''
455msgid ""
456msgstr ""
457"Project-Id-Version: No Project 0.0\n"
458"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
459"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
460"Last-Translator: John Doe <jdoe@example.com>\n"
461"Jane Foobar <jfoobar@example.com>\n"
462"Language-Team: xx <xx@example.com>\n"
463"MIME-Version: 1.0\n"
464"Content-Type: text/plain; charset=iso-8859-15\n"
465"Content-Transfer-Encoding: quoted-printable\n"
466"Generated-By: pygettext.py 1.3\n"
467'''