139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org#!/usr/bin/env python 239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved. 339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org# Use of this source code is governed by a BSD-style license that can be 439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org# found in the LICENSE file. 539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org'''Unit tests for grit.tool.android2grd''' 739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgimport os 939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgimport sys 1039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgif __name__ == '__main__': 1198b76c0017dbdc61506f146d197d594b1ce07db7joi@chromium.org sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) 1239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 1339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgimport unittest 1439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgimport xml.dom.minidom 1539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 166fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.orgfrom grit import grd_reader 176fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.orgfrom grit import util 186fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.orgfrom grit.node import empty 196fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.orgfrom grit.node import io 206fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.orgfrom grit.node import message 216fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.orgfrom grit.node import misc 2239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgfrom grit.tool import android2grd 2339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 2439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 2539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgclass Android2GrdUnittest(unittest.TestCase): 2639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 2739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org def __Parse(self, xml_string): 2839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org return xml.dom.minidom.parseString(xml_string).childNodes[0] 2939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 3039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org def testCreateTclibMessage(self): 3139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org tool = android2grd.Android2Grd() 3239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse(r''' 3339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org <string name="simple">A simple string</string>''')) 3439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), 'A simple string') 3539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse(r''' 3639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org <string name="outer_whitespace"> 3739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org Strip leading/trailing whitespace 3839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org </string>''')) 3939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), 'Strip leading/trailing whitespace') 4039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse(r''' 4139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org <string name="inner_whitespace">Fold multiple spaces</string>''')) 4239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), 'Fold multiple spaces') 4339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse(r''' 4439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org <string name="escaped_spaces">Retain \n escaped\t spaces</string>''')) 4539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), 'Retain \n escaped\t spaces') 4639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse(r''' 4739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org <string name="quotes"> " Quotes preserve 4839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org whitespace" but only for "enclosed elements " 4939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org </string>''')) 5039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), ''' Quotes preserve 5139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org whitespace but only for enclosed elements ''') 5239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse( 5339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org r'''<string name="escaped_characters">Escaped characters: \"\'\\\t\n''' 5439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org '</string>')) 5539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), '''Escaped characters: "'\\\t\n''') 5639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse( 5739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org '<string xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2" ' 5839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 'name="placeholders">' 5939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 'Open <xliff:g id="FILENAME" example="internet.html">%s</xliff:g>?' 6039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org '</string>')) 6139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), 'Open %s?') 6239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(len(msg.GetPlaceholders()), 1) 6339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetPlaceholders()[0].presentation, 'FILENAME') 6439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetPlaceholders()[0].original, '%s') 6539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetPlaceholders()[0].example, 'internet.html') 6639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org msg = tool.CreateTclibMessage(self.__Parse(r''' 6739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org <string name="comment">Contains a <!-- ignore this --> comment 6839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org </string>''')) 6939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertEqual(msg.GetRealContent(), 'Contains a comment') 7039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 7139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org def testIsTranslatable(self): 7239c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org tool = android2grd.Android2Grd() 7339c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org string_el = self.__Parse('<string>Hi</string>') 7439c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertTrue(tool.IsTranslatable(string_el)) 7539c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org string_el = self.__Parse( 7639c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org '<string translatable="true">Hi</string>') 7739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertTrue(tool.IsTranslatable(string_el)) 7839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org string_el = self.__Parse( 7939c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org '<string translatable="false">Hi</string>') 8039c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org self.assertFalse(tool.IsTranslatable(string_el)) 8139c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org 826fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org def __ParseAndroidXml(self, options = []): 836fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org tool = android2grd.Android2Grd() 846fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 856fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org tool.ParseOptions(options) 866fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 876fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org android_path = util.PathFromRoot('grit/testdata/android.xml') 886fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org with open(android_path) as android_file: 896fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org android_dom = xml.dom.minidom.parse(android_file) 906fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 916fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org grd = tool.AndroidDomToGrdDom(android_dom) 926fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(isinstance(grd, misc.GritNode)) 936fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 946fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org return grd 956fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 966fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org def testAndroidDomToGrdDom(self): 976fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org grd = self.__ParseAndroidXml(['--languages', 'en-US,en-GB,ru']) 986fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 996fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org # Check that the structure of the GritNode is as expected. 1006fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org messages = grd.GetChildrenOfType(message.MessageNode) 1016fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org translations = grd.GetChildrenOfType(empty.TranslationsNode) 1026fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org files = grd.GetChildrenOfType(io.FileNode) 1036fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1046fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(len(translations), 1) 1056fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(len(files), 3) 1066bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org self.assertEqual(len(messages), 5) 1076fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1086fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org # Check that a message node is constructed correctly. 1096fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org msg = filter(lambda x: x.GetTextualIds()[0] == "IDS_PLACEHOLDERS", messages) 1106fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(msg) 1116fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org msg = msg[0] 1126fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1136fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(msg.IsTranslateable()) 1146fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(msg.attrs["desc"], "A string with placeholder.") 1156fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1166fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org def testProductAttribute(self): 1176fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org grd = self.__ParseAndroidXml([]) 1186fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org messages = grd.GetChildrenOfType(message.MessageNode) 1196fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org msg = filter(lambda x: x.GetTextualIds()[0] == 1206fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org "IDS_SIMPLE_product_nosdcard", 1216fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org messages) 1226fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(msg) 1236fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1246bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org def testTranslatableAttribute(self): 1256bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org grd = self.__ParseAndroidXml([]) 1266bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org messages = grd.GetChildrenOfType(message.MessageNode) 1276bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org msgs = filter(lambda x: x.GetTextualIds()[0] == "IDS_CONSTANT", messages) 1286bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org self.assertTrue(msgs) 1296bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org self.assertFalse(msgs[0].IsTranslateable()) 1306bb3e563e4e8fd75ccc115a5b2290ceb821eb700newt@chromium.org 1316fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org def testTranslations(self): 1326fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org grd = self.__ParseAndroidXml(['--languages', 'en-US,en-GB,ru,id']) 1336fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1346fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org files = grd.GetChildrenOfType(io.FileNode) 1356fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org us_file = filter(lambda x: x.attrs['lang'] == 'en-US', files) 1366fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(us_file) 1376fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(us_file[0].GetInputPath(), 1386fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 'chrome_android_strings_en-US.xtb') 1396fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1406fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org id_file = filter(lambda x: x.attrs['lang'] == 'id', files) 1416fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(id_file) 1426fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(id_file[0].GetInputPath(), 1436fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 'chrome_android_strings_id.xtb') 1446fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1456fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org def testOutputs(self): 1466fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org grd = self.__ParseAndroidXml(['--languages', 'en-US,ru,id', 1476fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org '--rc-dir', 'rc/dir', 1486fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org '--header-dir', 'header/dir', 1496fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org '--xtb-dir', 'xtb/dir', 1506fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org '--xml-dir', 'xml/dir']) 1516fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1526fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org outputs = grd.GetChildrenOfType(io.OutputNode) 1536fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(len(outputs), 7) 1546fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1556fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org header_outputs = filter(lambda x: x.GetType() == 'rc_header', outputs) 1566fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org rc_outputs = filter(lambda x: x.GetType() == 'rc_all', outputs) 1576fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org xml_outputs = filter(lambda x: x.GetType() == 'android', outputs) 1586fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1596fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(len(header_outputs), 1) 1606fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(len(rc_outputs), 3) 1616fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertEqual(len(xml_outputs), 3) 1626fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1636fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org # The header node should have an "<emit>" child and the proper filename. 1646fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(header_outputs[0].GetChildrenOfType(io.EmitNode)) 165b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org self.assertEqual(util.normpath(header_outputs[0].GetFilename()), 166b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org util.normpath('header/dir/chrome_android_strings.h')) 1676fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1686fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org id_rc = filter(lambda x: x.GetLanguage() == 'id', rc_outputs) 1696fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org id_xml = filter(lambda x: x.GetLanguage() == 'id', xml_outputs) 1706fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(id_rc) 1716fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(id_xml) 172b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org self.assertEqual(util.normpath(id_rc[0].GetFilename()), 173b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org util.normpath('rc/dir/chrome_android_strings_id.rc')) 174b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org self.assertEqual(util.normpath(id_xml[0].GetFilename()), 175b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org util.normpath('xml/dir/values-in/strings.xml')) 1766fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1776fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org us_rc = filter(lambda x: x.GetLanguage() == 'en-US', rc_outputs) 1786fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org us_xml = filter(lambda x: x.GetLanguage() == 'en-US', xml_outputs) 1796fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(us_rc) 1806fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org self.assertTrue(us_xml) 181b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org self.assertEqual(util.normpath(us_rc[0].GetFilename()), 182b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org util.normpath('rc/dir/chrome_android_strings_en-US.rc')) 183b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org self.assertEqual(util.normpath(us_xml[0].GetFilename()), 184b1fb35582c700c4ac3399526f75b3cd6d193c100joi@chromium.org util.normpath('xml/dir/values-en-rUS/strings.xml')) 1856fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 1866fcd713bd730504dd4e578e4254359624d186a4ccjhopman@chromium.org 18739c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.orgif __name__ == '__main__': 18839c335c3faa47701974a3ba3f7f8175947efc248newt@chromium.org unittest.main() 189