// 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 '../../../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');
}
