#!/usr/bin/env python from lxml import etree from translate.storage import xliff, lisa from translate.storage import test_base from translate.storage.placeables import StringElem from translate.storage.placeables.xliff import X, G class TestXLIFFUnit(test_base.TestTranslationUnit): UnitClass = xliff.xliffunit def test_isfuzzy(self): """The default behaviour for XLIFF is different, so we adapt the test from test_base.py""" assert self.unit.isfuzzy() def test_markreview(self): """Tests if we can mark the unit to need review.""" unit = self.unit # We have to explicitly set the target to nothing, otherwise xliff # tests will fail. # Can we make it default behavior for the UnitClass? unit.target = "" unit.addnote("Test note 1", origin="translator") unit.addnote("Test note 2", origin="translator") original_notes = unit.getnotes(origin="translator") assert not unit.isreview() unit.markreviewneeded() assert unit.isreview() unit.markreviewneeded(False) assert not unit.isreview() assert unit.getnotes(origin="translator") == original_notes unit.markreviewneeded(explanation="Double check spelling.") assert unit.isreview() notes = unit.getnotes(origin="translator") assert notes.count("Double check spelling.") == 1 def test_errors(self): """Tests that we can add and retrieve error messages for a unit.""" unit = self.unit assert len(unit.geterrors()) == 0 unit.adderror(errorname='test1', errortext='Test error message 1.') unit.adderror(errorname='test2', errortext='Test error message 2.') unit.adderror(errorname='test3', errortext='Test error message 3.') assert len(unit.geterrors()) == 3 assert unit.geterrors()['test1'] == 'Test error message 1.' assert unit.geterrors()['test2'] == 'Test error message 2.' assert unit.geterrors()['test3'] == 'Test error message 3.' unit.adderror(errorname='test1', errortext='New error 1.') assert unit.geterrors()['test1'] == 'New error 1.' class TestXLIFFfile(test_base.TestTranslationStore): StoreClass = xliff.xlifffile skeleton = ''' %s ''' def test_basic(self): xlifffile = xliff.xlifffile() assert xlifffile.units == [] xlifffile.addsourceunit("Bla") assert len(xlifffile.units) == 1 newfile = xliff.xlifffile.parsestring(str(xlifffile)) print str(xlifffile) assert len(newfile.units) == 1 assert newfile.units[0].source == "Bla" assert newfile.findunit("Bla").source == "Bla" assert newfile.findunit("dit") is None def test_rich_source(self): xlifffile = xliff.xlifffile() xliffunit = xlifffile.addsourceunit(u'') # Test 1 xliffunit.rich_source = [StringElem([u'foo', X(id='bar'), u'baz'])] source_dom_node = xliffunit.getlanguageNode(None, 0) x_placeable = source_dom_node[0] assert source_dom_node.text == 'foo' assert x_placeable.tag == u'x' assert x_placeable.attrib['id'] == 'bar' assert x_placeable.tail == 'baz' xliffunit.rich_source[0].print_tree(2) print xliffunit.rich_source assert xliffunit.rich_source == [StringElem([StringElem(u'foo'), X(id='bar'), StringElem(u'baz')])] # Test 2 xliffunit.rich_source = [StringElem([u'foo', u'baz', G(id='oof', sub=[G(id='zab', sub=[u'bar', u'rab'])])])] source_dom_node = xliffunit.getlanguageNode(None, 0) g_placeable = source_dom_node[0] nested_g_placeable = g_placeable[0] assert source_dom_node.text == u'foobaz' assert g_placeable.tag == u'g' assert g_placeable.text is None assert g_placeable.attrib[u'id'] == u'oof' assert g_placeable.tail is None assert nested_g_placeable.tag == u'g' assert nested_g_placeable.text == u'barrab' assert nested_g_placeable.attrib[u'id'] == u'zab' assert nested_g_placeable.tail is None rich_source = xliffunit.rich_source rich_source[0].print_tree(2) assert rich_source == [StringElem([u'foobaz', G(id='oof', sub=[G(id='zab', sub=[u'barrab'])])])] def test_rich_target(self): xlifffile = xliff.xlifffile() xliffunit = xlifffile.addsourceunit(u'') # Test 1 xliffunit.set_rich_target([StringElem([u'foo', X(id='bar'), u'baz'])], u'fr') target_dom_node = xliffunit.getlanguageNode(None, 1) x_placeable = target_dom_node[0] assert target_dom_node.text == 'foo' assert x_placeable.tag == u'x' assert x_placeable.attrib['id'] == 'bar' assert x_placeable.tail == 'baz' # Test 2 xliffunit.set_rich_target([StringElem([u'foo', u'baz', G(id='oof', sub=[G(id='zab', sub=[u'bar', u'rab'])])])], u'fr') target_dom_node = xliffunit.getlanguageNode(None, 1) g_placeable = target_dom_node[0] nested_g_placeable = g_placeable[0] assert target_dom_node.text == u'foobaz' assert g_placeable.tag == u'g' print 'g_placeable.text: %s (%s)' % (g_placeable.text, type(g_placeable.text)) assert g_placeable.text is None assert g_placeable.attrib[u'id'] == u'oof' assert g_placeable.tail is None assert nested_g_placeable.tag == u'g' assert nested_g_placeable.text == u'barrab' assert nested_g_placeable.attrib[u'id'] == u'zab' assert nested_g_placeable.tail is None xliffunit.rich_target[0].print_tree(2) assert xliffunit.rich_target == [StringElem([u'foobaz', G(id='oof', sub=[G(id='zab', sub=[u'barrab'])])])] def test_source(self): xlifffile = xliff.xlifffile() xliffunit = xlifffile.addsourceunit("Concept") xliffunit.source = "Term" newfile = xliff.xlifffile.parsestring(str(xlifffile)) print str(xlifffile) assert newfile.findunit("Concept") is None assert newfile.findunit("Term") is not None def test_target(self): xlifffile = xliff.xlifffile() xliffunit = xlifffile.addsourceunit("Concept") xliffunit.target = "Konsep" newfile = xliff.xlifffile.parsestring(str(xlifffile)) print str(xlifffile) assert newfile.findunit("Concept").target == "Konsep" def test_sourcelanguage(self): xlifffile = xliff.xlifffile(sourcelanguage="xh") xmltext = str(xlifffile) print xmltext assert xmltext.find('source-language="xh"')> 0 #TODO: test that it also works for new files. def test_targetlanguage(self): xlifffile = xliff.xlifffile(sourcelanguage="zu", targetlanguage="af") xmltext = str(xlifffile) print xmltext assert xmltext.find('source-language="zu"')> 0 assert xmltext.find('target-language="af"')> 0 def test_notes(self): xlifffile = xliff.xlifffile() unit = xlifffile.addsourceunit("Concept") unit.addnote("Please buy bread") assert unit.getnotes() == "Please buy bread" notenodes = unit.xmlelement.findall(".//%s" % unit.namespaced("note")) assert len(notenodes) == 1 unit.addnote("Please buy milk", origin="Mom") notenodes = unit.xmlelement.findall(".//%s" % unit.namespaced("note")) assert len(notenodes) == 2 assert not "from" in notenodes[0].attrib assert notenodes[1].get("from") == "Mom" assert unit.getnotes(origin="Mom") == "Please buy milk" unit.addnote("Don't forget the beer", origin="Dad") notenodes = unit.xmlelement.findall(".//%s" % unit.namespaced("note")) assert len(notenodes) == 3 assert notenodes[1].get("from") == "Mom" assert notenodes[2].get("from") == "Dad" assert unit.getnotes(origin="Dad") == "Don't forget the beer" assert not unit.getnotes(origin="Bob") == "Please buy bread\nPlease buy milk\nDon't forget the beer" assert not notenodes[2].get("from") == "Mom" assert not "from" in notenodes[0].attrib assert unit.getnotes() == "Please buy bread\nPlease buy milk\nDon't forget the beer" assert unit.correctorigin(notenodes[2], "ad") == True assert unit.correctorigin(notenodes[2], "om") == False def test_alttrans(self): """Test xliff accessors""" xlifffile = xliff.xlifffile() unit = xlifffile.addsourceunit("Testing") unit.addalttrans("ginmi") unit.addalttrans("shikenki") alternatives = unit.getalttrans() assert alternatives[0].source == "Testing" assert alternatives[0].target == "ginmi" assert alternatives[1].target == "shikenki" assert not unit.target unit.addalttrans("Tasting", origin="bob", lang="eng") alternatives = unit.getalttrans() assert alternatives[2].target == "Tasting" alternatives = unit.getalttrans(origin="bob") assert alternatives[0].target == "Tasting" unit.delalttrans(alternatives[0]) assert len(unit.getalttrans(origin="bob")) == 0 alternatives = unit.getalttrans() assert len(alternatives) == 2 assert alternatives[0].target == "ginmi" assert alternatives[1].target == "shikenki" #clean up: alternatives = unit.getalttrans() for alt in alternatives: unit.delalttrans(alt) unit.addalttrans("targetx", sourcetxt="sourcex") # test that the source node is before the target node: alt = unit.getalttrans()[0] altformat = etree.tostring(alt.xmlelement) print altformat assert altformat.find(" File 1 ''' xlifffile = xliff.xlifffile.parsestring(xlfsource) assert xlifffile.units[0].source == " File 1 " root_node = xlifffile.document.getroot() lisa.setXMLspace(root_node, "preserve") assert xlifffile.units[0].source == " File 1 " lisa.setXMLspace(root_node, "default") assert xlifffile.units[0].source == " File 1 " xlfsource = self.skeleton \ % ''' File 1 ''' xlifffile = xliff.xlifffile.parsestring(xlfsource) assert xlifffile.units[0].source == "File 1" root_node = xlifffile.document.getroot() lisa.setXMLspace(root_node, "preserve") assert xlifffile.units[0].source == "File 1" lisa.setXMLspace(root_node, "default") assert xlifffile.units[0].source == "File 1" xlfsource = self.skeleton \ % ''' File 1 ''' # we currently always normalize as default behaviour for xliff xlifffile = xliff.xlifffile.parsestring(xlfsource) assert xlifffile.units[0].source == "File 1" root_node = xlifffile.document.getroot() lisa.setXMLspace(root_node, "preserve") assert xlifffile.units[0].source == "File 1" lisa.setXMLspace(root_node, "default") assert xlifffile.units[0].source == "File 1" xlfsource = self.skeleton \ % ''' File 1 ''' # we currently always normalize as default behaviour for xliff xlifffile = xliff.xlifffile.parsestring(xlfsource) assert xlifffile.units[0].source == "File 1" root_node = xlifffile.document.getroot() lisa.setXMLspace(root_node, "preserve") assert xlifffile.units[0].source == "File 1" lisa.setXMLspace(root_node, "default") assert xlifffile.units[0].source == "File 1" def test_parsing(self): xlfsource = self.skeleton \ % ''' File ''' xlifffile = xliff.xlifffile.parsestring(xlfsource) assert xlifffile.units[0].istranslatable() xlfsource = self.skeleton \ % ''' File ''' xlifffile = xliff.xlifffile.parsestring(xlfsource) assert not xlifffile.units[0].istranslatable() xlfsource = self.skeleton \ % ''' File ''' xlifffile = xliff.xlifffile.parsestring(xlfsource) assert xlifffile.units[0].istranslatable()