// Copyright (c) 2018, 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 "package:expect/expect.dart";

// Tests the constructors of the Invocation class.

main() {
  {
    var name = "getter";
    var invocation = new Invocation.getter(#name);
    Expect.isTrue(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isTrue(invocation.isAccessor, "$name:isAccessor");
    Expect.isFalse(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals([], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);
  }
  {
    var name = "setter";
    var argument = new Object();
    var invocation = new Invocation.setter(const Symbol("name="), argument);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isTrue(invocation.isSetter, "$name:isSetter");
    Expect.isTrue(invocation.isAccessor, "$name:isAccessor");
    Expect.isFalse(invocation.isMethod, "$name:isMethod");
    Expect.equals(const Symbol("name="), invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);
  }
  {
    var name = ".name()";
    var invocation = new Invocation.method(#name, []);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals([], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation("$name:", invocation, new Invocation.method(#name, null));
    expectInvocation(
        "$name:", invocation, new Invocation.method(#name, [], null));
    expectInvocation(
        "$name:", invocation, new Invocation.method(#name, [], {}));

    expectInvocation(
        "$name:", invocation, new Invocation.genericMethod(#name, [], []));
    expectInvocation(
        "$name:", invocation, new Invocation.genericMethod(#name, [], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [], [], null));
    expectInvocation(
        "$name:", invocation, new Invocation.genericMethod(#name, [], [], {}));
    expectInvocation(
        "$name:", invocation, new Invocation.genericMethod(#name, null, []));
    expectInvocation(
        "$name:", invocation, new Invocation.genericMethod(#name, null, null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, null, [], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, null, [], {}));
  }
  {
    var name = ".name(a)";
    var argument = new Object();
    var invocation = new Invocation.method(#name, [argument]);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation(
        "$name:", invocation, new Invocation.method(#name, [argument], null));
    expectInvocation(
        "$name:", invocation, new Invocation.method(#name, [argument], {}));

    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [], [argument], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [], [argument], {}));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, null, [argument], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, null, [argument], {}));
  }
  {
    var name = ".name(a,b)";
    var argument = new Object();
    var argument2 = new Object();
    var invocation = new Invocation.method(#name, [argument, argument2]);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals(
        [argument, argument2], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation("$name:", invocation,
        new Invocation.method(#name, [argument, argument2], null));
    expectInvocation("$name:", invocation,
        new Invocation.method(#name, [argument, argument2], {}));

    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [], [argument, argument2], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [], [argument, argument2], {}));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, null, [argument, argument2], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, null, [argument, argument2], {}));
  }
  {
    var name = ".name(a,b:)";
    var argument = new Object();
    var argument2 = new Object();
    var invocation =
        new Invocation.method(#name, [argument], {#arg: argument2});
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals(
        {#arg: argument2}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation(
        "$name:",
        invocation,
        new Invocation.genericMethod(
            #name, null, [argument], {#arg: argument2}));
  }
  {
    var name = ".name(a:,b:)";
    var argument = new Object();
    var argument2 = new Object();
    var invocation =
        new Invocation.method(#name, [], {#arg: argument, #arg2: argument2});
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([], invocation.typeArguments, "$name:types");
    Expect.listEquals([], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({#arg: argument, #arg2: argument2},
        invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation("$name:", invocation,
        new Invocation.method(#name, null, {#arg: argument, #arg2: argument2}));
    expectInvocation(
        "$name:",
        invocation,
        new Invocation.genericMethod(
            #name, null, [], {#arg: argument, #arg2: argument2}));
    expectInvocation(
        "$name:",
        invocation,
        new Invocation.genericMethod(
            #name, null, null, {#arg: argument, #arg2: argument2}));
  }
  {
    var name = ".name<i>()";
    var invocation = new Invocation.genericMethod(#name, [int], []);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([int], invocation.typeArguments, "$name:types");
    Expect.listEquals([], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation(
        "$name:", invocation, new Invocation.genericMethod(#name, [int], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], [], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], null, null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], [], {}));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], null, {}));
  }
  {
    var name = ".name<i>(a)";
    var argument = new Object();
    var invocation = new Invocation.genericMethod(#name, [int], [argument]);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([int], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], [argument], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], [argument], {}));
  }
  {
    var name = ".name<i>(a,b)";
    var argument = new Object();
    var argument2 = new Object();
    var invocation =
        new Invocation.genericMethod(#name, [int], [argument, argument2]);
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([int], invocation.typeArguments, "$name:types");
    Expect.listEquals(
        [argument, argument2], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation(
        "$name:",
        invocation,
        new Invocation.genericMethod(
            #name, [int], [argument, argument2], null));
    expectInvocation("$name:", invocation,
        new Invocation.genericMethod(#name, [int], [argument, argument2], {}));
  }
  {
    var name = ".name<i>(a,b:)";
    var argument = new Object();
    var argument2 = new Object();
    var invocation = new Invocation.genericMethod(
        #name, [int], [argument], {#arg: argument2});
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([int], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals(
        {#arg: argument2}, invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);
  }
  {
    var name = ".name<i>(a:,b:)";
    var argument = new Object();
    var argument2 = new Object();
    var invocation = new Invocation.genericMethod(
        #name, [int], [], {#arg: argument, #arg2: argument2});
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals([int], invocation.typeArguments, "$name:types");
    Expect.listEquals([], invocation.positionalArguments, "$name:pos");
    Expect.mapEquals({#arg: argument, #arg2: argument2},
        invocation.namedArguments, "$name: named");
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);

    expectInvocation(
        "$name:",
        invocation,
        new Invocation.genericMethod(
            #name, [int], null, {#arg: argument, #arg2: argument2}));
  }
  {
    // Many arguments.
    var name = ".name<..>(..,..:)";
    var argument = new Object();
    var argument2 = new Object();
    Type intList = new TypeHelper<List<int>>().type;
    var invocation = new Invocation.genericMethod(
        #name,
        [int, double, intList],
        [argument, argument2, null, argument],
        {#arg: argument, #arg2: argument2, #arg3: null, #arg4: argument});
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals(
        [int, double, intList], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument, argument2, null, argument],
        invocation.positionalArguments, "$name:pos");
    Expect.mapEquals(
        {#arg: argument, #arg2: argument2, #arg3: null, #arg4: argument},
        invocation.namedArguments);
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);
  }
  {
    // Accepts iterables, not just lists.
    var name = "iterables";
    var argument = new Object();
    var argument2 = new Object();
    Type intList = new TypeHelper<List<int>>().type;
    var invocation = new Invocation.genericMethod(
        #name,
        [int, double, intList].where(kTrue),
        [argument, argument2, null, argument].where(kTrue),
        {#arg: argument, #arg2: argument2, #arg3: null, #arg4: argument});
    Expect.isFalse(invocation.isGetter, "$name:isGetter");
    Expect.isFalse(invocation.isSetter, "$name:isSetter");
    Expect.isFalse(invocation.isAccessor, "$name:isAccessor");
    Expect.isTrue(invocation.isMethod, "$name:isMethod");
    Expect.equals(#name, invocation.memberName, "$name:name");
    Expect.listEquals(
        [int, double, intList], invocation.typeArguments, "$name:types");
    Expect.listEquals([argument, argument2, null, argument],
        invocation.positionalArguments, "$name:pos");
    Expect.mapEquals(
        {#arg: argument, #arg2: argument2, #arg3: null, #arg4: argument},
        invocation.namedArguments);
    checkUnmodifiableList("$name types", invocation.typeArguments);
    checkUnmodifiableList("$name positional", invocation.positionalArguments);
    checkUnmodifiableMap("$name named", invocation.namedArguments);
  }
  // No null type arguments.
  Expect.throws(() {
    new Invocation.genericMethod(#name, [null], []);
  });
  Expect.throws(() {
    new Invocation.genericMethod(#name, [int, null], []);
  });
}

void checkUnmodifiableList(String name, List<Object> list) {
  if (list.isNotEmpty) {
    Expect.throws(() {
      list[0] = null;
    }, null, "$name: list not unmodifiable");
  }
  Expect.throws(() {
    list.add(null);
  }, null, "$name: list not unmodifiable");
}

void checkUnmodifiableMap(String name, Map<Symbol, Object> map) {
  Expect.throws(() {
    map[#key] = null;
  }, null, "$name: map not unmodifiable");
}

class TypeHelper<T> {
  Type get type => T;
}

expectInvocation(String name, Invocation expect, Invocation actual) {
  Expect.equals(expect.isGetter, actual.isGetter, "$name:isGetter");
  Expect.equals(expect.isSetter, actual.isSetter, "$name:isSetter");
  Expect.equals(expect.isAccessor, actual.isAccessor, "$name:isAccessor");
  Expect.equals(actual.isGetter || actual.isSetter, actual.isAccessor);
  Expect.equals(expect.isMethod, actual.isMethod, "$name:isMethod");
  Expect.isTrue(actual.isMethod || actual.isGetter || actual.isSetter);
  Expect.isFalse(actual.isMethod && actual.isGetter);
  Expect.isFalse(actual.isMethod && actual.isSetter);
  Expect.isFalse(actual.isSetter && actual.isGetter);
  Expect.equals(expect.memberName, actual.memberName, "$name:memberName");
  Expect.listEquals(expect.typeArguments, actual.typeArguments, "$name:types");
  Expect.listEquals(
      expect.positionalArguments, actual.positionalArguments, "$name:pos");
  Expect.mapEquals(expect.namedArguments, actual.namedArguments, "$name:named");
  checkUnmodifiableList(name, actual.typeArguments);
  checkUnmodifiableList(name, actual.positionalArguments);
  checkUnmodifiableMap(name, actual.namedArguments);
}

bool kTrue(_) => true;
