blob: 5066731731fa4f896b194c3615b10047302bb264 [file] [log] [blame]
// Copyright (c) 2014, 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.
// Test to make sure that all members of reflectable classes are reflectable,
// including ones inherited from super classes and the overriding members
// of subclasses.
@MirrorsUsed(metaTargets: "Meta")
import 'dart:mirrors';
import 'package:expect/expect.dart';
class Meta {
const Meta();
}
class Super {
var inheritedField = 1;
var overriddenField = 1;
inheritedMethod(x) => x;
overriddenMethod(x) => x;
}
@Meta()
class Reflected extends Super {
var overriddenField = 2;
var subclassedField = 2;
overriddenMethod(x) => 2 * x;
subclassedMethod(x) => 2 * x;
}
class Subclass extends Reflected {
var subclassedField = 4;
var subclassField = 4;
subclassedMethod(x) => 4 * x;
subclassMethod(x) => 4 * x;
}
tryCall(object, symbol, value, expected) {
var mirror = reflect(object);
var result = mirror.invoke(symbol, [value]).reflectee;
Expect.equals(result, expected);
}
tryField(object, symbol, expected) {
var mirror = reflect(object);
var result = mirror.getField(symbol).reflectee;
Expect.equals(result, expected);
}
main() {
var objects = [new Reflected(), new Subclass()];
// Make sure the subclass methods are alive.
objects[1].subclassField = 9;
print(objects[1].subclassMethod(9));
var index = 1;
if (new DateTime.now().year == 1984) {
index = 0;
}
// Reflect an instance of [Subclass], which should only expose the interface
// of [Reflected].
var subclass = objects[index];
tryCall(subclass, #inheritedMethod, 11, 11);
tryCall(subclass, #overriddenMethod, 11, 22);
tryCall(subclass, #subclassedMethod, 11, 44);
tryField(subclass, #inheritedField, 1);
tryField(subclass, #overriddenField, 2);
tryField(subclass, #subclassedField, 4);
Expect.throws(() => reflect(subclass).invoke(#subclassMethod, [11]));
Expect.throws(() => reflect(subclass).getField(#subclassField));
}