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

// @dart = 2.9

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;
