Index: test/codegen/lib/mirrors/parameter_test.dart |
diff --git a/test/codegen/lib/mirrors/parameter_test.dart b/test/codegen/lib/mirrors/parameter_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4eb6ad596432523ba8d400ee2f55e28872861e2b |
--- /dev/null |
+++ b/test/codegen/lib/mirrors/parameter_test.dart |
@@ -0,0 +1,183 @@ |
+// 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. |
+ |
+// 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; |
+ |
+@MirrorsUsed(targets: const ['test.parameter_test', 'dart.core.int'], override: '*') |
+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]) {} |
+ garply({int y}) {} |
+ 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]; |
+ 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]; |
+ 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]; |
+ 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]; |
+ 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]; |
+ 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]; |
+ 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]; |
+ 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]; |
+ expect('Method(s(x) in s(B), getter)', xGetter); |
+ expect('[]', xGetter.parameters); |
+ |
+ MethodMirror xSetter = cm.declarations[const Symbol('x=')]; |
+ 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]; |
+ expect('Method(s(grault) in s(B))', grault); |
+ expect('[Parameter(s(x) in s(grault), optional,' |
+ ' type = Class(s(int) in s(dart.core), top-level))]', |
+ grault.parameters); |
+ expect('Instance(value = <null>)', grault.parameters[0].defaultValue); |
+ |
+ MethodMirror garply = cm.declarations[#garply]; |
+ expect('Method(s(garply) in s(B))', garply); |
+ expect('[Parameter(s(y) in s(garply), optional, named,' |
+ ' type = Class(s(int) in s(dart.core), top-level))]', |
+ garply.parameters); |
+ expect('Instance(value = <null>)', garply.parameters[0].defaultValue); |
+ |
+ MethodMirror waldo = cm.declarations[#waldo]; |
+ 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]; |
+ expect('Method(s(foo) in s(C))', fooInC); |
+ expect('[Parameter(s(a) in s(foo),' |
+ ' type = Class(s(int) in s(dart.core), top-level)), ' |
+ 'Parameter(s(b) in s(foo),' |
+ ' type = TypeVariable(s(S) in s(C),' |
+ ' upperBound = Class(s(int) in s(dart.core), top-level)))]', |
+ fooInC.parameters); |
+ |
+ MethodMirror barInC = cm.declarations[#bar]; |
+ expect('Method(s(bar) in s(C))', barInC); |
+ expect('[Parameter(s(a) in s(bar),' |
+ ' type = TypeVariable(s(S) in s(C),' |
+ ' upperBound = Class(s(int) in s(dart.core), top-level))), ' |
+ 'Parameter(s(b) in s(bar),' |
+ ' type = TypeVariable(s(T) in s(C),' |
+ ' upperBound = Class(s(Object) in s(dart.core), top-level))), ' |
+ 'Parameter(s(c) in s(bar),' |
+ ' type = Class(s(num) in s(dart.core), top-level))]', |
+ barInC.parameters); |
+} |