// Copyright (c) 2013, 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.

library type_representation_test;

import 'package:expect/expect.dart';
import "package:async_helper/async_helper.dart";
import 'type_test_helper.dart';
import 'package:compiler/src/dart_types.dart';
import 'package:compiler/src/js/js.dart';
import 'package:compiler/src/elements/elements.dart' show Element, ClassElement;
import 'package:compiler/src/js_backend/js_backend.dart'
    show JavaScriptBackend, TypeRepresentationGenerator;

void main() {
  testTypeRepresentations();
}

void testTypeRepresentations() {
  asyncTest(() => TypeEnvironment.create(r"""
      typedef void Typedef();
      typedef int Typedef2();
      typedef List<int> Typedef3();
      typedef Typedef4();
      typedef Typedef5(int a, String b);
      typedef Typedef6(int a, [String b]);
      typedef Typedef7(int a, String b, [List<int> c, d]);
      typedef Typedef8(int a, {String b});
      typedef Typedef9(int a, String b, {List<int> c, d});
      typedef Typedef10(void f(int a, [b]));

      void m1() {}
      int m2() => 0;
      List<int> m3() => null;
      m4() {}
      m5(int a, String b) {}
      m6(int a, [String b]) {}
      m7(int a, String b, [List<int> c, d]) {}
      m8(int a, {String b}) {}
      m9(int a, String b, {List<int> c, d}) {}
      m10(void f(int a, [b])) {}
      """).then((env) {
        TypeRepresentationGenerator typeRepresentation =
            new TypeRepresentationGenerator(env.compiler);

        Expression onVariable(TypeVariableType variable) {
          return new VariableUse(variable.name);
        }

        String stringify(Expression expression) {
          return prettyPrint(expression, env.compiler);
        }

        void expect(DartType type, String expectedRepresentation,
            [String expectedTypedefRepresentation]) {
          bool encodeTypedefName = false;
          Expression expression = typeRepresentation.getTypeRepresentation(
              type, onVariable, (x) => encodeTypedefName);
          Expect.stringEquals(expectedRepresentation, stringify(expression));

          encodeTypedefName = true;
          expression = typeRepresentation.getTypeRepresentation(
              type, onVariable, (x) => encodeTypedefName);
          if (expectedTypedefRepresentation == null) {
            expectedTypedefRepresentation = expectedRepresentation;
          }
          Expect.stringEquals(
              expectedTypedefRepresentation, stringify(expression));
        }

        String getJsName(Element cls) {
          Expression name = typeRepresentation.getJavaScriptClassName(cls);
          return stringify(name);
        }

        JavaScriptBackend backend = env.compiler.backend;
        String func = backend.namer.functionTypeTag;
        String retvoid = backend.namer.functionTypeVoidReturnTag;
        String ret = backend.namer.functionTypeReturnTypeTag;
        String args = backend.namer.functionTypeRequiredParametersTag;
        String opt = backend.namer.functionTypeOptionalParametersTag;
        String named = backend.namer.functionTypeNamedParametersTag;
        String typedefTag = backend.namer.typedefTag;

        ClassElement List_ = env.getElement('List');
        TypeVariableType List_E = List_.typeVariables[0];
        ClassElement Map_ = env.getElement('Map');
        TypeVariableType Map_K = Map_.typeVariables[0];
        TypeVariableType Map_V = Map_.typeVariables[1];

        DartType Object_ = env['Object'];
        DartType int_ = env['int'];
        DartType String_ = env['String'];
        DartType dynamic_ = env['dynamic'];
        DartType Typedef_ = env['Typedef'];
        DartType Typedef2_ = env['Typedef2'];
        DartType Typedef3_ = env['Typedef3'];
        DartType Typedef4_ = env['Typedef4'];
        DartType Typedef5_ = env['Typedef5'];
        DartType Typedef6_ = env['Typedef6'];
        DartType Typedef7_ = env['Typedef7'];
        DartType Typedef8_ = env['Typedef8'];
        DartType Typedef9_ = env['Typedef9'];
        DartType Typedef10_ = env['Typedef10'];

        String List_rep = getJsName(List_);
        String List_E_rep = stringify(onVariable(List_E));
        String Map_rep = getJsName(Map_);
        String Map_K_rep = stringify(onVariable(Map_K));
        String Map_V_rep = stringify(onVariable(Map_V));

        String Object_rep = getJsName(Object_.element);
        String int_rep = getJsName(int_.element);
        String String_rep = getJsName(String_.element);

        String Typedef_rep = getJsName(Typedef_.element);
        String Typedef2_rep = getJsName(Typedef2_.element);
        String Typedef3_rep = getJsName(Typedef3_.element);
        String Typedef4_rep = getJsName(Typedef4_.element);
        String Typedef5_rep = getJsName(Typedef5_.element);
        String Typedef6_rep = getJsName(Typedef6_.element);
        String Typedef7_rep = getJsName(Typedef7_.element);
        String Typedef8_rep = getJsName(Typedef8_.element);
        String Typedef9_rep = getJsName(Typedef9_.element);
        String Typedef10_rep = getJsName(Typedef10_.element);

        expect(int_, '$int_rep');
        expect(String_, '$String_rep');
        expect(dynamic_, 'null');

        // List<E>
        expect(List_.computeType(env.compiler.resolution),
            '[$List_rep, $List_E_rep]');
        // List
        expect(List_.rawType, '$List_rep');
        // List<dynamic>
        expect(instantiate(List_, [dynamic_]), '$List_rep');
        // List<int>
        expect(instantiate(List_, [int_]), '[$List_rep, $int_rep]');
        // List<Typedef>
        expect(
            instantiate(List_, [Typedef_]),
            '[$List_rep, {$func: 1, $retvoid: true}]',
            '[$List_rep, {$func: 1, $retvoid: true,'
            ' $typedefTag: $Typedef_rep}]');
        expect(
            instantiate(List_, [Typedef2_]),
            '[$List_rep, {$func: 1, $ret: $int_rep}]',
            '[$List_rep, {$func: 1, $ret: $int_rep,'
            ' $typedefTag: $Typedef2_rep}]');
        expect(
            instantiate(List_, [Typedef3_]),
            '[$List_rep, {$func: 1, $ret: [$List_rep, $int_rep]}]',
            '[$List_rep, {$func: 1, $ret: [$List_rep, $int_rep],'
            ' $typedefTag: $Typedef3_rep}]');
        expect(instantiate(List_, [Typedef4_]), '[$List_rep, {$func: 1}]',
            '[$List_rep, {$func: 1, $typedefTag: $Typedef4_rep}]');
        expect(
            instantiate(List_, [Typedef5_]),
            '[$List_rep, {$func: 1,'
            ' $args: [$int_rep, $String_rep]}]',
            '[$List_rep, {$func: 1,'
            ' $args: [$int_rep, $String_rep], $typedefTag: $Typedef5_rep}]');
        expect(
            instantiate(List_, [Typedef6_]),
            '[$List_rep, {$func: 1,'
            ' $args: [$int_rep], $opt: [$String_rep]}]',
            '[$List_rep, {$func: 1,'
            ' $args: [$int_rep], $opt: [$String_rep],'
            ' $typedefTag: $Typedef6_rep}]');
        expect(
            instantiate(List_, [Typedef7_]),
            '[$List_rep, {$func: 1, $args: '
            '[$int_rep, $String_rep], $opt: [[$List_rep, $int_rep],,]}]',
            '[$List_rep, {$func: 1, $args: '
            '[$int_rep, $String_rep], $opt: [[$List_rep, $int_rep],,], '
            '$typedefTag: $Typedef7_rep}]');
        expect(
            instantiate(List_, [Typedef8_]),
            '[$List_rep, {$func: 1, $args: [$int_rep],'
            ' $named: {b: $String_rep}}]',
            '[$List_rep, {$func: 1, $args: [$int_rep],'
            ' $named: {b: $String_rep}, $typedefTag: $Typedef8_rep}]');
        expect(
            instantiate(List_, [Typedef9_]),
            '[$List_rep, {$func: 1, '
            '$args: [$int_rep, $String_rep], $named: '
            '{c: [$List_rep, $int_rep], d: null}}]',
            '[$List_rep, {$func: 1, '
            '$args: [$int_rep, $String_rep], $named: {c: [$List_rep, $int_rep],'
            ' d: null}, $typedefTag: $Typedef9_rep}]');
        expect(
            instantiate(List_, [Typedef10_]),
            '[$List_rep, {$func: 1, '
            '$args: [{$func: 1, $retvoid: true, '
            '$args: [$int_rep], $opt: [,]}]}]',
            '[$List_rep, {$func: 1, '
            '$args: [{$func: 1, $retvoid: true, '
            '$args: [$int_rep], $opt: [,]}], $typedefTag: $Typedef10_rep}]');

        // Map<K,V>
        expect(Map_.computeType(env.compiler.resolution),
            '[$Map_rep, $Map_K_rep, $Map_V_rep]');
        // Map
        expect(Map_.rawType, '$Map_rep');
        // Map<dynamic,dynamic>
        expect(instantiate(Map_, [dynamic_, dynamic_]), '$Map_rep');
        // Map<int,String>
        expect(instantiate(Map_, [int_, String_]),
            '[$Map_rep, $int_rep, $String_rep]');

        // void m1() {}
        expect(env.getElement('m1').computeType(env.compiler.resolution),
            '{$func: 1, $retvoid: true}');

        // int m2() => 0;
        expect(env.getElement('m2').computeType(env.compiler.resolution),
            '{$func: 1, $ret: $int_rep}');

        // List<int> m3() => null;
        expect(env.getElement('m3').computeType(env.compiler.resolution),
            '{$func: 1, $ret: [$List_rep, $int_rep]}');

        // m4() {}
        expect(env.getElement('m4').computeType(env.compiler.resolution),
            '{$func: 1}');

        // m5(int a, String b) {}
        expect(env.getElement('m5').computeType(env.compiler.resolution),
            '{$func: 1, $args: [$int_rep, $String_rep]}');

        // m6(int a, [String b]) {}
        expect(
            env.getElement('m6').computeType(env.compiler.resolution),
            '{$func: 1, $args: [$int_rep],'
            ' $opt: [$String_rep]}');

        // m7(int a, String b, [List<int> c, d]) {}
        expect(
            env.getElement('m7').computeType(env.compiler.resolution),
            '{$func: 1,'
            ' $args: [$int_rep, $String_rep],'
            ' $opt: [[$List_rep, $int_rep],,]}');

        // m8(int a, {String b}) {}
        expect(
            env.getElement('m8').computeType(env.compiler.resolution),
            '{$func: 1,'
            ' $args: [$int_rep], $named: {b: $String_rep}}');

        // m9(int a, String b, {List<int> c, d}) {}
        expect(
            env.getElement('m9').computeType(env.compiler.resolution),
            '{$func: 1,'
            ' $args: [$int_rep, $String_rep],'
            ' $named: {c: [$List_rep, $int_rep], d: null}}');

        // m10(void f(int a, [b])) {}
        expect(
            env.getElement('m10').computeType(env.compiler.resolution),
            '{$func: 1, $args:'
            ' [{$func: 1,'
            ' $retvoid: true, $args: [$int_rep], $opt: [,]}]}');
      }));
}
