#!/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.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 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, ex:
            return
        raise AssertionError('Expected error')

    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()
