blob: fe1b77aa08a166881d341bdd177e72ac50846025 [file] [log] [blame]
// 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.
// @dart = 2.9
// This tests uses the multi-test "ok" feature:
// none: Desired behaviour, passing on the VM.
// 01: Trimmed version for dart2js.
//
// TODO(rmacnak,ahe): Remove multi-test when VM and dart2js are on par.
/** Test of [ParameterMirror]. */
library test.parameter_test;
import 'dart:mirrors';
import 'package:expect/expect.dart';
import 'stringify.dart';
class B {
B();
B.foo(int x);
B.bar(int z, x);
// TODO(6490): Currently only supported by the VM.
B.baz(final int x, int y, final int z);
B.qux(int x, [int y = 3 + 1]);
B.quux(int x, {String str: "foo"});
B.corge({int x: 3 * 17, String str: "bar"});
var _x;
get x => _x;
set x(final value) {
_x = value;
}
grault([int x = 0]) {}
garply({int y = 0}) {}
waldo(int z) {}
}
class C<S extends int, T> {
// TODO(6490): Currently only supported by the VM.
foo(int a, S b) => b;
bar(S a, T b, num c) {}
}
main() {
ClassMirror cm = reflectClass(B);
var constructors = new Map<Symbol, MethodMirror>();
cm.declarations.forEach((k, v) {
if (v is MethodMirror && v.isConstructor) constructors[k] = v;
});
List<Symbol> constructorKeys = [
#B,
#B.bar,
#B.baz,
#B.foo,
#B.quux,
#B.qux,
#B.corge
];
Expect.setEquals(constructorKeys, constructors.keys);
MethodMirror unnamedConstructor = constructors[#B] as MethodMirror;
expect('Method(s(B) in s(B), constructor)', unnamedConstructor);
expect('[]', unnamedConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
unnamedConstructor.returnType);
MethodMirror fooConstructor = constructors[#B.foo] as MethodMirror;
expect('Method(s(B.foo) in s(B), constructor)', fooConstructor);
expect(
'[Parameter(s(x) in s(B.foo),'
' type = Class(s(int) in s(dart.core), top-level))]',
fooConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
fooConstructor.returnType);
MethodMirror barConstructor = constructors[#B.bar] as MethodMirror;
expect('Method(s(B.bar) in s(B), constructor)', barConstructor);
expect(
'[Parameter(s(z) in s(B.bar),'
' type = Class(s(int) in s(dart.core), top-level)), '
'Parameter(s(x) in s(B.bar),'
' type = Type(s(dynamic), top-level))]',
barConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
barConstructor.returnType);
// dart2js stops testing here.
return; // //# 01: ok
MethodMirror bazConstructor = constructors[#B.baz] as MethodMirror;
expect('Method(s(B.baz) in s(B), constructor)', bazConstructor);
expect(
'[Parameter(s(x) in s(B.baz), final,'
' type = Class(s(int) in s(dart.core), top-level)), '
'Parameter(s(y) in s(B.baz),'
' type = Class(s(int) in s(dart.core), top-level)), '
'Parameter(s(z) in s(B.baz), final,'
' type = Class(s(int) in s(dart.core), top-level))]',
bazConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
bazConstructor.returnType);
MethodMirror quxConstructor = constructors[#B.qux] as MethodMirror;
expect('Method(s(B.qux) in s(B), constructor)', quxConstructor);
expect(
'[Parameter(s(x) in s(B.qux),'
' type = Class(s(int) in s(dart.core), top-level)), '
'Parameter(s(y) in s(B.qux), optional,'
' value = Instance(value = 4),'
' type = Class(s(int) in s(dart.core), top-level))]',
quxConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
quxConstructor.returnType);
MethodMirror quuxConstructor = constructors[#B.quux] as MethodMirror;
expect('Method(s(B.quux) in s(B), constructor)', quuxConstructor);
expect(
'[Parameter(s(x) in s(B.quux),'
' type = Class(s(int) in s(dart.core), top-level)), '
'Parameter(s(str) in s(B.quux), optional, named,'
' value = Instance(value = foo),'
' type = Class(s(String) in s(dart.core), top-level))]',
quuxConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
quuxConstructor.returnType);
MethodMirror corgeConstructor = constructors[#B.corge] as MethodMirror;
expect('Method(s(B.corge) in s(B), constructor)', corgeConstructor);
expect(
'[Parameter(s(x) in s(B.corge), optional, named,'
' value = Instance(value = 51),'
' type = Class(s(int) in s(dart.core), top-level)), '
'Parameter(s(str) in s(B.corge), optional, named,'
' value = Instance(value = bar),'
' type = Class(s(String) in s(dart.core), top-level))]',
corgeConstructor.parameters);
expect('Class(s(B) in s(test.parameter_test), top-level)',
corgeConstructor.returnType);
MethodMirror xGetter = cm.declarations[#x] as MethodMirror;
expect('Method(s(x) in s(B), getter)', xGetter);
expect('[]', xGetter.parameters);
MethodMirror xSetter = cm.declarations[const Symbol('x=')] as MethodMirror;
expect('Method(s(x=) in s(B), setter)', xSetter);
expect(
'[Parameter(s(value) in s(x=), final,'
' type = Type(s(dynamic), top-level))]',
xSetter.parameters);
MethodMirror grault = cm.declarations[#grault] as MethodMirror;
expect('Method(s(grault) in s(B))', grault);
expect(
'[Parameter(s(x) in s(grault), optional, value = Instance(value = 0),'
' type = Class(s(int) in s(dart.core), top-level))]',
grault.parameters);
expect('Instance(value = 0)', grault.parameters[0].defaultValue);
MethodMirror garply = cm.declarations[#garply] as MethodMirror;
expect('Method(s(garply) in s(B))', garply);
expect(
'[Parameter(s(y) in s(garply), optional, named, value = Instance(value = 0),'
' type = Class(s(int) in s(dart.core), top-level))]',
garply.parameters);
expect('Instance(value = 0)', garply.parameters[0].defaultValue);
MethodMirror waldo = cm.declarations[#waldo] as MethodMirror;
expect('Method(s(waldo) in s(B))', waldo);
expect(
'[Parameter(s(z) in s(waldo),'
' type = Class(s(int) in s(dart.core), top-level))]',
waldo.parameters);
expect('<null>', waldo.parameters[0].defaultValue);
cm = reflectClass(C);
MethodMirror fooInC = cm.declarations[#foo] as MethodMirror;
expect('Method(s(foo) in s(C))', fooInC);
// Names of type variables are not preserved after type canonicalization
// and are therefore not compared to expected names.
MethodMirror barInC = cm.declarations[#bar] as MethodMirror;
expect('Method(s(bar) in s(C))', barInC);
}