Files
sdk/tests/lib/mirrors/mirrors_test.dart
T
Jacob Richman 2dcd56ef43 Format all tests.
There are far too many files here to review everyone carefully.
Spot checking most of the diffs look good as test code is generally written
with less care than application code so lots of ugly formatting get through.
If people notice files where the automated formatting bothers them feel free
to comment indicating file names and I'll move spaces within comments to make
the formatting cleaner and use comments to force block formatting as I have
done for other case where formatting looked bad.

BUG=
R=efortuna@google.com

Review-Url: https://codereview.chromium.org/2771453003 .
2017-04-17 14:53:02 -07:00

248 lines
8.2 KiB
Dart

// Copyright (c) 2011, 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 MirrorsTest;
import 'dart:mirrors';
import '../../light_unittest.dart';
bool isDart2js = false; // TODO(ahe): Remove this field.
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) => new Class.withInitialValue(y * 3);
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;
static s(a, b, c) => {"a": a, "b": b, "c": c};
static _t(a, b) => a + b;
}
typedef Typedef();
testInvoke(mirrors) {
var instance = new Class();
var instMirror = reflect(instance);
expect(instMirror.invoke(#m, ['A', 'B', instance]).reflectee,
equals({"a": 'A', "b": 'B', "c": instance}));
expect(instMirror.invoke(#notDefined, []).reflectee, equals("DNU"));
expect(instMirror.invoke(#m, []).reflectee, equals("DNU")); // Wrong arity.
var classMirror = instMirror.type;
expect(classMirror.invoke(#s, ['A', 'B', instance]).reflectee,
equals({"a": 'A', "b": 'B', "c": instance}));
expect(() => classMirror.invoke(#notDefined, []).reflectee, throws);
expect(() => classMirror.invoke(#s, []).reflectee, throws); // Wrong arity.
var libMirror = classMirror.owner;
expect(libMirror.invoke(#u, ['A', 'B', instance]).reflectee,
equals({"a": 'A', "b": 'B', "c": instance}));
expect(() => libMirror.invoke(#notDefined, []).reflectee, throws);
expect(() => libMirror.invoke(#u, []).reflectee, throws); // Wrong arity.
}
/// In dart2js, lists, numbers, and other objects are treated special
/// and their methods are invoked through a techique called interceptors.
testIntercepted(mirrors) {
var instance = 1;
var instMirror = reflect(instance);
expect(instMirror.invoke(#toString, []).reflectee, equals('1'));
instance = [];
instMirror = reflect(instance);
instMirror.setField(#length, 44);
var resultMirror = instMirror.getField(#length);
expect(resultMirror.reflectee, equals(44));
expect(instance.length, equals(44));
expect(
instMirror.invoke(#toString, []).reflectee,
equals('[null, null, null, null, null, null, null, null, null, null,'
' null, null, null, null, null, null, null, null, null, null,'
' null, null, null, null, null, null, null, null, null, null,'
' null, null, null, null, null, null, null, null, null, null,'
' null, null, null, null]'));
}
testFieldAccess(mirrors) {
var instance = new Class();
var libMirror = mirrors.findLibrary(#MirrorsTest);
var classMirror = libMirror.declarations[#Class];
var instMirror = reflect(instance);
var fieldMirror = classMirror.declarations[#field];
var future;
expect(fieldMirror is VariableMirror, isTrue);
expect(fieldMirror.type, equals(mirrors.dynamicType));
libMirror.setField(#topLevelField, [91]);
expect(libMirror.getField(#topLevelField).reflectee, equals([91]));
expect(topLevelField, equals([91]));
}
testClosureMirrors(mirrors) {
// TODO(ahe): Test optional parameters (named or not).
var closure = (x, y, z) {
return x + y + z;
};
var mirror = reflect(closure);
expect(mirror is ClosureMirror, equals(true));
var funcMirror = mirror.function;
expect(funcMirror is MethodMirror, equals(true));
expect(funcMirror.parameters.length, equals(3));
expect(mirror.apply([7, 8, 9]).reflectee, equals(24));
}
testInvokeConstructor(mirrors) {
var classMirror = reflectClass(Class);
var instanceMirror = classMirror.newInstance(const Symbol(''), []);
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals("default value"));
instanceMirror = classMirror.newInstance(#withInitialValue, [45]);
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals(45));
instanceMirror = classMirror.newInstance(#generative, [7]);
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals(7));
instanceMirror = classMirror.newInstance(#redirecting, [8]);
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals(16));
instanceMirror = classMirror.newInstance(#faktory, [9]);
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals(27));
instanceMirror = classMirror.newInstance(#redirectingFactory, [10]);
expect(instanceMirror.reflectee is Class, equals(true));
expect(instanceMirror.reflectee.field, equals(30));
}
testReflectClass(mirrors) {
var classMirror = reflectClass(Class);
expect(classMirror is ClassMirror, equals(true));
var symbolClassMirror = reflectClass(Symbol);
var symbolMirror =
symbolClassMirror.newInstance(const Symbol(''), ['withInitialValue']);
var objectMirror = classMirror.newInstance(symbolMirror.reflectee, [1234]);
expect(objectMirror.reflectee is Class, equals(true));
expect(objectMirror.reflectee.field, equals(1234));
}
testNames(mirrors) {
var libMirror = mirrors.findLibrary(#MirrorsTest);
var classMirror = libMirror.declarations[#Class];
var typedefMirror = libMirror.declarations[#Typedef];
var methodMirror = libMirror.declarations[#testNames];
var variableMirror = classMirror.declarations[#field];
expect(libMirror.simpleName, equals(#MirrorsTest));
expect(libMirror.qualifiedName, equals(#MirrorsTest));
expect(classMirror.simpleName, equals(#Class));
expect(classMirror.qualifiedName, equals(#MirrorsTest.Class));
TypeVariableMirror typeVariable = classMirror.typeVariables.single;
expect(typeVariable.simpleName, equals(#T));
expect(
typeVariable.qualifiedName, equals(const Symbol('MirrorsTest.Class.T')));
if (!isDart2js) {
// TODO(ahe): Implement this in dart2js.
expect(typedefMirror.simpleName, equals(#Typedef));
expect(typedefMirror.qualifiedName,
equals(const Symbol('MirrorsTest.Typedef')));
var typedefMirrorDeNovo = reflectType(Typedef);
expect(typedefMirrorDeNovo.simpleName, equals(#Typedef));
expect(typedefMirrorDeNovo.qualifiedName,
equals(const Symbol('MirrorsTest.Typedef')));
}
expect(methodMirror.simpleName, equals(#testNames));
expect(methodMirror.qualifiedName,
equals(const Symbol('MirrorsTest.testNames')));
expect(variableMirror.simpleName, equals(#field));
expect(variableMirror.qualifiedName,
equals(const Symbol('MirrorsTest.Class.field')));
}
testLibraryUri(var value, bool check(Uri)) {
var valueMirror = reflect(value);
ClassMirror valueClass = valueMirror.type;
LibraryMirror valueLibrary = valueClass.owner;
Uri uri = valueLibrary.uri;
if (uri.scheme != "https" ||
uri.host != "dartlang.org" ||
uri.path != "/dart2js-stripped-uri") {
expect(check(uri), isTrue);
}
}
main() {
var mirrors = currentMirrorSystem();
test("Test reflective method invocation", () {
testInvoke(mirrors);
});
test('Test intercepted objects', () {
testIntercepted(mirrors);
});
test("Test field access", () {
testFieldAccess(mirrors);
});
test("Test closure mirrors", () {
testClosureMirrors(mirrors);
});
test("Test invoke constructor", () {
testInvokeConstructor(mirrors);
});
test("Test current library uri", () {
testLibraryUri(
new Class(),
// TODO(floitsch): change this to "/mirrors_test.dart" when
// dart2js_mirrors_test.dart has been removed.
(Uri uri) => uri.path.endsWith('mirrors_test.dart'));
});
test("Test dart library uri", () {
testLibraryUri("test", (Uri uri) {
if (uri == Uri.parse('dart:core')) return true;
// TODO(floitsch): do we want to fake the interceptors to
// be in dart:core?
return (uri == Uri.parse('dart:_interceptors'));
});
});
test("Test simple and qualifiedName", () {
testNames(mirrors);
});
test("Test reflect type", () {
testReflectClass(mirrors);
});
}