blob: 81a20811613ecc8cd6c6d6666c5fed58f5f7a2e4 [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')
Barry Warsawff6d8132000-08-25 19:50:38 +000049
50
Barry Warsawa1ce93f2003-04-11 18:36:43 +000051class GettextBaseTest(unittest.TestCase):
Martin v. Löwisd8996052002-11-21 21:45:32 +000052 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000053 os.makedirs(LOCALEDIR)
54 fp = open(MOFILE, 'wb')
55 fp.write(base64.decodestring(GNU_MO_DATA))
56 fp.close()
57 fp = open(UMOFILE, 'wb')
58 fp.write(base64.decodestring(UMO_DATA))
59 fp.close()
60 os.environ['LANGUAGE'] = 'xx'
61
62 def tearDown(self):
63 os.environ['LANGUAGE'] = 'en'
64 shutil.rmtree(LOCALEDIR)
65
66
67class GettextTestCase1(GettextBaseTest):
68 def setUp(self):
69 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +000070 self.localedir = os.curdir
71 self.mofile = MOFILE
Martin v. Löwisd8996052002-11-21 21:45:32 +000072 gettext.install('gettext', self.localedir)
73
Martin v. Löwisd8996052002-11-21 21:45:32 +000074 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000075 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000076 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +000077 eq(_('albatross'), 'albatross')
78 eq(_(u'mullusk'), 'bacon')
79 eq(_(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
80 eq(_(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +000081
82 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000083 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000084 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +000085 eq(_("albatross"), 'albatross')
86 eq(_(u"mullusk"), 'bacon')
87 eq(_(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
88 eq(_(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +000089
90 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000091 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +000092 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +000093 eq(_('''albatross'''), 'albatross')
94 eq(_(u'''mullusk'''), 'bacon')
95 eq(_(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
96 eq(_(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +000097
98 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +000099 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000100 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000101 eq(_("""albatross"""), 'albatross')
102 eq(_(u"""mullusk"""), 'bacon')
103 eq(_(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
104 eq(_(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000105
106 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000107 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000108 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000109 eq(_('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000110support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000111gettext message catalog library.'''),
112 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000113fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000114trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000115
116 def test_the_alternative_interface(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000117 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000118 # test the alternative interface
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000119 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000120 t = gettext.GNUTranslations(fp)
121 fp.close()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000122 # Install the translation object
Martin v. Löwisd8996052002-11-21 21:45:32 +0000123 t.install()
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000124 eq(_('nudge nudge'), 'wink wink')
125 # Try unicode return type
126 t.install(unicode=True)
127 eq(_('mullusk'), 'bacon')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000128
129
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000130class GettextTestCase2(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000131 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000132 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000133 self.localedir = os.curdir
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000134 # Set up the bindings
Martin v. Löwisd8996052002-11-21 21:45:32 +0000135 gettext.bindtextdomain('gettext', self.localedir)
136 gettext.textdomain('gettext')
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000137 # For convenience
Martin v. Löwisd8996052002-11-21 21:45:32 +0000138 self._ = gettext.gettext
139
Martin v. Löwisd8996052002-11-21 21:45:32 +0000140 def test_bindtextdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000141 self.assertEqual(gettext.bindtextdomain('gettext'), self.localedir)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000142
143 def test_textdomain(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000144 self.assertEqual(gettext.textdomain(), 'gettext')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000145
146 def test_some_translations(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000147 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000148 # test some translations
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000149 eq(self._('albatross'), 'albatross')
150 eq(self._(u'mullusk'), 'bacon')
151 eq(self._(r'Raymond Luxury Yach-t'), 'Throatwobbler Mangrove')
152 eq(self._(ur'nudge nudge'), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000153
154 def test_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000155 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000156 # double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000157 eq(self._("albatross"), 'albatross')
158 eq(self._(u"mullusk"), 'bacon')
159 eq(self._(r"Raymond Luxury Yach-t"), 'Throatwobbler Mangrove')
160 eq(self._(ur"nudge nudge"), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000161
162 def test_triple_single_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000163 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000164 # triple single quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000165 eq(self._('''albatross'''), 'albatross')
166 eq(self._(u'''mullusk'''), 'bacon')
167 eq(self._(r'''Raymond Luxury Yach-t'''), 'Throatwobbler Mangrove')
168 eq(self._(ur'''nudge nudge'''), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000169
170 def test_triple_double_quotes(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000171 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000172 # triple double quotes
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000173 eq(self._("""albatross"""), 'albatross')
174 eq(self._(u"""mullusk"""), 'bacon')
175 eq(self._(r"""Raymond Luxury Yach-t"""), 'Throatwobbler Mangrove')
176 eq(self._(ur"""nudge nudge"""), 'wink wink')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000177
178 def test_multiline_strings(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000179 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000180 # multiline strings
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000181 eq(self._('''This module provides internationalization and localization
Martin v. Löwisd8996052002-11-21 21:45:32 +0000182support for your Python programs by providing an interface to the GNU
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000183gettext message catalog library.'''),
184 '''Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba
Martin v. Löwisd8996052002-11-21 21:45:32 +0000185fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000186trggrkg zrffntr pngnybt yvoenel.''')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000187
188
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000189class PluralFormsTestCase(GettextBaseTest):
Martin v. Löwisd8996052002-11-21 21:45:32 +0000190 def setUp(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000191 GettextBaseTest.setUp(self)
Martin v. Löwisd8996052002-11-21 21:45:32 +0000192 self.mofile = MOFILE
193
194 def test_plural_forms1(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000195 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000196 x = gettext.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000197 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000198 x = gettext.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000199 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000200
201 def test_plural_forms2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000202 eq = self.assertEqual
203 fp = open(self.mofile, 'rb')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000204 t = gettext.GNUTranslations(fp)
205 fp.close()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000206 x = t.ngettext('There is %s file', 'There are %s files', 1)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000207 eq(x, 'Hay %s fichero')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000208 x = t.ngettext('There is %s file', 'There are %s files', 2)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000209 eq(x, 'Hay %s ficheros')
Martin v. Löwisd8996052002-11-21 21:45:32 +0000210
211 def test_hu(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000212 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000213 f = gettext.c2py('0')
214 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000215 eq(s, "00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000216
217 def test_de(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000218 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000219 f = gettext.c2py('n != 1')
220 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000221 eq(s, "10111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000222
223 def test_fr(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000224 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000225 f = gettext.c2py('n>1')
226 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000227 eq(s, "00111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000228
229 def test_gd(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000230 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000231 f = gettext.c2py('n==1 ? 0 : n==2 ? 1 : 2')
232 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000233 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000234
235 def test_gd2(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000236 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000237 # Tests the combination of parentheses and "?:"
238 f = gettext.c2py('n==1 ? 0 : (n==2 ? 1 : 2)')
239 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000240 eq(s, "20122222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000241
242 def test_lt(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%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2')
245 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000246 eq(s, "20111111112222222222201111111120111111112011111111201111111120111111112011111111201111111120111111112011111111222222222220111111112011111111201111111120111111112011111111201111111120111111112011111111")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000247
248 def test_ru(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%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
251 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000252 eq(s, "20111222222222222222201112222220111222222011122222201112222220111222222011122222201112222220111222222011122222222222222220111222222011122222201112222220111222222011122222201112222220111222222011122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000253
254 def test_pl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000255 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000256 f = gettext.c2py('n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2')
257 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000258 eq(s, "20111222222222222222221112222222111222222211122222221112222222111222222211122222221112222222111222222211122222222222222222111222222211122222221112222222111222222211122222221112222222111222222211122222")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000259
260 def test_sl(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000261 eq = self.assertEqual
Martin v. Löwisd8996052002-11-21 21:45:32 +0000262 f = gettext.c2py('n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3')
263 s = ''.join([ str(f(x)) for x in range(200) ])
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000264 eq(s, "30122333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333012233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000265
266 def test_security(self):
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000267 raises = self.assertRaises
Martin v. Löwisd8996052002-11-21 21:45:32 +0000268 # Test for a dangerous expression
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000269 raises(ValueError, gettext.c2py, "os.chmod('/etc/passwd',0777)")
Martin v. Löwisd8996052002-11-21 21:45:32 +0000270
271
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000272class UnicodeTranslationsTest(GettextBaseTest):
273 def setUp(self):
274 GettextBaseTest.setUp(self)
275 fp = open(UMOFILE, 'rb')
276 try:
Barry Warsawedb155f2003-04-24 18:08:13 +0000277 self.t = gettext.GNUTranslations(fp)
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000278 finally:
279 fp.close()
280 self._ = self.t.ugettext
281
282 def test_unicode_msgid(self):
283 unless = self.failUnless
284 unless(isinstance(self._(''), unicode))
285 unless(isinstance(self._(u''), unicode))
286
287 def test_unicode_msgstr(self):
288 eq = self.assertEqual
289 eq(self._(u'ab\xde'), u'\xa4yz')
290
291
292def suite():
293 suite = unittest.TestSuite()
294 suite.addTest(unittest.makeSuite(GettextTestCase1))
295 suite.addTest(unittest.makeSuite(GettextTestCase2))
296 suite.addTest(unittest.makeSuite(PluralFormsTestCase))
297 suite.addTest(unittest.makeSuite(UnicodeTranslationsTest))
298 return suite
Tim Peters0eadaac2003-04-24 16:02:54 +0000299
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000300
301def test_main():
302 run_suite(suite())
303
Martin v. Löwisd8996052002-11-21 21:45:32 +0000304
305if __name__ == '__main__':
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000306 test_main()
Martin v. Löwisd8996052002-11-21 21:45:32 +0000307
Barry Warsawff6d8132000-08-25 19:50:38 +0000308
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000309# For reference, here's the .po file used to created the GNU_MO_DATA above.
Martin v. Löwisd8996052002-11-21 21:45:32 +0000310#
311# The original version was automatically generated from the sources with
312# pygettext. Later it was manually modified to add plural forms support.
Barry Warsawff6d8132000-08-25 19:50:38 +0000313
Barry Warsaw64dab462000-08-30 03:32:07 +0000314'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000315# Dummy translation for the Python test_gettext.py module.
Barry Warsaw19148732001-08-24 19:11:57 +0000316# Copyright (C) 2001 Python Software Foundation
317# Barry Warsaw <barry@python.org>, 2000.
Barry Warsaw64dab462000-08-30 03:32:07 +0000318#
319msgid ""
320msgstr ""
321"Project-Id-Version: 2.0\n"
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000322"PO-Revision-Date: 2003-04-11 14:32-0400\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000323"Last-Translator: J. David Ibanez <j-david@noos.fr>\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000324"Language-Team: XX <python-dev@python.org>\n"
325"MIME-Version: 1.0\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000326"Content-Type: text/plain; charset=iso-8859-1\n"
327"Content-Transfer-Encoding: 8bit\n"
Barry Warsaw64dab462000-08-30 03:32:07 +0000328"Generated-By: pygettext.py 1.1\n"
Martin v. Löwisd8996052002-11-21 21:45:32 +0000329"Plural-Forms: nplurals=2; plural=n!=1;\n"
Barry Warsawff6d8132000-08-25 19:50:38 +0000330
Barry Warsaw64dab462000-08-30 03:32:07 +0000331#: test_gettext.py:19 test_gettext.py:25 test_gettext.py:31 test_gettext.py:37
332#: test_gettext.py:51 test_gettext.py:80 test_gettext.py:86 test_gettext.py:92
333#: test_gettext.py:98
334msgid "nudge nudge"
335msgstr "wink wink"
Barry Warsawff6d8132000-08-25 19:50:38 +0000336
Barry Warsaw64dab462000-08-30 03:32:07 +0000337#: test_gettext.py:16 test_gettext.py:22 test_gettext.py:28 test_gettext.py:34
338#: test_gettext.py:77 test_gettext.py:83 test_gettext.py:89 test_gettext.py:95
339msgid "albatross"
340msgstr ""
Barry Warsawff6d8132000-08-25 19:50:38 +0000341
Barry Warsaw64dab462000-08-30 03:32:07 +0000342#: test_gettext.py:18 test_gettext.py:24 test_gettext.py:30 test_gettext.py:36
343#: test_gettext.py:79 test_gettext.py:85 test_gettext.py:91 test_gettext.py:97
344msgid "Raymond Luxury Yach-t"
345msgstr "Throatwobbler Mangrove"
Barry Warsawff6d8132000-08-25 19:50:38 +0000346
Barry Warsaw64dab462000-08-30 03:32:07 +0000347#: test_gettext.py:17 test_gettext.py:23 test_gettext.py:29 test_gettext.py:35
348#: test_gettext.py:56 test_gettext.py:78 test_gettext.py:84 test_gettext.py:90
349#: test_gettext.py:96
350msgid "mullusk"
351msgstr "bacon"
Barry Warsawff6d8132000-08-25 19:50:38 +0000352
Barry Warsaw64dab462000-08-30 03:32:07 +0000353#: test_gettext.py:40 test_gettext.py:101
354msgid ""
355"This module provides internationalization and localization\n"
356"support for your Python programs by providing an interface to the GNU\n"
357"gettext message catalog library."
358msgstr ""
359"Guvf zbqhyr cebivqrf vagreangvbanyvmngvba naq ybpnyvmngvba\n"
360"fhccbeg sbe lbhe Clguba cebtenzf ol cebivqvat na vagresnpr gb gur TAH\n"
361"trggrkg zrffntr pngnybt yvoenel."
Martin v. Löwisd8996052002-11-21 21:45:32 +0000362
363# Manually added, as neither pygettext nor xgettext support plural forms
364# in Python.
365msgid "There is %s file"
366msgid_plural "There are %s files"
367msgstr[0] "Hay %s fichero"
368msgstr[1] "Hay %s ficheros"
Barry Warsaw64dab462000-08-30 03:32:07 +0000369'''
Barry Warsawa1ce93f2003-04-11 18:36:43 +0000370
371# Here's the second example po file example, used to generate the UMO_DATA
372# containing utf-8 encoded Unicode strings
373
374'''
375# Dummy translation for the Python test_gettext.py module.
376# Copyright (C) 2001 Python Software Foundation
377# Barry Warsaw <barry@python.org>, 2000.
378#
379msgid ""
380msgstr ""
381"Project-Id-Version: 2.0\n"
382"PO-Revision-Date: 2003-04-11 12:42-0400\n"
383"Last-Translator: Barry A. WArsaw <barry@python.org>\n"
384"Language-Team: XX <python-dev@python.org>\n"
385"MIME-Version: 1.0\n"
386"Content-Type: text/plain; charset=utf-8\n"
387"Content-Transfer-Encoding: 7bit\n"
388"Generated-By: manually\n"
389
390#: nofile:0
391msgid "ab\xc3\x9e"
392msgstr "\xc2\xa4yz"
393'''