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

Unified Diff: test_reflectable/test/private_class_test.dart

Issue 1391013008: Adds limited support for private classes. (Closed) Base URL: https://github.com/dart-lang/reflectable.git@master
Patch Set: 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
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..b3ffe3c00922aad97590d92bb09b9e9289a95fe1
--- /dev/null
+++ b/test_reflectable/test/private_class_test.dart
@@ -0,0 +1,69 @@
+// 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();
+
+void testPrivacyViolation(PublicClass object, String description) {
+ test("Privacy violation, $description", () {
+ 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,
+ <String>[
+ "PublicClass",
+ "_PrivateClass1",
+ "_PrivateClass2",
+ "PublicSubclass1",
+ "PublicSubclass2"
+ ].toSet());
+
+ InstanceMirror instanceMirror = privacyReflectable.reflect(object);
sigurdm 2015/10/15 12:30:58 I think the right way to allow reflection on priva
sigurdm 2015/10/15 12:30:58 What about other actions on private class-mirrors?
eernst 2015/10/15 13:46:11 For now, I've changed the test to check `canReflec
eernst 2015/10/15 13:46:11 Now you won't get a mirror on them, so we can revi
+ ClassMirror classMirror = instanceMirror.type;
+ 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() {
+ testPrivacyViolation(func1(), "private subclass");
+ testPrivacyViolation(func2(), "private subtype");
+ testPrivacyViolation(func3(), "public subclass of private subclass");
+ testPrivacyViolation(func4(), "public subclass of private subtype");
+}

Powered by Google App Engine
This is Rietveld 408576698