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.gather.rc''' | |
7 | |
8 | |
9 import os | |
10 import sys | |
11 if __name__ == '__main__': | |
12 sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) | |
13 | |
14 import unittest | |
15 import StringIO | |
16 | |
17 from grit.gather import rc | |
18 from grit import util | |
19 | |
20 | |
21 class RcUnittest(unittest.TestCase): | |
22 | |
23 part_we_want = '''IDC_KLONKACC ACCELERATORS | |
24 BEGIN | |
25 "?", IDM_ABOUT, ASCII, ALT | |
26 "/", IDM_ABOUT, ASCII, ALT | |
27 END''' | |
28 | |
29 def testSectionFromFile(self): | |
30 buf = '''IDC_SOMETHINGELSE BINGO | |
31 BEGIN | |
32 BLA BLA | |
33 BLA BLA | |
34 END | |
35 %s | |
36 | |
37 IDC_KLONK BINGOBONGO | |
38 BEGIN | |
39 HONGO KONGO | |
40 END | |
41 ''' % self.part_we_want | |
42 | |
43 f = StringIO.StringIO(buf) | |
44 | |
45 out = rc.Section(f, 'IDC_KLONKACC') | |
46 out.ReadSection() | |
47 self.failUnless(out.GetText() == self.part_we_want) | |
48 | |
49 out = rc.Section(util.PathFromRoot(r'grit/testdata/klonk.rc'), | |
50 'IDC_KLONKACC', | |
51 encoding='utf-16') | |
52 out.ReadSection() | |
53 out_text = out.GetText().replace('\t', '') | |
54 out_text = out_text.replace(' ', '') | |
55 self.part_we_want = self.part_we_want.replace(' ', '') | |
56 self.failUnless(out_text.strip() == self.part_we_want.strip()) | |
57 | |
58 | |
59 def testDialog(self): | |
60 dlg = rc.Dialog(StringIO.StringIO('''IDD_ABOUTBOX DIALOGEX 22, 17, 230, 75 | |
61 STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | |
62 CAPTION "About" | |
63 FONT 8, "System", 0, 0, 0x0 | |
64 BEGIN | |
65 ICON IDI_KLONK,IDC_MYICON,14,9,20,20 | |
66 LTEXT "klonk Version ""yibbee"" 1.0",IDC_STATIC,49,10,119,8, | |
67 SS_NOPREFIX | |
68 LTEXT "Copyright (C) 2005",IDC_STATIC,49,20,119,8 | |
69 DEFPUSHBUTTON "OK",IDOK,195,6,30,11,WS_GROUP | |
70 CONTROL "Jack ""Black"" Daniels",IDC_RADIO1,"Button", | |
71 BS_AUTORADIOBUTTON,46,51,84,10 | |
72 // try a line where the ID is on the continuation line | |
73 LTEXT "blablablabla blablabla blablablablablablablabla blablabla", | |
74 ID_SMURF, whatever... | |
75 END | |
76 '''), 'IDD_ABOUTBOX') | |
77 dlg.Parse() | |
78 self.failUnless(len(dlg.GetTextualIds()) == 7) | |
79 self.failUnless(len(dlg.GetCliques()) == 6) | |
80 self.failUnless(dlg.GetCliques()[1].GetMessage().GetRealContent() == | |
81 'klonk Version "yibbee" 1.0') | |
82 | |
83 transl = dlg.Translate('en') | |
84 self.failUnless(transl.strip() == dlg.GetText().strip()) | |
85 | |
86 def testAlternateSkeleton(self): | |
87 dlg = rc.Dialog(StringIO.StringIO('''IDD_ABOUTBOX DIALOGEX 22, 17, 230, 75 | |
88 STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | |
89 CAPTION "About" | |
90 FONT 8, "System", 0, 0, 0x0 | |
91 BEGIN | |
92 LTEXT "Yipee skippy",IDC_STATIC,49,10,119,8, | |
93 SS_NOPREFIX | |
94 END | |
95 '''), 'IDD_ABOUTBOX') | |
96 dlg.Parse() | |
97 | |
98 alt_dlg = rc.Dialog(StringIO.StringIO('''IDD_ABOUTBOX DIALOGEX 040704, 17, 2
30, 75 | |
99 STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU | |
100 CAPTION "XXXXXXXXX" | |
101 FONT 8, "System", 0, 0, 0x0 | |
102 BEGIN | |
103 LTEXT "XXXXXXXXXXXXXXXXX",IDC_STATIC,110978,10,119,8, | |
104 SS_NOPREFIX | |
105 END | |
106 '''), 'IDD_ABOUTBOX') | |
107 alt_dlg.Parse() | |
108 | |
109 transl = dlg.Translate('en', skeleton_gatherer=alt_dlg) | |
110 self.failUnless(transl.count('040704') and | |
111 transl.count('110978')) | |
112 self.failUnless(transl.count('Yipee skippy')) | |
113 | |
114 def testMenu(self): | |
115 menu = rc.Menu(StringIO.StringIO('''IDC_KLONK MENU | |
116 BEGIN | |
117 POPUP "&File """ | |
118 BEGIN | |
119 MENUITEM "E&xit", IDM_EXIT | |
120 MENUITEM "This be ""Klonk"" me like", ID_FILE_THISBE | |
121 POPUP "gonk" | |
122 BEGIN | |
123 MENUITEM "Klonk && is ""good""", ID_GONK_KLONKIS | |
124 END | |
125 MENUITEM "This is a very long menu caption to try to see if we can make
the ID go to a continuation line, blablabla blablabla bla blabla blablabla blabl
abla blablabla blablabla...", | |
126 ID_FILE_THISISAVERYLONGMENUCAPTIONTOTRYT
OSEEIFWECANMAKETHEIDGOTOACONTINUATIONLINE | |
127 END | |
128 POPUP "&Help" | |
129 BEGIN | |
130 MENUITEM "&About ...", IDM_ABOUT | |
131 END | |
132 END'''), 'IDC_KLONK') | |
133 | |
134 menu.Parse() | |
135 self.failUnless(len(menu.GetTextualIds()) == 6) | |
136 self.failUnless(len(menu.GetCliques()) == 1) | |
137 self.failUnless(len(menu.GetCliques()[0].GetMessage().GetPlaceholders()) == | |
138 9) | |
139 | |
140 transl = menu.Translate('en') | |
141 self.failUnless(transl.strip() == menu.GetText().strip()) | |
142 | |
143 def testVersion(self): | |
144 version = rc.Version(StringIO.StringIO(''' | |
145 VS_VERSION_INFO VERSIONINFO | |
146 FILEVERSION 1,0,0,1 | |
147 PRODUCTVERSION 1,0,0,1 | |
148 FILEFLAGSMASK 0x3fL | |
149 #ifdef _DEBUG | |
150 FILEFLAGS 0x1L | |
151 #else | |
152 FILEFLAGS 0x0L | |
153 #endif | |
154 FILEOS 0x4L | |
155 FILETYPE 0x2L | |
156 FILESUBTYPE 0x0L | |
157 BEGIN | |
158 BLOCK "StringFileInfo" | |
159 BEGIN | |
160 BLOCK "040904e4" | |
161 BEGIN | |
162 VALUE "CompanyName", "TODO: <Company name>" | |
163 VALUE "FileDescription", "TODO: <File description>" | |
164 VALUE "FileVersion", "1.0.0.1" | |
165 VALUE "LegalCopyright", "TODO: (c) <Company name>. All rights reser
ved." | |
166 VALUE "InternalName", "res_format_test.dll" | |
167 VALUE "OriginalFilename", "res_format_test.dll" | |
168 VALUE "ProductName", "TODO: <Product name>" | |
169 VALUE "ProductVersion", "1.0.0.1" | |
170 END | |
171 END | |
172 BLOCK "VarFileInfo" | |
173 BEGIN | |
174 VALUE "Translation", 0x409, 1252 | |
175 END | |
176 END | |
177 '''.strip()), 'VS_VERSION_INFO') | |
178 version.Parse() | |
179 self.failUnless(len(version.GetTextualIds()) == 1) | |
180 self.failUnless(len(version.GetCliques()) == 4) | |
181 | |
182 transl = version.Translate('en') | |
183 self.failUnless(transl.strip() == version.GetText().strip()) | |
184 | |
185 | |
186 def testRegressionDialogBox(self): | |
187 dialog = rc.Dialog(StringIO.StringIO(''' | |
188 IDD_SIDEBAR_WEATHER_PANEL_PROPPAGE DIALOGEX 0, 0, 205, 157 | |
189 STYLE DS_SETFONT | DS_FIXEDSYS | WS_CHILD | |
190 FONT 8, "MS Shell Dlg", 400, 0, 0x1 | |
191 BEGIN | |
192 EDITTEXT IDC_SIDEBAR_WEATHER_NEW_CITY,3,27,112,14,ES_AUTOHSCROLL | |
193 DEFPUSHBUTTON "Add Location",IDC_SIDEBAR_WEATHER_ADD,119,27,50,14 | |
194 LISTBOX IDC_SIDEBAR_WEATHER_CURR_CITIES,3,48,127,89, | |
195 LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP | |
196 PUSHBUTTON "Move Up",IDC_SIDEBAR_WEATHER_MOVE_UP,134,104,50,14 | |
197 PUSHBUTTON "Move Down",IDC_SIDEBAR_WEATHER_MOVE_DOWN,134,121,50,14 | |
198 PUSHBUTTON "Remove",IDC_SIDEBAR_WEATHER_DELETE,134,48,50,14 | |
199 LTEXT "To see current weather conditions and forecasts in the USA,
enter the zip code (example: 94043) or city and state (example: Mountain View,
CA).", | |
200 IDC_STATIC,3,0,199,25 | |
201 CONTROL "Fahrenheit",IDC_SIDEBAR_WEATHER_FAHRENHEIT,"Button", | |
202 BS_AUTORADIOBUTTON | WS_GROUP | WS_TABSTOP,3,144,51,10 | |
203 CONTROL "Celsius",IDC_SIDEBAR_WEATHER_CELSIUS,"Button", | |
204 BS_AUTORADIOBUTTON,57,144,38,10 | |
205 END'''.strip()), 'IDD_SIDEBAR_WEATHER_PANEL_PROPPAGE') | |
206 dialog.Parse() | |
207 self.failUnless(len(dialog.GetTextualIds()) == 10) | |
208 | |
209 | |
210 def testRegressionDialogBox2(self): | |
211 dialog = rc.Dialog(StringIO.StringIO(''' | |
212 IDD_SIDEBAR_EMAIL_PANEL_PROPPAGE DIALOG DISCARDABLE 0, 0, 264, 220 | |
213 STYLE WS_CHILD | |
214 FONT 8, "MS Shell Dlg" | |
215 BEGIN | |
216 GROUPBOX "Email Filters",IDC_STATIC,7,3,250,190 | |
217 LTEXT "Click Add Filter to create the email filter.",IDC_STATIC,16
,41,130,9 | |
218 PUSHBUTTON "Add Filter...",IDC_SIDEBAR_EMAIL_ADD_FILTER,196,38,50,14 | |
219 PUSHBUTTON "Remove",IDC_SIDEBAR_EMAIL_REMOVE,196,174,50,14 | |
220 PUSHBUTTON "", IDC_SIDEBAR_EMAIL_HIDDEN, 200, 178, 5, 5, NOT WS_VISIBLE | |
221 LISTBOX IDC_SIDEBAR_EMAIL_LIST,16,60,230,108, | |
222 LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP | |
223 LTEXT "You can prevent certain emails from showing up in the sideb
ar with a filter.", | |
224 IDC_STATIC,16,18,234,18 | |
225 END'''.strip()), 'IDD_SIDEBAR_EMAIL_PANEL_PROPPAGE') | |
226 dialog.Parse() | |
227 self.failUnless('IDC_SIDEBAR_EMAIL_HIDDEN' in dialog.GetTextualIds()) | |
228 | |
229 | |
230 def testRegressionMenuId(self): | |
231 menu = rc.Menu(StringIO.StringIO(''' | |
232 IDR_HYPERMENU_FOLDER MENU | |
233 BEGIN | |
234 POPUP "HyperFolder" | |
235 BEGIN | |
236 MENUITEM "Open Containing Folder", IDM_OPENFOLDER | |
237 END | |
238 END'''.strip()), 'IDR_HYPERMENU_FOLDER') | |
239 menu.Parse() | |
240 self.failUnless(len(menu.GetTextualIds()) == 2) | |
241 | |
242 def testRegressionNewlines(self): | |
243 menu = rc.Menu(StringIO.StringIO(''' | |
244 IDR_HYPERMENU_FOLDER MENU | |
245 BEGIN | |
246 POPUP "Hyper\\nFolder" | |
247 BEGIN | |
248 MENUITEM "Open Containing Folder", IDM_OPENFOLDER | |
249 END | |
250 END'''.strip()), 'IDR_HYPERMENU_FOLDER') | |
251 menu.Parse() | |
252 transl = menu.Translate('en') | |
253 # Shouldn't find \\n (the \n shouldn't be changed to \\n) | |
254 self.failUnless(transl.find('\\\\n') == -1) | |
255 | |
256 def testRegressionTabs(self): | |
257 menu = rc.Menu(StringIO.StringIO(''' | |
258 IDR_HYPERMENU_FOLDER MENU | |
259 BEGIN | |
260 POPUP "Hyper\\tFolder" | |
261 BEGIN | |
262 MENUITEM "Open Containing Folder", IDM_OPENFOLDER | |
263 END | |
264 END'''.strip()), 'IDR_HYPERMENU_FOLDER') | |
265 menu.Parse() | |
266 transl = menu.Translate('en') | |
267 # Shouldn't find \\t (the \t shouldn't be changed to \\t) | |
268 self.failUnless(transl.find('\\\\t') == -1) | |
269 | |
270 def testEscapeUnescape(self): | |
271 original = 'Hello "bingo"\n How\\are\\you\\n?' | |
272 escaped = rc.Section.Escape(original) | |
273 self.failUnless(escaped == 'Hello ""bingo""\\n How\\\\are\\\\you\\\\n?') | |
274 unescaped = rc.Section.UnEscape(escaped) | |
275 self.failUnless(unescaped == original) | |
276 | |
277 def testRegressionPathsWithSlashN(self): | |
278 original = '..\\\\..\\\\trs\\\\res\\\\nav_first.gif' | |
279 unescaped = rc.Section.UnEscape(original) | |
280 self.failUnless(unescaped == '..\\..\\trs\\res\\nav_first.gif') | |
281 | |
282 def testRegressionDialogItemsTextOnly(self): | |
283 dialog = rc.Dialog(StringIO.StringIO('''IDD_OPTIONS_SEARCH DIALOGEX 0, 0, 28
0, 292 | |
284 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | | |
285 WS_DISABLED | WS_CAPTION | WS_SYSMENU | |
286 CAPTION "Search" | |
287 FONT 8, "MS Shell Dlg", 400, 0, 0x1 | |
288 BEGIN | |
289 GROUPBOX "Select search buttons and options",-1,7,5,266,262 | |
290 CONTROL "",IDC_OPTIONS,"SysTreeView32",TVS_DISABLEDRAGDROP | | |
291 WS_BORDER | WS_TABSTOP | 0x800,16,19,248,218 | |
292 LTEXT "Use Google site:",-1,26,248,52,8 | |
293 COMBOBOX IDC_GOOGLE_HOME,87,245,177,256,CBS_DROPDOWNLIST | | |
294 WS_VSCROLL | WS_TABSTOP | |
295 PUSHBUTTON "Restore Defaults...",IDC_RESET,187,272,86,14 | |
296 END'''), 'IDD_OPTIONS_SEARCH') | |
297 dialog.Parse() | |
298 translateables = [c.GetMessage().GetRealContent() | |
299 for c in dialog.GetCliques()] | |
300 self.failUnless('Select search buttons and options' in translateables) | |
301 self.failUnless('Use Google site:' in translateables) | |
302 | |
303 def testAccelerators(self): | |
304 acc = rc.Accelerators(StringIO.StringIO('''\ | |
305 IDR_ACCELERATOR1 ACCELERATORS | |
306 BEGIN | |
307 "^C", ID_ACCELERATOR32770, ASCII, NOINVERT | |
308 "^V", ID_ACCELERATOR32771, ASCII, NOINVERT | |
309 VK_INSERT, ID_ACCELERATOR32772, VIRTKEY, CONTROL, NOINVERT | |
310 END | |
311 '''), 'IDR_ACCELERATOR1') | |
312 acc.Parse() | |
313 self.failUnless(len(acc.GetTextualIds()) == 4) | |
314 self.failUnless(len(acc.GetCliques()) == 0) | |
315 | |
316 transl = acc.Translate('en') | |
317 self.failUnless(transl.strip() == acc.GetText().strip()) | |
318 | |
319 | |
320 def testRegressionEmptyString(self): | |
321 dlg = rc.Dialog(StringIO.StringIO('''\ | |
322 IDD_CONFIRM_QUIT_GD_DLG DIALOGEX 0, 0, 267, 108 | |
323 STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | DS_CENTER | WS_POPUP | | |
324 WS_CAPTION | |
325 EXSTYLE WS_EX_TOPMOST | |
326 CAPTION "Google Desktop" | |
327 FONT 8, "MS Shell Dlg", 400, 0, 0x1 | |
328 BEGIN | |
329 DEFPUSHBUTTON "&Yes",IDYES,82,87,50,14 | |
330 PUSHBUTTON "&No",IDNO,136,87,50,14 | |
331 ICON 32514,IDC_STATIC,7,9,21,20 | |
332 EDITTEXT IDC_TEXTBOX,34,7,231,60,ES_MULTILINE | ES_READONLY | NOT WS_
BORDER | |
333 CONTROL "", | |
334 IDC_ENABLE_GD_AUTOSTART,"Button",BS_AUTOCHECKBOX | | |
335 WS_TABSTOP,33,70,231,10 | |
336 END'''), 'IDD_CONFIRM_QUIT_GD_DLG') | |
337 dlg.Parse() | |
338 | |
339 def Check(): | |
340 self.failUnless(transl.count('IDC_ENABLE_GD_AUTOSTART')) | |
341 self.failUnless(transl.count('END')) | |
342 | |
343 transl = dlg.Translate('de', pseudo_if_not_available=True, | |
344 fallback_to_english=True) | |
345 Check() | |
346 transl = dlg.Translate('de', pseudo_if_not_available=True, | |
347 fallback_to_english=False) | |
348 Check() | |
349 transl = dlg.Translate('de', pseudo_if_not_available=False, | |
350 fallback_to_english=True) | |
351 Check() | |
352 transl = dlg.Translate('de', pseudo_if_not_available=False, | |
353 fallback_to_english=False) | |
354 Check() | |
355 transl = dlg.Translate('en', pseudo_if_not_available=True, | |
356 fallback_to_english=True) | |
357 Check() | |
358 transl = dlg.Translate('en', pseudo_if_not_available=True, | |
359 fallback_to_english=False) | |
360 Check() | |
361 transl = dlg.Translate('en', pseudo_if_not_available=False, | |
362 fallback_to_english=True) | |
363 Check() | |
364 transl = dlg.Translate('en', pseudo_if_not_available=False, | |
365 fallback_to_english=False) | |
366 Check() | |
367 | |
368 | |
369 if __name__ == '__main__': | |
370 unittest.main() | |
OLD | NEW |