Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / devtools / v9 / lib / python2.4 / test / test_gettext.py
CommitLineData
920dae64
AT
1import os
2import base64
3import shutil
4import gettext
5import unittest
6
7from test.test_support import run_suite
8
9
10# 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.
15
16GNU_MO_DATA = '''\
173hIElQAAAAAGAAAAHAAAAEwAAAALAAAAfAAAAAAAAACoAAAAFQAAAKkAAAAjAAAAvwAAAKEAAADj
18AAAABwAAAIUBAAALAAAAjQEAAEUBAACZAQAAFgAAAN8CAAAeAAAA9gIAAKEAAAAVAwAABQAAALcD
19AAAJAAAAvQMAAAEAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAABQAAAAYAAAACAAAAAFJh
20eW1vbmQgTHV4dXJ5IFlhY2gtdABUaGVyZSBpcyAlcyBmaWxlAFRoZXJlIGFyZSAlcyBmaWxlcwBU
21aGlzIG1vZHVsZSBwcm92aWRlcyBpbnRlcm5hdGlvbmFsaXphdGlvbiBhbmQgbG9jYWxpemF0aW9u
22CnN1cHBvcnQgZm9yIHlvdXIgUHl0aG9uIHByb2dyYW1zIGJ5IHByb3ZpZGluZyBhbiBpbnRlcmZh
23Y2UgdG8gdGhlIEdOVQpnZXR0ZXh0IG1lc3NhZ2UgY2F0YWxvZyBsaWJyYXJ5LgBtdWxsdXNrAG51
24ZGdlIG51ZGdlAFByb2plY3QtSWQtVmVyc2lvbjogMi4wClBPLVJldmlzaW9uLURhdGU6IDIwMDAt
25MDgtMjkgMTI6MTktMDQ6MDAKTGFzdC1UcmFuc2xhdG9yOiBKLiBEYXZpZCBJYsOhw7FleiA8ai1k
26YXZpZEBub29zLmZyPgpMYW5ndWFnZS1UZWFtOiBYWCA8cHl0aG9uLWRldkBweXRob24ub3JnPgpN
27SU1FLVZlcnNpb246IDEuMApDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9aXNvLTg4
28NTktMQpDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBub25lCkdlbmVyYXRlZC1CeTogcHlnZXR0
29ZXh0LnB5IDEuMQpQbHVyYWwtRm9ybXM6IG5wbHVyYWxzPTI7IHBsdXJhbD1uIT0xOwoAVGhyb2F0
30d29iYmxlciBNYW5ncm92ZQBIYXkgJXMgZmljaGVybwBIYXkgJXMgZmljaGVyb3MAR3V2ZiB6YnFo
31eXIgY2ViaXZxcmYgdmFncmVhbmd2YmFueXZtbmd2YmEgbmFxIHlicG55dm1uZ3ZiYQpmaGNjYmVn
32IHNiZSBsYmhlIENsZ3ViYSBjZWJ0ZW56ZiBvbCBjZWJpdnF2YXQgbmEgdmFncmVzbnByIGdiIGd1
33ciBUQUgKdHJnZ3JrZyB6cmZmbnRyIHBuZ255YnQgeXZvZW5lbC4AYmFjb24Ad2luayB3aW5rAA==
34'''
35
36UMO_DATA = '''\
373hIElQAAAAACAAAAHAAAACwAAAAFAAAAPAAAAAAAAABQAAAABAAAAFEAAAAPAQAAVgAAAAQAAABm
38AQAAAQAAAAIAAAAAAAAAAAAAAAAAAAAAYWLDngBQcm9qZWN0LUlkLVZlcnNpb246IDIuMApQTy1S
39ZXZpc2lvbi1EYXRlOiAyMDAzLTA0LTExIDEyOjQyLTA0MDAKTGFzdC1UcmFuc2xhdG9yOiBCYXJy
40eSBBLiBXQXJzYXcgPGJhcnJ5QHB5dGhvbi5vcmc+Ckxhbmd1YWdlLVRlYW06IFhYIDxweXRob24t
41ZGV2QHB5dGhvbi5vcmc+Ck1JTUUtVmVyc2lvbjogMS4wCkNvbnRlbnQtVHlwZTogdGV4dC9wbGFp
42bjsgY2hhcnNldD11dGYtOApDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CkdlbmVyYXRl
43ZC1CeTogbWFudWFsbHkKAMKkeXoA
44'''
45
46MMO_DATA = '''\
473hIElQAAAAABAAAAHAAAACQAAAADAAAALAAAAAAAAAA4AAAAeAEAADkAAAABAAAAAAAAAAAAAAAA
48UHJvamVjdC1JZC1WZXJzaW9uOiBObyBQcm9qZWN0IDAuMApQT1QtQ3JlYXRpb24tRGF0ZTogV2Vk
49IERlYyAxMSAwNzo0NDoxNSAyMDAyClBPLVJldmlzaW9uLURhdGU6IDIwMDItMDgtMTQgMDE6MTg6
50NTgrMDA6MDAKTGFzdC1UcmFuc2xhdG9yOiBKb2huIERvZSA8amRvZUBleGFtcGxlLmNvbT4KSmFu
51ZSBGb29iYXIgPGpmb29iYXJAZXhhbXBsZS5jb20+Ckxhbmd1YWdlLVRlYW06IHh4IDx4eEBleGFt
52cGxlLmNvbT4KTUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFy
53c2V0PWlzby04ODU5LTE1CkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IHF1b3RlZC1wcmludGFi
54bGUKR2VuZXJhdGVkLUJ5OiBweWdldHRleHQucHkgMS4zCgA=
55'''
56
57LOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
58MOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
59UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
60MMOFILE = os.path.join(LOCALEDIR, 'metadata.mo')
61try:
62 LANG = os.environ['LANGUAGE']
63except:
64 LANG = 'en'
65
66
67class GettextBaseTest(unittest.TestCase):
68 def setUp(self):
69 if not os.path.isdir(LOCALEDIR):
70 os.makedirs(LOCALEDIR)
71 fp = open(MOFILE, 'wb')
72 fp.write(base64.decodestring(GNU_MO_DATA))
73 fp.close()
74 fp = open(UMOFILE, 'wb')
75 fp.write(base64.decodestring(UMO_DATA))
76 fp.close()
77 fp = open(MMOFILE, 'wb')
78 fp.write(base64.decodestring(MMO_DATA))
79 fp.close()
80 os.environ['LANGUAGE'] = 'xx'
81
82 def tearDown(self):
83 os.environ['LANGUAGE'] = LANG
84 shutil.rmtree(os.path.split(LOCALEDIR)[0])
85
86
87class GettextTestCase1(GettextBaseTest):
88 def setUp(self):
89 GettextBaseTest.setUp(self)
90 self.localedir = os.curdir
91 self.mofile = MOFILE
92 gettext.install('gettext', self.localedir)
93
94 def test_some_translations(self):
95 eq = self.assertEqual
96 # test some translations
97 eq(_('albatross'), 'albatross')
98 eq(_(u'mullusk'), 'bacon')
99 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
100 eq(_(ur'nudge nudge'), 'wink wink')
101
102 def test_double_quotes(self):
103 eq = self.assertEqual
104 # double quotes
105 eq(_("albatross"), 'albatross')
106 eq(_(u"mullusk"), 'bacon')
107 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
108 eq(_(ur"nudge nudge"), 'wink wink')
109
110 def test_triple_single_quotes(self):
111 eq = self.assertEqual
112 # triple single quotes
113 eq(_('''albatross'''), 'albatross')
114 eq(_(u'''mullusk'''), 'bacon')
115 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
116 eq(_(ur'''nudge nudge'''), 'wink wink')
117
118 def test_triple_double_quotes(self):
119 eq = self.assertEqual
120 # triple double quotes
121 eq(_("""albatross"""), 'albatross')
122 eq(_(u"""mullusk"""), 'bacon')
123 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
124 eq(_(ur"""nudge nudge"""), 'wink wink')
125
126 def test_multiline_strings(self):
127 eq = self.assertEqual
128 # multiline strings
129 eq(_('''This module provides internationalization and localization
130support for your Python programs by providing an interface to the GNU
131gettext message catalog library.'''),
132 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
133fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
134trggrkg zrffntr pngnybt yvoenel.''')
135
136 def test_the_alternative_interface(self):
137 eq = self.assertEqual
138 # test the alternative interface
139 fp = open(self.mofile, 'rb')
140 t = gettext.GNUTranslations(fp)
141 fp.close()
142 # Install the translation object
143 t.install()
144 eq(_('nudge nudge'), 'wink wink')
145 # Try unicode return type
146 t.install(unicode=True)
147 eq(_('mullusk'), 'bacon')
148
149
150class GettextTestCase2(GettextBaseTest):
151 def setUp(self):
152 GettextBaseTest.setUp(self)
153 self.localedir = os.curdir
154 # Set up the bindings
155 gettext.bindtextdomain('gettext', self.localedir)
156 gettext.textdomain('gettext')
157 # For convenience
158 self._ = gettext.gettext
159
160 def test_bindtextdomain(self):
161 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
162
163 def test_textdomain(self):
164 self.assertEqual(gettext.textdomain(), 'gettext')
165
166 def test_some_translations(self):
167 eq = self.assertEqual
168 # test some translations
169 eq(self._('albatross'), 'albatross')
170 eq(self._(u'mullusk'), 'bacon')
171 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
172 eq(self._(ur'nudge nudge'), 'wink wink')
173
174 def test_double_quotes(self):
175 eq = self.assertEqual
176 # double quotes
177 eq(self._("albatross"), 'albatross')
178 eq(self._(u"mullusk"), 'bacon')
179 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
180 eq(self._(ur"nudge nudge"), 'wink wink')
181
182 def test_triple_single_quotes(self):
183 eq = self.assertEqual
184 # triple single quotes
185 eq(self._('''albatross'''), 'albatross')
186 eq(self._(u'''mullusk'''), 'bacon')
187 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
188 eq(self._(ur'''nudge nudge'''), 'wink wink')
189
190 def test_triple_double_quotes(self):
191 eq = self.assertEqual
192 # triple double quotes
193 eq(self._("""albatross"""), 'albatross')
194 eq(self._(u"""mullusk"""), 'bacon')
195 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
196 eq(self._(ur"""nudge nudge"""), 'wink wink')
197
198 def test_multiline_strings(self):
199 eq = self.assertEqual
200 # multiline strings
201 eq(self._('''This module provides internationalization and localization
202support for your Python programs by providing an interface to the GNU
203gettext message catalog library.'''),
204 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
205fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
206trggrkg zrffntr pngnybt yvoenel.''')
207
208
209class PluralFormsTestCase(GettextBaseTest):
210 def setUp(self):
211 GettextBaseTest.setUp(self)
212 self.mofile = MOFILE
213
214 def test_plural_forms1(self):
215 eq = self.assertEqual
216 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
217 eq(x, 'Hay %s fichero')
218 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
219 eq(x, 'Hay %s ficheros')
220
221 def test_plural_forms2(self):
222 eq = self.assertEqual
223 fp = open(self.mofile, 'rb')
224 t = gettext.GNUTranslations(fp)
225 fp.close()
226 x = t.ngettext('There is %s file', 'There are %s files', 1)
227 eq(x, 'Hay %s fichero')
228 x = t.ngettext('There is %s file', 'There are %s files', 2)
229 eq(x, 'Hay %s ficheros')
230
231 def test_hu(self):
232 eq = self.assertEqual
233 f = gettext.c2py('0')
234 s = ''.join([ str(f(x)) for x in range(200) ])
235 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
236
237 def test_de(self):
238 eq = self.assertEqual
239 f = gettext.c2py('n != 1')
240 s = ''.join([ str(f(x)) for x in range(200) ])
241 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
242
243 def test_fr(self):
244 eq = self.assertEqual
245 f = gettext.c2py('n>1')
246 s = ''.join([ str(f(x)) for x in range(200) ])
247 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
248
249 def test_gd(self):
250 eq = self.assertEqual
251 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
252 s = ''.join([ str(f(x)) for x in range(200) ])
253 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
254
255 def test_gd2(self):
256 eq = self.assertEqual
257 # Tests the combination of parentheses and "?:"
258 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
259 s = ''.join([ str(f(x)) for x in range(200) ])
260 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
261
262 def test_lt(self):
263 eq = self.assertEqual
264 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
265 s = ''.join([ str(f(x)) for x in range(200) ])
266 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
267
268 def test_ru(self):
269 eq = self.assertEqual
270 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
271 s = ''.join([ str(f(x)) for x in range(200) ])
272 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
273
274 def test_pl(self):
275 eq = self.assertEqual
276 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
277 s = ''.join([ str(f(x)) for x in range(200) ])
278 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
279
280 def test_sl(self):
281 eq = self.assertEqual
282 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
283 s = ''.join([ str(f(x)) for x in range(200) ])
284 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
285
286 def test_security(self):
287 raises = self.assertRaises
288 # Test for a dangerous expression
289 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
290
291
292class UnicodeTranslationsTest(GettextBaseTest):
293 def setUp(self):
294 GettextBaseTest.setUp(self)
295 fp = open(UMOFILE, 'rb')
296 try:
297 self.t = gettext.GNUTranslations(fp)
298 finally:
299 fp.close()
300 self._ = self.t.ugettext
301
302 def test_unicode_msgid(self):
303 unless = self.failUnless
304 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
312class WeirdMetadataTest(GettextBaseTest):
313 def setUp(self):
314 GettextBaseTest.setUp(self)
315 fp = open(MMOFILE, 'rb')
316 try:
317 try:
318 self.t = gettext.GNUTranslations(fp)
319 except:
320 self.tearDown()
321 raise
322 finally:
323 fp.close()
324
325 def test_weird_metadata(self):
326 info = self.t.info()
327 self.assertEqual(info['last-translator'],
328 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
329
330
331def suite():
332 suite = unittest.TestSuite()
333 suite.addTest(unittest.makeSuite(GettextTestCase1))
334 suite.addTest(unittest.makeSuite(GettextTestCase2))
335 suite.addTest(unittest.makeSuite(PluralFormsTestCase))
336 suite.addTest(unittest.makeSuite(UnicodeTranslationsTest))
337 suite.addTest(unittest.makeSuite(WeirdMetadataTest))
338 return suite
339
340
341def test_main():
342 run_suite(suite())
343
344
345if __name__ == '__main__':
346 test_main()
347
348
349# For reference, here's the .po file used to created the GNU_MO_DATA above.
350#
351# The original version was automatically generated from the sources with
352# pygettext. Later it was manually modified to add plural forms support.
353
354'''
355# Dummy translation for the Python test_gettext.py module.
356# Copyright (C) 2001 Python Software Foundation
357# Barry Warsaw <barry@python.org>, 2000.
358#
359msgid ""
360msgstr ""
361"Project-Id-Version: 2.0\n"
362"PO-Revision-Date: 2003-04-11 14:32-0400\n"
363"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
364"Language-Team: XX <python-dev@python.org>\n"
365"MIME-Version: 1.0\n"
366"Content-Type: text/plain; charset=iso-8859-1\n"
367"Content-Transfer-Encoding: 8bit\n"
368"Generated-By: pygettext.py 1.1\n"
369"Plural-Forms: nplurals=2; plural=n!=1;\n"
370
371#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
372#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
373#: test_gettext.py:98
374msgid "nudge nudge"
375msgstr "wink wink"
376
377#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
378#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
379msgid "albatross"
380msgstr ""
381
382#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
383#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
384msgid "Raymond Luxury Yach-t"
385msgstr "Throatwobbler Mangrove"
386
387#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
388#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
389#: test_gettext.py:96
390msgid "mullusk"
391msgstr "bacon"
392
393#: test_gettext.py:40 test_gettext.py:101
394msgid ""
395"This module provides internationalization and localization\n"
396"support for your Python programs by providing an interface to the GNU\n"
397"gettext message catalog library."
398msgstr ""
399"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
400"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
401"trggrkg zrffntr pngnybt yvoenel."
402
403# Manually added, as neither pygettext nor xgettext support plural forms
404# in Python.
405msgid "There is %s file"
406msgid_plural "There are %s files"
407msgstr[0] "Hay %s fichero"
408msgstr[1] "Hay %s ficheros"
409'''
410
411# Here's the second example po file example, used to generate the UMO_DATA
412# containing utf-8 encoded Unicode strings
413
414'''
415# Dummy translation for the Python test_gettext.py module.
416# Copyright (C) 2001 Python Software Foundation
417# Barry Warsaw <barry@python.org>, 2000.
418#
419msgid ""
420msgstr ""
421"Project-Id-Version: 2.0\n"
422"PO-Revision-Date: 2003-04-11 12:42-0400\n"
423"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
424"Language-Team: XX <python-dev@python.org>\n"
425"MIME-Version: 1.0\n"
426"Content-Type: text/plain; charset=utf-8\n"
427"Content-Transfer-Encoding: 7bit\n"
428"Generated-By: manually\n"
429
430#: nofile:0
431msgid "ab\xc3\x9e"
432msgstr "\xc2\xa4yz"
433'''
434
435# Here's the third example po file, used to generate MMO_DATA
436
437'''
438msgid ""
439msgstr ""
440"Project-Id-Version: No Project 0.0\n"
441"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
442"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
443"Last-Translator: John Doe <jdoe@example.com>\n"
444"Jane Foobar <jfoobar@example.com>\n"
445"Language-Team: xx <xx@example.com>\n"
446"MIME-Version: 1.0\n"
447"Content-Type: text/plain; charset=iso-8859-15\n"
448"Content-Transfer-Encoding: quoted-printable\n"
449"Generated-By: pygettext.py 1.3\n"
450'''