// 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 '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
import "compiler_helper.dart";
import "parser_helper.dart";
import "type_test_helper.dart";

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

  // 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.head.computeType(compiler);
  }
}

int length(Link link) {
  int count = 0;
  while (!link.isEmpty) {
    count++;
    link = link.tail;
  }
  return count;
}

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].
 */
bool 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, length(Class_T_S.typeArguments));

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

    DartType S = Class_T_S.typeArguments.tail.head;
    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);

    var parameters = new Link<DartType>.fromList(<DartType>[T, S]);
    var arguments = new Link<DartType>.fromList(<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);
    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);
    Expect.equals(Function_dynamic_dynamic, unalias2,
        '$Typedef1.unalias=$unalias2 != $Function_dynamic_dynamic');
  }));
}
