1#!/usr/bin/env python 2# Copyright (c) 2012 The Chromium Authors. All rights reserved. 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6'''Unit tests for node_io.FileNode''' 7 8from __future__ import print_function 9 10import os 11import sys 12import unittest 13 14if __name__ == '__main__': 15 sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) 16 17from six import StringIO 18 19from grit.node import misc 20from grit.node import node_io 21from grit.node import empty 22from grit import grd_reader 23from grit import util 24 25 26def _GetAllCliques(root_node): 27 """Return all cliques in the |root_node| tree.""" 28 ret = [] 29 for node in root_node: 30 ret.extend(node.GetCliques()) 31 return ret 32 33 34class FileNodeUnittest(unittest.TestCase): 35 def testGetPath(self): 36 root = misc.GritNode() 37 root.StartParsing(u'grit', None) 38 root.HandleAttribute(u'latest_public_release', u'0') 39 root.HandleAttribute(u'current_release', u'1') 40 root.HandleAttribute(u'base_dir', r'..\resource') 41 translations = empty.TranslationsNode() 42 translations.StartParsing(u'translations', root) 43 root.AddChild(translations) 44 file_node = node_io.FileNode() 45 file_node.StartParsing(u'file', translations) 46 file_node.HandleAttribute(u'path', r'flugel\kugel.pdf') 47 translations.AddChild(file_node) 48 root.EndParsing() 49 50 self.failUnless(root.ToRealPath(file_node.GetInputPath()) == 51 util.normpath( 52 os.path.join(r'../resource', r'flugel/kugel.pdf'))) 53 54 def VerifyCliquesContainEnglishAndFrenchAndNothingElse(self, cliques): 55 self.assertEqual(2, len(cliques)) 56 for clique in cliques: 57 self.assertEqual({'en', 'fr'}, set(clique.clique.keys())) 58 59 def testLoadTranslations(self): 60 xml = '''<?xml version="1.0" encoding="UTF-8"?> 61 <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir="."> 62 <translations> 63 <file path="generated_resources_fr.xtb" lang="fr" /> 64 </translations> 65 <release seq="3"> 66 <messages> 67 <message name="ID_HELLO">Hello!</message> 68 <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>Joi</ex></ph></message> 69 </messages> 70 </release> 71 </grit>''' 72 grd = grd_reader.Parse(StringIO(xml), 73 util.PathFromRoot('grit/testdata')) 74 grd.SetOutputLanguage('en') 75 grd.RunGatherers() 76 self.VerifyCliquesContainEnglishAndFrenchAndNothingElse(_GetAllCliques(grd)) 77 78 def testIffyness(self): 79 grd = grd_reader.Parse(StringIO('''<?xml version="1.0" encoding="UTF-8"?> 80 <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir="."> 81 <translations> 82 <if expr="lang == 'fr'"> 83 <file path="generated_resources_fr.xtb" lang="fr" /> 84 </if> 85 </translations> 86 <release seq="3"> 87 <messages> 88 <message name="ID_HELLO">Hello!</message> 89 <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>Joi</ex></ph></message> 90 </messages> 91 </release> 92 </grit>'''), util.PathFromRoot('grit/testdata')) 93 grd.SetOutputLanguage('en') 94 grd.RunGatherers() 95 cliques = _GetAllCliques(grd) 96 self.assertEqual(2, len(cliques)) 97 for clique in cliques: 98 self.assertEqual({'en'}, set(clique.clique.keys())) 99 100 grd.SetOutputLanguage('fr') 101 grd.RunGatherers() 102 self.VerifyCliquesContainEnglishAndFrenchAndNothingElse(_GetAllCliques(grd)) 103 104 def testConditionalLoadTranslations(self): 105 xml = '''<?xml version="1.0" encoding="UTF-8"?> 106 <grit latest_public_release="2" source_lang_id="en-US" current_release="3" 107 base_dir="."> 108 <translations> 109 <if expr="True"> 110 <file path="generated_resources_fr.xtb" lang="fr" /> 111 </if> 112 <if expr="False"> 113 <file path="no_such_file.xtb" lang="de" /> 114 </if> 115 </translations> 116 <release seq="3"> 117 <messages> 118 <message name="ID_HELLO">Hello!</message> 119 <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex> 120 Joi</ex></ph></message> 121 </messages> 122 </release> 123 </grit>''' 124 grd = grd_reader.Parse(StringIO(xml), 125 util.PathFromRoot('grit/testdata')) 126 grd.SetOutputLanguage('en') 127 grd.RunGatherers() 128 self.VerifyCliquesContainEnglishAndFrenchAndNothingElse(_GetAllCliques(grd)) 129 130 def testConditionalOutput(self): 131 xml = '''<?xml version="1.0" encoding="UTF-8"?> 132 <grit latest_public_release="2" source_lang_id="en-US" current_release="3" 133 base_dir="."> 134 <outputs> 135 <output filename="resource.h" type="rc_header" /> 136 <output filename="en/generated_resources.rc" type="rc_all" 137 lang="en" /> 138 <if expr="pp_if('NOT_TRUE')"> 139 <output filename="de/generated_resources.rc" type="rc_all" 140 lang="de" /> 141 </if> 142 </outputs> 143 <release seq="3"> 144 <messages> 145 <message name="ID_HELLO">Hello!</message> 146 </messages> 147 </release> 148 </grit>''' 149 grd = grd_reader.Parse(StringIO(xml), 150 util.PathFromRoot('grit/test/data'), 151 defines={}) 152 grd.SetOutputLanguage('en') 153 grd.RunGatherers() 154 outputs = grd.GetChildrenOfType(node_io.OutputNode) 155 active = set(grd.ActiveDescendants()) 156 self.failUnless(outputs[0] in active) 157 self.failUnless(outputs[0].GetType() == 'rc_header') 158 self.failUnless(outputs[1] in active) 159 self.failUnless(outputs[1].GetType() == 'rc_all') 160 self.failUnless(outputs[2] not in active) 161 self.failUnless(outputs[2].GetType() == 'rc_all') 162 163 # Verify that 'iw' and 'no' language codes in xtb files are mapped to 'he' and 164 # 'nb'. 165 def testLangCodeMapping(self): 166 grd = grd_reader.Parse(StringIO('''<?xml version="1.0" encoding="UTF-8"?> 167 <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir="."> 168 <translations> 169 <file path="generated_resources_no.xtb" lang="nb" /> 170 <file path="generated_resources_iw.xtb" lang="he" /> 171 </translations> 172 <release seq="3"> 173 <messages></messages> 174 </release> 175 </grit>'''), util.PathFromRoot('grit/testdata')) 176 grd.SetOutputLanguage('en') 177 grd.RunGatherers() 178 self.assertEqual([], _GetAllCliques(grd)) 179 180 181if __name__ == '__main__': 182 unittest.main() 183