Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(324)

Unified Diff: tests/lib/mirrors/mirrors_test.dart

Issue 18463003: Implement the invoke methods (invoke, getField, setField, newInstance, apply) as internal natives. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« runtime/lib/mirrors.cc ('K') | « runtime/vm/symbols.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tests/lib/mirrors/mirrors_test.dart
===================================================================
--- tests/lib/mirrors/mirrors_test.dart (revision 25019)
+++ tests/lib/mirrors/mirrors_test.dart (working copy)
@@ -2,31 +2,72 @@
// 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.
-// TODO(rmacnak): Move the existing mirror tests here (a place for
-// cross-implementation tests).
-
library MirrorsTest;
import "dart:mirrors";
import "../../../pkg/unittest/lib/unittest.dart";
var topLevelField;
+u(a, b, c) => {"a": a, "b": b, "c": c};
+_v(a, b) => a + b;
class Class<T> {
Class() { this.field = "default value"; }
Class.withInitialValue(this.field);
var field;
+
+ Class.generative(this.field);
+ Class.redirecting(y) : this.generative(y*2);
+ factory Class.faktory(y) => "FakeClass $y";
+ factory Class.redirectingFactory(y) = Class.faktory;
+
+ m(a, b, c) => {"a": a, "b": b, "c": c};
+ _n(a, b) => a + b;
+ noSuchMethod(invocation) => "DNU";
+
static var staticField;
- m(a, b, c) => {"a": a, "b": b, "c": c};
+ static s(a, b, c) => {"a": a, "b": b, "c": c};
+ static _t(a, b) => a + b;
}
typedef Typedef();
-testInvoke(mirrors) {
+testInvoke(mirrors, isDart2js) {
var instance = new Class();
var instMirror = reflect(instance);
expect(instMirror.invoke(const Symbol("m"),['A', 'B', instance]).reflectee,
equals({"a": 'A', "b":'B', "c": instance}));
+ expect(instMirror.invoke(const Symbol("notDefined"), []).reflectee,
ahe 2013/07/16 10:40:47 It would be great if you could avoid making furthe
+ equals("DNU"));
+ expect(instMirror.invoke(const Symbol("m"), []).reflectee,
+ equals("DNU")); // Wrong arity.
+ // TODO(rmacnak): Implement access to private members.
+ // expect(instMirror.invoke(const Symbol("_n"), [3, 4]).reflectee,
+ // equals(7));
+
+ if (isDart2js) return;
+
+ var classMirror = instMirror.type;
+ expect(classMirror.invoke(const Symbol("s"),['A', 'B', instance]).reflectee,
+ equals({"a": 'A', "b":'B', "c": instance}));
+ expect(() => classMirror.invoke(const Symbol("notDefined"), []).reflectee,
+ throws);
+ expect(() => classMirror.invoke(const Symbol("s"), []).reflectee,
+ throws); // Wrong arity.
+ // TODO(rmacnak): Implement access to private members.
+ // expect(classMirror.invoke(const Symbol("_t"), [3, 4]).reflectee,
+ // equals(7));
+
+ var libMirror = classMirror.owner;
+ expect(libMirror.invoke(const Symbol("u"),['A', 'B', instance]).reflectee,
+ equals({"a": 'A', "b":'B', "c": instance}));
+ expect(() => libMirror.invoke(const Symbol("notDefined"), []).reflectee,
+ throws);
+ expect(() => libMirror.invoke(const Symbol("u"), []).reflectee,
+ throws); // Wrong arity.
+ // NB: This works on the VM but fails at compile-time on dart2js.
+ // expect(libMirror.invoke(const Symbol("_v"), [3, 4]).reflectee,
+ // equals(7));
}
testInstanceFieldAccess(mirrors) {
@@ -122,7 +163,7 @@
}));
}
-testInvokeConstructor(mirrors) {
+testInvokeConstructor(mirrors, isDart2js) {
var classMirror = reflectClass(Class);
var instanceMirror = classMirror.newInstance(const Symbol(''),[]);
@@ -134,6 +175,29 @@
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals(45));
+
+ instanceMirror = classMirror.newInstance(const Symbol('generative'),
+ [7]);
+ expect(instanceMirror.reflectee is Class, equals(true));
+ expect(instanceMirror.reflectee.field, equals(7));
+
+ instanceMirror = classMirror.newInstance(const Symbol('redirecting'),
+ [8]);
+ expect(instanceMirror.reflectee is Class, equals(true));
+ expect(instanceMirror.reflectee.field, equals(16));
+
+
+ if (!isDart2js) {
+ instanceMirror = classMirror.newInstance(const Symbol('faktory'),
+ [9]);
+ expect(instanceMirror.reflectee, equals('FakeClass 9'));
+
+ instanceMirror = classMirror.newInstance(const Symbol('redirectingFactory'),
+ [10]);
+ expect(instanceMirror.reflectee, equals('FakeClass 10'));
+ }
+
+
var future = classMirror.newInstanceAsync(const Symbol(''), []);
future.then(expectAsync1((resultMirror) {
var instance = resultMirror.reflectee;
@@ -202,13 +266,15 @@
mainWithArgument({bool isDart2js: false, bool isMinified: false}) {
var mirrors = currentMirrorSystem();
- test("Test reflective method invocation", () { testInvoke(mirrors); });
+ test("Test reflective method invocation", () { testInvoke(mirrors,
+ isDart2js); });
test("Test instance field access", () { testInstanceFieldAccess(mirrors); });
test('Test intercepted objects', () { testIntercepted(mirrors); });
if (!isMinified) // TODO(ahe): Remove this line.
test("Test field access", () { testFieldAccess(mirrors); });
test("Test closure mirrors", () { testClosureMirrors(mirrors); });
- test("Test invoke constructor", () { testInvokeConstructor(mirrors); });
+ test("Test invoke constructor", () { testInvokeConstructor(mirrors,
+ isDart2js); });
test("Test current library uri", () {
testLibraryUri(new Class(),
(Uri uri) => uri.path.endsWith('/mirrors_test.dart'));
« runtime/lib/mirrors.cc ('K') | « runtime/vm/symbols.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698