blob: 4a17230546b098643b2dfed1560dce43de4cbac9 [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):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000069 os.makedirs(LOCALEDIR)
70 fp = open(MOFILE, 'wb')
71 fp.write(base64.decodestring(GNU_MO_DATA))
72 fp.close()
73 fp = open(UMOFILE, 'wb')
74 fp.write(base64.decodestring(UMO_DATA))
75 fp.close()
Barry Warsawe960e222003-05-20 17:28:54 +000076 fp = open(MMOFILE, 'wb')
77 fp.write(base64.decodestring(MMO_DATA))
78 fp.close()
Barry Warsawa1ce93f2003-04-11 18:36:43 +000079 os.environ['LANGUAGE'] = 'xx'
80
81 def tearDown(self):
Brett Cannon4aebbb02003-04-27 19:42:41 +000082 os.environ['LANGUAGE'] = LANG
83 shutil.rmtree(os.path.split(LOCALEDIR)[0])
Barry Warsawa1ce93f2003-04-11 18:36:43 +000084
85
86class GettextTestCase1(GettextBaseTest):
87 def setUp(self):
88 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +000089 self.localedir = os.curdir
90 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +000091 gettext.install('gettext', self.localedir)
92
Martin v. Löwisd8996052002-11-21 21:45:32 +000093 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000094 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000095 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +000096 eq(_('albatross'), 'albatross')
97 eq(_(u'mullusk'), 'bacon')
98 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
99 eq(_(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000100
101 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000102 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000103 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000104 eq(_("albatross"), 'albatross')
105 eq(_(u"mullusk"), 'bacon')
106 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
107 eq(_(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000108
109 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000110 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000111 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000112 eq(_('''albatross'''), 'albatross')
113 eq(_(u'''mullusk'''), 'bacon')
114 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
115 eq(_(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000116
117 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000118 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000119 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000120 eq(_("""albatross"""), 'albatross')
121 eq(_(u"""mullusk"""), 'bacon')
122 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
123 eq(_(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000124
125 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000126 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000127 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000128 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000129support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000130gettext message catalog library.'''),
131 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000132fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000133trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000134
135 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000136 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000137 # test the alternative interface
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000138 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000139 t = gettext.GNUTranslations(fp)
140 fp.close()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000141 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000142 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000143 eq(_('nudge nudge'), 'wink wink')
144 # Try unicode return type
145 t.install(unicode=True)
146 eq(_('mullusk'), 'bacon')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000147
148
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000149class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000150 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000151 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000152 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000153 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000154 gettext.bindtextdomain('gettext', self.localedir)
155 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000156 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000157 self._ = gettext.gettext
158
Martin v. Löwisd8996052002-11-21 21:45:32 +0000159 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000160 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000161
162 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000163 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000164
165 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000166 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000167 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000168 eq(self._('albatross'), 'albatross')
169 eq(self._(u'mullusk'), 'bacon')
170 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
171 eq(self._(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000172
173 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000174 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000175 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000176 eq(self._("albatross"), 'albatross')
177 eq(self._(u"mullusk"), 'bacon')
178 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
179 eq(self._(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000180
181 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000182 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000183 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000184 eq(self._('''albatross'''), 'albatross')
185 eq(self._(u'''mullusk'''), 'bacon')
186 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
187 eq(self._(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000188
189 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000190 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000191 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000192 eq(self._("""albatross"""), 'albatross')
193 eq(self._(u"""mullusk"""), 'bacon')
194 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
195 eq(self._(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000196
197 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000198 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000199 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000200 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000201support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000202gettext message catalog library.'''),
203 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000204fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000205trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000206
207
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000208class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000209 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000210 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000211 self.mofile = MOFILE
212
213 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000214 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000215 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000216 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000217 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000218 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000219
220 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000221 eq = self.assertEqual
222 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000223 t = gettext.GNUTranslations(fp)
224 fp.close()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000225 x = t.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 = t.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_hu(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000231 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000232 f = gettext.c2py('0')
233 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000234 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000235
236 def test_de(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000237 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000238 f = gettext.c2py('n != 1')
239 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000240 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000241
242 def test_fr(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000243 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000244 f = gettext.c2py('n>1')
245 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000246 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000247
248 def test_gd(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000249 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000250 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
251 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000252 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000253
254 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000255 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000256 # Tests the combination of parentheses and "?:"
257 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
258 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000259 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000260
261 def test_lt(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000262 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000263 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
264 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000265 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000266
267 def test_ru(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000268 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000269 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
270 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000271 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000272
273 def test_pl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000274 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000275 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
276 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000277 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000278
279 def test_sl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000280 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000281 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
282 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000283 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000284
285 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000286 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000287 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000288 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000289
290
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000291class UnicodeTranslationsTest(GettextBaseTest):
292 def setUp(self):
293 GettextBaseTest.setUp(self)
294 fp = open(UMOFILE, 'rb')
295 try:
Barry Warsawedb155f2003-04-24 18:08:13 +0000296 self.t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000297 finally:
298 fp.close()
299 self._ = self.t.ugettext
300
301 def test_unicode_msgid(self):
302 unless = self.failUnless
303 unless(isinstance(self._(''), unicode))
304 unless(isinstance(self._(u''), unicode))
305
306 def test_unicode_msgstr(self):
307 eq = self.assertEqual
308 eq(self._(u'ab\xde'), u'\xa4yz')
309
310
Barry Warsawe960e222003-05-20 17:28:54 +0000311class WeirdMetadataTest(GettextBaseTest):
312 def setUp(self):
313 GettextBaseTest.setUp(self)
314 fp = open(MMOFILE, 'rb')
315 try:
316 try:
317 self.t = gettext.GNUTranslations(fp)
318 except:
319 self.tearDown()
320 raise
321 finally:
322 fp.close()
323
324 def test_weird_metadata(self):
325 info = self.t.info()
326 self.assertEqual(info['last-translator'],
327 'John Doe <jdoe@example.com>\nJane Foobar <jfoobar@example.com>')
328
329
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000330def suite():
331 suite = unittest.TestSuite()
332 suite.addTest(unittest.makeSuite(GettextTestCase1))
333 suite.addTest(unittest.makeSuite(GettextTestCase2))
334 suite.addTest(unittest.makeSuite(PluralFormsTestCase))
335 suite.addTest(unittest.makeSuite(UnicodeTranslationsTest))
Barry Warsawe960e222003-05-20 17:28:54 +0000336 suite.addTest(unittest.makeSuite(WeirdMetadataTest))
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000337 return suite
Tim Peters0eadaac2003-04-24 16:02:54 +0000338
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000339
340def test_main():
341 run_suite(suite())
342
Martin v. Löwisd8996052002-11-21 21:45:32 +0000343
344if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000345 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000346
Barry Warsawff6d8132000-08-25 19:50:38 +0000347
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000348# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000349#
350# The original version was automatically generated from the sources with
351# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000352
Barry Warsaw64dab462000-08-30 03:32:07 +0000353'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000354# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000355# Copyright (C) 2001 Python Software Foundation
356# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000357#
358msgid ""
359msgstr ""
360"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000361"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000362"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000363"Language-Team: XX <python-dev@python.org>\n"
364"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000365"Content-Type: text/plain; charset=iso-8859-1\n"
366"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000367"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000368"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000369
Barry Warsaw64dab462000-08-30 03:32:07 +0000370#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
371#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
372#: test_gettext.py:98
373msgid "nudge nudge"
374msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000375
Barry Warsaw64dab462000-08-30 03:32:07 +0000376#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
377#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
378msgid "albatross"
379msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000380
Barry Warsaw64dab462000-08-30 03:32:07 +0000381#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
382#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
383msgid "Raymond Luxury Yach-t"
384msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000385
Barry Warsaw64dab462000-08-30 03:32:07 +0000386#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
387#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
388#: test_gettext.py:96
389msgid "mullusk"
390msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000391
Barry Warsaw64dab462000-08-30 03:32:07 +0000392#: test_gettext.py:40 test_gettext.py:101
393msgid ""
394"This module provides internationalization and localization\n"
395"support for your Python programs by providing an interface to the GNU\n"
396"gettext message catalog library."
397msgstr ""
398"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
399"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
400"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000401
402# Manually added, as neither pygettext nor xgettext support plural forms
403# in Python.
404msgid "There is %s file"
405msgid_plural "There are %s files"
406msgstr[0] "Hay %s fichero"
407msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000408'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000409
410# Here's the second example po file example, used to generate the UMO_DATA
411# containing utf-8 encoded Unicode strings
412
413'''
414# Dummy translation for the Python test_gettext.py module.
415# Copyright (C) 2001 Python Software Foundation
416# Barry Warsaw <barry@python.org>, 2000.
417#
418msgid ""
419msgstr ""
420"Project-Id-Version: 2.0\n"
421"PO-Revision-Date: 2003-04-11 12:42-0400\n"
422"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
423"Language-Team: XX <python-dev@python.org>\n"
424"MIME-Version: 1.0\n"
425"Content-Type: text/plain; charset=utf-8\n"
426"Content-Transfer-Encoding: 7bit\n"
427"Generated-By: manually\n"
428
429#: nofile:0
430msgid "ab\xc3\x9e"
431msgstr "\xc2\xa4yz"
432'''
Barry Warsawe960e222003-05-20 17:28:54 +0000433
434# Here's the third example po file, used to generate MMO_DATA
435
436'''
437msgid ""
438msgstr ""
439"Project-Id-Version: No Project 0.0\n"
440"POT-Creation-Date: Wed Dec 11 07:44:15 2002\n"
441"PO-Revision-Date: 2002-08-14 01:18:58+00:00\n"
442"Last-Translator: John Doe <jdoe@example.com>\n"
443"Jane Foobar <jfoobar@example.com>\n"
444"Language-Team: xx <xx@example.com>\n"
445"MIME-Version: 1.0\n"
446"Content-Type: text/plain; charset=iso-8859-15\n"
447"Content-Transfer-Encoding: quoted-printable\n"
448"Generated-By: pygettext.py 1.3\n"
449'''