visibility of package_protected methods and fields should follow include_protected or include_private if the class is or is not in the same package as the autoclass start package

This commit is contained in:
Jim 2020-04-25 18:48:42 -04:00
parent a15b686e14
commit 712dbfdd4a
3 changed files with 48 additions and 112 deletions

View File

@ -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)

View File

@ -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"))

View File

@ -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)