| Index: tools/grit/grit/node/base_unittest.py
|
| diff --git a/tools/grit/grit/node/base_unittest.py b/tools/grit/grit/node/base_unittest.py
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..f7e7b759c2da49ea9d572a07cf24bc02c8a9fdea
|
| --- /dev/null
|
| +++ b/tools/grit/grit/node/base_unittest.py
|
| @@ -0,0 +1,258 @@
|
| +#!/usr/bin/env python
|
| +# Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +'''Unit tests for base.Node functionality (as used in various subclasses)'''
|
| +
|
| +
|
| +import os
|
| +import sys
|
| +if __name__ == '__main__':
|
| + sys.path.append(os.path.join(os.path.dirname(__file__), '../..'))
|
| +
|
| +import StringIO
|
| +import unittest
|
| +
|
| +from grit import grd_reader
|
| +from grit import util
|
| +from grit.node import base
|
| +from grit.node import message
|
| +
|
| +
|
| +def MakePlaceholder(phname='BINGO'):
|
| + ph = message.PhNode()
|
| + ph.StartParsing(u'ph', None)
|
| + ph.HandleAttribute(u'name', phname)
|
| + ph.AppendContent(u'bongo')
|
| + ph.EndParsing()
|
| + return ph
|
| +
|
| +
|
| +class NodeUnittest(unittest.TestCase):
|
| + def testWhitespaceHandling(self):
|
| + # We test using the Message node type.
|
| + node = message.MessageNode()
|
| + node.StartParsing(u'hello', None)
|
| + node.HandleAttribute(u'name', u'bla')
|
| + node.AppendContent(u" ''' two spaces ")
|
| + node.EndParsing()
|
| + self.failUnless(node.GetCdata() == u' two spaces')
|
| +
|
| + node = message.MessageNode()
|
| + node.StartParsing(u'message', None)
|
| + node.HandleAttribute(u'name', u'bla')
|
| + node.AppendContent(u" two spaces ''' ")
|
| + node.EndParsing()
|
| + self.failUnless(node.GetCdata() == u'two spaces ')
|
| +
|
| + def testWhitespaceHandlingWithChildren(self):
|
| + # We test using the Message node type.
|
| + node = message.MessageNode()
|
| + node.StartParsing(u'message', None)
|
| + node.HandleAttribute(u'name', u'bla')
|
| + node.AppendContent(u" ''' two spaces ")
|
| + node.AddChild(MakePlaceholder())
|
| + node.AppendContent(u' space before and after ')
|
| + node.AddChild(MakePlaceholder('BONGO'))
|
| + node.AppendContent(u" space before two after '''")
|
| + node.EndParsing()
|
| + self.failUnless(node.mixed_content[0] == u' two spaces ')
|
| + self.failUnless(node.mixed_content[2] == u' space before and after ')
|
| + self.failUnless(node.mixed_content[-1] == u' space before two after ')
|
| +
|
| + def testXmlFormatMixedContent(self):
|
| + # Again test using the Message node type, because it is the only mixed
|
| + # content node.
|
| + node = message.MessageNode()
|
| + node.StartParsing(u'message', None)
|
| + node.HandleAttribute(u'name', u'name')
|
| + node.AppendContent(u'Hello <young> ')
|
| +
|
| + ph = message.PhNode()
|
| + ph.StartParsing(u'ph', None)
|
| + ph.HandleAttribute(u'name', u'USERNAME')
|
| + ph.AppendContent(u'$1')
|
| + ex = message.ExNode()
|
| + ex.StartParsing(u'ex', None)
|
| + ex.AppendContent(u'Joi')
|
| + ex.EndParsing()
|
| + ph.AddChild(ex)
|
| + ph.EndParsing()
|
| +
|
| + node.AddChild(ph)
|
| + node.EndParsing()
|
| +
|
| + non_indented_xml = node.FormatXml()
|
| + self.failUnless(non_indented_xml == u'<message name="name">\n Hello '
|
| + u'<young> <ph name="USERNAME">$1<ex>Joi</ex></ph>'
|
| + u'\n</message>')
|
| +
|
| + indented_xml = node.FormatXml(u' ')
|
| + self.failUnless(indented_xml == u' <message name="name">\n Hello '
|
| + u'<young> <ph name="USERNAME">$1<ex>Joi</ex></ph>'
|
| + u'\n </message>')
|
| +
|
| + def testXmlFormatMixedContentWithLeadingWhitespace(self):
|
| + # Again test using the Message node type, because it is the only mixed
|
| + # content node.
|
| + node = message.MessageNode()
|
| + node.StartParsing(u'message', None)
|
| + node.HandleAttribute(u'name', u'name')
|
| + node.AppendContent(u"''' Hello <young> ")
|
| +
|
| + ph = message.PhNode()
|
| + ph.StartParsing(u'ph', None)
|
| + ph.HandleAttribute(u'name', u'USERNAME')
|
| + ph.AppendContent(u'$1')
|
| + ex = message.ExNode()
|
| + ex.StartParsing(u'ex', None)
|
| + ex.AppendContent(u'Joi')
|
| + ex.EndParsing()
|
| + ph.AddChild(ex)
|
| + ph.EndParsing()
|
| +
|
| + node.AddChild(ph)
|
| + node.AppendContent(u" yessiree '''")
|
| + node.EndParsing()
|
| +
|
| + non_indented_xml = node.FormatXml()
|
| + self.failUnless(non_indented_xml ==
|
| + u"<message name=\"name\">\n ''' Hello"
|
| + u' <young> <ph name="USERNAME">$1<ex>Joi</ex></ph>'
|
| + u" yessiree '''\n</message>")
|
| +
|
| + indented_xml = node.FormatXml(u' ')
|
| + self.failUnless(indented_xml ==
|
| + u" <message name=\"name\">\n ''' Hello"
|
| + u' <young> <ph name="USERNAME">$1<ex>Joi</ex></ph>'
|
| + u" yessiree '''\n </message>")
|
| +
|
| + self.failUnless(node.GetNodeById('name'))
|
| +
|
| + def testXmlFormatContentWithEntities(self):
|
| + '''Tests a bug where would not be escaped correctly.'''
|
| + from grit import tclib
|
| + msg_node = message.MessageNode.Construct(None, tclib.Message(
|
| + text = 'BEGIN_BOLDHelloWHITESPACEthere!END_BOLD Bingo!',
|
| + placeholders = [
|
| + tclib.Placeholder('BEGIN_BOLD', '<b>', 'bla'),
|
| + tclib.Placeholder('WHITESPACE', ' ', 'bla'),
|
| + tclib.Placeholder('END_BOLD', '</b>', 'bla')]),
|
| + 'BINGOBONGO')
|
| + xml = msg_node.FormatXml()
|
| + self.failUnless(xml.find(' ') == -1, 'should have no entities')
|
| +
|
| + def testIter(self):
|
| + # First build a little tree of message and ph nodes.
|
| + node = message.MessageNode()
|
| + node.StartParsing(u'message', None)
|
| + node.HandleAttribute(u'name', u'bla')
|
| + node.AppendContent(u" ''' two spaces ")
|
| + node.AppendContent(u' space before and after ')
|
| + ph = message.PhNode()
|
| + ph.StartParsing(u'ph', None)
|
| + ph.AddChild(message.ExNode())
|
| + ph.HandleAttribute(u'name', u'BINGO')
|
| + ph.AppendContent(u'bongo')
|
| + node.AddChild(ph)
|
| + node.AddChild(message.PhNode())
|
| + node.AppendContent(u" space before two after '''")
|
| +
|
| + order = [message.MessageNode, message.PhNode, message.ExNode, message.PhNode]
|
| + for n in node:
|
| + self.failUnless(type(n) == order[0])
|
| + order = order[1:]
|
| + self.failUnless(len(order) == 0)
|
| +
|
| + def testGetChildrenOfType(self):
|
| + xml = '''<?xml version="1.0" encoding="UTF-8"?>
|
| + <grit latest_public_release="2" source_lang_id="en-US"
|
| + current_release="3" base_dir=".">
|
| + <outputs>
|
| + <output filename="resource.h" type="rc_header" />
|
| + <output filename="en/generated_resources.rc" type="rc_all"
|
| + lang="en" />
|
| + <if expr="pp_if('NOT_TRUE')">
|
| + <output filename="de/generated_resources.rc" type="rc_all"
|
| + lang="de" />
|
| + </if>
|
| + </outputs>
|
| + <release seq="3">
|
| + <messages>
|
| + <message name="ID_HELLO">Hello!</message>
|
| + </messages>
|
| + </release>
|
| + </grit>'''
|
| + grd = grd_reader.Parse(StringIO.StringIO(xml),
|
| + util.PathFromRoot('grit/test/data'))
|
| + from grit.node import io
|
| + output_nodes = grd.GetChildrenOfType(io.OutputNode)
|
| + self.failUnlessEqual(len(output_nodes), 3)
|
| + self.failUnlessEqual(output_nodes[2].attrs['filename'],
|
| + 'de/generated_resources.rc')
|
| +
|
| + def testEvaluateExpression(self):
|
| + def AssertExpr(expected_value, expr, defs, target_platform,
|
| + extra_variables):
|
| + self.failUnlessEqual(expected_value, base.Node.EvaluateExpression(
|
| + expr, defs, target_platform, extra_variables))
|
| +
|
| + AssertExpr(True, "True", {}, 'linux', {})
|
| + AssertExpr(False, "False", {}, 'linux', {})
|
| + AssertExpr(True, "True or False", {}, 'linux', {})
|
| + AssertExpr(False, "True and False", {}, 'linux', {})
|
| + AssertExpr(True, "os == 'linux'", {}, 'linux', {})
|
| + AssertExpr(False, "os == 'linux'", {}, 'ios', {})
|
| + AssertExpr(True, "'foo' in defs", {'foo': 'bar'}, 'ios', {})
|
| + AssertExpr(False, "'foo' in defs", {'baz': 'bar'}, 'ios', {})
|
| + AssertExpr(False, "'foo' in defs", {}, 'ios', {})
|
| + AssertExpr(True, "is_linux", {}, 'linux2', {})
|
| + AssertExpr(False, "is_linux", {}, 'win32', {})
|
| + AssertExpr(True, "is_macosx", {}, 'darwin', {})
|
| + AssertExpr(False, "is_macosx", {}, 'ios', {})
|
| + AssertExpr(True, "is_win", {}, 'win32', {})
|
| + AssertExpr(False, "is_win", {}, 'darwin', {})
|
| + AssertExpr(True, "is_android", {}, 'android', {})
|
| + AssertExpr(False, "is_android", {}, 'linux3', {})
|
| + AssertExpr(True, "is_ios", {}, 'ios', {})
|
| + AssertExpr(False, "is_ios", {}, 'darwin', {})
|
| + AssertExpr(True, "is_posix", {}, 'linux2', {})
|
| + AssertExpr(True, "is_posix", {}, 'darwin', {})
|
| + AssertExpr(True, "is_posix", {}, 'android', {})
|
| + AssertExpr(True, "is_posix", {}, 'ios', {})
|
| + AssertExpr(True, "is_posix", {}, 'freebsd7', {})
|
| + AssertExpr(False, "is_posix", {}, 'win32', {})
|
| + AssertExpr(True, "pp_ifdef('foo')", {'foo': True}, 'win32', {})
|
| + AssertExpr(True, "pp_ifdef('foo')", {'foo': False}, 'win32', {})
|
| + AssertExpr(False, "pp_ifdef('foo')", {'bar': True}, 'win32', {})
|
| + AssertExpr(True, "pp_if('foo')", {'foo': True}, 'win32', {})
|
| + AssertExpr(False, "pp_if('foo')", {'foo': False}, 'win32', {})
|
| + AssertExpr(False, "pp_if('foo')", {'bar': True}, 'win32', {})
|
| + AssertExpr(True, "foo", {'foo': True}, 'win32', {})
|
| + AssertExpr(False, "foo", {'foo': False}, 'win32', {})
|
| + AssertExpr(False, "foo", {'bar': True}, 'win32', {})
|
| + AssertExpr(True, "foo == 'baz'", {'foo': 'baz'}, 'win32', {})
|
| + AssertExpr(False, "foo == 'baz'", {'foo': True}, 'win32', {})
|
| + AssertExpr(False, "foo == 'baz'", {}, 'win32', {})
|
| + AssertExpr(True, "lang == 'de'", {}, 'win32', {'lang': 'de'})
|
| + AssertExpr(False, "lang == 'de'", {}, 'win32', {'lang': 'fr'})
|
| + AssertExpr(False, "lang == 'de'", {}, 'win32', {})
|
| +
|
| + # Test a couple more complex expressions for good measure.
|
| + AssertExpr(True, "is_ios and (lang in ['de', 'fr'] or foo)",
|
| + {'foo': 'bar'}, 'ios', {'lang': 'fr', 'context': 'today'})
|
| + AssertExpr(False, "is_ios and (lang in ['de', 'fr'] or foo)",
|
| + {'foo': False}, 'linux2', {'lang': 'fr', 'context': 'today'})
|
| + AssertExpr(False, "is_ios and (lang in ['de', 'fr'] or foo)",
|
| + {'baz': 'bar'}, 'ios', {'lang': 'he', 'context': 'today'})
|
| + AssertExpr(True, "foo == 'bar' or not baz",
|
| + {'foo': 'bar', 'fun': True}, 'ios', {'lang': 'en'})
|
| + AssertExpr(True, "foo == 'bar' or not baz",
|
| + {}, 'ios', {'lang': 'en', 'context': 'java'})
|
| + AssertExpr(False, "foo == 'bar' or not baz",
|
| + {'foo': 'ruz', 'baz': True}, 'ios', {'lang': 'en'})
|
| +
|
| +if __name__ == '__main__':
|
| + unittest.main()
|
| +
|
|
|