#!/usr/bin/env python3 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file # for details. All rights reserved. Use of this source code is governed by a # BSD-style license that can be found in the LICENSE file. """Tests for emitter module.""" import logging.config import unittest import emitter class EmitterTestCase(unittest.TestCase): def setUp(self): pass def tearDown(self): pass def check(self, e, expected): self.assertEqual(''.join(e.Fragments()), expected) def testExample(self): e = emitter.Emitter() body = e.Emit('$TYPE $NAME() {\n' ' $!BODY\n' '}\n', TYPE='int', NAME='foo') body.Emit('return $VALUE;', VALUE='100') self.check(e, 'int foo() {\n' ' return 100;\n' '}\n') def testTemplateErrorDuplicate(self): try: e = emitter.Emitter() b = e.Emit('$(A)$(!B)$(A)$(!B)') # $(!B) is duplicated except RuntimeError as ex: return raise AssertionError('Expected error') def testTemplate1(self): e = emitter.Emitter() e.Emit('-$A+$B-$A+$B-', A='1', B='2') self.check(e, '-1+2-1+2-') def testTemplate2(self): e = emitter.Emitter() r = e.Emit('1$(A)2$(B)3$(A)4$(B)5', A='x', B='y') self.assertEqual(None, r) self.check(e, '1x2y3x4y5') def testTemplate3(self): e = emitter.Emitter() b = e.Emit('1$(A)2$(!B)3$(A)4$(B)5', A='x') b.Emit('y') self.check(e, '1x2y3x4y5') self.check(b, 'y') def testTemplate4(self): e = emitter.Emitter() (a, b) = e.Emit('$!A$!B$A$B') # pair of holes. a.Emit('x') b.Emit('y') self.check(e, 'xyxy') def testMissing(self): # Behaviour of Undefined parameters depends on form. e = emitter.Emitter() e.Emit('$A $?B $(C) $(?D)') self.check(e, '$A $(C) ') def testHoleScopes(self): e = emitter.Emitter() # Holes have scope. They remember the bindings of the template application # in which they are created. Create two holes which inherit bindings for C # and D. (a, b) = e.Emit('[$!A][$!B]$C$D$E', C='1', D='2') e.Emit(' $A$B$C$D') # Bindings are local to the Emit self.check(e, '[][]12$E $A$B$C$D') # Holes are not bound within holes. That would too easily lead to infinite # expansions. a.Emit('$A$C$D') # $A12 b.Emit('$D$C$B') # 21$B self.check(e, '[$A12][21$B]12$E $A$B$C$D') # EmitRaw avoids interpolation. a.EmitRaw('$C$D') b.EmitRaw('$D$C') self.check(e, '[$A12$C$D][21$B$D$C]12$E $A$B$C$D') def testNestedTemplates(self): e = emitter.Emitter() e.Emit('-$#A(-)-', A=True) self.check(e, '---') def testNestedTemplates2(self): e = emitter.Emitter() e.Emit('-$#A( $#B(-$C-) )-', A=True, B=True, C='1') self.check(e, '- -1- -') def testNestedTemplatesWithFalse(self): e = emitter.Emitter() e.Emit('-$#A( $B )-', A=False, B='1') self.check(e, '--') def testNestedTemplatesWithFalse2(self): e = emitter.Emitter() e.Emit('-$#A( $#B(-$C-) )-', A=False, B=True, C='1') self.check(e, '--') def testNestedTemplatesWithFalse3(self): e = emitter.Emitter() e.Emit('-$#A( $#B(-$C-) )-', A=True, B=False, C='1') self.check(e, '- -') def testNestedTemplateMissingBindings(self): e = emitter.Emitter() e.Emit('-$#A(-$#B(-$C-)-)-', C='1') self.check(e, '-$#A(-$#B(-1-)-)-') def testNestedTemplateWithNoRightParen(self): e = emitter.Emitter() e.Emit('-$#A(-$B-', A=True, B='1') self.check(e, '-$#A(-1-') def testNestedTemplateWithWrongBinding(self): try: e = emitter.Emitter() e.Emit('$#A(-)', A='Invalid') e.Fragments() except RuntimeError as ex: return raise AssertionError('Expected error') def testFormat(self): self.assertEqual(emitter.Format('$A$B', A=1, B=2), '12') if __name__ == '__main__': logging.config.fileConfig('logging.conf') if __name__ == '__main__': unittest.main()