Index: test_reflectable/test/private_class_test.dart |
diff --git a/test_reflectable/test/private_class_test.dart b/test_reflectable/test/private_class_test.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..fc3e52cf23091ae9f2e4e9bbb2c859f0aa3018a4 |
--- /dev/null |
+++ b/test_reflectable/test/private_class_test.dart |
@@ -0,0 +1,85 @@ |
+// Copyright (c) 2015, the Dart Team. All rights reserved. Use of this |
+// source code is governed by a BSD-style license that can be found in |
+// the LICENSE file. |
+ |
+/// File being transformed by the reflectable transformer. |
+/// Uses public features of an instance of a private class in a different |
+/// library. This illustrates that there is (very limited) support for access |
+/// to private features. |
+library test_reflectable.test.private_class_test; |
+ |
+@GlobalQuantifyCapability("PublicClass", privacyReflectable) |
+import 'package:reflectable/reflectable.dart'; |
+import 'package:unittest/unittest.dart'; |
+import 'private_class_library.dart'; |
+ |
+class PrivacyReflectable extends Reflectable { |
+ const PrivacyReflectable() |
+ : super( |
+ subtypeQuantifyCapability, |
+ reflectedTypeCapability, |
+ instanceInvokeCapability, |
+ declarationsCapability, |
+ libraryCapability); |
+} |
+ |
+const privacyReflectable = const PrivacyReflectable(); |
+ |
+final Set<String> libraryClassNames = <String>[ |
+ "PublicClass", |
+ "_PrivateClass1", |
+ "_PrivateClass2", |
+ "PublicSubclass1", |
+ "PublicSubclass2" |
+].toSet(); |
+ |
+void testPrivacyViolation(PublicClass object, String description, |
+ {bool doReflect: true}) { |
+ test("Privacy, $description", () { |
+ bool canReflect = privacyReflectable.canReflect(object); |
+ expect(canReflect, doReflect); |
+ if (canReflect) { |
+ // Check that we can reflect upon [object], and that its class |
+ // is among the expected ones. |
+ InstanceMirror instanceMirror = privacyReflectable.reflect(object); |
+ ClassMirror classMirror = instanceMirror.type; |
+ expect(libraryClassNames.contains(classMirror.simpleName), true); |
+ |
+ // Browse [object] and call a method declared in a private class. |
+ classMirror.declarations.values.forEach((DeclarationMirror declaration) { |
+ expect(declaration is MethodMirror, true); |
+ MethodMirror method = |
+ declaration; // Declaration needed, no type propagation. |
+ expect(method.reflectedReturnType, int); |
+ expect(method.parameters.length, 0); |
+ expect( |
+ <String>[ |
+ "publicMethod", |
+ "supposedlyPrivate", |
+ "supposedlyPrivateToo" |
+ ].contains(method.simpleName), |
+ true); |
+ if (method.simpleName != "publicMethod") { |
+ expect(instanceMirror.invoke(declaration.simpleName, []), |
+ -object.publicMethod()); |
+ } |
+ }); |
+ } |
+ }); |
+} |
+ |
+main() { |
+ test("Privacy, libraries", () { |
+ // Check that we can browse libraries. |
+ Map<Uri, LibraryMirror> libraries = privacyReflectable.libraries; |
+ Uri libraryUri = libraries.keys.firstWhere( |
+ (Uri uri) => uri.toString().contains("private_class_library")); |
+ LibraryMirror library = libraries[libraryUri]; |
+ expect(library.declarations.keys, libraryClassNames); |
+ }); |
+ |
+ testPrivacyViolation(func1(), "private subclass", doReflect: false); |
+ testPrivacyViolation(func2(), "private subtype", doReflect: false); |
+ testPrivacyViolation(func3(), "public subclass of private subclass"); |
+ testPrivacyViolation(func4(), "public subclass of private subtype"); |
+} |