| #!/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() |