mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 01:30:32 +00:00
5642199dd0
Change-Id: I35bb926e53e92fd02e264fb5b14feadf063fb8db Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/257961 Reviewed-by: Michael Thomsen <mit@google.com> Commit-Queue: Lasse Nielsen <lrn@google.com>
289 lines
11 KiB
Dart
289 lines
11 KiB
Dart
// Copyright (c) 2013, 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.
|
|
|
|
library test.invoke_named_test;
|
|
|
|
import 'dart:mirrors';
|
|
|
|
import 'dart:async' show Future;
|
|
|
|
import 'package:expect/expect.dart';
|
|
import 'invoke_test.dart';
|
|
|
|
// TODO(ahe): Remove this variable (http://dartbug.com/12863).
|
|
bool isDart2js = false;
|
|
|
|
class C {
|
|
a(a, {b = 'B', c}) => "$a-$b-$c";
|
|
b({a = 'A', b, c}) => "$a-$b-$c";
|
|
c(a, [b, c = 'C']) => "$a-$b-$c";
|
|
d([a, b = 'B', c = 'C']) => "$a-$b-$c";
|
|
e(a, b, c) => "$a-$b-$c";
|
|
}
|
|
|
|
class D {
|
|
static a(a, {b = 'B', c}) => "$a-$b-$c";
|
|
static b({a = 'A', b, c}) => "$a-$b-$c";
|
|
static c(a, [b, c = 'C']) => "$a-$b-$c";
|
|
static d([a, b = 'B', c = 'C']) => "$a-$b-$c";
|
|
static e(a, b, c) => "$a-$b-$c";
|
|
}
|
|
|
|
class E {
|
|
var field;
|
|
E(a, {b = 'B', c}) : this.field = "$a-$b-$c";
|
|
E.b({a = 'A', b, c}) : this.field = "$a-$b-$c";
|
|
E.c(a, [b, c = 'C']) : this.field = "$a-$b-$c";
|
|
E.d([a, b = 'B', c = 'C']) : this.field = "$a-$b-$c";
|
|
E.e(a, b, c) : this.field = "$a-$b-$c";
|
|
}
|
|
|
|
a(a, {b = 'B', c}) => "$a-$b-$c";
|
|
b({a = 'A', b, c}) => "$a-$b-$c";
|
|
c(a, [b, c = 'C']) => "$a-$b-$c";
|
|
d([a, b = 'B', c = 'C']) => "$a-$b-$c";
|
|
e(a, b, c) => "$a-$b-$c";
|
|
|
|
testSyncInvoke(ObjectMirror om) {
|
|
InstanceMirror result;
|
|
|
|
result = om.invoke(const Symbol('a'), ['X']);
|
|
Expect.equals('X-B-null', result.reflectee);
|
|
result = om.invoke(const Symbol('a'), ['X'], {const Symbol('b'): 'Y'});
|
|
Expect.equals('X-Y-null', result.reflectee);
|
|
result = om.invoke(const Symbol('a'), ['X'],
|
|
{const Symbol('c'): 'Z', const Symbol('b'): 'Y'});
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(() => om.invoke(const Symbol('a'), []),
|
|
'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(() => om.invoke(const Symbol('a'), ['X', 'Y']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('a'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = om.invoke(const Symbol('b'), []);
|
|
Expect.equals('A-null-null', result.reflectee);
|
|
result = om.invoke(const Symbol('b'), [], {const Symbol('a'): 'X'});
|
|
Expect.equals('X-null-null', result.reflectee);
|
|
result = om.invoke(const Symbol('b'), [],
|
|
{const Symbol('b'): 'Y', const Symbol('c'): 'Z', const Symbol('a'): 'X'});
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('b'), ['X']), 'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('b'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = om.invoke(const Symbol('c'), ['X']);
|
|
Expect.equals('X-null-C', result.reflectee);
|
|
result = om.invoke(const Symbol('c'), ['X', 'Y']);
|
|
Expect.equals('X-Y-C', result.reflectee);
|
|
result = om.invoke(const Symbol('c'), ['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(() => om.invoke(const Symbol('c'), []),
|
|
'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('c'), ['X', 'Y', 'Z', 'W']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('c'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = om.invoke(const Symbol('d'), []);
|
|
Expect.equals('null-B-C', result.reflectee);
|
|
result = om.invoke(const Symbol('d'), ['X']);
|
|
Expect.equals('X-B-C', result.reflectee);
|
|
result = om.invoke(const Symbol('d'), ['X', 'Y']);
|
|
Expect.equals('X-Y-C', result.reflectee);
|
|
result = om.invoke(const Symbol('d'), ['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('d'), ['X', 'Y', 'Z', 'W']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('d'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = om.invoke(const Symbol('e'), ['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(() => om.invoke(const Symbol('e'), ['X']),
|
|
'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('e'), ['X', 'Y', 'Z', 'W']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => om.invoke(const Symbol('e'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
}
|
|
|
|
testSyncNewInstance() {
|
|
ClassMirror cm = reflectClass(E);
|
|
InstanceMirror result;
|
|
|
|
result = cm.newInstance(Symbol.empty, ['X']);
|
|
Expect.equals('X-B-null', result.reflectee.field);
|
|
result = cm.newInstance(Symbol.empty, ['X'], {const Symbol('b'): 'Y'});
|
|
Expect.equals('X-Y-null', result.reflectee.field);
|
|
result = cm.newInstance(
|
|
Symbol.empty, ['X'], {const Symbol('c'): 'Z', const Symbol('b'): 'Y'});
|
|
Expect.equals('X-Y-Z', result.reflectee.field);
|
|
Expect.throwsNoSuchMethodError(() => cm.newInstance(Symbol.empty, []),
|
|
'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(() => cm.newInstance(Symbol.empty, ['X', 'Y']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.newInstance(Symbol.empty, ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = cm.newInstance(const Symbol('b'), []);
|
|
Expect.equals('A-null-null', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('b'), [], {const Symbol('a'): 'X'});
|
|
Expect.equals('X-null-null', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('b'), [],
|
|
{const Symbol('b'): 'Y', const Symbol('c'): 'Z', const Symbol('a'): 'X'});
|
|
Expect.equals('X-Y-Z', result.reflectee.field);
|
|
Expect.throwsNoSuchMethodError(() => cm.newInstance(const Symbol('b'), ['X']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm
|
|
.newInstance(const Symbol('b'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = cm.newInstance(const Symbol('c'), ['X']);
|
|
Expect.equals('X-null-C', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('c'), ['X', 'Y']);
|
|
Expect.equals('X-Y-C', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('c'), ['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee.field);
|
|
Expect.throwsNoSuchMethodError(() => cm.newInstance(const Symbol('c'), []),
|
|
'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.newInstance(const Symbol('c'), ['X', 'Y', 'Z', 'W']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm
|
|
.newInstance(const Symbol('c'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = cm.newInstance(const Symbol('d'), []);
|
|
Expect.equals('null-B-C', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('d'), ['X']);
|
|
Expect.equals('X-B-C', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('d'), ['X', 'Y']);
|
|
Expect.equals('X-Y-C', result.reflectee.field);
|
|
result = cm.newInstance(const Symbol('d'), ['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee.field);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.newInstance(const Symbol('d'), ['X', 'Y', 'Z', 'W']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm
|
|
.newInstance(const Symbol('d'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
result = cm.newInstance(const Symbol('e'), ['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee.field);
|
|
Expect.throwsNoSuchMethodError(() => cm.newInstance(const Symbol('e'), ['X']),
|
|
'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.newInstance(const Symbol('e'), ['X', 'Y', 'Z', 'W']),
|
|
'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm
|
|
.newInstance(const Symbol('e'), ['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
}
|
|
|
|
testSyncApply() {
|
|
ClosureMirror cm;
|
|
InstanceMirror result;
|
|
|
|
cm = reflect(a) as ClosureMirror;
|
|
result = cm.apply(['X']);
|
|
Expect.equals('X-B-null', result.reflectee);
|
|
result = cm.apply(['X'], {const Symbol('b'): 'Y'});
|
|
Expect.equals('X-Y-null', result.reflectee);
|
|
result = cm.apply(['X'], {const Symbol('c'): 'Z', const Symbol('b'): 'Y'});
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply([]), 'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X', 'Y']), 'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
cm = reflect(b) as ClosureMirror;
|
|
result = cm.apply([]);
|
|
Expect.equals('A-null-null', result.reflectee);
|
|
result = cm.apply([], {const Symbol('a'): 'X'});
|
|
Expect.equals('X-null-null', result.reflectee);
|
|
result = cm.apply([],
|
|
{const Symbol('b'): 'Y', const Symbol('c'): 'Z', const Symbol('a'): 'X'});
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X']), 'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
cm = reflect(c) as ClosureMirror;
|
|
result = cm.apply(['X']);
|
|
Expect.equals('X-null-C', result.reflectee);
|
|
result = cm.apply(['X', 'Y']);
|
|
Expect.equals('X-Y-C', result.reflectee);
|
|
result = cm.apply(['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply([]), 'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X', 'Y', 'Z', 'W']), 'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
cm = reflect(d) as ClosureMirror;
|
|
result = cm.apply([]);
|
|
Expect.equals('null-B-C', result.reflectee);
|
|
result = cm.apply(['X']);
|
|
Expect.equals('X-B-C', result.reflectee);
|
|
result = cm.apply(['X', 'Y']);
|
|
Expect.equals('X-Y-C', result.reflectee);
|
|
result = cm.apply(['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X', 'Y', 'Z', 'W']), 'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
|
|
cm = reflect(e) as ClosureMirror;
|
|
result = cm.apply(['X', 'Y', 'Z']);
|
|
Expect.equals('X-Y-Z', result.reflectee);
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X']), 'Insufficient positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X', 'Y', 'Z', 'W']), 'Extra positional arguments');
|
|
Expect.throwsNoSuchMethodError(
|
|
() => cm.apply(['X'], {const Symbol('undef'): 'Y'}),
|
|
'Unmatched named argument');
|
|
}
|
|
|
|
main() {
|
|
isDart2js = true; //# 01: ok
|
|
|
|
testSyncInvoke(reflect(new C())); // InstanceMirror
|
|
|
|
if (isDart2js) return;
|
|
|
|
testSyncInvoke(reflectClass(D)); // ClassMirror
|
|
LibraryMirror lib = reflectClass(D).owner as LibraryMirror;
|
|
testSyncInvoke(lib); // LibraryMirror
|
|
|
|
testSyncNewInstance();
|
|
|
|
testSyncApply();
|
|
}
|