OLD | NEW |
| (Empty) |
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 grit.tool.rc2grd''' | |
7 | |
8 import os | |
9 import sys | |
10 if __name__ == '__main__': | |
11 sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) | |
12 | |
13 import re | |
14 import StringIO | |
15 import unittest | |
16 | |
17 from grit import grd_reader | |
18 from grit.node import base | |
19 from grit.tool import rc2grd | |
20 | |
21 | |
22 class Rc2GrdUnittest(unittest.TestCase): | |
23 def testPlaceholderize(self): | |
24 tool = rc2grd.Rc2Grd() | |
25 original = "Hello %s, how are you? I'm $1 years old!" | |
26 msg = tool.Placeholderize(original) | |
27 self.failUnless(msg.GetPresentableContent() == "Hello TODO_0001, how are you
? I'm TODO_0002 years old!") | |
28 self.failUnless(msg.GetRealContent() == original) | |
29 | |
30 def testHtmlPlaceholderize(self): | |
31 tool = rc2grd.Rc2Grd() | |
32 original = "Hello <b>[USERNAME]</b>, how are you? I'm [AGE] years old!" | |
33 msg = tool.Placeholderize(original) | |
34 self.failUnless(msg.GetPresentableContent() == | |
35 "Hello BEGIN_BOLDX_USERNAME_XEND_BOLD, how are you? I'm X_AG
E_X years old!") | |
36 self.failUnless(msg.GetRealContent() == original) | |
37 | |
38 def testMenuWithoutWhitespaceRegression(self): | |
39 # There was a problem in the original regular expression for parsing out | |
40 # menu sections, that would parse the following block of text as a single | |
41 # menu instead of two. | |
42 two_menus = ''' | |
43 // Hyper context menus | |
44 IDR_HYPERMENU_FOLDER MENU | |
45 BEGIN | |
46 POPUP "HyperFolder" | |
47 BEGIN | |
48 MENUITEM "Open Containing Folder", IDM_OPENFOLDER | |
49 END | |
50 END | |
51 | |
52 IDR_HYPERMENU_FILE MENU | |
53 BEGIN | |
54 POPUP "HyperFile" | |
55 BEGIN | |
56 MENUITEM "Open Folder", IDM_OPENFOLDER | |
57 END | |
58 END | |
59 | |
60 ''' | |
61 self.failUnless(len(rc2grd._MENU.findall(two_menus)) == 2) | |
62 | |
63 def testRegressionScriptWithTranslateable(self): | |
64 tool = rc2grd.Rc2Grd() | |
65 | |
66 # test rig | |
67 class DummyNode(base.Node): | |
68 def AddChild(self, item): | |
69 self.node = item | |
70 verbose = False | |
71 extra_verbose = False | |
72 tool.not_localizable_re = re.compile('') | |
73 tool.o = DummyNode() | |
74 | |
75 rc_text = '''STRINGTABLE\nBEGIN\nID_BINGO "<SPAN id=hp style='BEHAVIOR: url(
#default#homepage)'></SPAN><script>if (!hp.isHomePage('[$~HOMEPAGE~$]')) {docume
nt.write(""<a href=\\""[$~SETHOMEPAGEURL~$]\\"" >Set As Homepage</a> - "");}</sc
ript>"\nEND\n''' | |
76 tool.AddMessages(rc_text, tool.o) | |
77 self.failUnless(tool.o.node.GetCdata().find('Set As Homepage') != -1) | |
78 | |
79 # TODO(joi) Improve the HTML parser to support translateables inside | |
80 # <script> blocks? | |
81 self.failUnless(tool.o.node.attrs['translateable'] == 'false') | |
82 | |
83 def testRoleModel(self): | |
84 rc_text = ('STRINGTABLE\n' | |
85 'BEGIN\n' | |
86 ' // This should not show up\n' | |
87 ' IDS_BINGO "Hello %s, how are you?"\n' | |
88 ' // The first description\n' | |
89 ' IDS_BONGO "Hello %s, my name is %s, and yours?"\n' | |
90 ' IDS_PROGRAMS_SHUTDOWN_TEXT "Google Desktop Search needs t
o close the following programs:\\n\\n$1\\nThe installation will not proceed if y
ou choose to cancel."\n' | |
91 'END\n') | |
92 tool = rc2grd.Rc2Grd() | |
93 tool.role_model = grd_reader.Parse(StringIO.StringIO( | |
94 '''<?xml version="1.0" encoding="UTF-8"?> | |
95 <grit latest_public_release="2" source_lang_id="en-US" current_release="3"
base_dir="."> | |
96 <release seq="3"> | |
97 <messages> | |
98 <message name="IDS_BINGO"> | |
99 Hello <ph name="USERNAME">%s<ex>Joi</ex></ph>, how are you? | |
100 </message> | |
101 <message name="IDS_BONGO" desc="The other description"> | |
102 Hello <ph name="USERNAME">%s<ex>Jakob</ex></ph>, my name is <ph na
me="ADMINNAME">%s<ex>Joi</ex></ph>, and yours? | |
103 </message> | |
104 <message name="IDS_PROGRAMS_SHUTDOWN_TEXT" desc="LIST_OF_PROGRAMS is
replaced by a bulleted list of program names."> | |
105 Google Desktop Search needs to close the following programs: | |
106 | |
107 <ph name="LIST_OF_PROGRAMS">$1<ex>Program 1, Program 2</ex></ph> | |
108 The installation will not proceed if you choose to cancel. | |
109 </message> | |
110 </messages> | |
111 </release> | |
112 </grit>'''), dir='.') | |
113 | |
114 # test rig | |
115 class DummyOpts(object): | |
116 verbose = False | |
117 extra_verbose = False | |
118 tool.o = DummyOpts() | |
119 result = tool.Process(rc_text, '.\resource.rc') | |
120 self.failUnless( | |
121 result.children[2].children[2].children[0].attrs['desc'] == '') | |
122 self.failUnless( | |
123 result.children[2].children[2].children[0].children[0].attrs['name'] == 'U
SERNAME') | |
124 self.failUnless( | |
125 result.children[2].children[2].children[1].attrs['desc'] == 'The other des
cription') | |
126 self.failUnless( | |
127 result.children[2].children[2].children[1].attrs['meaning'] == '') | |
128 self.failUnless( | |
129 result.children[2].children[2].children[1].children[0].attrs['name'] == 'U
SERNAME') | |
130 self.failUnless( | |
131 result.children[2].children[2].children[1].children[1].attrs['name'] == 'A
DMINNAME') | |
132 self.failUnless( | |
133 result.children[2].children[2].children[2].children[0].attrs['name'] == 'L
IST_OF_PROGRAMS') | |
134 | |
135 if __name__ == '__main__': | |
136 unittest.main() | |
137 | |
OLD | NEW |