#!/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.

import idlnode
import idlparser
import idlrenderer
import logging.config
import unittest


class IDLRendererTestCase(unittest.TestCase):

    def _run_test(self, input_text, expected_text):
        """Parses input, renders it and compares the results"""
        parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
        idl_file = idlnode.IDLFile(parser.parse(input_text))
        output_text = idlrenderer.render(idl_file)

        if output_text != expected_text:
            msg = '''
EXPECTED:
%s
ACTUAL  :
%s
''' % (expected_text, output_text)
            self.fail(msg)

    def test_rendering(self):
        input_text = \
    '''module M {
  [Constructor(long x)] interface I : @A J, K {
    attribute int attr;
    readonly attribute long attr2;
    getter attribute int get_attr;
    setter attribute int set_attr;

    [A,B=123] void function(in long x, in optional boolean y);

    const boolean CONST = 1;

    @A @B() @C(x) @D(x=1) @E(x,y=2)
    void something();
  };
};
@X module M2 {
  @Y interface I {};
};'''

        expected_text = \
    '''module M {
  [Constructor(in long x)]
  interface I :
      @A J,
      K {

    /* Constants */
    const boolean CONST = 1;

    /* Attributes */
    attribute int attr;
    attribute long attr2;
    getter attribute int get_attr;
    setter attribute int set_attr;

    /* Operations */
    [A, B=123] void function(in long x, in optional boolean y);
    @A @B @C(x) @D(x=1) @E(x, y=2) void something();
  };
};
@X module M2 {
  @Y
  interface I {
  };
};
'''
        self._run_test(input_text, expected_text)


if __name__ == "__main__":
    logging.config.fileConfig("logging.conf")
    if __name__ == '__main__':
        unittest.main()
