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
6from code import Code
7import unittest
8
9class CodeTest(unittest.TestCase):
10  def testAppend(self):
11    c = Code()
12    c.Append('line')
13    self.assertEquals('line', c.Render())
14
15  def testBlock(self):
16    c = Code()
17    (c.Append('line')
18      .Sblock('sblock')
19        .Append('inner')
20        .Append('moreinner')
21        .Sblock('moresblock')
22          .Append('inner')
23        .Eblock('out')
24        .Append('inner')
25      .Eblock('out')
26    )
27    self.assertEquals(
28      'line\n'
29      'sblock\n'
30      '  inner\n'
31      '  moreinner\n'
32      '  moresblock\n'
33      '    inner\n'
34      '  out\n'
35      '  inner\n'
36      'out',
37      c.Render())
38
39  def testConcat(self):
40    b = Code()
41    (b.Sblock('2')
42        .Append('2')
43      .Eblock('2')
44    )
45    c = Code()
46    (c.Sblock('1')
47        .Concat(b)
48        .Append('1')
49      .Eblock('1')
50    )
51    self.assertEquals(
52      '1\n'
53      '  2\n'
54      '    2\n'
55      '  2\n'
56      '  1\n'
57      '1',
58      c.Render())
59    d = Code()
60    a = Code()
61    a.Concat(d)
62    self.assertEquals('', a.Render())
63    a.Concat(c)
64    self.assertEquals(
65      '1\n'
66      '  2\n'
67      '    2\n'
68      '  2\n'
69      '  1\n'
70      '1',
71      a.Render())
72
73  def testConcatErrors(self):
74    c = Code()
75    d = Code()
76    d.Append('%s')
77    self.assertRaises(TypeError, c.Concat, d)
78    d = Code()
79    d.Append('%(classname)s')
80    self.assertRaises(TypeError, c.Concat, d)
81    d = 'line of code'
82    self.assertRaises(TypeError, c.Concat, d)
83
84  def testSubstitute(self):
85    c = Code()
86    c.Append('%(var1)s %(var2)s %(var1)s')
87    c.Substitute({'var1': 'one', 'var2': 'two'})
88    self.assertEquals('one two one', c.Render())
89    c.Append('%(var1)s %(var2)s %(var3)s')
90    c.Append('%(var2)s %(var1)s %(var3)s')
91    c.Substitute({'var1': 'one', 'var2': 'two', 'var3': 'three'})
92    self.assertEquals(
93        'one two one\n'
94        'one two three\n'
95        'two one three',
96        c.Render())
97
98  def testSubstituteErrors(self):
99    # No unnamed placeholders allowed when substitute is run
100    c = Code()
101    c.Append('%s %s')
102    self.assertRaises(TypeError, c.Substitute, ('var1', 'one'))
103    c = Code()
104    c.Append('%s %(var1)s')
105    self.assertRaises(TypeError, c.Substitute, {'var1': 'one'})
106    c = Code()
107    c.Append('%s %(var1)s')
108    self.assertRaises(TypeError, c.Substitute, {'var1': 'one'})
109    c = Code()
110    c.Append('%(var1)s')
111    self.assertRaises(KeyError, c.Substitute, {'clearlynotvar1': 'one'})
112
113  def testIsEmpty(self):
114    c = Code()
115    self.assertTrue(c.IsEmpty())
116    c.Append('asdf')
117    self.assertFalse(c.IsEmpty())
118
119  def testComment(self):
120    long_comment = ('This comment is eighty nine characters in longness, '
121        'that is, to use another word, length')
122    c = Code()
123    c.Comment(long_comment)
124    self.assertEquals(
125        '// This comment is eighty nine characters '
126        'in longness, that is, to use another\n'
127        '// word, length',
128        c.Render())
129    c = Code()
130    c.Sblock('sblock')
131    c.Comment(long_comment)
132    c.Eblock('eblock')
133    c.Comment(long_comment)
134    self.assertEquals(
135        'sblock\n'
136        '  // This comment is eighty nine characters '
137        'in longness, that is, to use\n'
138        '  // another word, length\n'
139        'eblock\n'
140        '// This comment is eighty nine characters in '
141        'longness, that is, to use another\n'
142        '// word, length',
143        c.Render())
144    long_word = 'x' * 100
145    c = Code()
146    c.Comment(long_word)
147    self.assertEquals(
148        '// ' + 'x' * 77 + '\n'
149        '// ' + 'x' * 23,
150        c.Render())
151
152  def testCommentWithSpecialCharacters(self):
153    c = Code()
154    c.Comment('20% of 80%s')
155    c.Substitute({})
156    self.assertEquals('// 20% of 80%s', c.Render())
157    d = Code()
158    d.Append('90')
159    d.Concat(c)
160    self.assertEquals('90\n'
161        '// 20% of 80%s',
162        d.Render())
163
164if __name__ == '__main__':
165  unittest.main()
166