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