| Index: grit/format/rc_unittest.py
 | 
| ===================================================================
 | 
| --- grit/format/rc_unittest.py	(revision 0)
 | 
| +++ grit/format/rc_unittest.py	(revision 0)
 | 
| @@ -0,0 +1,302 @@
 | 
| +#!/usr/bin/env python
 | 
| +# Copyright (c) 2011 The Chromium Authors. All rights reserved.
 | 
| +# Use of this source code is governed by a BSD-style license that can be
 | 
| +# found in the LICENSE file.
 | 
| +
 | 
| +'''Unit tests for grit.format.rc'''
 | 
| +
 | 
| +import os
 | 
| +import re
 | 
| +import sys
 | 
| +if __name__ == '__main__':
 | 
| +  sys.path.append(os.path.join(os.path.dirname(sys.argv[0]), '../..'))
 | 
| +
 | 
| +import tempfile
 | 
| +import unittest
 | 
| +import StringIO
 | 
| +
 | 
| +from grit.format import rc
 | 
| +from grit import grd_reader
 | 
| +from grit import util
 | 
| +from grit.tool import build
 | 
| +
 | 
| +class DummyOutput(object):
 | 
| +  def __init__(self, type, language, file = 'hello.gif'):
 | 
| +    self.type = type
 | 
| +    self.language = language
 | 
| +    self.file = file
 | 
| +  def GetType(self):
 | 
| +    return self.type
 | 
| +  def GetLanguage(self):
 | 
| +    return self.language
 | 
| +  def GetOutputFilename(self):
 | 
| +    return self.file
 | 
| +
 | 
| +class FormatRcUnittest(unittest.TestCase):
 | 
| +  def testMessages(self):
 | 
| +    root = grd_reader.Parse(StringIO.StringIO('''
 | 
| +      <messages>
 | 
| +          <message name="IDS_BTN_GO" desc="Button text" meaning="verb">Go!</message>
 | 
| +          <message name="IDS_GREETING" desc="Printed to greet the currently logged in user">
 | 
| +            Hello <ph name="USERNAME">%s<ex>Joi</ex></ph>, how are you doing today?
 | 
| +          </message>
 | 
| +          <message name="BONGO" desc="Flippo nippo">
 | 
| +            Howdie "Mr. Elephant", how are you doing?   \'\'\'
 | 
| +          </message>
 | 
| +          <message name="IDS_WITH_LINEBREAKS">
 | 
| +Good day sir,
 | 
| +I am a bee
 | 
| +Sting sting
 | 
| +          </message>
 | 
| +      </messages>
 | 
| +      '''), flexible_root = True)
 | 
| +    util.FixRootForUnittest(root)
 | 
| +
 | 
| +    buf = StringIO.StringIO()
 | 
| +    build.RcBuilder.ProcessNode(root, DummyOutput('rc_all', 'en'), buf)
 | 
| +    output = buf.getvalue()
 | 
| +    self.failUnless(output.strip() == u'''
 | 
| +STRINGTABLE
 | 
| +BEGIN
 | 
| +  IDS_BTN_GO      "Go!"
 | 
| +  IDS_GREETING    "Hello %s, how are you doing today?"
 | 
| +  BONGO           "Howdie ""Mr. Elephant"", how are you doing?   "
 | 
| +  IDS_WITH_LINEBREAKS "Good day sir,\\nI am a bee\\nSting sting"
 | 
| +END'''.strip())
 | 
| +
 | 
| +
 | 
| +  def testRcSection(self):
 | 
| +    root = grd_reader.Parse(StringIO.StringIO('''
 | 
| +      <structures>
 | 
| +          <structure type="menu" name="IDC_KLONKMENU" file="grit\\testdata\klonk.rc" encoding="utf-16" />
 | 
| +          <structure type="dialog" name="IDD_ABOUTBOX" file="grit\\testdata\klonk.rc" encoding="utf-16" />
 | 
| +          <structure type="version" name="VS_VERSION_INFO" file="grit\\testdata\klonk.rc" encoding="utf-16" />
 | 
| +      </structures>'''), flexible_root = True)
 | 
| +    util.FixRootForUnittest(root)
 | 
| +    root.RunGatherers(recursive = True)
 | 
| +
 | 
| +    buf = StringIO.StringIO()
 | 
| +    build.RcBuilder.ProcessNode(root, DummyOutput('rc_all', 'en'), buf)
 | 
| +    output = buf.getvalue().strip()
 | 
| +    expected = u'''
 | 
| +IDC_KLONKMENU MENU
 | 
| +BEGIN
 | 
| +    POPUP "&File"
 | 
| +    BEGIN
 | 
| +        MENUITEM "E&xit",                       IDM_EXIT
 | 
| +        MENUITEM "This be ""Klonk"" me like",   ID_FILE_THISBE
 | 
| +        POPUP "gonk"
 | 
| +        BEGIN
 | 
| +            MENUITEM "Klonk && is ""good""",           ID_GONK_KLONKIS
 | 
| +        END
 | 
| +    END
 | 
| +    POPUP "&Help"
 | 
| +    BEGIN
 | 
| +        MENUITEM "&About ...",                  IDM_ABOUT
 | 
| +    END
 | 
| +END
 | 
| +
 | 
| +IDD_ABOUTBOX DIALOGEX 22, 17, 230, 75
 | 
| +STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 | 
| +CAPTION "About"
 | 
| +FONT 8, "System", 0, 0, 0x0
 | 
| +BEGIN
 | 
| +    ICON            IDI_KLONK,IDC_MYICON,14,9,20,20
 | 
| +    LTEXT           "klonk Version ""yibbee"" 1.0",IDC_STATIC,49,10,119,8,
 | 
| +                    SS_NOPREFIX
 | 
| +    LTEXT           "Copyright (C) 2005",IDC_STATIC,49,20,119,8
 | 
| +    DEFPUSHBUTTON   "OK",IDOK,195,6,30,11,WS_GROUP
 | 
| +    CONTROL         "Jack ""Black"" Daniels",IDC_RADIO1,"Button",
 | 
| +                    BS_AUTORADIOBUTTON,46,51,84,10
 | 
| +END
 | 
| +
 | 
| +VS_VERSION_INFO VERSIONINFO
 | 
| + FILEVERSION 1,0,0,1
 | 
| + PRODUCTVERSION 1,0,0,1
 | 
| + FILEFLAGSMASK 0x17L
 | 
| +#ifdef _DEBUG
 | 
| + FILEFLAGS 0x1L
 | 
| +#else
 | 
| + FILEFLAGS 0x0L
 | 
| +#endif
 | 
| + FILEOS 0x4L
 | 
| + FILETYPE 0x1L
 | 
| + FILESUBTYPE 0x0L
 | 
| +BEGIN
 | 
| +    BLOCK "StringFileInfo"
 | 
| +    BEGIN
 | 
| +        BLOCK "040904b0"
 | 
| +        BEGIN
 | 
| +            VALUE "FileDescription", "klonk Application"
 | 
| +            VALUE "FileVersion", "1, 0, 0, 1"
 | 
| +            VALUE "InternalName", "klonk"
 | 
| +            VALUE "LegalCopyright", "Copyright (C) 2005"
 | 
| +            VALUE "OriginalFilename", "klonk.exe"
 | 
| +            VALUE "ProductName", " klonk Application"
 | 
| +            VALUE "ProductVersion", "1, 0, 0, 1"
 | 
| +        END
 | 
| +    END
 | 
| +    BLOCK "VarFileInfo"
 | 
| +    BEGIN
 | 
| +        VALUE "Translation", 0x409, 1200
 | 
| +    END
 | 
| +END'''.strip()
 | 
| +    for expected_line, output_line in zip(expected.split(), output.split()):
 | 
| +        self.assertEqual(expected_line, output_line)
 | 
| +
 | 
| +  def testRcIncludeStructure(self):
 | 
| +    root = grd_reader.Parse(StringIO.StringIO('''
 | 
| +      <structures>
 | 
| +        <structure type="tr_html" name="IDR_HTML" file="bingo.html"/>
 | 
| +        <structure type="tr_html" name="IDR_HTML2" file="bingo2.html"/>
 | 
| +      </structures>'''), flexible_root = True)
 | 
| +    util.FixRootForUnittest(root, '/temp')
 | 
| +    # We do not run gatherers as it is not needed and wouldn't find the file
 | 
| +
 | 
| +    buf = StringIO.StringIO()
 | 
| +    build.RcBuilder.ProcessNode(root, DummyOutput('rc_all', 'en'), buf)
 | 
| +    output = buf.getvalue()
 | 
| +    expected = (u'IDR_HTML           HTML               "%s"\n'
 | 
| +                u'IDR_HTML2          HTML               "%s"'
 | 
| +                % (util.normpath('/temp/bingo.html').replace('\\', '\\\\'),
 | 
| +                   util.normpath('/temp/bingo2.html').replace('\\', '\\\\')))
 | 
| +    # hackety hack to work on win32&lin
 | 
| +    output = re.sub('"[c-zC-Z]:', '"', output)
 | 
| +    self.failUnless(output.strip() == expected)
 | 
| +
 | 
| +  def testRcIncludeFile(self):
 | 
| +    root = grd_reader.Parse(StringIO.StringIO('''
 | 
| +      <includes>
 | 
| +        <include type="TXT" name="TEXT_ONE" file="bingo.txt"/>
 | 
| +        <include type="TXT" name="TEXT_TWO" file="bingo2.txt"  filenameonly="true" />
 | 
| +      </includes>'''), flexible_root = True)
 | 
| +    util.FixRootForUnittest(root, '/temp')
 | 
| +
 | 
| +    buf = StringIO.StringIO()
 | 
| +    build.RcBuilder.ProcessNode(root, DummyOutput('rc_all', 'en'), buf)
 | 
| +    output = buf.getvalue()
 | 
| +    expected = (u'TEXT_ONE           TXT                "%s"\n'
 | 
| +                u'TEXT_TWO           TXT                "%s"'
 | 
| +                % (util.normpath('/temp/bingo.txt').replace('\\', '\\\\'),
 | 
| +                   'bingo2.txt'))
 | 
| +    # hackety hack to work on win32&lin
 | 
| +    output = re.sub('"[c-zC-Z]:', '"', output)
 | 
| +    self.failUnless(output.strip() == expected)
 | 
| +
 | 
| +  def testRcIncludeFlattenedHtmlFile(self):
 | 
| +    input_file = util.PathFromRoot('grit/testdata/include_test.html')
 | 
| +    output_file = '%s/HTML_FILE1_include_test.html' % tempfile.gettempdir()
 | 
| +    root = grd_reader.Parse(StringIO.StringIO('''
 | 
| +      <includes>
 | 
| +        <include name="HTML_FILE1" flattenhtml="true" file="%s" type="BINDATA" />
 | 
| +      </includes>''' % input_file), flexible_root = True)
 | 
| +    util.FixRootForUnittest(root, '.')
 | 
| +
 | 
| +    buf = StringIO.StringIO()
 | 
| +    build.RcBuilder.ProcessNode(root, DummyOutput('rc_all', 'en', output_file),
 | 
| +                                buf)
 | 
| +    output = buf.getvalue()
 | 
| +
 | 
| +    expected = u'HTML_FILE1         BINDATA            "HTML_FILE1_include_test.html"'
 | 
| +    # hackety hack to work on win32&lin
 | 
| +    output = re.sub('"[c-zC-Z]:', '"', output)
 | 
| +    self.failUnless(output.strip() == expected)
 | 
| +
 | 
| +    fo = file(output_file)
 | 
| +    file_contents = fo.read()
 | 
| +    fo.close()
 | 
| +
 | 
| +    # Check for the content added by the <include> tag.
 | 
| +    self.failUnless(file_contents.find('Hello Include!') != -1)
 | 
| +    # Check for the content that was removed by if tag.
 | 
| +    self.failUnless(file_contents.find('should be removed') == -1)
 | 
| +    # Check for the content that was kept in place by if.
 | 
| +    self.failUnless(file_contents.find('should be kept') != -1)
 | 
| +    self.failUnless(file_contents.find('in the middle...') != -1)
 | 
| +    self.failUnless(file_contents.find('at the end...') != -1)
 | 
| +    # Check for nested content that was kept
 | 
| +    self.failUnless(file_contents.find('nested true should be kept') != -1)
 | 
| +    self.failUnless(file_contents.find('silbing true should be kept') != -1)
 | 
| +    # Check for removed "<if>" and "</if>" tags.
 | 
| +    self.failUnless(file_contents.find('<if expr=') == -1)
 | 
| +    self.failUnless(file_contents.find('</if>') == -1)
 | 
| +
 | 
| +
 | 
| +  def testStructureNodeOutputfile(self):
 | 
| +    input_file = util.PathFromRoot('grit/testdata/simple.html')
 | 
| +    root = grd_reader.Parse(StringIO.StringIO(
 | 
| +      '<structure type="tr_html" name="IDR_HTML" file="%s" />' %input_file),
 | 
| +      flexible_root = True)
 | 
| +    util.FixRootForUnittest(root, '.')
 | 
| +    # We must run the gatherers since we'll be wanting the translation of the
 | 
| +    # file.  The file exists in the location pointed to.
 | 
| +    root.RunGatherers(recursive=True)
 | 
| +
 | 
| +    output_dir = tempfile.gettempdir()
 | 
| +    en_file = root.FileForLanguage('en', output_dir)
 | 
| +    self.failUnless(en_file == input_file)
 | 
| +    fr_file = root.FileForLanguage('fr', output_dir)
 | 
| +    self.failUnless(fr_file == os.path.join(output_dir, 'fr_simple.html'))
 | 
| +
 | 
| +    fo = file(fr_file)
 | 
| +    contents = fo.read()
 | 
| +    fo.close()
 | 
| +
 | 
| +    self.failUnless(contents.find('<p>') != -1)  # should contain the markup
 | 
| +    self.failUnless(contents.find('Hello!') == -1)  # should be translated
 | 
| +
 | 
| +
 | 
| +  def testFallbackToEnglish(self):
 | 
| +    root = grd_reader.Parse(StringIO.StringIO('''<?xml version="1.0" encoding="UTF-8"?>
 | 
| +      <grit latest_public_release="2" source_lang_id="en-US" current_release="3" base_dir=".">
 | 
| +        <release seq="1" allow_pseudo="False">
 | 
| +          <structures fallback_to_english="True">
 | 
| +            <structure type="dialog" name="IDD_ABOUTBOX" file="grit\\testdata\klonk.rc" encoding="utf-16" />
 | 
| +          </structures>
 | 
| +        </release>
 | 
| +      </grit>'''), util.PathFromRoot('.'))
 | 
| +    util.FixRootForUnittest(root)
 | 
| +    root.RunGatherers(recursive = True)
 | 
| +
 | 
| +    node = root.GetNodeById("IDD_ABOUTBOX")
 | 
| +    formatter = node.ItemFormatter('rc_all')
 | 
| +    output = formatter.Format(node, 'bingobongo')
 | 
| +    self.failUnless(output.strip() == '''IDD_ABOUTBOX DIALOGEX 22, 17, 230, 75
 | 
| +STYLE DS_SETFONT | DS_MODALFRAME | WS_CAPTION | WS_SYSMENU
 | 
| +CAPTION "About"
 | 
| +FONT 8, "System", 0, 0, 0x0
 | 
| +BEGIN
 | 
| +    ICON            IDI_KLONK,IDC_MYICON,14,9,20,20
 | 
| +    LTEXT           "klonk Version ""yibbee"" 1.0",IDC_STATIC,49,10,119,8,
 | 
| +                    SS_NOPREFIX
 | 
| +    LTEXT           "Copyright (C) 2005",IDC_STATIC,49,20,119,8
 | 
| +    DEFPUSHBUTTON   "OK",IDOK,195,6,30,11,WS_GROUP
 | 
| +    CONTROL         "Jack ""Black"" Daniels",IDC_RADIO1,"Button",
 | 
| +                    BS_AUTORADIOBUTTON,46,51,84,10
 | 
| +END''')
 | 
| +
 | 
| +
 | 
| +  def testRelativePath(self):
 | 
| +    ''' Verify that _MakeRelativePath works in some tricky cases.'''
 | 
| +    def TestRelativePathCombinations(base_path, other_path, expected_result):
 | 
| +      ''' Verify that the relative path function works for
 | 
| +      the given paths regardless of whether or not they end with
 | 
| +      a trailing slash.'''
 | 
| +      for path1 in [base_path, base_path + os.path.sep]:
 | 
| +        for path2 in [other_path, other_path + os.path.sep]:
 | 
| +          result = rc._MakeRelativePath(path1, path2)
 | 
| +          self.failUnless(result == expected_result)
 | 
| +
 | 
| +    # set-up variables
 | 
| +    root_dir = 'c:%sa' % os.path.sep
 | 
| +    result1 = '..%sabc' % os.path.sep
 | 
| +    path1 = root_dir + 'bc'
 | 
| +    result2 = 'bc'
 | 
| +    path2 = '%s%s%s' % (root_dir, os.path.sep, result2)
 | 
| +    # run the tests
 | 
| +    TestRelativePathCombinations(root_dir, path1, result1)
 | 
| +    TestRelativePathCombinations(root_dir, path2, result2)
 | 
| +
 | 
| +
 | 
| +if __name__ == '__main__':
 | 
| +  unittest.main()
 | 
| 
 | 
| Property changes on: grit/format/rc_unittest.py
 | 
| ___________________________________________________________________
 | 
| Added: svn:eol-style
 | 
|    + LF
 | 
| 
 | 
| 
 |