2 # -*- coding: utf-8 -*-
4 from translate
.storage
import test_po
5 from translate
.storage
import cpo
6 from translate
.misc
.multistring
import multistring
7 from translate
.misc
import wStringIO
8 from py
.test
import raises
10 class TestCPOUnit(test_po
.TestPOUnit
):
11 UnitClass
= cpo
.pounit
13 def test_plurals(self
):
14 """Tests that plurals are handled correctly."""
15 unit
= self
.UnitClass("Cow")
16 unit
.msgid_plural
= ["Cows"]
17 assert isinstance(unit
.source
, multistring
)
18 assert unit
.source
.strings
== ["Cow", "Cows"]
19 assert unit
.source
== "Cow"
21 unit
.target
= ["Koei", "Koeie"]
22 assert isinstance(unit
.target
, multistring
)
23 assert unit
.target
.strings
== ["Koei", "Koeie"]
24 assert unit
.target
== "Koei"
26 unit
.target
= {0:"Koei", 3:"Koeie"}
27 assert isinstance(unit
.target
, multistring
)
28 assert unit
.target
.strings
== ["Koei", "Koeie"]
29 assert unit
.target
== "Koei"
31 unit
.target
= [u
"Sk\u00ear", u
"Sk\u00eare"]
32 assert isinstance(unit
.target
, multistring
)
33 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"
37 def test_plural_reduction(self
):
38 """checks that reducing the number of plurals supplied works"""
39 unit
= self
.UnitClass("Tree")
40 unit
.msgid_plural
= ["Trees"]
41 assert isinstance(unit
.source
, multistring
)
42 assert unit
.source
.strings
== ["Tree", "Trees"]
43 unit
.target
= multistring(["Boom", "Bome", "Baie Bome"])
44 assert isinstance(unit
.source
, multistring
)
45 assert unit
.target
.strings
== ["Boom", "Bome", "Baie Bome"]
46 unit
.target
= multistring(["Boom", "Bome"])
47 assert unit
.target
.strings
== ["Boom", "Bome"]
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...
51 assert unit
.target
.strings
== ["Boom", "Bome"]
52 unit
.target
= "Een Boom"
53 assert unit
.target
.strings
== ["Een Boom"]
56 """tests that the generic notes API works"""
57 unit
= self
.UnitClass("File")
58 assert unit
.getnotes() == ""
59 unit
.addnote("Which meaning of file?")
60 assert unit
.getnotes("translator") == "Which meaning of file?"
61 assert unit
.getnotes("developer") == ""
62 unit
.addnote("Verb", origin
="programmer")
63 assert unit
.getnotes("developer") == "Verb"
64 unit
.addnote("Thank you", origin
="translator")
65 assert unit
.getnotes("translator") == "Which meaning of file?\nThank you"
66 assert unit
.getnotes() == "Which meaning of file?\nThank you\nVerb"
67 assert raises(ValueError, unit
.getnotes
, "devteam")
69 def test_notes_withcomments(self
):
70 """tests that when we add notes that look like comments that we treat them properly"""
71 unit
= self
.UnitClass("File")
72 unit
.addnote("# Double commented comment")
73 assert unit
.getnotes() == "# Double commented comment"
75 class TestCPOFile(test_po
.TestPOFile
):
76 StoreClass
= cpo
.pofile
77 def test_msgidcomments(self
):
78 """checks that we handle msgid comments"""
79 posource
= 'msgid "test me"\nmsgstr ""'
80 pofile
= self
.poparse(posource
)
81 thepo
= pofile
.units
[0]
82 thepo
.msgidcomment
= "first comment"
84 print "Blah", thepo
.source
85 assert thepo
.source
== "test me"
86 thepo
.msgidcomment
= "second comment"
87 assert str(pofile
).count("_:") == 1
89 # def test_merge_duplicates_msgctxt(self):
90 # """checks that merging duplicates works for msgctxt"""
91 # posource = '#: source1\nmsgid "test me"\nmsgstr ""\n\n#: source2\nmsgid "test me"\nmsgstr ""\n'
92 # pofile = self.poparse(posource)
93 # assert len(pofile.units) == 2
94 # pofile.removeduplicates("msgctxt")
96 # assert len(pofile.units) == 2
97 # assert str(pofile.units[0]).count("source1") == 2
98 # assert str(pofile.units[1]).count("source2") == 2
100 # def test_merge_blanks(self):
101 # """checks that merging adds msgid_comments to blanks"""
102 # posource = '#: source1\nmsgid ""\nmsgstr ""\n\n#: source2\nmsgid ""\nmsgstr ""\n'
103 # pofile = self.poparse(posource)
104 # assert len(pofile.units) == 2
105 # pofile.removeduplicates("merge")
106 # assert len(pofile.units) == 2
107 # print pofile.units[0].msgidcomments
108 # print pofile.units[1].msgidcomments
109 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "_: source1\n"
110 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "_: source2\n"
112 # def test_msgid_comment(self):
113 # """checks that when adding msgid_comments we place them on a newline"""
114 # posource = '#: source0\nmsgid "Same"\nmsgstr ""\n\n#: source1\nmsgid "Same"\nmsgstr ""\n'
115 # pofile = self.poparse(posource)
116 # assert len(pofile.units) == 2
117 # pofile.removeduplicates("msgid_comment")
118 # assert len(pofile.units) == 2
119 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == "_: source0\n"
120 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == "_: source1\n"
121 # # Now lets check for formating
123 # expected = '''#: source%d\nmsgid ""\n"_: source%d\\n"\n"Same"\nmsgstr ""\n''' % (i, i)
124 # assert pofile.units[i].__str__() == expected
126 # def test_keep_blanks(self):
127 # """checks that keeping keeps blanks and doesn't add msgid_comments"""
128 # posource = '#: source1\nmsgid ""\nmsgstr ""\n\n#: source2\nmsgid ""\nmsgstr ""\n'
129 # pofile = self.poparse(posource)
130 # assert len(pofile.units) == 2
131 # pofile.removeduplicates("keep")
132 # assert len(pofile.units) == 2
133 # # check we don't add msgidcomments
134 # assert po.unquotefrompo(pofile.units[0].msgidcomments) == ""
135 # assert po.unquotefrompo(pofile.units[1].msgidcomments) == ""
137 def test_output_str_unicode(self
):
138 """checks that we can str(pofile) which is in unicode"""
139 posource
= u
'''#: nb\nmsgid "Norwegian Bokm\xe5l"\nmsgstr ""\n'''
140 pofile
= self
.StoreClass(wStringIO
.StringIO(posource
.encode("UTF-8")), encoding
="UTF-8")
141 assert len(pofile
.units
) == 1
143 thepo
= pofile
.units
[0]
144 # assert str(pofile) == posource.encode("UTF-8")
145 # extra test: what if we set the msgid to a unicode? this happens in prop2po etc
146 thepo
.source
= u
"Norwegian Bokm\xe5l"
147 # assert str(thepo) == posource.encode("UTF-8")
148 # Now if we set the msgstr to Unicode
149 # this is an escaped half character (1/2)
150 halfstr
= "\xbd ...".decode("latin-1")
151 thepo
.target
= halfstr
152 # assert halfstr in str(pofile).decode("UTF-8")
153 thepo
.target
= halfstr
.encode("UTF-8")
154 # assert halfstr.encode("UTF-8") in str(pofile)
156 def test_posections(self
):
157 """checks the content of all the expected sections of a PO message"""
158 posource
= '# other comment\n#. automatic comment\n#: source comment\n#, fuzzy\nmsgid "One"\nmsgstr "Een"\n'
159 pofile
= self
.poparse(posource
)
161 assert len(pofile
.units
) == 1
162 assert str(pofile
) == posource
164 def test_multiline_obsolete(self
):
165 """Tests for correct output of mulitline obsolete messages"""
166 posource
= '#~ msgid ""\n#~ "Old thing\\n"\n#~ "Second old thing"\n#~ msgstr ""\n#~ "Ou ding\\n"\n#~ "Tweede ou ding"\n'
167 pofile
= self
.poparse(posource
)
168 print "Source:\n%s" % posource
169 print "Output:\n%s" % str(pofile
)
170 assert len(pofile
.units
) == 1
171 assert pofile
.units
[0].isobsolete()
172 assert not pofile
.units
[0].istranslatable()
173 assert str(pofile
) == posource
175 def test_unassociated_comments(self
):
176 """tests behaviour of unassociated comments."""
177 oldsource
= '# old lonesome comment\n\nmsgid "one"\nmsgstr "een"\n'
178 oldfile
= self
.poparse(oldsource
)
179 print "__str__", str(oldfile
)
180 assert len(oldfile
.units
) == 1
181 assert str(oldfile
).find("# old lonesome comment\nmsgid") >= 0