blob: a36cd30067b54af2c52f47ff415c30ea202f3ba0 [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 Warsawff6d8132000-08-25 19:50:38 +000046LOCALEDIR = os.path.join('xx', 'LC_MESSAGES')
47MOFILE = os.path.join(LOCALEDIR, 'gettext.mo')
Barry Warsawa1ce93f2003-04-11 18:36:43 +000048UMOFILE = os.path.join(LOCALEDIR, 'ugettext.mo')
Brett Cannon4aebbb02003-04-27 19:42:41 +000049try:
50 LANG = os.environ['LANGUAGE']
51except:
52 LANG = 'en'
Barry Warsawff6d8132000-08-25 19:50:38 +000053
54
Barry Warsawa1ce93f2003-04-11 18:36:43 +000055class GettextBaseTest(unittest.TestCase):
Martin v. Löwisd8996052002-11-21 21:45:32 +000056 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000057 os.makedirs(LOCALEDIR)
58 fp = open(MOFILE, 'wb')
59 fp.write(base64.decodestring(GNU_MO_DATA))
60 fp.close()
61 fp = open(UMOFILE, 'wb')
62 fp.write(base64.decodestring(UMO_DATA))
63 fp.close()
64 os.environ['LANGUAGE'] = 'xx'
65
66 def tearDown(self):
Brett Cannon4aebbb02003-04-27 19:42:41 +000067 os.environ['LANGUAGE'] = LANG
68 shutil.rmtree(os.path.split(LOCALEDIR)[0])
Barry Warsawa1ce93f2003-04-11 18:36:43 +000069
70
71class GettextTestCase1(GettextBaseTest):
72 def setUp(self):
73 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +000074 self.localedir = os.curdir
75 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +000076 gettext.install('gettext', self.localedir)
77
Brett Cannon4aebbb02003-04-27 19:42:41 +000078 def tearDown(self):
79 GettextBaseTest.tearDown(self)
80
Martin v. Löwisd8996052002-11-21 21:45:32 +000081 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000082 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000083 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +000084 eq(_('albatross'), 'albatross')
85 eq(_(u'mullusk'), 'bacon')
86 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
87 eq(_(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +000088
89 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000090 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000091 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +000092 eq(_("albatross"), 'albatross')
93 eq(_(u"mullusk"), 'bacon')
94 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
95 eq(_(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +000096
97 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000098 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000099 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000100 eq(_('''albatross'''), 'albatross')
101 eq(_(u'''mullusk'''), 'bacon')
102 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
103 eq(_(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000104
105 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000106 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000107 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000108 eq(_("""albatross"""), 'albatross')
109 eq(_(u"""mullusk"""), 'bacon')
110 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
111 eq(_(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000112
113 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000114 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000115 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000116 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000117support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000118gettext message catalog library.'''),
119 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000120fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000121trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000122
123 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000124 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000125 # test the alternative interface
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000126 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000127 t = gettext.GNUTranslations(fp)
128 fp.close()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000129 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000130 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000131 eq(_('nudge nudge'), 'wink wink')
132 # Try unicode return type
133 t.install(unicode=True)
134 eq(_('mullusk'), 'bacon')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000135
136
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000137class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000138 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000139 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000140 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000141 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000142 gettext.bindtextdomain('gettext', self.localedir)
143 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000144 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000145 self._ = gettext.gettext
146
Brett Cannon4aebbb02003-04-27 19:42:41 +0000147 def tearDown(self):
148 GettextBaseTest.tearDown(self)
149
Martin v. Löwisd8996052002-11-21 21:45:32 +0000150 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000151 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000152
153 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000154 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000155
156 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000157 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000158 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000159 eq(self._('albatross'), 'albatross')
160 eq(self._(u'mullusk'), 'bacon')
161 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
162 eq(self._(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000163
164 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000165 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000166 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000167 eq(self._("albatross"), 'albatross')
168 eq(self._(u"mullusk"), 'bacon')
169 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
170 eq(self._(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000171
172 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000173 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000174 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000175 eq(self._('''albatross'''), 'albatross')
176 eq(self._(u'''mullusk'''), 'bacon')
177 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
178 eq(self._(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000179
180 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000181 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000182 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000183 eq(self._("""albatross"""), 'albatross')
184 eq(self._(u"""mullusk"""), 'bacon')
185 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
186 eq(self._(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000187
188 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000189 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000190 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000191 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000192support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000193gettext message catalog library.'''),
194 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000195fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000196trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000197
198
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000199class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000200 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000201 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000202 self.mofile = MOFILE
203
Brett Cannon4aebbb02003-04-27 19:42:41 +0000204 def tearDown(self):
205 GettextBaseTest.tearDown(self)
206
Martin v. Löwisd8996052002-11-21 21:45:32 +0000207 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000208 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000209 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000210 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000211 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000212 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000213
214 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000215 eq = self.assertEqual
216 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000217 t = gettext.GNUTranslations(fp)
218 fp.close()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000219 x = t.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000220 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000221 x = t.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000222 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000223
224 def test_hu(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000225 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000226 f = gettext.c2py('0')
227 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000228 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000229
230 def test_de(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('n != 1')
233 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000234 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000235
236 def test_fr(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, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000241
242 def test_gd(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 ? 0 : n==2 ? 1 : 2')
245 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000246 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000247
248 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000249 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000250 # Tests the combination of parentheses and "?:"
251 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
252 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000253 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000254
255 def test_lt(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000256 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000257 f = gettext.c2py('n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
258 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000259 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000260
261 def test_ru(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%10<=4 && (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, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000266
267 def test_pl(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==1 ? 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, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000272
273 def test_sl(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%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
276 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000277 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000278
279 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000280 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000281 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000282 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000283
284
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000285class UnicodeTranslationsTest(GettextBaseTest):
286 def setUp(self):
287 GettextBaseTest.setUp(self)
288 fp = open(UMOFILE, 'rb')
289 try:
Barry Warsawedb155f2003-04-24 18:08:13 +0000290 self.t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000291 finally:
292 fp.close()
293 self._ = self.t.ugettext
294
Brett Cannon4aebbb02003-04-27 19:42:41 +0000295 def tearDown(self):
296 GettextBaseTest.tearDown(self)
297
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000298 def test_unicode_msgid(self):
299 unless = self.failUnless
300 unless(isinstance(self._(''), unicode))
301 unless(isinstance(self._(u''), unicode))
302
303 def test_unicode_msgstr(self):
304 eq = self.assertEqual
305 eq(self._(u'ab\xde'), u'\xa4yz')
306
307
308def suite():
309 suite = unittest.TestSuite()
310 suite.addTest(unittest.makeSuite(GettextTestCase1))
311 suite.addTest(unittest.makeSuite(GettextTestCase2))
312 suite.addTest(unittest.makeSuite(PluralFormsTestCase))
313 suite.addTest(unittest.makeSuite(UnicodeTranslationsTest))
314 return suite
Tim Peters0eadaac2003-04-24 16:02:54 +0000315
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000316
317def test_main():
318 run_suite(suite())
319
Martin v. Löwisd8996052002-11-21 21:45:32 +0000320
321if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000322 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000323
Barry Warsawff6d8132000-08-25 19:50:38 +0000324
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000325# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000326#
327# The original version was automatically generated from the sources with
328# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000329
Barry Warsaw64dab462000-08-30 03:32:07 +0000330'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000331# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000332# Copyright (C) 2001 Python Software Foundation
333# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000334#
335msgid ""
336msgstr ""
337"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000338"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000339"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000340"Language-Team: XX <python-dev@python.org>\n"
341"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000342"Content-Type: text/plain; charset=iso-8859-1\n"
343"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000344"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000345"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000346
Barry Warsaw64dab462000-08-30 03:32:07 +0000347#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
348#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
349#: test_gettext.py:98
350msgid "nudge nudge"
351msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000352
Barry Warsaw64dab462000-08-30 03:32:07 +0000353#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
354#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
355msgid "albatross"
356msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000357
Barry Warsaw64dab462000-08-30 03:32:07 +0000358#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
359#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
360msgid "Raymond Luxury Yach-t"
361msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000362
Barry Warsaw64dab462000-08-30 03:32:07 +0000363#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
364#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
365#: test_gettext.py:96
366msgid "mullusk"
367msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000368
Barry Warsaw64dab462000-08-30 03:32:07 +0000369#: test_gettext.py:40 test_gettext.py:101
370msgid ""
371"This module provides internationalization and localization\n"
372"support for your Python programs by providing an interface to the GNU\n"
373"gettext message catalog library."
374msgstr ""
375"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
376"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
377"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000378
379# Manually added, as neither pygettext nor xgettext support plural forms
380# in Python.
381msgid "There is %s file"
382msgid_plural "There are %s files"
383msgstr[0] "Hay %s fichero"
384msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000385'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000386
387# Here's the second example po file example, used to generate the UMO_DATA
388# containing utf-8 encoded Unicode strings
389
390'''
391# Dummy translation for the Python test_gettext.py module.
392# Copyright (C) 2001 Python Software Foundation
393# Barry Warsaw <barry@python.org>, 2000.
394#
395msgid ""
396msgstr ""
397"Project-Id-Version: 2.0\n"
398"PO-Revision-Date: 2003-04-11 12:42-0400\n"
399"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
400"Language-Team: XX <python-dev@python.org>\n"
401"MIME-Version: 1.0\n"
402"Content-Type: text/plain; charset=utf-8\n"
403"Content-Transfer-Encoding: 7bit\n"
404"Generated-By: manually\n"
405
406#: nofile:0
407msgid "ab\xc3\x9e"
408msgstr "\xc2\xa4yz"
409'''