diff --git a/jnius/reflect.py b/jnius/reflect.py index b72e3ed..08c93a8 100644 --- a/jnius/reflect.py +++ b/jnius/reflect.py @@ -273,8 +273,11 @@ def autoclass(clsname, include_protected=True, include_private=True): continue if Modifier.isPrivate(method_modifier) and not include_private: continue - if Modifier.isPackageProtected(method_modifier) and not include_protected and cls_start_packagename != cls_packagename: - continue + if Modifier.isPackageProtected(method_modifier): + if cls_start_packagename == cls_packagename and not include_protected: + continue + if cls_start_packagename != cls_packagename and not include_private: + continue name = methods_name[index] cls_methods[name].append((cls, method, level)) @@ -297,8 +300,11 @@ def autoclass(clsname, include_protected=True, include_private=True): continue if Modifier.isPrivate(field_modifier) and not include_private: continue - if Modifier.isPackageProtected(field_modifier) and not include_protected and cls_start_packagename != cls_packagename: - continue + if Modifier.isPackageProtected(field_modifier): + if cls_start_packagename == cls_packagename and not include_protected: + continue + if cls_start_packagename != cls_packagename and not include_private: + continue cls = JavaStaticField if static else JavaField classDict[field_name] = cls(sig) diff --git a/tests/test_visibility_package_protected.py b/tests/test_visibility_package_protected.py index a9a0772..b4a287d 100644 --- a/tests/test_visibility_package_protected.py +++ b/tests/test_visibility_package_protected.py @@ -22,152 +22,94 @@ def py2_encode(uni): class VisibilityPackageProtectedTest(unittest.TestCase): + """This unittest verifies the correct visibility of package protected methods and fields. - def test_static_fields_package_protected(self): - Test = autoclass('org.jnius.VisibilityTest', include_protected=False, include_private=False) - - self.assertTrue(hasattr(Test, 'fieldStaticPublic')) - self.assertTrue(hasattr(Test, 'fieldStaticPackageProtected')) - self.assertFalse(hasattr(Test, 'fieldStaticProtected')) - self.assertFalse(hasattr(Test, 'fieldStaticPrivate')) - - self.assertEqual(Test.fieldStaticPublic, py2_encode("StaticPublic")) - self.assertEqual(Test.fieldStaticPackageProtected, py2_encode("StaticPackageProtected")) + Observe that org.jnius2.ChildVisibilityTest is not in the same package as + it's parent class. If `include_protected` is True and `include_private` + is False, only the package protected methods and fields in the child class + should be visible. + """ def test_child_static_fields_package_protected(self): - Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=False, include_private=False) + Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=True, include_private=False) self.assertTrue(hasattr(Test, 'fieldStaticPublic')) self.assertFalse(hasattr(Test, 'fieldStaticPackageProtected')) - self.assertFalse(hasattr(Test, 'fieldStaticProtected')) + self.assertTrue(hasattr(Test, 'fieldStaticProtected')) self.assertFalse(hasattr(Test, 'fieldStaticPrivate')) self.assertEqual(Test.fieldStaticPublic, py2_encode("StaticPublic")) + self.assertEqual(Test.fieldStaticProtected, py2_encode("StaticProtected")) self.assertTrue(hasattr(Test, 'fieldChildStaticPublic')) self.assertTrue(hasattr(Test, 'fieldChildStaticPackageProtected')) - self.assertFalse(hasattr(Test, 'fieldChildStaticProtected')) + self.assertTrue(hasattr(Test, 'fieldChildStaticProtected')) self.assertFalse(hasattr(Test, 'fieldChildStaticPrivate')) self.assertEqual(Test.fieldChildStaticPublic, py2_encode("ChildStaticPublic")) self.assertEqual(Test.fieldChildStaticPackageProtected, py2_encode("ChildStaticPackageProtected")) - - def test_static_methods_package_protected(self): - Test = autoclass('org.jnius.VisibilityTest', include_protected=False, include_private=False) - - self.assertTrue(hasattr(Test, 'methodStaticPublic')) - self.assertTrue(hasattr(Test, 'methodStaticPackageProtected')) - self.assertFalse(hasattr(Test, 'methodStaticProtected')) - self.assertFalse(hasattr(Test, 'methodStaticPrivate')) - - self.assertEqual(Test.methodStaticPublic(), py2_encode("StaticPublic")) - self.assertEqual(Test.methodStaticPackageProtected(), py2_encode("StaticPackageProtected")) + self.assertEqual(Test.fieldChildStaticProtected, py2_encode("ChildStaticProtected")) def test_child_static_methods_package_protected(self): - Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=False, include_private=False) + Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=True, include_private=False) self.assertTrue(hasattr(Test, 'methodStaticPublic')) self.assertFalse(hasattr(Test, 'methodStaticPackageProtected')) - self.assertFalse(hasattr(Test, 'methodStaticProtected')) + self.assertTrue(hasattr(Test, 'methodStaticProtected')) self.assertFalse(hasattr(Test, 'methodStaticPrivate')) self.assertEqual(Test.methodStaticPublic(), py2_encode("StaticPublic")) + self.assertEqual(Test.methodStaticProtected(), py2_encode("StaticProtected")) self.assertTrue(hasattr(Test, 'methodChildStaticPublic')) self.assertTrue(hasattr(Test, 'methodChildStaticPackageProtected')) - self.assertFalse(hasattr(Test, 'methodChildStaticProtected')) + self.assertTrue(hasattr(Test, 'methodChildStaticProtected')) self.assertFalse(hasattr(Test, 'methodChildStaticPrivate')) self.assertEqual(Test.methodChildStaticPublic(), py2_encode("ChildStaticPublic")) self.assertEqual(Test.methodChildStaticPackageProtected(), py2_encode("ChildStaticPackageProtected")) - - def test_fields_package_protected(self): - - Test = autoclass('org.jnius.VisibilityTest', include_protected=False, include_private=False) - test = Test() - - self.assertTrue(hasattr(test, 'fieldPublic')) - self.assertTrue(hasattr(test, 'fieldPackageProtected')) - self.assertFalse(hasattr(test, 'fieldProtected')) - self.assertFalse(hasattr(test, 'fieldPrivate')) - - self.assertEqual(test.fieldPublic, py2_encode("Public")) - self.assertEqual(test.fieldPackageProtected, py2_encode("PackageProtected")) + self.assertEqual(Test.methodChildStaticProtected(), py2_encode("ChildStaticProtected")) def test_child_fields_package_protected(self): - Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=False, include_private=False) + Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=True, include_private=False) test = Test() self.assertTrue(hasattr(test, 'fieldPublic')) self.assertFalse(hasattr(test, 'fieldPackageProtected')) - self.assertFalse(hasattr(test, 'fieldProtected')) + self.assertTrue(hasattr(test, 'fieldProtected')) self.assertFalse(hasattr(test, 'fieldPrivate')) self.assertEqual(test.fieldPublic, py2_encode("Public")) + self.assertEqual(test.fieldProtected, py2_encode("Protected")) self.assertTrue(hasattr(test, 'fieldChildPublic')) self.assertTrue(hasattr(test, 'fieldChildPackageProtected')) - self.assertFalse(hasattr(test, 'fieldChildProtected')) + self.assertTrue(hasattr(test, 'fieldChildProtected')) self.assertFalse(hasattr(test, 'fieldChildPrivate')) self.assertEqual(test.fieldChildPublic, py2_encode("ChildPublic")) self.assertEqual(test.fieldChildPackageProtected, py2_encode("ChildPackageProtected")) - - def test_methods_package_protected(self): - - Test = autoclass('org.jnius.VisibilityTest', include_protected=False, include_private=False) - test = Test() - - self.assertTrue(hasattr(test, 'methodPublic')) - self.assertTrue(hasattr(test, 'methodPackageProtected')) - self.assertFalse(hasattr(test, 'methodProtected')) - self.assertFalse(hasattr(test, 'methodPrivate')) - - self.assertEqual(test.methodPublic(), py2_encode("Public")) - self.assertEqual(test.methodPackageProtected(), py2_encode("PackageProtected")) + self.assertEqual(test.fieldChildProtected, py2_encode("ChildProtected")) def test_child_methods_package_protected(self): - Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=False, include_private=False) + Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=True, include_private=False) test = Test() self.assertTrue(hasattr(test, 'methodPublic')) self.assertFalse(hasattr(test, 'methodPackageProtected')) - self.assertFalse(hasattr(test, 'methodProtected')) + self.assertTrue(hasattr(test, 'methodProtected')) self.assertFalse(hasattr(test, 'methodPrivate')) self.assertEqual(test.methodPublic(), py2_encode("Public")) + self.assertEqual(test.methodProtected(), py2_encode("Protected")) self.assertTrue(hasattr(test, 'methodChildPublic')) self.assertTrue(hasattr(test, 'methodChildPackageProtected')) - self.assertFalse(hasattr(test, 'methodChildProtected')) + self.assertTrue(hasattr(test, 'methodChildProtected')) self.assertFalse(hasattr(test, 'methodChildPrivate')) self.assertEqual(test.methodChildPublic(), py2_encode("ChildPublic")) self.assertEqual(test.methodChildPackageProtected(), py2_encode("ChildPackageProtected")) - - def test_static_multi_methods(self): - Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=False, include_private=False) - - self.assertTrue(hasattr(Test, 'methodStaticMultiArgs')) - self.assertTrue(isinstance(Test.methodStaticMultiArgs, JavaStaticMethod)) - - self.assertTrue(Test.methodStaticMultiArgs(True)) - with self.assertRaises(JavaException): - Test.methodStaticMultiArgs(True, False) - with self.assertRaises(JavaException): - Test.methodStaticMultiArgs(True, False, True) - - def test_multi_methods(self): - Test = autoclass('org.jnius2.ChildVisibilityTest', include_protected=False, include_private=False) - test = Test() - - self.assertTrue(hasattr(test, 'methodMultiArgs')) - self.assertTrue(isinstance(Test.methodMultiArgs, JavaMethod)) - - self.assertTrue(test.methodMultiArgs(True)) - with self.assertRaises(JavaException): - test.methodMultiArgs(True, False) - with self.assertRaises(JavaException): - test.methodMultiArgs(True, False, True) + self.assertEqual(test.methodChildProtected(), py2_encode("ChildProtected")) diff --git a/tests/test_visibility_public_only.py b/tests/test_visibility_public_only.py index 7971258..78ac831 100644 --- a/tests/test_visibility_public_only.py +++ b/tests/test_visibility_public_only.py @@ -27,61 +27,55 @@ class VisibilityPublicOnlyTest(unittest.TestCase): Test = autoclass('org.jnius.VisibilityTest', include_protected=False, include_private=False) self.assertTrue(hasattr(Test, 'fieldStaticPublic')) - self.assertTrue(hasattr(Test, 'fieldStaticPackageProtected')) + self.assertFalse(hasattr(Test, 'fieldStaticPackageProtected')) self.assertFalse(hasattr(Test, 'fieldStaticProtected')) self.assertFalse(hasattr(Test, 'fieldStaticPrivate')) self.assertEqual(Test.fieldStaticPublic, py2_encode("StaticPublic")) - self.assertEqual(Test.fieldStaticPackageProtected, py2_encode("StaticPackageProtected")) def test_child_static_fields_public_only(self): Test = autoclass('org.jnius.ChildVisibilityTest', include_protected=False, include_private=False) self.assertTrue(hasattr(Test, 'fieldStaticPublic')) - self.assertTrue(hasattr(Test, 'fieldStaticPackageProtected')) + self.assertFalse(hasattr(Test, 'fieldStaticPackageProtected')) self.assertFalse(hasattr(Test, 'fieldStaticProtected')) self.assertFalse(hasattr(Test, 'fieldStaticPrivate')) self.assertEqual(Test.fieldStaticPublic, py2_encode("StaticPublic")) - self.assertEqual(Test.fieldStaticPackageProtected, py2_encode("StaticPackageProtected")) self.assertTrue(hasattr(Test, 'fieldChildStaticPublic')) - self.assertTrue(hasattr(Test, 'fieldChildStaticPackageProtected')) + self.assertFalse(hasattr(Test, 'fieldChildStaticPackageProtected')) self.assertFalse(hasattr(Test, 'fieldChildStaticProtected')) self.assertFalse(hasattr(Test, 'fieldChildStaticPrivate')) self.assertEqual(Test.fieldChildStaticPublic, py2_encode("ChildStaticPublic")) - self.assertEqual(Test.fieldChildStaticPackageProtected, py2_encode("ChildStaticPackageProtected")) def test_static_methods_public_only(self): Test = autoclass('org.jnius.VisibilityTest', include_protected=False, include_private=False) self.assertTrue(hasattr(Test, 'methodStaticPublic')) - self.assertTrue(hasattr(Test, 'methodStaticPackageProtected')) + self.assertFalse(hasattr(Test, 'methodStaticPackageProtected')) self.assertFalse(hasattr(Test, 'methodStaticProtected')) self.assertFalse(hasattr(Test, 'methodStaticPrivate')) self.assertEqual(Test.methodStaticPublic(), py2_encode("StaticPublic")) - self.assertEqual(Test.methodStaticPackageProtected(), py2_encode("StaticPackageProtected")) def test_child_static_methods_public_only(self): Test = autoclass('org.jnius.ChildVisibilityTest', include_protected=False, include_private=False) self.assertTrue(hasattr(Test, 'methodStaticPublic')) - self.assertTrue(hasattr(Test, 'methodStaticPackageProtected')) + self.assertFalse(hasattr(Test, 'methodStaticPackageProtected')) self.assertFalse(hasattr(Test, 'methodStaticProtected')) self.assertFalse(hasattr(Test, 'methodStaticPrivate')) self.assertEqual(Test.methodStaticPublic(), py2_encode("StaticPublic")) - self.assertEqual(Test.methodStaticPackageProtected(), py2_encode("StaticPackageProtected")) self.assertTrue(hasattr(Test, 'methodChildStaticPublic')) - self.assertTrue(hasattr(Test, 'methodChildStaticPackageProtected')) + self.assertFalse(hasattr(Test, 'methodChildStaticPackageProtected')) self.assertFalse(hasattr(Test, 'methodChildStaticProtected')) self.assertFalse(hasattr(Test, 'methodChildStaticPrivate')) self.assertEqual(Test.methodChildStaticPublic(), py2_encode("ChildStaticPublic")) - self.assertEqual(Test.methodChildStaticPackageProtected(), py2_encode("ChildStaticPackageProtected")) def test_fields_public_only(self): @@ -89,12 +83,11 @@ class VisibilityPublicOnlyTest(unittest.TestCase): test = Test() self.assertTrue(hasattr(test, 'fieldPublic')) - self.assertTrue(hasattr(test, 'fieldPackageProtected')) + self.assertFalse(hasattr(test, 'fieldPackageProtected')) self.assertFalse(hasattr(test, 'fieldProtected')) self.assertFalse(hasattr(test, 'fieldPrivate')) self.assertEqual(test.fieldPublic, py2_encode("Public")) - self.assertEqual(test.fieldPackageProtected, py2_encode("PackageProtected")) def test_child_fields_public_only(self): @@ -102,20 +95,18 @@ class VisibilityPublicOnlyTest(unittest.TestCase): test = Test() self.assertTrue(hasattr(test, 'fieldPublic')) - self.assertTrue(hasattr(test, 'fieldPackageProtected')) + self.assertFalse(hasattr(test, 'fieldPackageProtected')) self.assertFalse(hasattr(test, 'fieldProtected')) self.assertFalse(hasattr(test, 'fieldPrivate')) self.assertEqual(test.fieldPublic, py2_encode("Public")) - self.assertEqual(test.fieldPackageProtected, py2_encode("PackageProtected")) self.assertTrue(hasattr(test, 'fieldChildPublic')) - self.assertTrue(hasattr(test, 'fieldChildPackageProtected')) + self.assertFalse(hasattr(test, 'fieldChildPackageProtected')) self.assertFalse(hasattr(test, 'fieldChildProtected')) self.assertFalse(hasattr(test, 'fieldChildPrivate')) self.assertEqual(test.fieldChildPublic, py2_encode("ChildPublic")) - self.assertEqual(test.fieldChildPackageProtected, py2_encode("ChildPackageProtected")) def test_methods_public_only(self): @@ -123,12 +114,11 @@ class VisibilityPublicOnlyTest(unittest.TestCase): test = Test() self.assertTrue(hasattr(test, 'methodPublic')) - self.assertTrue(hasattr(test, 'methodPackageProtected')) + self.assertFalse(hasattr(test, 'methodPackageProtected')) self.assertFalse(hasattr(test, 'methodProtected')) self.assertFalse(hasattr(test, 'methodPrivate')) self.assertEqual(test.methodPublic(), py2_encode("Public")) - self.assertEqual(test.methodPackageProtected(), py2_encode("PackageProtected")) def test_child_methods_public_only(self): @@ -136,20 +126,18 @@ class VisibilityPublicOnlyTest(unittest.TestCase): test = Test() self.assertTrue(hasattr(test, 'methodPublic')) - self.assertTrue(hasattr(test, 'methodPackageProtected')) + self.assertFalse(hasattr(test, 'methodPackageProtected')) self.assertFalse(hasattr(test, 'methodProtected')) self.assertFalse(hasattr(test, 'methodPrivate')) self.assertEqual(test.methodPublic(), py2_encode("Public")) - self.assertEqual(test.methodPackageProtected(), py2_encode("PackageProtected")) self.assertTrue(hasattr(test, 'methodChildPublic')) - self.assertTrue(hasattr(test, 'methodChildPackageProtected')) + self.assertFalse(hasattr(test, 'methodChildPackageProtected')) self.assertFalse(hasattr(test, 'methodChildProtected')) self.assertFalse(hasattr(test, 'methodChildPrivate')) self.assertEqual(test.methodChildPublic(), py2_encode("ChildPublic")) - self.assertEqual(test.methodChildPackageProtected(), py2_encode("ChildPackageProtected")) def test_static_multi_methods(self): Test = autoclass('org.jnius.ChildVisibilityTest', include_protected=False, include_private=False)