// 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/dart_types.dart';
import 'compiler_helper.dart';
import 'type_test_helper.dart';

DartType 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");

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

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

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

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

    InterfaceType 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) {
  DartType type1 = getType(compiler, name1);
  DartType type2 = getType(compiler, name2);
  DartType 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;

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

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

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

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

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

    List<DartType> parameters = <DartType>[T, S];
    List<DartType> arguments = <DartType>[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.
    DartType Typedef2_int_String = getType(compiler, "Typedef2a");
    Expect.isNotNull(Typedef2_int_String);
    DartType Function_int_String = getType(compiler, "Function2b");
    Expect.isNotNull(Function_int_String);
    DartType unalias1 = Typedef2_int_String.unalias(compiler.resolution);
    Expect.equals(Function_int_String, unalias1,
        '$Typedef2_int_String.unalias=$unalias1 != $Function_int_String');

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