fix git support for v1.5.3 (or higher) by setting "--work-tree"
[translate_toolkit.git] / storage / test_cpo.py
blob193d149032a9ae921a1b2688e7c98cada6d2b55a
1 #!/usr/bin/env python
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"]
48 unit.target = "Boom"
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"]
55 def test_notes(self):
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"
83 print pofile
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")
95 # print pofile
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
122 # for i in (0, 1):
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
142 print str(pofile)
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)
160 print pofile
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