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

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