blob: 76253dedf4f7c12f7a84bf79df7ba8a82565e4b4 [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
7from test.test_support import run_suite
8
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')
Brett Cannon4aebbb02003-04-27 19:42:41 +000061try:
62 LANG = os.environ['LANGUAGE']
63except:
64 LANG = 'en'
Barry Warsawff6d8132000-08-25 19:50:38 +000065
66
Barry Warsawa1ce93f2003-04-11 18:36:43 +000067class GettextBaseTest(unittest.TestCase):
Martin v. Löwisd8996052002-11-21 21:45:32 +000068 def setUp(self):
Neal Norwitza0e0cd32004-07-19 00:08:59 +000069 if not os.path.isdir(LOCALEDIR):
70 os.makedirs(LOCALEDIR)
Barry Warsawa1ce93f2003-04-11 18:36:43 +000071 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()
Barry Warsawe960e222003-05-20 17:28:54 +000077 fp = open(MMOFILE, 'wb')
78 fp.write(base64.decodestring(MMO_DATA))
79 fp.close()
Barry Warsawa1ce93f2003-04-11 18:36:43 +000080 os.environ['LANGUAGE'] = 'xx'
81
82 def tearDown(self):
Brett Cannon4aebbb02003-04-27 19:42:41 +000083 os.environ['LANGUAGE'] = LANG
84 shutil.rmtree(os.path.split(LOCALEDIR)[0])
Barry Warsawa1ce93f2003-04-11 18:36:43 +000085
86
87class GettextTestCase1(GettextBaseTest):
88 def setUp(self):
89 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +000090 self.localedir = os.curdir
91 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +000092 gettext.install('gettext', self.localedir)
93
Martin v. Löwisd8996052002-11-21 21:45:32 +000094 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000095 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000096 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +000097 eq(_('albatross'), 'albatross')
98 eq(_(u'mullusk'), 'bacon')
99 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
100 eq(_(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000101
102 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000103 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000104 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000105 eq(_("albatross"), 'albatross')
106 eq(_(u"mullusk"), 'bacon')
107 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
108 eq(_(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000109
110 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000111 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000112 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000113 eq(_('''albatross'''), 'albatross')
114 eq(_(u'''mullusk'''), 'bacon')
115 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
116 eq(_(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000117
118 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000119 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000120 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000121 eq(_("""albatross"""), 'albatross')
122 eq(_(u"""mullusk"""), 'bacon')
123 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
124 eq(_(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000125
126 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000127 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000128 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000129 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000130support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000131gettext message catalog library.'''),
132 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000133fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000134trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000135
136 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000137 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000138 # test the alternative interface
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000139 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000140 t = gettext.GNUTranslations(fp)
141 fp.close()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000142 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000143 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000144 eq(_('nudge nudge'), 'wink wink')
145 # Try unicode return type
146 t.install(unicode=True)
147 eq(_('mullusk'), 'bacon')
Georg Brandl602b9ba2006-02-19 13:26:36 +0000148 # Test installation of other methods
149 import __builtin__
150 t.install(unicode=True, names=["gettext", "lgettext"])
151 eq(_, t.ugettext)
152 eq(__builtin__.gettext, t.ugettext)
153 eq(lgettext, t.lgettext)
154 del __builtin__.gettext
155 del __builtin__.lgettext
Martin v. Löwisd8996052002-11-21 21:45:32 +0000156
157
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000158class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000159 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000160 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000161 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000162 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000163 gettext.bindtextdomain('gettext', self.localedir)
164 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000165 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000166 self._ = gettext.gettext
167
Martin v. Löwisd8996052002-11-21 21:45:32 +0000168 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000169 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000170
171 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000172 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000173
174 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000175 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000176 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000177 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')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000181
182 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000183 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000184 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000185 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')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000189
190 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000191 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000192 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000193 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')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000197
198 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000199 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000200 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000201 eq(self._("""albatross"""), 'albatross')
202 eq(self._(u"""mullusk"""), 'bacon')
203 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
204 eq(self._(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000205
206 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000207 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000208 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000209 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000210support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000211gettext message catalog library.'''),
212 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000213fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000214trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000215
216
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000217class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000218 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000219 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000220 self.mofile = MOFILE
221
222 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000223 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000224 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000225 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000226 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000227 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000228
229 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000230 eq = self.assertEqual
231 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000232 t = gettext.GNUTranslations(fp)
233 fp.close()
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
299
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000300class UnicodeTranslationsTest(GettextBaseTest):
301 def setUp(self):
302 GettextBaseTest.setUp(self)
303 fp = open(UMOFILE, 'rb')
304 try:
Barry Warsawedb155f2003-04-24 18:08:13 +0000305 self.t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000306 finally:
307 fp.close()
308 self._ = self.t.ugettext
309
310 def test_unicode_msgid(self):
311 unless = self.failUnless
312 unless(isinstance(self._(''), unicode))
313 unless(isinstance(self._(u''), unicode))
314
315 def test_unicode_msgstr(self):
316 eq = self.assertEqual
317 eq(self._(u'ab\xde'), u'\xa4yz')
318
319
Barry Warsawe960e222003-05-20 17:28:54 +0000320class WeirdMetadataTest(GettextBaseTest):
321 def setUp(self):
322 GettextBaseTest.setUp(self)
323 fp = open(MMOFILE, 'rb')
324 try:
325 try:
326 self.t = gettext.GNUTranslations(fp)
327 except:
328 self.tearDown()
329 raise
330 finally:
331 fp.close()
332
333 def test_weird_metadata(self):
334 info = self.t.info()
335 self.assertEqual(info['last-translator'],
336 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
337
338
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000339def suite():
340 suite = unittest.TestSuite()
341 suite.addTest(unittest.makeSuite(GettextTestCase1))
342 suite.addTest(unittest.makeSuite(GettextTestCase2))
343 suite.addTest(unittest.makeSuite(PluralFormsTestCase))
344 suite.addTest(unittest.makeSuite(UnicodeTranslationsTest))
Barry Warsawe960e222003-05-20 17:28:54 +0000345 suite.addTest(unittest.makeSuite(WeirdMetadataTest))
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000346 return suite
Tim Peters0eadaac2003-04-24 16:02:54 +0000347
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000348
349def test_main():
350 run_suite(suite())
351
Martin v. Löwisd8996052002-11-21 21:45:32 +0000352
353if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000354 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000355
Barry Warsawff6d8132000-08-25 19:50:38 +0000356
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000357# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000358#
359# The original version was automatically generated from the sources with
360# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000361
Barry Warsaw64dab462000-08-30 03:32:07 +0000362'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000363# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000364# Copyright (C) 2001 Python Software Foundation
365# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000366#
367msgid ""
368msgstr ""
369"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000370"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000371"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000372"Language-Team: XX <python-dev@python.org>\n"
373"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000374"Content-Type: text/plain; charset=iso-8859-1\n"
375"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000376"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000377"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000378
Barry Warsaw64dab462000-08-30 03:32:07 +0000379#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
380#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
381#: test_gettext.py:98
382msgid "nudge nudge"
383msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000384
Barry Warsaw64dab462000-08-30 03:32:07 +0000385#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
386#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
387msgid "albatross"
388msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000389
Barry Warsaw64dab462000-08-30 03:32:07 +0000390#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
391#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
392msgid "Raymond Luxury Yach-t"
393msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000394
Barry Warsaw64dab462000-08-30 03:32:07 +0000395#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
396#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
397#: test_gettext.py:96
398msgid "mullusk"
399msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000400
Barry Warsaw64dab462000-08-30 03:32:07 +0000401#: test_gettext.py:40 test_gettext.py:101
402msgid ""
403"This module provides internationalization and localization\n"
404"support for your Python programs by providing an interface to the GNU\n"
405"gettext message catalog library."
406msgstr ""
407"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
408"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
409"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000410
411# Manually added, as neither pygettext nor xgettext support plural forms
412# in Python.
413msgid "There is %s file"
414msgid_plural "There are %s files"
415msgstr[0] "Hay %s fichero"
416msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000417'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000418
419# Here's the second example po file example, used to generate the UMO_DATA
420# containing utf-8 encoded Unicode strings
421
422'''
423# Dummy translation for the Python test_gettext.py module.
424# Copyright (C) 2001 Python Software Foundation
425# Barry Warsaw <barry@python.org>, 2000.
426#
427msgid ""
428msgstr ""
429"Project-Id-Version: 2.0\n"
430"PO-Revision-Date: 2003-04-11 12:42-0400\n"
431"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
432"Language-Team: XX <python-dev@python.org>\n"
433"MIME-Version: 1.0\n"
434"Content-Type: text/plain; charset=utf-8\n"
435"Content-Transfer-Encoding: 7bit\n"
436"Generated-By: manually\n"
437
438#: nofile:0
439msgid "ab\xc3\x9e"
440msgstr "\xc2\xa4yz"
441'''
Barry Warsawe960e222003-05-20 17:28:54 +0000442
443# Here's the third example po file, used to generate MMO_DATA
444
445'''
446msgid ""
447msgstr ""
448"Project-Id-Version: No Project 0.0\n"
449"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
450"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
451"Last-Translator: John Doe <jdoe@example.com>\n"
452"Jane Foobar <jfoobar@example.com>\n"
453"Language-Team: xx <xx@example.com>\n"
454"MIME-Version: 1.0\n"
455"Content-Type: text/plain; charset=iso-8859-15\n"
456"Content-Transfer-Encoding: quoted-printable\n"
457"Generated-By: pygettext.py 1.3\n"
458'''