#!/usr/bin/env python # Copyright (c) 2012 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. from code import Code import unittest class CodeTest(unittest.TestCase): def testAppend(self): c = Code() c.Append('line') self.assertEquals('line', c.Render()) def testBlock(self): c = Code() (c.Append('line') .Sblock('sblock') .Append('inner') .Append('moreinner') .Sblock('moresblock') .Append('inner') .Eblock('out') .Append('inner') .Eblock('out') ) self.assertEquals( 'line\n' 'sblock\n' ' inner\n' ' moreinner\n' ' moresblock\n' ' inner\n' ' out\n' ' inner\n' 'out', c.Render()) def testConcat(self): b = Code() (b.Sblock('2') .Append('2') .Eblock('2') ) c = Code() (c.Sblock('1') .Concat(b) .Append('1') .Eblock('1') ) self.assertMultiLineEqual( '1\n' ' 2\n' ' 2\n' ' 2\n' ' 1\n' '1', c.Render()) d = Code() a = Code() a.Concat(d) self.assertEquals('', a.Render()) a.Concat(c) self.assertEquals( '1\n' ' 2\n' ' 2\n' ' 2\n' ' 1\n' '1', a.Render()) def testConcatErrors(self): c = Code() d = Code() d.Append('%s') self.assertRaises(TypeError, c.Concat, d) d = Code() d.Append('%(classname)s') self.assertRaises(TypeError, c.Concat, d) d = 'line of code' self.assertRaises(TypeError, c.Concat, d) def testSubstitute(self): c = Code() c.Append('%(var1)s %(var2)s %(var1)s') c.Substitute({'var1': 'one', 'var2': 'two'}) self.assertEquals('one two one', c.Render()) c.Append('%(var1)s %(var2)s %(var3)s') c.Append('%(var2)s %(var1)s %(var3)s') c.Substitute({'var1': 'one', 'var2': 'two', 'var3': 'three'}) self.assertEquals( 'one two one\n' 'one two three\n' 'two one three', c.Render()) def testSubstituteErrors(self): # No unnamed placeholders allowed when substitute is run c = Code() c.Append('%s %s') self.assertRaises(TypeError, c.Substitute, ('var1', 'one')) c = Code() c.Append('%s %(var1)s') self.assertRaises(TypeError, c.Substitute, {'var1': 'one'}) c = Code() c.Append('%s %(var1)s') self.assertRaises(TypeError, c.Substitute, {'var1': 'one'}) c = Code() c.Append('%(var1)s') self.assertRaises(KeyError, c.Substitute, {'clearlynotvar1': 'one'}) def testIsEmpty(self): c = Code() self.assertTrue(c.IsEmpty()) c.Append('asdf') self.assertFalse(c.IsEmpty()) def testComment(self): long_comment = ('This comment is ninety one characters in longness, ' 'that is, using a different word, length.') c = Code() c.Comment(long_comment) self.assertEquals( '// This comment is ninety one characters ' 'in longness, that is, using a different\n' '// word, length.', c.Render()) c = Code() c.Sblock('sblock') c.Comment(long_comment) c.Eblock('eblock') c.Comment(long_comment) self.assertEquals( 'sblock\n' ' // This comment is ninety one characters ' 'in longness, that is, using a\n' ' // different word, length.\n' 'eblock\n' '// This comment is ninety one characters in ' 'longness, that is, using a different\n' '// word, length.', c.Render()) long_word = 'x' * 100 c = Code() c.Comment(long_word) self.assertEquals( '// ' + 'x' * 77 + '\n' '// ' + 'x' * 23, c.Render()) c = Code(indent_size=2, comment_length=40) c.Comment('Pretend this is a Closure Compiler style comment, which should ' 'both wrap and indent', comment_prefix=' * ', wrap_indent=4) self.assertEquals( ' * Pretend this is a Closure Compiler\n' ' * style comment, which should both\n' ' * wrap and indent', c.Render()) def testCommentWithSpecialCharacters(self): c = Code() c.Comment('20% of 80%s') c.Substitute({}) self.assertEquals('// 20% of 80%s', c.Render()) d = Code() d.Append('90') d.Concat(c) self.assertEquals('90\n' '// 20% of 80%s', d.Render()) def testLinePrefixes(self): c = Code() c.Sblock(line='/**', line_prefix=' * ') c.Sblock('@typedef {{') c.Append('foo: bar,') c.Sblock('baz: {') c.Append('x: y') c.Eblock('}') c.Eblock('}}') c.Eblock(line=' */') output = c.Render() self.assertMultiLineEqual( '/**\n' ' * @typedef {{\n' ' * foo: bar,\n' ' * baz: {\n' ' * x: y\n' ' * }\n' ' * }}\n' ' */', output) def testSameLineAppendConcatComment(self): c = Code() c.Append('This is a line.') c.Append('This too.', new_line=False) d = Code() d.Append('And this.') c.Concat(d, new_line=False) self.assertEquals('This is a line.This too.And this.', c.Render()) c = Code() c.Append('This is a') c.Comment(' spectacular 80-character line thingy ' + 'that fits wonderfully everywhere.', comment_prefix='', new_line=False) self.assertEquals('This is a spectacular 80-character line thingy that ' + 'fits wonderfully everywhere.', c.Render()) if __name__ == '__main__': unittest.main()