07b9df22ac
No behavioral changes, just getting rid of a lot of redundant closures and helper functions. Change-Id: I55c52c2cc9e5505bb64203c31aad8d76847f8eeb Reviewed-on: https://dart-review.googlesource.com/14320 Commit-Queue: Bob Nystrom <rnystrom@google.com> Reviewed-by: William Hesse <whesse@google.com>
143 lines
4.5 KiB
Dart
143 lines
4.5 KiB
Dart
// 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.
|
|
|
|
library test.reflect_model_test;
|
|
|
|
import 'dart:mirrors';
|
|
|
|
import 'package:expect/expect.dart';
|
|
|
|
import 'model.dart';
|
|
import 'stringify.dart';
|
|
|
|
variablesOf(ClassMirror cm) {
|
|
var result = new Map();
|
|
cm.declarations.forEach((k, v) {
|
|
if (v is VariableMirror) result[k] = v;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
gettersOf(ClassMirror cm) {
|
|
var result = new Map();
|
|
cm.declarations.forEach((k, v) {
|
|
if (v is MethodMirror && v.isGetter) result[k] = v;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
settersOf(ClassMirror cm) {
|
|
var result = new Map();
|
|
cm.declarations.forEach((k, v) {
|
|
if (v is MethodMirror && v.isSetter) result[k] = v;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
methodsOf(ClassMirror cm) {
|
|
var result = new Map();
|
|
cm.declarations.forEach((k, v) {
|
|
if (v is MethodMirror && v.isRegularMethod) result[k] = v;
|
|
});
|
|
return result;
|
|
}
|
|
|
|
main() {
|
|
var unnamed = new Symbol('');
|
|
var field = new Symbol('field');
|
|
var instanceMethod = new Symbol('instanceMethod');
|
|
var accessor = new Symbol('accessor');
|
|
var aMethod = new Symbol('aMethod');
|
|
var bMethod = new Symbol('bMethod');
|
|
var cMethod = new Symbol('cMethod');
|
|
|
|
var aClass = reflectClass(A);
|
|
var bClass = reflectClass(B);
|
|
var cClass = reflectClass(C);
|
|
var a = aClass.newInstance(unnamed, []);
|
|
var b = bClass.newInstance(unnamed, []);
|
|
var c = cClass.newInstance(unnamed, []);
|
|
|
|
expect('{field: Variable(s(field) in s(A))}', variablesOf(aClass));
|
|
expect('{}', variablesOf(bClass));
|
|
expect('{}', variablesOf(cClass));
|
|
|
|
Expect.isNull(a.getField(field).reflectee);
|
|
Expect.equals('B:get field', b.getField(field).reflectee);
|
|
Expect.equals('B:get field', c.getField(field).reflectee);
|
|
|
|
Expect.equals(42, a.setField(field, 42).reflectee);
|
|
Expect.equals(87, b.setField(field, 87).reflectee);
|
|
Expect.equals(89, c.setField(field, 89).reflectee);
|
|
|
|
Expect.equals(42, a.getField(field).reflectee);
|
|
Expect.equals('B:get field', b.getField(field).reflectee);
|
|
Expect.equals('B:get field', c.getField(field).reflectee);
|
|
Expect.equals(89, fieldC);
|
|
|
|
expect(
|
|
'{accessor: Method(s(accessor) in s(A), getter)'
|
|
'}',
|
|
gettersOf(aClass));
|
|
expect(
|
|
'{accessor: Method(s(accessor) in s(B), getter)'
|
|
', field: Method(s(field) in s(B), getter)}',
|
|
gettersOf(bClass));
|
|
expect('{accessor: Method(s(accessor) in s(C), getter)}', gettersOf(cClass));
|
|
|
|
expect(
|
|
'{accessor=: Method(s(accessor=) in s(A), setter)'
|
|
'}',
|
|
settersOf(aClass));
|
|
expect(
|
|
'{accessor=: Method(s(accessor=) in s(B), setter)}', settersOf(bClass));
|
|
expect(
|
|
'{accessor=: Method(s(accessor=) in s(C), setter)'
|
|
', field=: Method(s(field=) in s(C), setter)}',
|
|
settersOf(cClass));
|
|
|
|
Expect.equals('A:instanceMethod(7)', a.invoke(instanceMethod, [7]).reflectee);
|
|
Expect.equals('B:instanceMethod(9)', b.invoke(instanceMethod, [9]).reflectee);
|
|
Expect.equals(
|
|
'C:instanceMethod(13)', c.invoke(instanceMethod, [13]).reflectee);
|
|
|
|
expect(
|
|
'{aMethod: Method(s(aMethod) in s(A))'
|
|
', instanceMethod: Method(s(instanceMethod) in s(A))}',
|
|
methodsOf(aClass));
|
|
|
|
expect(
|
|
'{bMethod: Method(s(bMethod) in s(B))'
|
|
', instanceMethod: Method(s(instanceMethod) in s(B))}',
|
|
methodsOf(bClass));
|
|
expect(
|
|
'{cMethod: Method(s(cMethod) in s(C))'
|
|
', instanceMethod: Method(s(instanceMethod) in s(C))}',
|
|
methodsOf(cClass));
|
|
|
|
Expect.equals('A:get accessor', a.getField(accessor).reflectee);
|
|
Expect.equals('B:get accessor', b.getField(accessor).reflectee);
|
|
Expect.equals('C:get accessor', c.getField(accessor).reflectee);
|
|
|
|
Expect.equals('foo', a.setField(accessor, 'foo').reflectee);
|
|
Expect.equals('bar', b.setField(accessor, 'bar').reflectee);
|
|
Expect.equals('baz', c.setField(accessor, 'baz').reflectee);
|
|
|
|
Expect.equals('foo', accessorA);
|
|
Expect.equals('bar', accessorB);
|
|
Expect.equals('baz', accessorC);
|
|
|
|
Expect.equals('aMethod', a.invoke(aMethod, []).reflectee);
|
|
Expect.equals('aMethod', b.invoke(aMethod, []).reflectee);
|
|
Expect.equals('aMethod', c.invoke(aMethod, []).reflectee);
|
|
|
|
Expect.throwsNoSuchMethodError(() => a.invoke(bMethod, []));
|
|
Expect.equals('bMethod', b.invoke(bMethod, []).reflectee);
|
|
Expect.equals('bMethod', c.invoke(bMethod, []).reflectee);
|
|
|
|
Expect.throwsNoSuchMethodError(() => a.invoke(cMethod, []));
|
|
Expect.throwsNoSuchMethodError(() => b.invoke(cMethod, []));
|
|
Expect.equals('cMethod', c.invoke(cMethod, []).reflectee);
|
|
}
|