src/JavaFieldRefTests.st
branchjk_new_structure
changeset 761 43e017ec7958
parent 758 be8e84381ce0
child 764 3c1d3f2d29a5
--- a/src/JavaFieldRefTests.st	Mon Apr 25 19:32:44 2011 +0000
+++ b/src/JavaFieldRefTests.st	Sun May 01 12:52:23 2011 +0000
@@ -8,13 +8,329 @@
 !
 
 
-!JavaFieldRefTests methodsFor:'javaFieldRef tests'!
+!JavaFieldRefTests methodsFor:'permission tests'!
+
+testAccessingPPFromOutside
+    | javaClassRef  javaFieldRef  initString throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+            [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+            javaClassRef := JavaClassRef2 for: initString.
+            javaClassRef owner: (Java classForName: 'java.lang.Object').
+            javaFieldRef := JavaFieldRef2 
+                        namedAndTyped: (JavaNameAndType2 name: 'packagePrivateField'
+                                descriptor: 'Ljava/lang/String;')
+                        inClassIdentifiedByRef: javaClassRef.
+            javaFieldRef resolve. ] on: Error do: [:e | throwedException := e].
+            self assertTrue: (throwedException messageText = 'IllegalAccessError').
+        
+    self disableMockedExceptionThrowing.
+
+    "Created: / 14-04-2011 / 15:05:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPPFromPackage
+    | javaClassRef  javaFieldRef  initString |
+
+    self enableMockedExceptionThrowing.
+    self shouldnt: 
+            [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+            javaClassRef := JavaClassRef2 for: initString.
+            javaClassRef owner: (Java classForName: 'stx.libjava.tests.mocks.Crate').
+            javaFieldRef := JavaFieldRef2 
+                        namedAndTyped: (JavaNameAndType2 name: 'packagePrivateField'
+                                descriptor: 'Ljava/lang/String;')
+                        inClassIdentifiedByRef: javaClassRef.
+            javaFieldRef resolve. ]
+        raise: Error.
+    self disableMockedExceptionThrowing.
+
+    "Created: / 14-04-2011 / 15:08:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPPFromSubclass
+    | javaClassRef  javaFieldRef  initString |
+
+    self enableMockedExceptionThrowing.
+    self shouldnt: 
+            [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+            javaClassRef := JavaClassRef2 for: initString.
+            javaClassRef owner: (Java classForName: 'stx.libjava.tests.mocks.SubclassOfPublicClass').
+            javaFieldRef := JavaFieldRef2 
+                        namedAndTyped: (JavaNameAndType2 name: 'packagePrivateField'
+                                descriptor: 'Ljava/lang/String;')
+                        inClassIdentifiedByRef: javaClassRef.
+            javaFieldRef resolve. ]
+        raise: Error.
+    self disableMockedExceptionThrowing.
+
+    "Created: / 14-04-2011 / 15:08:39 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPrivateFromOutside
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'privateField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException notNil 
+                and: [ throwedException messageText = 'IllegalAccessError' ]).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:44:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:10:28 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPrivateFromOutsideInNonPublic
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/NonPublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'privateField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException notNil 
+                and: [ throwedException messageText = 'IllegalAccessError' ]).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:47:44 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:11:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPrivateFromSubclass
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.SubclassOfPublicClass').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'privateField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException notNil 
+                and: [ throwedException messageText = 'IllegalAccessError' ]).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:49:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:12:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingProtectedFromOutside
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'protectedField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException notNil 
+                and: [ throwedException messageText = 'IllegalAccessError' ]).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:44:48 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:12:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingProtectedFromOutsideInNonPublic
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/NonPublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'protectedMethod'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException notNil 
+                and: [ throwedException messageText = 'IllegalAccessError' ]).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:47:54 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:13:05 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingProtectedFromPackage
+    | javaClassRef  javaFieldRef  initString |
+
+    self enableMockedExceptionThrowing.
+    self shouldnt: 
+            [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+            javaClassRef := JavaClassRef2 for: initString.
+            javaClassRef owner: (Java classForName: 'stx.libjava.tests.mocks.Crate').
+            javaFieldRef := JavaFieldRef2 
+                        namedAndTyped: (JavaNameAndType2 name: 'protectedField'
+                                descriptor: 'Ljava/lang/String;')
+                        inClassIdentifiedByRef: javaClassRef.
+            javaFieldRef resolve. ]
+        raise: Error.
+    self disableMockedExceptionThrowing.
+
+    "Created: / 14-04-2011 / 15:09:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingProtectedFromSubclass
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef 
+        owner: (Java classForName: 'stx.libjava.tests.mocks.SubclassOfPublicClass').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'protectedField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException isNil).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:49:23 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:13:27 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPublic
+    | javaClassRef  javaFieldRef  initString |
+
+    self enableMockedExceptionThrowing.
+    self shouldnt: 
+            [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+            javaClassRef := JavaClassRef2 for: initString.
+            javaClassRef owner: (Java classForName: 'java.lang.Object').
+            javaFieldRef := JavaFieldRef2 
+                        namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                                descriptor: 'Ljava/lang/String;')
+                        inClassIdentifiedByRef: javaClassRef.
+            javaFieldRef resolve. ]
+        raise: Error.
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:44:13 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:13:45 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPublicFromOutside
+    | javaClassRef  javaFieldRef  initString |
+
+    self enableMockedExceptionThrowing.
+    self shouldnt: 
+            [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+            javaClassRef := JavaClassRef2 for: initString.
+            javaClassRef owner: (Java classForName: 'java.lang.Object').
+            javaFieldRef := JavaFieldRef2 
+                        namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                                descriptor: 'Ljava/lang/String;')
+                        inClassIdentifiedByRef: javaClassRef.
+            javaFieldRef resolve. ]
+        raise: Error.
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:44:31 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:14:12 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPublicFromOutsideInNonPublic
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/NonPublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException notNil 
+                and: [ throwedException messageText = 'IllegalAccessError' ]).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:48:05 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:14:32 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+!
+
+testAccessingPublicFromSubclass
+    | javaClassRef  javaFieldRef  initString  throwedException |
+
+    self enableMockedExceptionThrowing.
+    
+    [ initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.SubclassOfPublicClass').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    javaFieldRef resolve. ] on: Error
+            do: [:e | throwedException := e ].
+    self assertTrue: (throwedException isNil).
+    self disableMockedExceptionThrowing.
+
+    "Created: / 13-04-2011 / 14:49:11 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 14:14:46 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaFieldRefTests methodsFor:'resolving static tests'!
+
+testResolvingStatic
+    | javaClassRef  javaFieldRef  initString  result  expectedResult |
+
+    initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
+    javaFieldRef := JavaFieldRef2 
+                namedAndTyped: (JavaNameAndType2 name: 'publicStaticField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
+    result := javaFieldRef resolveStatic.
+    expectedResult := (Java 
+                classForName: 'stx.libjava.tests.mocks.PublicClass') staticFields 
+                at: 3.
+    self assertTrue: (result = expectedResult).
+
+    "Created: / 28-04-2011 / 22:00:52 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+! !
+
+!JavaFieldRefTests methodsFor:'resolving tests'!
 
 testCorrectInstanceCreation
     | javaClassRef  initString  javaFieldRef |
 
     initString := 'Ljava/lang/String;'.
     javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
     javaFieldRef := JavaFieldRef2 
                 namedAndTyped: (JavaNameAndType2 name: 'value' descriptor: '[C')
                 inClassIdentifiedByRef: javaClassRef.
@@ -25,48 +341,58 @@
     self assertTrue: (javaFieldRef classRef name = 'Ljava/lang/String;').
 
     "Created: / 08-04-2011 / 14:01:41 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 08-04-2011 / 16:22:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 11-04-2011 / 19:59:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 testCorrectResolving
     | javaClassRef  initString  javaFieldRef  expectedResult  result |
 
-    initString := 'Ljava/lang/String;'.
+    initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
     javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
     javaFieldRef := JavaFieldRef2 
-                namedAndTyped: (JavaNameAndType2 name: 'value' descriptor: '[C')
-                inClassIdentifiedByRef: javaClassRef.    
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
+                inClassIdentifiedByRef: javaClassRef.
     result := javaFieldRef resolve.
-    expectedResult := (Java classForName: 'java.lang.String') fields at: 1.
+    expectedResult := (Java classForName: 'stx.libjava.tests.mocks.PublicClass') fields at: 3.
     self assertTrue: (result = expectedResult).
 
     "Created: / 08-04-2011 / 14:07:57 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 08-04-2011 / 16:28:00 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 15:29:55 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 testInvalidation
-    | javaClassRef   javaFieldRef |
+    | javaClassRef  javaFieldRef  initString|
 
-    javaClassRef := JavaClassRef2 for: 'Ljava/lang/String;'.
+    initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
     javaFieldRef := JavaFieldRef2 
-                namedAndTyped: (JavaNameAndType2 name: 'value' descriptor: '[C')
-                inClassIdentifiedByRef: javaClassRef.
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
+                    inClassIdentifiedByRef: javaClassRef.
     self assertTrue: (javaFieldRef isResolved not).
     javaFieldRef resolve.
     self assertTrue: (javaFieldRef isResolved).
+    self assertTrue: (javaFieldRef classRef isResolved).
     javaFieldRef invalidate.
     self assertTrue: (javaFieldRef isResolved not).
+    self assertTrue: (javaFieldRef classRef isResolved not).
 
     "Created: / 08-04-2011 / 14:09:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 08-04-2011 / 15:15:18 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 15:30:20 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 testInvalidationForClassNegative
-    | javaClassRef  javaFieldRef |
+    | javaClassRef  javaFieldRef  initString |
 
-    javaClassRef := JavaClassRef2 for: 'Ljava/lang/String;'.
+    initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
     javaFieldRef := JavaFieldRef2 
-                namedAndTyped: (JavaNameAndType2 name: 'value' descriptor: '[C')
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
                 inClassIdentifiedByRef: javaClassRef.
     self assertTrue: (javaFieldRef isResolved not).
     javaFieldRef resolve.
@@ -75,38 +401,46 @@
     self assertTrue: (javaFieldRef isResolved).
 
     "Created: / 08-04-2011 / 16:23:06 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 15:30:33 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 testInvalidationForClassPositive
-    | javaClassRef  javaFieldRef |
+    | javaClassRef  javaFieldRef  initString |
 
-    javaClassRef := JavaClassRef2 for: 'Ljava/lang/String;'.
+    initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
     javaFieldRef := JavaFieldRef2 
-                namedAndTyped: (JavaNameAndType2 name: 'value' descriptor: '[C')
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
                 inClassIdentifiedByRef: javaClassRef.
     self assertTrue: (javaFieldRef isResolved not).
     javaFieldRef resolve.
     self assertTrue: (javaFieldRef isResolved).
-    javaFieldRef invalidateForClass: 'Ljava/lang/String;'.
+    javaFieldRef invalidateForClass: 'Lstx/libjava/tests/mocks/PublicClass;'.
     self assertTrue: (javaFieldRef isResolved not).
 
     "Created: / 08-04-2011 / 16:23:19 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 15:31:07 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 !
 
 testResolving
-    | javaClassRef  javaFieldRef |
+    | javaClassRef  javaFieldRef  initString|
 
-    javaClassRef := JavaClassRef2 for: 'Ljava/lang/String;'.
+   initString := 'Lstx/libjava/tests/mocks/PublicClass;'.
+    javaClassRef := JavaClassRef2 for: initString.
+    javaClassRef owner: (Java classForName: 'java.lang.Object').
     javaFieldRef := JavaFieldRef2 
-                namedAndTyped: (JavaNameAndType2 name: 'value' descriptor: '[C')
-                inClassIdentifiedByRef: javaClassRef.
+                namedAndTyped: (JavaNameAndType2 name: 'publicField'
+                        descriptor: 'Ljava/lang/String;')
+                   inClassIdentifiedByRef: javaClassRef.
     self assertTrue: (javaFieldRef isResolved not).
     javaFieldRef resolve.
     self assertTrue: (javaClassRef isResolved).
     self assertTrue: (javaFieldRef isResolved).
 
     "Created: / 08-04-2011 / 14:04:01 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 08-04-2011 / 15:14:34 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 14-04-2011 / 15:30:47 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
 ! !
 
 !JavaFieldRefTests class methodsFor:'documentation'!
@@ -114,3 +448,4 @@
 version_SVN
     ^ '$Id$'
 ! !
+