Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(74)

Delta Between Two Patch Sets: translate/storage/test_cpo.py

Issue 62: CPO support for previous messages SVN Base: https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/
Left Patch Set: Created 1 year, 5 months ago
Right Patch Set: Fixed minor issues Created 1 year, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: View regular side by side diff
Right: View regular side by side diff
LEFTRIGHT
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # -*- coding: utf-8 -*- 2 # -*- coding: utf-8 -*-
3 3
4 from translate.storage import test_po 4 from translate.storage import test_po
5 from translate.storage import cpo 5 from translate.storage import cpo
6 from translate.misc.multistring import multistring 6 from translate.misc.multistring import multistring
7 from translate.misc import wStringIO 7 from translate.misc import wStringIO
8 from py.test import raises 8 from py.test import raises
9 9
10 class TestCPOUnit(test_po.TestPOUnit): 10 class TestCPOUnit(test_po.TestPOUnit):
11 UnitClass = cpo.pounit 11 UnitClass = cpo.pounit
12 12
13 def test_plurals(self): 13 def test_plurals(self):
14 """Tests that plurals are handled correctly.""" 14 """Tests that plurals are handled correctly."""
15 unit = self.UnitClass("Cow") 15 unit = self.UnitClass("Cow")
16 unit.msgid_plural = ["Cows"] 16 unit.msgid_plural = ["Cows"]
17 assert isinstance(unit.source, multistring) 17 assert isinstance(unit.source, multistring)
18 assert unit.source.strings == ["Cow", "Cows"] 18 assert unit.source.strings == ["Cow", "Cows"]
19 assert unit.source == "Cow" 19 assert unit.source == "Cow"
20 20
21 unit.target = ["Koei", "Koeie"] 21 unit.target = ["Koei", "Koeie"]
22 assert isinstance(unit.target, multistring) 22 assert isinstance(unit.target, multistring)
23 assert unit.target.strings == ["Koei", "Koeie"] 23 assert unit.target.strings == ["Koei", "Koeie"]
24 assert unit.target == "Koei" 24 assert unit.target == "Koei"
25 25
26 unit.target = {0:"Koei", 3:"Koeie"} 26 unit.target = {0:"Koei", 3:"Koeie"}
27 assert isinstance(unit.target, multistring) 27 assert isinstance(unit.target, multistring)
28 assert unit.target.strings == ["Koei", "Koeie"] 28 assert unit.target.strings == ["Koei", "Koeie"]
29 assert unit.target == "Koei" 29 assert unit.target == "Koei"
30 30
31 unit.target = [u"Sk\u00ear", u"Sk\u00eare"] 31 unit.target = [u"Sk\u00ear", u"Sk\u00eare"]
32 assert isinstance(unit.target, multistring) 32 assert isinstance(unit.target, multistring)
33 assert unit.target.strings == [u"Sk\u00ear", u"Sk\u00eare"] 33 assert unit.target.strings == [u"Sk\u00ear", u"Sk\u00eare"]
34 assert unit.target.strings == [u"Sk\u00ear", u"Sk\u00eare"] 34 assert unit.target.strings == [u"Sk\u00ear", u"Sk\u00eare"]
35 assert unit.target == u"Sk\u00ear" 35 assert unit.target == u"Sk\u00ear"
36 36
37 def test_plural_reduction(self): 37 def test_plural_reduction(self):
38 """checks that reducing the number of plurals supplied works""" 38 """checks that reducing the number of plurals supplied works"""
39 unit = self.UnitClass("Tree") 39 unit = self.UnitClass("Tree")
40 unit.msgid_plural = ["Trees"] 40 unit.msgid_plural = ["Trees"]
41 assert isinstance(unit.source, multistring) 41 assert isinstance(unit.source, multistring)
42 assert unit.source.strings == ["Tree", "Trees"] 42 assert unit.source.strings == ["Tree", "Trees"]
43 unit.target = multistring(["Boom", "Bome", "Baie Bome"]) 43 unit.target = multistring(["Boom", "Bome", "Baie Bome"])
44 assert isinstance(unit.source, multistring) 44 assert isinstance(unit.source, multistring)
45 assert unit.target.strings == ["Boom", "Bome", "Baie Bome"] 45 assert unit.target.strings == ["Boom", "Bome", "Baie Bome"]
46 unit.target = multistring(["Boom", "Bome"]) 46 unit.target = multistring(["Boom", "Bome"])
47 assert unit.target.strings == ["Boom", "Bome"] 47 assert unit.target.strings == ["Boom", "Bome"]
48 unit.target = "Boom" 48 unit.target = "Boom"
49 # FIXME: currently assigning the target to the same as the first string won't change anything 49 # FIXME: currently assigning the target to the same as the first string won't change anything
50 # we need to verify that this is the desired behaviour... 50 # we need to verify that this is the desired behaviour...
51 assert unit.target.strings == ["Boom", "Bome"] 51 assert unit.target.strings == ["Boom", "Bome"]
52 unit.target = "Een Boom" 52 unit.target = "Een Boom"
53 assert unit.target.strings == ["Een Boom"] 53 assert unit.target.strings == ["Een Boom"]
54 54
55 def test_notes(self): 55 def test_notes(self):
56 """tests that the generic notes API works""" 56 """tests that the generic notes API works"""
57 unit = self.UnitClass("File") 57 unit = self.UnitClass("File")
58 assert unit.getnotes() == "" 58 assert unit.getnotes() == ""
59 unit.addnote("Which meaning of file?") 59 unit.addnote("Which meaning of file?")
60 assert unit.getnotes("translator") == "Which meaning of file?" 60 assert unit.getnotes("translator") == "Which meaning of file?"
61 assert unit.getnotes("developer") == "" 61 assert unit.getnotes("developer") == ""
62 unit.addnote("Verb", origin="programmer") 62 unit.addnote("Verb", origin="programmer")
63 assert unit.getnotes("developer") == "Verb" 63 assert unit.getnotes("developer") == "Verb"
64 unit.addnote("Thank you", origin="translator") 64 unit.addnote("Thank you", origin="translator")
65 assert unit.getnotes("translator") == "Which meaning of file?\nThank you " 65 assert unit.getnotes("translator") == "Which meaning of file?\nThank you "
66 assert unit.getnotes() == "Which meaning of file?\nThank you\nVerb" 66 assert unit.getnotes() == "Which meaning of file?\nThank you\nVerb"
67 assert raises(ValueError, unit.getnotes, "devteam") 67 assert raises(ValueError, unit.getnotes, "devteam")
68 68
69 def test_notes_withcomments(self): 69 def test_notes_withcomments(self):
70 """tests that when we add notes that look like comments that we treat th em properly""" 70 """tests that when we add notes that look like comments that we treat th em properly"""
71 unit = self.UnitClass("File") 71 unit = self.UnitClass("File")
72 unit.addnote("# Double commented comment") 72 unit.addnote("# Double commented comment")
73 assert unit.getnotes() == "# Double commented comment" 73 assert unit.getnotes() == "# Double commented comment"
74 74
75 def test_previous_source(self): 75 def test_previous_source(self):
76 """tests if we handle previous msgid properly""" 76 """tests if we handle previous msgid properly"""
77 unit = self.UnitClass("Cat") 77 unit = self.UnitClass("Cat")
78 assert unit.prev_source == "" 78 assert unit.prev_source == ""
79 assert isinstance(unit.prev_source, multistring)
79 80
80 unit.prev_source = "Feline" 81 unit.prev_source = "Feline"
81 assert unit.prev_source == "Feline" 82 assert unit.prev_source == "Feline"
83 assert isinstance(unit.prev_source, multistring)
84
85 unit.prev_source = ["Feline", "Felines"]
86 assert unit.prev_source.strings == ["Feline", "Felines"]
87 assert unit.prev_source == "Feline"
88 assert isinstance(unit.prev_source, multistring)
82 89
83 unit.prev_source = "" 90 unit.prev_source = ""
84 assert unit.prev_source == "" 91 assert unit.prev_source == ""
92 assert unit.source == "Cat"
93 assert len(unit.prev_source.strings) == 1
94 assert isinstance(unit.prev_source, multistring)
95
96 unit.source = ""
97 unit.prev_source = "Feline"
98 assert unit.prev_source == ""
99 unit.source = "Cat"
100
101 unit.markfuzzy()
102 unit.prev_source = "Feline"
103 assert unit.prev_source == ""
104 assert len(unit.prev_source.strings) == 1
105 assert isinstance(unit.prev_source, multistring)
85 106
86 def test_previous_context(self): 107 def test_previous_context(self):
87 """tests if we handle previous context messages properly""" 108 """tests if we handle previous context messages properly"""
88 unit = self.UnitClass("Cat") 109 unit = self.UnitClass("Cat")
89 assert unit.prev_context == "" 110 assert unit.prev_context == ""
90 111
91 context = "A sort of a cute animal" 112 context = "A sort of a cute animal"
92 unit.prev_context = context 113 unit.prev_context = context
93 assert unit.prev_context == context 114 assert unit.prev_context == context
94 115
95 unit.prev_context = "" 116 unit.prev_context = ""
96 assert unit.prev_context == "" 117 assert unit.prev_context == ""
97 118
98 def test_previous_plural(self): 119 unit.markfuzzy()
99 """tests if we handle previous plural properly""" 120 unit.prev_context = "A sort of a cute animal"
100 unit = self.UnitClass("Cat") 121 assert unit.prev_context == ""
101 assert unit.prev_plural == ""
102
103 unit.prev_plural = "Cats"
104 assert unit.prev_plural == "Cats"
105
106 unit.prev_plural = ""
107 assert unit.prev_plural == ""
108 122
109 def test_set_as_previous(self): 123 def test_set_as_previous(self):
110 """tests if we set previous messages properly""" 124 """tests if we set previous messages properly"""
111 # This is just a sanity test, for a more complete test look 125 # This is just a sanity test, for a more complete test look
112 # at convert/test_pot2po.py 126 # at convert/test_pot2po.py
113 unit = self.UnitClass("Test %d") 127 unit = self.UnitClass(["Test %d", "Tests %d"])
114 unit.msgid_plural = ["Tests %d"]
115 unit.target = ["Teste %d", "Testes %d"] 128 unit.target = ["Teste %d", "Testes %d"]
116 unit.set_as_previous() 129 unit.set_as_previous()
117 unit.source = "Test %s" 130 unit.source = "Test %s"
118 test_unit = '''#, fuzzy\n#| msgid "Test %d"\n#| msgid_plural "Tests %d" 131 test_unit = '''#, fuzzy\n#| msgid "Test %d"\n#| msgid_plural "Tests %d"
119 msgid "Test %s"\nmsgstr "Teste %d"\n''' 132 msgid "Test %s"\nmsgstr "Teste %d"\n'''
120 assert str(unit) == test_unit 133 assert str(unit) == test_unit
121 assert unit.isfuzzy() 134 assert unit.isfuzzy()
122 135
123 # without a target, the unit remain the same 136 # without a target, the unit remain the same
124 unit2 = self.UnitClass("Other") 137 unit2 = self.UnitClass(["Other", "Others"])
125 unit2.msgid_plural = ["Others"]
126 expected = str(unit2) 138 expected = str(unit2)
127 unit2.set_as_previous() 139 unit2.set_as_previous()
128 assert str(unit2) == expected 140 assert str(unit2) == expected
141
142 # we can't set a message as previous if the message is marked as fuzzy
143 unit = self.UnitClass("Pizza")
144 unit.msgid_plural = ["Pizzas"]
145 unit.target = ["Pizza", "Pizzas"]
146 unit.markfuzzy()
147 unit.set_as_previous()
148 assert unit.prev_context == ""
149 assert unit.prev_source == ""
129 150
130 151
131 class TestCPOFile(test_po.TestPOFile): 152 class TestCPOFile(test_po.TestPOFile):
132 StoreClass = cpo.pofile 153 StoreClass = cpo.pofile
133 def test_msgidcomments(self): 154 def test_msgidcomments(self):
134 """checks that we handle msgid comments""" 155 """checks that we handle msgid comments"""
135 posource = 'msgid "test me"\nmsgstr ""' 156 posource = 'msgid "test me"\nmsgstr ""'
136 pofile = self.poparse(posource) 157 pofile = self.poparse(posource)
137 thepo = pofile.units[0] 158 thepo = pofile.units[0]
138 thepo.msgidcomment = "first comment" 159 thepo.msgidcomment = "first comment"
139 print pofile 160 print pofile
140 print "Blah", thepo.source 161 print "Blah", thepo.source
141 assert thepo.source == "test me" 162 assert thepo.source == "test me"
142 thepo.msgidcomment = "second comment" 163 thepo.msgidcomment = "second comment"
143 assert str(pofile).count("_:") == 1 164 assert str(pofile).count("_:") == 1
144 165
145 # def test_merge_duplicates_msgctxt(self): 166 # def test_merge_duplicates_msgctxt(self):
146 # """checks that merging duplicates works for msgctxt""" 167 # """checks that merging duplicates works for msgctxt"""
147 # posource = '#: source1\nmsgid "test me"\nmsgstr ""\n\n#: source2\nmsgid "test me"\nmsgstr ""\n' 168 # posource = '#: source1\nmsgid "test me"\nmsgstr ""\n\n#: source2\nmsgid "test me"\nmsgstr ""\n'
148 # pofile = self.poparse(posource) 169 # pofile = self.poparse(posource)
149 # assert len(pofile.units) == 2 170 # assert len(pofile.units) == 2
150 # pofile.removeduplicates("msgctxt") 171 # pofile.removeduplicates("msgctxt")
151 # print pofile 172 # print pofile
152 # assert len(pofile.units) == 2 173 # assert len(pofile.units) == 2
153 # assert str(pofile.units[0]).count("source1") == 2 174 # assert str(pofile.units[0]).count("source1") == 2
154 # assert str(pofile.units[1]).count("source2") == 2 175 # assert str(pofile.units[1]).count("source2") == 2
155 176
156 # def test_merge_blanks(self): 177 # def test_merge_blanks(self):
157 # """checks that merging adds msgid_comments to blanks""" 178 # """checks that merging adds msgid_comments to blanks"""
158 # posource = '#: source1\nmsgid ""\nmsgstr ""\n\n#: source2\nmsgid ""\nms gstr ""\n' 179 # posource = '#: source1\nmsgid ""\nmsgstr ""\n\n#: source2\nmsgid ""\nms gstr ""\n'
159 # pofile = self.poparse(posource) 180 # pofile = self.poparse(posource)
160 # assert len(pofile.units) == 2 181 # assert len(pofile.units) == 2
161 # pofile.removeduplicates("merge") 182 # pofile.removeduplicates("merge")
162 # assert len(pofile.units) == 2 183 # assert len(pofile.units) == 2
163 # print pofile.units[0].msgidcomments 184 # print pofile.units[0].msgidcomments
164 # print pofile.units[1].msgidcomments 185 # print pofile.units[1].msgidcomments
165 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "_: source1\n " 186 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "_: source1\n "
166 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "_: source2\n " 187 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "_: source2\n "
167 188
168 # def test_msgid_comment(self): 189 # def test_msgid_comment(self):
169 # """checks that when adding msgid_comments we place them on a newline""" 190 # """checks that when adding msgid_comments we place them on a newline"""
170 # posource = '#: source0\nmsgid "Same"\nmsgstr ""\n\n#: source1\nmsgid "S ame"\nmsgstr ""\n' 191 # posource = '#: source0\nmsgid "Same"\nmsgstr ""\n\n#: source1\nmsgid "S ame"\nmsgstr ""\n'
171 # pofile = self.poparse(posource) 192 # pofile = self.poparse(posource)
172 # assert len(pofile.units) == 2 193 # assert len(pofile.units) == 2
173 # pofile.removeduplicates("msgid_comment") 194 # pofile.removeduplicates("msgid_comment")
174 # assert len(pofile.units) == 2 195 # assert len(pofile.units) == 2
175 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "_: source0\n " 196 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "_: source0\n "
176 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "_: source1\n " 197 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "_: source1\n "
177 # # Now lets check for formating 198 # # Now lets check for formating
178 # for i in (0, 1): 199 # for i in (0, 1):
179 # expected = '''#: source%d\nmsgid ""\n"_: source%d\\n"\n"Same"\nmsgstr ""\n''' % (i, i) 200 # expected = '''#: source%d\nmsgid ""\n"_: source%d\\n"\n"Same"\nmsgstr ""\n''' % (i, i)
180 # assert pofile.units[i].__str__() == expected 201 # assert pofile.units[i].__str__() == expected
181 202
182 # def test_keep_blanks(self): 203 # def test_keep_blanks(self):
183 # """checks that keeping keeps blanks and doesn't add msgid_comments""" 204 # """checks that keeping keeps blanks and doesn't add msgid_comments"""
184 # posource = '#: source1\nmsgid ""\nmsgstr ""\n\n#: source2\nmsgid ""\nms gstr ""\n' 205 # posource = '#: source1\nmsgid ""\nmsgstr ""\n\n#: source2\nmsgid ""\nms gstr ""\n'
185 # pofile = self.poparse(posource) 206 # pofile = self.poparse(posource)
186 # assert len(pofile.units) == 2 207 # assert len(pofile.units) == 2
187 # pofile.removeduplicates("keep") 208 # pofile.removeduplicates("keep")
188 # assert len(pofile.units) == 2 209 # assert len(pofile.units) == 2
189 # # check we don't add msgidcomments 210 # # check we don't add msgidcomments
190 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "" 211 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == ""
191 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "" 212 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == ""
192 213
193 def test_output_str_unicode(self): 214 def test_output_str_unicode(self):
194 """checks that we can str(pofile) which is in unicode""" 215 """checks that we can str(pofile) which is in unicode"""
195 posource = u'''#: nb\nmsgid "Norwegian Bokm\xe5l"\nmsgstr ""\n''' 216 posource = u'''#: nb\nmsgid "Norwegian Bokm\xe5l"\nmsgstr ""\n'''
196 pofile = self.StoreClass(wStringIO.StringIO(posource.encode("UTF-8")), e ncoding="UTF-8") 217 pofile = self.StoreClass(wStringIO.StringIO(posource.encode("UTF-8")), e ncoding="UTF-8")
197 assert len(pofile.units) == 1 218 assert len(pofile.units) == 1
198 print str(pofile) 219 print str(pofile)
199 thepo = pofile.units[0] 220 thepo = pofile.units[0]
200 # assert str(pofile) == posource.encode("UTF-8") 221 # assert str(pofile) == posource.encode("UTF-8")
201 # extra test: what if we set the msgid to a unicode? this happens in pro p2po etc 222 # extra test: what if we set the msgid to a unicode? this happens in pro p2po etc
202 thepo.source = u"Norwegian Bokm\xe5l" 223 thepo.source = u"Norwegian Bokm\xe5l"
203 # assert str(thepo) == posource.encode("UTF-8") 224 # assert str(thepo) == posource.encode("UTF-8")
204 # Now if we set the msgstr to Unicode 225 # Now if we set the msgstr to Unicode
205 # this is an escaped half character (1/2) 226 # this is an escaped half character (1/2)
206 halfstr = "\xbd ...".decode("latin-1") 227 halfstr = "\xbd ...".decode("latin-1")
207 thepo.target = halfstr 228 thepo.target = halfstr
208 # assert halfstr in str(pofile).decode("UTF-8") 229 # assert halfstr in str(pofile).decode("UTF-8")
209 thepo.target = halfstr.encode("UTF-8") 230 thepo.target = halfstr.encode("UTF-8")
210 # assert halfstr.encode("UTF-8") in str(pofile) 231 # assert halfstr.encode("UTF-8") in str(pofile)
211 232
212 def test_posections(self): 233 def test_posections(self):
213 """checks the content of all the expected sections of a PO message""" 234 """checks the content of all the expected sections of a PO message"""
214 posource = '# other comment\n#. automatic comment\n#: source comment\n#, fuzzy\nmsgid "One"\nmsgstr "Een"\n' 235 posource = '# other comment\n#. automatic comment\n#: source comment\n#, fuzzy\nmsgid "One"\nmsgstr "Een"\n'
215 pofile = self.poparse(posource) 236 pofile = self.poparse(posource)
216 print pofile 237 print pofile
217 assert len(pofile.units) == 1 238 assert len(pofile.units) == 1
218 assert str(pofile) == posource 239 assert str(pofile) == posource
219 240
220 def test_multiline_obsolete(self): 241 def test_multiline_obsolete(self):
221 """Tests for correct output of mulitline obsolete messages""" 242 """Tests for correct output of mulitline obsolete messages"""
222 posource = '#~ msgid ""\n#~ "Old thing\\n"\n#~ "Second old thing"\n#~ ms gstr ""\n#~ "Ou ding\\n"\n#~ "Tweede ou ding"\n' 243 posource = '#~ msgid ""\n#~ "Old thing\\n"\n#~ "Second old thing"\n#~ ms gstr ""\n#~ "Ou ding\\n"\n#~ "Tweede ou ding"\n'
223 pofile = self.poparse(posource) 244 pofile = self.poparse(posource)
224 print "Source:\n%s" % posource 245 print "Source:\n%s" % posource
225 print "Output:\n%s" % str(pofile) 246 print "Output:\n%s" % str(pofile)
226 assert len(pofile.units) == 1 247 assert len(pofile.units) == 1
227 assert pofile.units[0].isobsolete() 248 assert pofile.units[0].isobsolete()
228 assert not pofile.units[0].istranslatable() 249 assert not pofile.units[0].istranslatable()
229 assert str(pofile) == posource 250 assert str(pofile) == posource
230 251
231 def test_unassociated_comments(self): 252 def test_unassociated_comments(self):
232 """tests behaviour of unassociated comments.""" 253 """tests behaviour of unassociated comments."""
233 oldsource = '# old lonesome comment\n\nmsgid "one"\nmsgstr "een"\n' 254 oldsource = '# old lonesome comment\n\nmsgid "one"\nmsgstr "een"\n'
234 oldfile = self.poparse(oldsource) 255 oldfile = self.poparse(oldsource)
235 print "__str__", str(oldfile) 256 print "__str__", str(oldfile)
236 assert len(oldfile.units) == 1 257 assert len(oldfile.units) == 1
237 assert str(oldfile).find("# old lonesome comment\nmsgid") >= 0 258 assert str(oldfile).find("# old lonesome comment\nmsgid") >= 0
238 259
LEFTRIGHT

Powered by Google App Engine
This is Rietveld r159