// 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/dart2jslib.dart";
import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
import "compiler_helper.dart";
import "parser_helper.dart";
import "dart:uri";

Element getElement(compiler, String name) {
  var element = findElement(compiler, name);
  Expect.isNotNull(element);
  if (identical(element.kind, ElementKind.CLASS)) {
    element.ensureResolved(compiler);
  }
  return element;
}

DartType getElementType(compiler, String name) {
  return getElement(compiler, name).computeType(compiler);
}

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();
}

InterfaceType instantiate(ClassElement element, List<DartType> arguments) {
  return new InterfaceType(element, new Link<DartType>.fromList(arguments));
}

void testAsInstanceOf() {
  var uri = new Uri.fromComponents(scheme: 'source');
  Compiler compiler = compilerFor('''
      main() {}
      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>> {}''',
    uri);
  compiler.runCompiler(uri);

  ClassElement A = getElement(compiler, "A");
  ClassElement B = getElement(compiler, "B");
  ClassElement C = getElement(compiler, "C");
  ClassElement D = getElement(compiler, "D");
  ClassElement E = getElement(compiler, "E");
  ClassElement F = getElement(compiler, "F");

  DartType numType = compiler.numClass.computeType(compiler);
  DartType intType = compiler.intClass.computeType(compiler);
  DartType stringType = compiler.stringClass.computeType(compiler);

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

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

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

  DartType 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 uri = new Uri.fromComponents(scheme: 'source');
  var compiler = compilerFor(
      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) {}
      }

      void main() {}
      """,
      uri);
  compiler.runCompiler(uri);

  DartType Class_T_S = getElementType(compiler, "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 = getType(compiler, "int1");
  Expect.isNotNull(intType);
  Expect.identical(intType.kind, TypeKind.INTERFACE);

  DartType StringType = 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');
}
