// 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 '../../../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(buildSourceString(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.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() {
  var env = new TypeEnvironment('''
      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>> {}''');
  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() {
  var env = new TypeEnvironment(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) {}
      }
      """);
  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');
}
