195640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org#!/usr/bin/env python
295640e3a20adea634b4df4ccf8c93f411184c438joi@chromium.org# Copyright (c) 2012 The Chromium Authors. All rights reserved.
301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# Use of this source code is governed by a BSD-style license that can be
401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org# found in the LICENSE file.
501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''Unit tests for io.FileNode'''
701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport os
901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport sys
1001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgif __name__ == '__main__':
1198b76c0017dbdc61506f146d197d594b1ce07db7joi@chromium.org  sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
1201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport os
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport StringIO
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport unittest
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
1701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.node import misc
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.node import io
1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.node import empty
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import grd_reader
2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit import util
2201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass FileNodeUnittest(unittest.TestCase):
2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testGetPath(self):
2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root = misc.GritNode()
2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root.StartParsing(u'grit', None)
2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root.HandleAttribute(u'latest_public_release', u'0')
2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root.HandleAttribute(u'current_release', u'1')
3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root.HandleAttribute(u'base_dir', ur'..\resource')
3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    translations = empty.TranslationsNode()
3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    translations.StartParsing(u'translations', root)
3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root.AddChild(translations)
3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    file_node = io.FileNode()
3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    file_node.StartParsing(u'file', translations)
3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    file_node.HandleAttribute(u'path', ur'flugel\kugel.pdf')
3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    translations.AddChild(file_node)
3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    root.EndParsing()
3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
40ec8016c73b3b945b6284746230913d88653f35e7benrg@chromium.org    self.failUnless(root.ToRealPath(file_node.GetInputPath()) ==
4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org                    util.normpath(
4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org                      os.path.join(ur'../resource', ur'flugel/kugel.pdf')))
4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
44705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org  def VerifyCliquesContainEnglishAndFrenchAndNothingElse(self, cliques):
45705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    for clique in cliques:
46705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      self.failUnlessEquals(len(clique[0].clique), 2)
47705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      self.failUnless('en' in cliques[i][0].clique)
48705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      self.failUnless('fr' in cliques[i][0].clique)
49705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org
5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testLoadTranslations(self):
51705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    xml = '''<?xml version="1.0" encoding="UTF-8"?>
5201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
5301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        <translations>
5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          <file path="generated_resources_fr.xtb" lang="fr" />
5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        </translations>
5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        <release seq="3">
5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          <messages>
5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="ID_HELLO">Hello!</message>
5901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>Joi</ex></ph></message>
6001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          </messages>
6101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        </release>
62705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      </grit>'''
63705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    grd = grd_reader.Parse(StringIO.StringIO(xml),
64705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org                           util.PathFromRoot('grit/testdata'))
65783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org    grd.SetOutputLanguage('en')
66ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    grd.RunGatherers()
67705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    self.VerifyCliquesContainEnglishAndFrenchAndNothingElse(grd.GetCliques())
6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testIffyness(self):
7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    grd = grd_reader.Parse(StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
7201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        <translations>
7301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          <if expr="lang == 'fr'">
7401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <file path="generated_resources_fr.xtb" lang="fr" />
7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          </if>
7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        </translations>
7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        <release seq="3">
7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          <messages>
7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="ID_HELLO">Hello!</message>
8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>Joi</ex></ph></message>
8101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          </messages>
8201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        </release>
8301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      </grit>'''), util.PathFromRoot('grit/testdata'))
84783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org    grd.SetOutputLanguage('en')
85ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    grd.RunGatherers()
8601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
87783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org    grd.SetOutputLanguage('fr')
88ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    grd.RunGatherers()
8901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
90705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org  def testConditionalLoadTranslations(self):
91705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    xml = '''<?xml version="1.0" encoding="UTF-8"?>
92705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      <grit latest_public_release="2" source_lang_id="en-US" current_release="3"
93705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            base_dir=".">
94705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        <translations>
95705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <if expr="True">
96705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            <file path="generated_resources_fr.xtb" lang="fr" />
97705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          </if>
98705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <if expr="False">
99705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            <file path="no_such_file.xtb" lang="de" />
100705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          </if>
101705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        </translations>
102705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        <release seq="3">
103705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <messages>
104705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            <message name="ID_HELLO">Hello!</message>
105705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            <message name="ID_HELLO_USER">Hello <ph name="USERNAME">%s<ex>
106705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org              Joi</ex></ph></message>
107705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          </messages>
108705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        </release>
109705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      </grit>'''
110705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    grd = grd_reader.Parse(StringIO.StringIO(xml),
111705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org                           util.PathFromRoot('grit/testdata'))
112783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org    grd.SetOutputLanguage('en')
113ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    grd.RunGatherers()
114705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    self.VerifyCliquesContainEnglishAndFrenchAndNothingElse(grd.GetCliques())
115705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org
116705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org  def testConditionalOutput(self):
117705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    xml = '''<?xml version="1.0" encoding="UTF-8"?>
118705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      <grit latest_public_release="2" source_lang_id="en-US" current_release="3"
119705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            base_dir=".">
120705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        <outputs>
121705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <output filename="resource.h" type="rc_header" />
122705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <output filename="en/generated_resources.rc" type="rc_all"
123705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org                  lang="en" />
124705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <if expr="pp_if('NOT_TRUE')">
125705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            <output filename="de/generated_resources.rc" type="rc_all"
126705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org                    lang="de" />
127705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          </if>
128705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        </outputs>
129705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        <release seq="3">
130705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          <messages>
131705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org            <message name="ID_HELLO">Hello!</message>
132705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org          </messages>
133705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org        </release>
134705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org      </grit>'''
135705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    grd = grd_reader.Parse(StringIO.StringIO(xml),
136783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org                           util.PathFromRoot('grit/test/data'),
137783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org                           defines={})
138783385ad40d453977d8b9d537e204f851e21591abenrg@chromium.org    grd.SetOutputLanguage('en')
139ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    grd.RunGatherers()
140705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    outputs = grd.GetChildrenOfType(io.OutputNode)
141ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    active = set(grd.ActiveDescendants())
142ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    self.failUnless(outputs[0] in active)
143705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    self.failUnless(outputs[0].GetType() == 'rc_header')
144ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    self.failUnless(outputs[1] in active)
145705a118ab4a1f2fe348fccdcd4786a0b5bf426ecjoi@chromium.org    self.failUnless(outputs[1].GetType() == 'rc_all')
146ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    self.failUnless(outputs[2] not in active)
147ccda47032903a6550dac2921f88c51b4da55aa36benrg@chromium.org    self.failUnless(outputs[2].GetType() == 'rc_all')
14801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
149d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org  # Verify that 'iw' and 'no' language codes in xtb files are mapped to 'he' and
150d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org  # 'nb'.
151d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org  def testLangCodeMapping(self):
152d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org    grd = grd_reader.Parse(StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
153d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org      <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
154d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org        <translations>
155d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org          <file path="generated_resources_no.xtb" lang="nb" />
156d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org          <file path="generated_resources_iw.xtb" lang="he" />
157d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org        </translations>
158d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org        <release seq="3">
159d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org          <messages></messages>
160d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org        </release>
161d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org      </grit>'''), util.PathFromRoot('grit/testdata'))
162d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org    grd.SetOutputLanguage('en')
163d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org    grd.RunGatherers()
164d769b0cb7974d27fc2e1feda9a2523e0da4a10b9tony@chromium.org
16501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
16601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgif __name__ == '__main__':
16701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  unittest.main()
168