|  | #!/usr/bin/python | 
|  | # 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.assertEquals(''.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, 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.assertEquals(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 testFormat(self): | 
|  | self.assertEquals(emitter.Format('$A$B', A=1, B=2), '12') | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | logging.config.fileConfig('logging.conf') | 
|  | if __name__ == '__main__': | 
|  | unittest.main() |