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 grit.tool.rc2grd'''
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 re
1401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport StringIO
1501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgimport unittest
1601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
17b9161407f737461b5db16a29782f8a31d19e602dbenrg@chromium.orgfrom grit import grd_reader
1801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.node import base
1901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgfrom grit.tool import rc2grd
2001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
2201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgclass Rc2GrdUnittest(unittest.TestCase):
2301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testPlaceholderize(self):
2401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool = rc2grd.Rc2Grd()
2501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    original = "Hello %s, how are you? I'm $1 years old!"
2601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    msg = tool.Placeholderize(original)
2701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(msg.GetPresentableContent() == "Hello TODO_0001, how are you? I'm TODO_0002 years old!")
2801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(msg.GetRealContent() == original)
2901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testHtmlPlaceholderize(self):
3101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool = rc2grd.Rc2Grd()
3201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    original = "Hello <b>[USERNAME]</b>, how are you? I'm [AGE] years old!"
3301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    msg = tool.Placeholderize(original)
3401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(msg.GetPresentableContent() ==
3501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org                    "Hello BEGIN_BOLDX_USERNAME_XEND_BOLD, how are you? I'm X_AGE_X years old!")
3601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(msg.GetRealContent() == original)
3701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
3801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testMenuWithoutWhitespaceRegression(self):
3901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # There was a problem in the original regular expression for parsing out
4001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # menu sections, that would parse the following block of text as a single
4101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # menu instead of two.
4201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    two_menus = '''
4301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org// Hyper context menus
4401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgIDR_HYPERMENU_FOLDER MENU
4501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgBEGIN
4601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    POPUP "HyperFolder"
4701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    BEGIN
4801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        MENUITEM "Open Containing Folder",      IDM_OPENFOLDER
4901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    END
5001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgEND
5101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
5201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgIDR_HYPERMENU_FILE MENU
5301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgBEGIN
5401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    POPUP "HyperFile"
5501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    BEGIN
5601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        MENUITEM "Open Folder",                 IDM_OPENFOLDER
5701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    END
5801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgEND
5901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org'''
6101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(len(rc2grd._MENU.findall(two_menus)) == 2)
6201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testRegressionScriptWithTranslateable(self):
6401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool = rc2grd.Rc2Grd()
6501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
6601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # test rig
6701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    class DummyNode(base.Node):
6801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      def AddChild(self, item):
6901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        self.node = item
7001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      verbose = False
7101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      extra_verbose = False
7201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool.not_localizable_re = re.compile('')
7301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool.o = DummyNode()
7401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
7501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    rc_text = '''STRINGTABLE\nBEGIN\nID_BINGO "<SPAN id=hp style='BEHAVIOR: url(#default#homepage)'></SPAN><script>if (!hp.isHomePage('[$~HOMEPAGE~$]')) {document.write(""<a href=\\""[$~SETHOMEPAGEURL~$]\\"" >Set As Homepage</a> - "");}</script>"\nEND\n'''
7601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool.AddMessages(rc_text, tool.o)
7701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(tool.o.node.GetCdata().find('Set As Homepage') != -1)
7801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
7901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # TODO(joi) Improve the HTML parser to support translateables inside
8001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # <script> blocks?
8101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(tool.o.node.attrs['translateable'] == 'false')
8201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
8301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  def testRoleModel(self):
8401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    rc_text = ('STRINGTABLE\n'
8501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               'BEGIN\n'
8601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               '  // This should not show up\n'
8701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               '  IDS_BINGO "Hello %s, how are you?"\n'
8801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               '  // The first description\n'
8901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               '  IDS_BONGO "Hello %s, my name is %s, and yours?"\n'
9001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               '  IDS_PROGRAMS_SHUTDOWN_TEXT      "Google Desktop Search needs to close the following programs:\\n\\n$1\\nThe installation will not proceed if you choose to cancel."\n'
9101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org               'END\n')
9201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool = rc2grd.Rc2Grd()
9301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool.role_model = grd_reader.Parse(StringIO.StringIO(
9401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      '''<?xml version="1.0" encoding="UTF-8"?>
9501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
9601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        <release seq="3">
9701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          <messages>
9801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="IDS_BINGO">
9901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org              Hello <ph name="USERNAME">%s<ex>Joi</ex></ph>, how are you?
10001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            </message>
10101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="IDS_BONGO" desc="The other description">
10201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org              Hello <ph name="USERNAME">%s<ex>Jakob</ex></ph>, my name is <ph name="ADMINNAME">%s<ex>Joi</ex></ph>, and yours?
10301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            </message>
10401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            <message name="IDS_PROGRAMS_SHUTDOWN_TEXT" desc="LIST_OF_PROGRAMS is replaced by a bulleted list of program names.">
10501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org              Google Desktop Search needs to close the following programs:
10601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
10701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org<ph name="LIST_OF_PROGRAMS">$1<ex>Program 1, Program 2</ex></ph>
10801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgThe installation will not proceed if you choose to cancel.
10901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org            </message>
11001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org          </messages>
11101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org        </release>
11201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      </grit>'''), dir='.')
11301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
11401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    # test rig
11501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    class DummyOpts(object):
11601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      verbose = False
11701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      extra_verbose = False
11801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    tool.o = DummyOpts()
11901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    result = tool.Process(rc_text, '.\resource.rc')
12001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
12101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[0].attrs['desc'] == '')
12201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
12301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[0].children[0].attrs['name'] == 'USERNAME')
12401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
12501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[1].attrs['desc'] == 'The other description')
12601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
12701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[1].attrs['meaning'] == '')
12801b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
12901b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[1].children[0].attrs['name'] == 'USERNAME')
13001b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
13101b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[1].children[1].attrs['name'] == 'ADMINNAME')
13201b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org    self.failUnless(
13301b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org      result.children[2].children[2].children[2].children[0].attrs['name'] == 'LIST_OF_PROGRAMS')
13401b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
13501b3bc768461bd303bff39f8cd1663682254e407joi@chromium.orgif __name__ == '__main__':
13601b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org  unittest.main()
13701b3bc768461bd303bff39f8cd1663682254e407joi@chromium.org
138