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