blob: deb89dfe5344f665d344afd5a011c3fc0c096a59 [file] [log] [blame] [edit]
// 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);
}
}
void checkUnmodifiableList(String name, List<Object?> list) {
if (list.isNotEmpty) {
Expect.throws(
() {
list[0] = null;
},
(_) => true,
"$name: list not unmodifiable",
);
}
Expect.throws(
() {
list.add(null);
},
(_) => true,
"$name: list not unmodifiable",
);
}
void checkUnmodifiableMap(String name, Map<Symbol, Object?> map) {
Expect.throws(
() {
map[#key] = null;
},
(_) => true,
"$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;