// Copyright (c) 2012, 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_substitution_test;

import 'package:expect/expect.dart';
import 'package:async_helper/async_helper.dart';
import 'package:compiler/src/elements/resolution_types.dart';
import 'compiler_helper.dart';
import 'type_test_helper.dart';

ResolutionDartType getType(compiler, String name) {
  var clazz = findElement(compiler, "Class");
  clazz.ensureResolved(compiler.resolution);
  var element = clazz.buildScope().lookup(name);
  Expect.isNotNull(element);
  Expect.equals(element.kind, ElementKind.FUNCTION);
  element.computeType(compiler.resolution);
  FunctionSignature signature = element.functionSignature;

  // Function signatures are used to be to provide void types (only occuring as
  // as return types) and (inlined) function types (only occuring as method
  // parameter types).
  //
  // Only a single type is used from each signature. That is, it is not the
  // intention to check the whole signatures against eachother.
  if (signature.requiredParameterCount == 0) {
    // If parameters is empty, use return type.
    return signature.type.returnType;
  } else {
    // Otherwise use the first argument type.
    return signature.requiredParameters.first.type;
  }
}

void main() {
  testAsInstanceOf();
  testTypeSubstitution();
}

void testAsInstanceOf() {
  asyncTest(() => TypeEnvironment.create('''
      class A<T> {}
      class B<T> {}
      class C<T> extends A<T> {}
      class D<T> extends A<int> {}
      class E<T> extends A<A<T>> {}
      class F<T, U> extends B<F<T, String>> implements A<F<B<U>, int>> {}
      ''').then((env) {
        var compiler = env.compiler;

        ClassElement A = env.getElement("A");
        ClassElement B = env.getElement("B");
        ClassElement C = env.getElement("C");
        ClassElement D = env.getElement("D");
        ClassElement E = env.getElement("E");
        ClassElement F = env.getElement("F");

        ResolutionDartType numType = env['num'];
        ResolutionDartType intType = env['int'];
        ResolutionDartType stringType = env['String'];

        ResolutionInterfaceType C_int = instantiate(C, [intType]);
        Expect.equals(instantiate(C, [intType]), C_int);
        Expect.equals(instantiate(A, [intType]), C_int.asInstanceOf(A));

        ResolutionInterfaceType D_int = instantiate(D, [stringType]);
        Expect.equals(instantiate(A, [intType]), D_int.asInstanceOf(A));

        ResolutionInterfaceType E_int = instantiate(E, [intType]);
        Expect.equals(
            instantiate(A, [
              instantiate(A, [intType])
            ]),
            E_int.asInstanceOf(A));

        ResolutionInterfaceType F_int_string =
            instantiate(F, [intType, stringType]);
        Expect.equals(
            instantiate(B, [
              instantiate(F, [intType, stringType])
            ]),
            F_int_string.asInstanceOf(B));
        Expect.equals(
            instantiate(A, [
              instantiate(F, [
                instantiate(B, [stringType]),
                intType
              ])
            ]),
            F_int_string.asInstanceOf(A));
      }));
}

/**
 * Test that substitution of [parameters] by [arguments] in the type found
 * through [name1] is the same as the type found through [name2].
 */
void testSubstitution(
    compiler, arguments, parameters, String name1, String name2) {
  ResolutionDartType type1 = getType(compiler, name1);
  ResolutionDartType type2 = getType(compiler, name2);
  ResolutionDartType subst = type1.subst(arguments, parameters);
  Expect.equals(
      type2, subst, "$type1.subst($arguments,$parameters)=$subst != $type2");
}

void testTypeSubstitution() {
  asyncTest(() => TypeEnvironment.create(r"""
      typedef void Typedef1<X,Y>(X x1, Y y2);
      typedef void Typedef2<Z>(Z z1);

      class Class<T,S> {
        void void1() {}
        void void2() {}
        void dynamic1(dynamic a) {}
        void dynamic2(dynamic b) {}
        void int1(int a) {}
        void int2(int a) {}
        void String1(String a) {}
        void String2(String a) {}
        void ListInt1(List<int> a) {}
        void ListInt2(List<int> b) {}
        void ListT1(List<T> a) {}
        void ListT2(List<int> b) {}
        void ListS1(List<S> a) {}
        void ListS2(List<String> b) {}
        void ListListT1(List<List<T>> a) {}
        void ListListT2(List<List<int>> b) {}
        void ListRaw1(List a) {}
        void ListRaw2(List b) {}
        void ListDynamic1(List<dynamic> a) {}
        void ListDynamic2(List<dynamic> b) {}
        void MapIntString1(Map<T,S> a) {}
        void MapIntString2(Map<int,String> b) {}
        void MapTString1(Map<T,String> a) {}
        void MapTString2(Map<int,String> b) {}
        void MapDynamicString1(Map<dynamic,String> a) {}
        void MapDynamicString2(Map<dynamic,String> b) {}
        void TypeVarT1(T t1) {}
        void TypeVarT2(int t2) {}
        void TypeVarS1(S s1) {}
        void TypeVarS2(String s2) {}
        void Function1a(int a(String s1)) {}
        void Function2a(int b(String s2)) {}
        void Function1b(void a(T t1, S s1)) {}
        void Function2b(void b(int t2, String s2)) {}
        void Function1c(void a(dynamic t1, dynamic s1)) {}
        void Function2c(void b(dynamic t2, dynamic s2)) {}
        void Typedef1a(Typedef1<T,S> a) {}
        void Typedef2a(Typedef1<int,String> b) {}
        void Typedef1b(Typedef1<dynamic,dynamic> a) {}
        void Typedef2b(Typedef1<dynamic,dynamic> b) {}
        void Typedef1c(Typedef1 a) {}
        void Typedef2c(Typedef1 b) {}
        void Typedef1d(Typedef2<T> a) {}
        void Typedef2d(Typedef2<int> b) {}
        void Typedef1e(Typedef2<S> a) {}
        void Typedef2e(Typedef2<String> b) {}
      }
      """).then((env) {
        var compiler = env.compiler;

        ResolutionInterfaceType Class_T_S = env["Class"];
        Expect.isNotNull(Class_T_S);
        Expect.identical(Class_T_S.kind, ResolutionTypeKind.INTERFACE);
        Expect.equals(2, Class_T_S.typeArguments.length);

        ResolutionDartType T = Class_T_S.typeArguments[0];
        Expect.isNotNull(T);
        Expect.identical(T.kind, ResolutionTypeKind.TYPE_VARIABLE);

        ResolutionDartType S = Class_T_S.typeArguments[1];
        Expect.isNotNull(S);
        Expect.identical(S.kind, ResolutionTypeKind.TYPE_VARIABLE);

        ResolutionDartType intType = env['int']; //getType(compiler, "int1");
        Expect.isNotNull(intType);
        Expect.identical(intType.kind, ResolutionTypeKind.INTERFACE);

        ResolutionDartType StringType =
            env['String']; //getType(compiler, "String1");
        Expect.isNotNull(StringType);
        Expect.identical(StringType.kind, ResolutionTypeKind.INTERFACE);

        List<ResolutionDartType> parameters = <ResolutionDartType>[T, S];
        List<ResolutionDartType> arguments = <ResolutionDartType>[
          intType,
          StringType
        ];

        // TODO(johnniwinther): Create types directly from strings to improve test
        // readability.

        testSubstitution(compiler, arguments, parameters, "void1", "void2");
        testSubstitution(
            compiler, arguments, parameters, "dynamic1", "dynamic2");
        testSubstitution(compiler, arguments, parameters, "int1", "int2");
        testSubstitution(compiler, arguments, parameters, "String1", "String2");
        testSubstitution(
            compiler, arguments, parameters, "ListInt1", "ListInt2");
        testSubstitution(compiler, arguments, parameters, "ListT1", "ListT2");
        testSubstitution(compiler, arguments, parameters, "ListS1", "ListS2");
        testSubstitution(
            compiler, arguments, parameters, "ListListT1", "ListListT2");
        testSubstitution(
            compiler, arguments, parameters, "ListRaw1", "ListRaw2");
        testSubstitution(
            compiler, arguments, parameters, "ListDynamic1", "ListDynamic2");
        testSubstitution(
            compiler, arguments, parameters, "MapIntString1", "MapIntString2");
        testSubstitution(
            compiler, arguments, parameters, "MapTString1", "MapTString2");
        testSubstitution(compiler, arguments, parameters, "MapDynamicString1",
            "MapDynamicString2");
        testSubstitution(
            compiler, arguments, parameters, "TypeVarT1", "TypeVarT2");
        testSubstitution(
            compiler, arguments, parameters, "TypeVarS1", "TypeVarS2");
        testSubstitution(
            compiler, arguments, parameters, "Function1a", "Function2a");
        testSubstitution(
            compiler, arguments, parameters, "Function1b", "Function2b");
        testSubstitution(
            compiler, arguments, parameters, "Function1c", "Function2c");
        testSubstitution(
            compiler, arguments, parameters, "Typedef1a", "Typedef2a");
        testSubstitution(
            compiler, arguments, parameters, "Typedef1b", "Typedef2b");
        testSubstitution(
            compiler, arguments, parameters, "Typedef1c", "Typedef2c");
        testSubstitution(
            compiler, arguments, parameters, "Typedef1d", "Typedef2d");
        testSubstitution(
            compiler, arguments, parameters, "Typedef1e", "Typedef2e");

        // Substitution in unalias.
        ResolutionDartType Typedef2_int_String = getType(compiler, "Typedef2a");
        Expect.isNotNull(Typedef2_int_String);
        ResolutionDartType Function_int_String =
            getType(compiler, "Function2b");
        Expect.isNotNull(Function_int_String);
        ResolutionDartType unalias1 = Typedef2_int_String.unaliased;
        Expect.equals(Function_int_String, unalias1,
            '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');

        ResolutionDartType Typedef1 = getType(compiler, "Typedef1c");
        Expect.isNotNull(Typedef1);
        ResolutionDartType Function_dynamic_dynamic =
            getType(compiler, "Function1c");
        Expect.isNotNull(Function_dynamic_dynamic);
        ResolutionDartType unalias2 = Typedef1.unaliased;
        Expect.equals(Function_dynamic_dynamic, unalias2,
            '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
      }));
}
