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