blob: 286f12fecffaa3350566cb90a74c51b4e3d89505 [file] [log] [blame]
// 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;