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