// 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.

import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.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";

bool test(compiler, String name1, String name2, {bool expect}) {
  Expect.isTrue(?expect, 'required parameter "expect" not given');
  var clazz = findElement(compiler, "Class");
  clazz.ensureResolved(compiler);
  var element1 = clazz.buildScope().lookup(buildSourceString(name1));
  var element2 = clazz.buildScope().lookup(buildSourceString(name2));
  Expect.isNotNull(element1);
  Expect.isNotNull(element2);
  Expect.equals(element1.kind, ElementKind.FUNCTION);
  Expect.equals(element2.kind, ElementKind.FUNCTION);
  FunctionSignature signature1 = element1.computeSignature(compiler);
  FunctionSignature signature2 = element2.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.
  DartType type1;
  DartType type2;
  if (signature1.requiredParameterCount == 0) {
    // If parameters is empty, use return type.
    type1 = signature1.returnType;
  } else {
    // Otherwise use the first argument type.
    type1 = signature1.requiredParameters.head.computeType(compiler);
  }
  if (signature2.requiredParameterCount == 0) {
    // If parameters is empty, use return type.
    type2 = signature2.returnType;
  } else {
    // Otherwise use the first argument type.
    type2 = signature2.requiredParameters.head.computeType(compiler);
  }
  if (expect) {
    Expect.equals(type1, type2, "$type1 != $type2");
  } else {
    Expect.notEquals(type1, type2, "$type1 == $type2");
  }
}

void main() {
  var uri = new Uri.fromComponents(scheme: 'source');
  var compiler = compilerFor(
      r"""
      typedef int Typedef1<X,Y>(String s1);
      typedef void Typedef2<Z>(T t1, S s1);

      class Class<T,S> {
        void void1() {}
        void void2() {}
        void int1(int a) {}
        void int2(int b) {}
        void String1(String a) {}
        void String2(String b) {}
        void ListInt1(List<int> a) {}
        void ListInt2(List<int> b) {}
        void ListString1(List<String> a) {}
        void ListString2(List<String> b) {}
        void MapIntString1(Map<int,String> a) {}
        void MapIntString2(Map<int,String> b) {}
        void TypeVar1(T t1, S s1) {}
        void TypeVar2(T t2, S 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(T t2, S s2)) {}
        void Typedef1a(Typedef1<int,String> a) {}
        void Typedef2a(Typedef1<int,String> b) {}
        void Typedef1b(Typedef2<T> a) {}
        void Typedef2b(Typedef2<T> b) {}
        void Typedef1c(Typedef2<S> a) {}
        void Typedef2c(Typedef2<S> b) {}
      }

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

  test(compiler, "void1", "void2", expect: true);
  test(compiler, "int1", "int2", expect: true);
  test(compiler, "String1", "String2", expect: true);
  test(compiler, "ListInt1", "ListInt2", expect: true);
  test(compiler, "ListString1", "ListString2", expect: true);
  test(compiler, "MapIntString1", "MapIntString2", expect: true);
  test(compiler, "TypeVar1", "TypeVar2", expect: true);
  test(compiler, "Function1a", "Function2a", expect: true);
  test(compiler, "Function1b", "Function2b", expect: true);
  test(compiler, "Typedef1a", "Typedef2a", expect: true);
  test(compiler, "Typedef1b", "Typedef2b", expect: true);
  test(compiler, "Typedef1c", "Typedef2c", expect: true);

  test(compiler, "void1", "int1", expect: false);
  test(compiler, "int1", "String1", expect: false);
  test(compiler, "String1", "ListInt1", expect: false);
  test(compiler, "ListInt1", "ListString1", expect: false);
  test(compiler, "ListString1", "MapIntString1", expect: false);
  test(compiler, "MapIntString1", "TypeVar1", expect: false);
  test(compiler, "TypeVar1", "Function1a", expect: false);
  test(compiler, "Function1a", "Function1b", expect: false);
  test(compiler, "Function1b", "Typedef1a", expect: false);
  test(compiler, "Typedef1a", "Typedef1b", expect: false);
  test(compiler, "Typedef1b", "Typedef1c", expect: false);
}
