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