Home | History | Annotate | Download | only in tests
      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 import cStringIO
      7 import difflib
      8 import os
      9 import sys
     10 import unittest
     11 
     12 SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
     13 BUILD_TOOLS_DIR = os.path.dirname(SCRIPT_DIR)
     14 
     15 sys.path.append(BUILD_TOOLS_DIR)
     16 import easy_template
     17 
     18 class EasyTemplateTestCase(unittest.TestCase):
     19   def _RunTest(self, template, expected, template_dict):
     20     src = cStringIO.StringIO(template)
     21     dst = cStringIO.StringIO()
     22     easy_template.RunTemplate(src, dst, template_dict)
     23     if dst.getvalue() != expected:
     24       expected_lines = expected.splitlines(1)
     25       actual_lines = dst.getvalue().splitlines(1)
     26       diff = ''.join(difflib.unified_diff(
     27         expected_lines, actual_lines,
     28         fromfile='expected', tofile='actual'))
     29       self.fail('Unexpected output:\n' + diff)
     30 
     31   def testEmpty(self):
     32     self._RunTest('', '', {})
     33 
     34   def testNewlines(self):
     35     self._RunTest('\n\n', '\n\n', {})
     36 
     37   def testNoInterpolation(self):
     38     template = """I love paris in the
     39     the springtime [don't you?]
     40     {this is not interpolation}.
     41     """
     42     self._RunTest(template, template, {})
     43 
     44   def testSimpleInterpolation(self):
     45     self._RunTest(
     46         '{{foo}} is my favorite number',
     47         '42 is my favorite number',
     48         {'foo': 42})
     49 
     50   def testLineContinuations(self):
     51     template = "Line 1 \\\nLine 2\n"""
     52     self._RunTest(template, template, {})
     53 
     54   def testIfStatement(self):
     55     template = r"""
     56 [[if foo:]]
     57   foo
     58 [[else:]]
     59   not foo
     60 [[]]"""
     61     self._RunTest(template, "\n  foo\n", {'foo': True})
     62     self._RunTest(template, "\n  not foo\n", {'foo': False})
     63 
     64   def testForStatement(self):
     65     template = r"""[[for beers in [99, 98, 1]:]]
     66 {{beers}} bottle{{(beers != 1) and 's' or ''}} of beer on the wall...
     67 [[]]"""
     68     expected = r"""99 bottles of beer on the wall...
     69 98 bottles of beer on the wall...
     70 1 bottle of beer on the wall...
     71 """
     72     self._RunTest(template, expected, {})
     73 
     74   def testListVariables(self):
     75     template = r"""
     76 [[for i, item in enumerate(my_list):]]
     77 {{i+1}}: {{item}}
     78 [[]]
     79 """
     80     self._RunTest(template, "\n1: Banana\n2: Grapes\n3: Kumquat\n",
     81         {'my_list': ['Banana', 'Grapes', 'Kumquat']})
     82 
     83   def testListInterpolation(self):
     84     template = "{{', '.join(growing[0:-1]) + ' and ' + growing[-1]}} grow..."
     85     self._RunTest(template, "Oats, peas, beans and barley grow...",
     86         {'growing': ['Oats', 'peas', 'beans', 'barley']})
     87     self._RunTest(template, "Love and laughter grow...",
     88         {'growing': ['Love', 'laughter']})
     89 
     90   def testComplex(self):
     91     template = r"""
     92 struct {{name}} {
     93 [[for field in fields:]]
     94 [[  if field['type'] == 'array':]]
     95   {{field['basetype']}} {{field['name']}}[{{field['size']}}];
     96 [[  else:]]
     97   {{field['type']}} {{field['name']}};
     98 [[  ]]
     99 [[]]
    100 };"""
    101     expected = r"""
    102 struct Foo {
    103   std::string name;
    104   int problems[99];
    105 };"""
    106     self._RunTest(template, expected, {
    107       'name': 'Foo',
    108       'fields': [
    109         {'name': 'name', 'type': 'std::string'},
    110         {'name': 'problems', 'type': 'array', 'basetype': 'int', 'size': 99}]})
    111 
    112   def testModulo(self):
    113     self._RunTest('No expression %', 'No expression %', {})
    114     self._RunTest('% before {{3 + 4}}', '% before 7', {})
    115     self._RunTest('{{2**8}} % after', '256 % after', {})
    116     self._RunTest('inside {{8 % 3}}', 'inside 2', {})
    117     self._RunTest('Everywhere % {{8 % 3}} %', 'Everywhere % 2 %', {})
    118 
    119 
    120 if __name__ == '__main__':
    121   unittest.main()
    122