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

Unified Diff: test_reflectable/test/meta_reflector_test.dart

Issue 1391543003: Creates `reflectors`, as a meta-meta feature that enables dynamic selection of a "mirror system". (Closed) Base URL: https://github.com/dart-lang/reflectable.git@master
Patch Set: Review response. Created 5 years, 2 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
« no previous file with comments | « test_reflectable/pubspec.yaml ('k') | test_reflectable/test/meta_reflectors_definer.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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");
- });
}
« no previous file with comments | « test_reflectable/pubspec.yaml ('k') | test_reflectable/test/meta_reflectors_definer.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698