| Index: test_reflectable/test/meta_reflector_test.dart
|
| diff --git a/test_reflectable/test/mixin_test.dart b/test_reflectable/test/meta_reflector_test.dart
|
| similarity index 57%
|
| copy from test_reflectable/test/mixin_test.dart
|
| copy to test_reflectable/test/meta_reflector_test.dart
|
| index 3f2041519312a1add8569789b607c3aa63c82313..1590a15b7412b91ee12bc365d2c9be98944e65ba 100644
|
| --- a/test_reflectable/test/mixin_test.dart
|
| +++ b/test_reflectable/test/meta_reflector_test.dart
|
| @@ -2,38 +2,78 @@
|
| // source code is governed by a BSD-style license that can be found in
|
| // the LICENSE file.
|
|
|
| -library test_reflectable.test.mixin_test;
|
| +/// File being transformed by the reflectable transformer.
|
| +/// Creates a `MetaReflector` which may be used to reflect on the set of
|
| +/// reflectors themselves.
|
| +library test_reflectable.test.meta_reflector_test;
|
|
|
| +@GlobalQuantifyCapability(
|
| + r"^reflectable.reflectable.Reflectable$", const MetaReflector())
|
| import "package:reflectable/reflectable.dart";
|
| import "package:unittest/unittest.dart";
|
|
|
| -class Reflector extends Reflectable {
|
| +abstract class AllReflectorsCapable implements Reflectable {
|
| + Reflectable get self;
|
| + Set<String> get scopes;
|
| +}
|
| +
|
| +class MetaReflector extends Reflectable {
|
| + const MetaReflector()
|
| + : super(subtypeQuantifyCapability, newInstanceCapability);
|
| + Set<Reflectable> get allReflectors {
|
| + Set<Reflectable> result = new Set<Reflectable>();
|
| + annotatedClasses.forEach((ClassMirror classMirror) {
|
| + if (classMirror.isAbstract) return;
|
| + Reflectable reflector = classMirror.newInstance("", []);
|
| + if (reflector is AllReflectorsCapable) {
|
| + result.add(reflector.self);
|
| + }
|
| + });
|
| + return result;
|
| + }
|
| +}
|
| +
|
| +Set<String> setOf(String s) => new Set<String>.from(<String>[s]);
|
| +
|
| +class Reflector extends Reflectable implements AllReflectorsCapable {
|
| const Reflector()
|
| : super(invokingCapability, declarationsCapability, libraryCapability);
|
| + Reflectable get self => const Reflector();
|
| + Set<String> get scopes => setOf("polymer");
|
| }
|
|
|
| -// Note the class `A` is not annotated by this.
|
| -class Reflector2 extends Reflectable {
|
| +class Reflector2 extends Reflectable implements AllReflectorsCapable {
|
| const Reflector2()
|
| : super(invokingCapability, metadataCapability, libraryCapability);
|
| + Reflectable get self => const Reflector2();
|
| + Set<String> get scopes => setOf("observe");
|
| }
|
|
|
| -class ReflectorUpwardsClosed extends Reflectable {
|
| +class ReflectorUpwardsClosed extends Reflectable
|
| + implements AllReflectorsCapable {
|
| const ReflectorUpwardsClosed()
|
| : super(superclassQuantifyCapability, invokingCapability,
|
| declarationsCapability, typeRelationsCapability);
|
| + Reflectable get self => const ReflectorUpwardsClosed();
|
| + Set<String> get scopes => setOf("polymer")..add("observe");
|
| }
|
|
|
| -class ReflectorUpwardsClosedToA extends Reflectable {
|
| +class ReflectorUpwardsClosedToA extends Reflectable
|
| + implements AllReflectorsCapable {
|
| const ReflectorUpwardsClosedToA()
|
| : super(const SuperclassQuantifyCapability(A), invokingCapability,
|
| declarationsCapability);
|
| + Reflectable get self => const ReflectorUpwardsClosedToA();
|
| + Set<String> get scopes => new Set<String>();
|
| }
|
|
|
| -class ReflectorUpwardsClosedUntilA extends Reflectable {
|
| +class ReflectorUpwardsClosedUntilA extends Reflectable
|
| + implements AllReflectorsCapable {
|
| const ReflectorUpwardsClosedUntilA()
|
| : super(const SuperclassQuantifyCapability(A, excludeUpperBound: true),
|
| invokingCapability, declarationsCapability);
|
| + Reflectable get self => const ReflectorUpwardsClosedUntilA();
|
| + Set<String> get scopes => new Set<String>();
|
| }
|
|
|
| @Reflector()
|
| @@ -118,10 +158,37 @@ Matcher throwsANoSuchCapabilityException =
|
| throwsA(const isInstanceOf<NoSuchCapabilityError>());
|
|
|
| main() {
|
| - testReflector(const Reflector(), "each is annotated");
|
| - testReflector(const ReflectorUpwardsClosed(), "upwards closed");
|
| - test("Mixin, superclasses not included", () {
|
| - var reflector2 = const Reflector2();
|
| + Set<Reflectable> allReflectors = const MetaReflector().allReflectors;
|
| +
|
| + test("MetaReflector, set of reflectors", () {
|
| + expect(
|
| + allReflectors,
|
| + [
|
| + const Reflector(),
|
| + const Reflector2(),
|
| + const ReflectorUpwardsClosed(),
|
| + const ReflectorUpwardsClosedToA(),
|
| + const ReflectorUpwardsClosedUntilA()
|
| + ].toSet());
|
| + expect(
|
| + allReflectors.where((AllReflectorsCapable reflector) =>
|
| + reflector.scopes.contains("polymer")),
|
| + [const Reflector(), const ReflectorUpwardsClosed()].toSet());
|
| + expect(
|
| + allReflectors.where((AllReflectorsCapable reflector) =>
|
| + reflector.scopes.contains("observe")),
|
| + [const Reflector2(), const ReflectorUpwardsClosed()].toSet());
|
| + });
|
| +
|
| + allReflectors
|
| + .where((AllReflectorsCapable reflector) =>
|
| + reflector.scopes.contains("polymer"))
|
| + .forEach(
|
| + (Reflectable reflector) => testReflector(reflector, "$reflector"));
|
| +
|
| + test("MetaReflector, select by name", () {
|
| + var reflector2 = allReflectors
|
| + .firstWhere((Reflectable reflector) => "$reflector".contains("2"));
|
| ClassMirror bMirror = reflector2.reflectType(B);
|
| ClassMirror cMirror = reflector2.reflectType(C);
|
| ClassMirror dMirror = reflector2.reflectType(D);
|
| @@ -147,8 +214,14 @@ main() {
|
| expect(cMirror.superclass.superclass.superclass, bMirror);
|
| expect(() => dMirror.superclass, throwsANoSuchCapabilityException);
|
| });
|
| - test("Mixin, superclasses included up to bound", () {
|
| - var reflector = const ReflectorUpwardsClosedToA();
|
| +
|
| + test("MetaReflector, select by capability", () {
|
| + var reflector = allReflectors.firstWhere((AllReflectorsCapable reflector) {
|
| + return (reflector.capabilities.any((ReflectCapability capability) =>
|
| + capability is SuperclassQuantifyCapability &&
|
| + capability.upperBound == A &&
|
| + !capability.excludeUpperBound));
|
| + });
|
| ClassMirror aMirror = reflector.reflectType(A);
|
| ClassMirror bMirror = reflector.reflectType(B);
|
| ClassMirror cMirror = reflector.reflectType(C);
|
| @@ -165,72 +238,4 @@ main() {
|
| expect(() => dMirror.mixin, throwsANoSuchCapabilityException);
|
| expect(dMirror.superclass, aMirror);
|
| });
|
| - test("Mixin, superclasses included up to but not including bound", () {
|
| - var reflector = const ReflectorUpwardsClosedUntilA();
|
| - ClassMirror bMirror = reflector.reflectType(B);
|
| - ClassMirror cMirror = reflector.reflectType(C);
|
| - ClassMirror dMirror = reflector.reflectType(D);
|
| - expect(() => reflector.reflectType(A), throwsANoSuchCapabilityException);
|
| - expect(() => reflector.reflectType(M1), throwsANoSuchCapabilityException);
|
| - expect(() => reflector.reflectType(M2), throwsANoSuchCapabilityException);
|
| - expect(() => reflector.reflectType(M3), throwsANoSuchCapabilityException);
|
| - expect(() => cMirror.superclass.mixin, throwsANoSuchCapabilityException);
|
| - expect(() => cMirror.superclass.superclass.mixin,
|
| - throwsANoSuchCapabilityException);
|
| - expect(cMirror.superclass.superclass.superclass, bMirror);
|
| - expect(cMirror.superclass.superclass.superclass.superclass != null, true);
|
| - expect(() => cMirror.superclass.superclass.superclass.superclass.superclass,
|
| - throwsANoSuchCapabilityException);
|
| - expect(() => dMirror.mixin, throwsANoSuchCapabilityException);
|
| - expect(() => dMirror.superclass, throwsANoSuchCapabilityException);
|
| - });
|
| - test("Mixin, naming", () {
|
| - var reflector2 = const Reflector2();
|
| - ClassMirror bMirror = reflector2.reflectType(B);
|
| - ClassMirror cMirror = reflector2.reflectType(C);
|
| - ClassMirror dMirror = reflector2.reflectType(D);
|
| - ClassMirror aWithM1Mirror = bMirror.superclass;
|
| - ClassMirror bWithM2Mirror = cMirror.superclass.superclass;
|
| - ClassMirror bWithM2WithM3Mirror = cMirror.superclass;
|
| - expect(bMirror.simpleName, "B");
|
| - expect(cMirror.simpleName, "C");
|
| - expect(dMirror.simpleName, "D");
|
| - expect(
|
| - aWithM1Mirror.simpleName,
|
| - "test_reflectable.test.mixin_test.A with "
|
| - "test_reflectable.test.mixin_test.M1");
|
| - expect(
|
| - bWithM2Mirror.simpleName,
|
| - "test_reflectable.test.mixin_test.B with "
|
| - "test_reflectable.test.mixin_test.M2");
|
| - expect(
|
| - bWithM2WithM3Mirror.simpleName,
|
| - "test_reflectable.test.mixin_test.B with "
|
| - "test_reflectable.test.mixin_test.M2, "
|
| - "test_reflectable.test.mixin_test.M3");
|
| - expect(cMirror.simpleName, "C");
|
| - expect(dMirror.simpleName, "D");
|
| -
|
| - expect(bMirror.qualifiedName, "test_reflectable.test.mixin_test.B");
|
| - expect(cMirror.qualifiedName, "test_reflectable.test.mixin_test.C");
|
| - expect(dMirror.qualifiedName, "test_reflectable.test.mixin_test.D");
|
| - expect(
|
| - aWithM1Mirror.qualifiedName,
|
| - "test_reflectable.test.mixin_test."
|
| - "test_reflectable.test.mixin_test.A with "
|
| - "test_reflectable.test.mixin_test.M1");
|
| - expect(
|
| - bWithM2Mirror.qualifiedName,
|
| - "test_reflectable.test.mixin_test."
|
| - "test_reflectable.test.mixin_test.B with "
|
| - "test_reflectable.test.mixin_test.M2");
|
| - expect(
|
| - bWithM2WithM3Mirror.qualifiedName,
|
| - "test_reflectable.test.mixin_test."
|
| - "test_reflectable.test.mixin_test.B with "
|
| - "test_reflectable.test.mixin_test.M2, "
|
| - "test_reflectable.test.mixin_test.M3");
|
| - expect(cMirror.qualifiedName, "test_reflectable.test.mixin_test.C");
|
| - expect(dMirror.qualifiedName, "test_reflectable.test.mixin_test.D");
|
| - });
|
| }
|
|
|