]>
git.proxmox.com Git - mirror_edk2.git/blob - AppPkg/Applications/Python/Python-2.7.2/Lib/test/test_gettext.py
7 from test
import test_support
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.
17 3hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
18 AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
19 AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
20 eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
21 aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
22 CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
23 Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
24 ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
25 MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
26 YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
27 SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
28 NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
29 ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
30 d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
31 eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
32 IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
33 ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
37 3hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
38 AQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
39 ZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
40 eSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
41 ZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
42 bjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
43 ZC1CeTogbWFudWFsbHkKAMKkeXoA
47 3hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
48 UHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
49 IERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
50 NTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
51 ZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
52 cGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
53 c2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
54 bGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
57 LOCALEDIR
= os
.path
.join('xx', 'LC_MESSAGES')
58 MOFILE
= os
.path
.join(LOCALEDIR
, 'gettext.mo')
59 UMOFILE
= os
.path
.join(LOCALEDIR
, 'ugettext.mo')
60 MMOFILE
= os
.path
.join(LOCALEDIR
, 'metadata.mo')
63 class GettextBaseTest(unittest
.TestCase
):
65 if not os
.path
.isdir(LOCALEDIR
):
66 os
.makedirs(LOCALEDIR
)
67 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
))
74 self
.env
= test_support
.EnvironmentVarGuard()
75 self
.env
['LANGUAGE'] = 'xx'
76 gettext
._translations
.clear()
81 shutil
.rmtree(os
.path
.split(LOCALEDIR
)[0])
84 class GettextTestCase1(GettextBaseTest
):
86 GettextBaseTest
.setUp(self
)
87 self
.localedir
= os
.curdir
89 gettext
.install('gettext', self
.localedir
)
91 def test_some_translations(self
):
93 # test some translations
94 eq(_('albatross'), 'albatross')
95 eq(_(u
'mullusk'), 'bacon')
96 eq(_(r
'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
97 eq(_(ur
'nudge nudge'), 'wink wink')
99 def test_double_quotes(self
):
100 eq
= self
.assertEqual
102 eq(_("albatross"), 'albatross')
103 eq(_(u
"mullusk"), 'bacon')
104 eq(_(r
"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
105 eq(_(ur
"nudge nudge"), 'wink wink')
107 def test_triple_single_quotes(self
):
108 eq
= self
.assertEqual
109 # triple single quotes
110 eq(_('''albatross'''), 'albatross')
111 eq(_(u
'''mullusk'''), 'bacon')
112 eq(_(r
'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
113 eq(_(ur
'''nudge nudge'''), 'wink wink')
115 def test_triple_double_quotes(self
):
116 eq
= self
.assertEqual
117 # triple double quotes
118 eq(_("""albatross"""), 'albatross')
119 eq(_(u
"""mullusk"""), 'bacon')
120 eq(_(r
"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
121 eq(_(ur
"""nudge nudge"""), 'wink wink')
123 def test_multiline_strings(self
):
124 eq
= self
.assertEqual
126 eq(_('''This module provides internationalization and localization
127 support for your Python programs by providing an interface to the GNU
128 gettext message catalog library.'''),
129 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
130 fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
131 trggrkg zrffntr pngnybt yvoenel.''')
133 def test_the_alternative_interface(self
):
134 eq
= self
.assertEqual
135 # test the alternative interface
136 with
open(self
.mofile
, 'rb') as fp
:
137 t
= gettext
.GNUTranslations(fp
)
138 # Install the translation object
140 eq(_('nudge nudge'), 'wink wink')
141 # Try unicode return type
142 t
.install(unicode=True)
143 eq(_('mullusk'), 'bacon')
144 # Test installation of other methods
146 t
.install(unicode=True, names
=["gettext", "lgettext"])
148 eq(__builtin__
.gettext
, t
.ugettext
)
149 eq(lgettext
, t
.lgettext
)
150 del __builtin__
.gettext
151 del __builtin__
.lgettext
154 class GettextTestCase2(GettextBaseTest
):
156 GettextBaseTest
.setUp(self
)
157 self
.localedir
= os
.curdir
158 # Set up the bindings
159 gettext
.bindtextdomain('gettext', self
.localedir
)
160 gettext
.textdomain('gettext')
162 self
._ = gettext
.gettext
164 def test_bindtextdomain(self
):
165 self
.assertEqual(gettext
.bindtextdomain('gettext'), self
.localedir
)
167 def test_textdomain(self
):
168 self
.assertEqual(gettext
.textdomain(), 'gettext')
170 def test_some_translations(self
):
171 eq
= self
.assertEqual
172 # test some translations
173 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')
178 def test_double_quotes(self
):
179 eq
= self
.assertEqual
181 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')
186 def test_triple_single_quotes(self
):
187 eq
= self
.assertEqual
188 # triple single quotes
189 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')
194 def test_triple_double_quotes(self
):
195 eq
= self
.assertEqual
196 # triple double quotes
197 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')
202 def test_multiline_strings(self
):
203 eq
= self
.assertEqual
205 eq(self
._('''This module provides internationalization and localization
206 support for your Python programs by providing an interface to the GNU
207 gettext message catalog library.'''),
208 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
209 fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
210 trggrkg zrffntr pngnybt yvoenel.''')
213 class PluralFormsTestCase(GettextBaseTest
):
215 GettextBaseTest
.setUp(self
)
218 def test_plural_forms1(self
):
219 eq
= self
.assertEqual
220 x
= gettext
.ngettext('There is %s file', 'There are %s files', 1)
221 eq(x
, 'Hay %s fichero')
222 x
= gettext
.ngettext('There is %s file', 'There are %s files', 2)
223 eq(x
, 'Hay %s ficheros')
225 def test_plural_forms2(self
):
226 eq
= self
.assertEqual
227 with
open(self
.mofile
, 'rb') as fp
:
228 t
= gettext
.GNUTranslations(fp
)
229 x
= t
.ngettext('There is %s file', 'There are %s files', 1)
230 eq(x
, 'Hay %s fichero')
231 x
= t
.ngettext('There is %s file', 'There are %s files', 2)
232 eq(x
, 'Hay %s ficheros')
235 eq
= self
.assertEqual
236 f
= gettext
.c2py('0')
237 s
= ''.join([ str(f(x
)) for x
in range(200) ])
238 eq(s
, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
241 eq
= self
.assertEqual
242 f
= gettext
.c2py('n != 1')
243 s
= ''.join([ str(f(x
)) for x
in range(200) ])
244 eq(s
, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
247 eq
= self
.assertEqual
248 f
= gettext
.c2py('n>1')
249 s
= ''.join([ str(f(x
)) for x
in range(200) ])
250 eq(s
, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
253 eq
= self
.assertEqual
254 f
= gettext
.c2py('n==1 ? 0 : n==2 ? 1 : 2')
255 s
= ''.join([ str(f(x
)) for x
in range(200) ])
256 eq(s
, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
259 eq
= self
.assertEqual
260 # 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) ])
263 eq(s
, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
266 eq
= self
.assertEqual
267 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) ])
269 eq(s
, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
272 eq
= self
.assertEqual
273 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) ])
275 eq(s
, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
278 eq
= self
.assertEqual
279 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) ])
281 eq(s
, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
284 eq
= self
.assertEqual
285 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) ])
287 eq(s
, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
289 def test_security(self
):
290 raises
= self
.assertRaises
291 # Test for a dangerous expression
292 raises(ValueError, gettext
.c2py
, "os.chmod('/etc/passwd',0777)")
295 class UnicodeTranslationsTest(GettextBaseTest
):
297 GettextBaseTest
.setUp(self
)
298 with
open(UMOFILE
, 'rb') as fp
:
299 self
.t
= gettext
.GNUTranslations(fp
)
300 self
._ = self
.t
.ugettext
302 def test_unicode_msgid(self
):
303 unless
= self
.assertTrue
304 unless(isinstance(self
._(''), unicode))
305 unless(isinstance(self
._(u
''), unicode))
307 def test_unicode_msgstr(self
):
308 eq
= self
.assertEqual
309 eq(self
._(u
'ab\xde'), u
'\xa4yz')
312 class WeirdMetadataTest(GettextBaseTest
):
314 GettextBaseTest
.setUp(self
)
315 with
open(MMOFILE
, 'rb') as fp
:
317 self
.t
= gettext
.GNUTranslations(fp
)
322 def test_weird_metadata(self
):
324 self
.assertEqual(info
['last-translator'],
325 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
328 class DummyGNUTranslations(gettext
.GNUTranslations
):
333 class GettextCacheTestCase(GettextBaseTest
):
334 def test_cache(self
):
335 self
.localedir
= os
.curdir
338 self
.assertEqual(len(gettext
._translations
), 0)
340 t
= gettext
.translation('gettext', self
.localedir
)
342 self
.assertEqual(len(gettext
._translations
), 1)
344 t
= gettext
.translation('gettext', self
.localedir
,
345 class_
=DummyGNUTranslations
)
347 self
.assertEqual(len(gettext
._translations
), 2)
348 self
.assertEqual(t
.__class
__, DummyGNUTranslations
)
350 # Calling it again doesn't add to the cache
352 t
= gettext
.translation('gettext', self
.localedir
,
353 class_
=DummyGNUTranslations
)
355 self
.assertEqual(len(gettext
._translations
), 2)
356 self
.assertEqual(t
.__class
__, DummyGNUTranslations
)
360 test_support
.run_unittest(__name__
)
362 if __name__
== '__main__':
366 # For reference, here's the .po file used to created the GNU_MO_DATA above.
368 # The original version was automatically generated from the sources with
369 # pygettext. Later it was manually modified to add plural forms support.
372 # Dummy translation for the Python test_gettext.py module.
373 # Copyright (C) 2001 Python Software Foundation
374 # Barry Warsaw <barry@python.org>, 2000.
378 "Project-Id-Version: 2.0\n"
379 "PO-Revision-Date: 2003-04-11 14:32-0400\n"
380 "Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
381 "Language-Team: XX <python-dev@python.org>\n"
382 "MIME-Version: 1.0\n"
383 "Content-Type: text/plain; charset=iso-8859-1\n"
384 "Content-Transfer-Encoding: 8bit\n"
385 "Generated-By: pygettext.py 1.1\n"
386 "Plural-Forms: nplurals=2; plural=n!=1;\n"
388 #: 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
394 #: 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
399 #: 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
401 msgid "Raymond Luxury Yach-t"
402 msgstr "Throatwobbler Mangrove"
404 #: 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
410 #: test_gettext.py:40 test_gettext.py:101
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."
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."
420 # Manually added, as neither pygettext nor xgettext support plural forms
422 msgid "There is %s file"
423 msgid_plural "There are %s files"
424 msgstr[0] "Hay %s fichero"
425 msgstr[1] "Hay %s ficheros"
428 # Here's the second example po file example, used to generate the UMO_DATA
429 # containing utf-8 encoded Unicode strings
432 # Dummy translation for the Python test_gettext.py module.
433 # Copyright (C) 2001 Python Software Foundation
434 # Barry Warsaw <barry@python.org>, 2000.
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"
452 # Here's the third example po file, used to generate MMO_DATA
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"