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