JavaClassReloaderTests moved from stx:libjava/experiments to stx:libjava
authorJan Vrany <jan.vrany@fit.cvut.cz>
Tue, 20 Jan 2015 10:49:24 +0100
changeset 3331 ee36f2088d60
parent 3330 b14c58b2876c
child 3332 7aa6c098fb82
JavaClassReloaderTests moved from stx:libjava/experiments to stx:libjava
JavaClassReloaderTests.st
abbrev.stc
experiments/JavaClassReloaderTests.st
experiments/Make.proto
experiments/abbrev.stc
experiments/bc.mak
experiments/experiments.rc
experiments/stx_libjava_experiments.st
libjava.rc
stx_libjava.st
tools/abbrev.stc
tools/stx_libjava_tools.st
tools/tools.rc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/JavaClassReloaderTests.st	Tue Jan 20 10:49:24 2015 +0100
@@ -0,0 +1,2532 @@
+"
+ Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
+                         SWING Research Group, Czech Technical University 
+                         in Prague
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the 'Software'), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+"
+"{ Package: 'stx:libjava' }"
+
+"{ NameSpace: Smalltalk }"
+
+TestCase subclass:#JavaClassReloaderTests
+	instanceVariableNames:'testClassLoader'
+	classVariableNames:''
+	poolDictionaries:''
+	category:'Languages-Java-Tests-ClassReloading'
+!
+
+!JavaClassReloaderTests class methodsFor:'documentation'!
+
+copyright
+"
+ Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
+                         SWING Research Group, Czech Technical University 
+                         in Prague
+
+ Permission is hereby granted, free of charge, to any person
+ obtaining a copy of this software and associated documentation
+ files (the 'Software'), to deal in the Software without
+ restriction, including without limitation the rights to use,
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the
+ Software is furnished to do so, subject to the following
+ conditions:
+
+ The above copyright notice and this permission notice shall be
+ included in all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+ OTHER DEALINGS IN THE SOFTWARE.
+
+"
+!
+
+history
+
+    "Created: #resources / 21-12-2012 / 18:09:27 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: #setUp / 02-10-2013 / 22:54:13 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: #tearDown / 02-10-2013 / 22:54:16 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests class methodsFor:'resources'!
+
+resources
+
+  ^ Array 
+        with: JavaInitializedResource.
+
+    "Created: / 21-12-2012 / 18:09:27 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'interfaces'!
+
+testAddingInterface
+    OperatingSystem getLoginName = 'm' ifTrue:[
+        self assert: false message: 'implement me!!'
+    ]
+
+    "Created: / 16-12-2012 / 17:40:40 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 03-04-2013 / 22:07:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'private'!
+
+compile: sourceCode
+    | classes |
+
+    classes := JavaCompiler compile: sourceCode.
+"/    classes do:[:cls|cls classLoader: testClassLoader] .
+    ^classes
+
+    "Created: / 16-12-2012 / 17:02:41 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 09-04-2013 / 22:39:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+compileAndRegister: sourceCode
+    |compiledClasses|
+
+    compiledClasses := self compile: sourceCode.
+    ^ self register: compiledClasses.
+
+    "Created: / 16-12-2012 / 16:59:19 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+performTest
+
+    JavaClassReader classLoaderQuerySignal answer: testClassLoader do:[
+        super performTest
+    ].
+
+    "Created: / 16-12-2012 / 16:35:01 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+register: aClassOrArray
+
+    ^aClassOrArray isArray ifTrue:[
+        JavaVM registry registerClasses: aClassOrArray .
+        JavaVM registry classNamed: aClassOrArray anElement binaryName loader: aClassOrArray anElement classLoader
+    ] ifFalse:[
+        JavaVM registry registerClass: aClassOrArray.
+        JavaVM registry classNamed: aClassOrArray binaryName loader: aClassOrArray classLoader
+    ].
+
+    "Created: / 16-12-2012 / 17:02:04 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 14-10-2013 / 23:12:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+testInfrastructure
+
+    |compiledClass|
+
+    self assert: (JavaClassReader classLoaderQuerySignal query = testClassLoader ) 
+        message: 'tests should run in testClassLoader sandbox'.
+    compiledClass := self compileAndRegister: '
+public class HelloSun {
+
+    public String hello() {
+        return "helloooo";
+    }
+
+}
+'.
+    self assert: compiledClass notNil message: 'Java compiler should be working for these tests to run'.
+    self assert: compiledClass classLoader = testClassLoader message: 'compiled classes should have testClassLoader as their defining cl'.
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == compiledClass message: 'compiled classes should be registered in testClassLoader'.
+
+    "Created: / 16-12-2012 / 16:38:17 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'running'!
+
+setUp
+    testClassLoader := JAVA java lang ClassLoader new.
+    ObjectMemory garbageCollect.
+
+    "Created: / 16-12-2012 / 16:32:32 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 02-10-2013 / 22:54:13 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+tearDown
+    JavaVM registry unregisterClassLoader: testClassLoader.
+    ObjectMemory garbageCollect.
+
+    "Created: / 16-12-2012 / 16:33:31 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 02-10-2013 / 22:54:16 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'test helpers'!
+
+callerClass
+    | callerClass |
+    callerClass := (JavaCompiler 
+            compile: '
+package classReloadingTests;
+public class Caller {
+    public String callFooToString(Object c) {
+        return c.toString();
+    }   
+}
+') anElement.
+    callerClass 
+        ifNil: [ self error: 'callerClass is expected to be not nil in these tests' ].
+    ^ callerClass.
+
+    "Created: / 06-12-2012 / 21:41:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified: / 18-12-2012 / 14:00:12 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 04-01-2013 / 14:51:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+compileAndRegisterChangingClassParent
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClassParent {
+    public String foo() {
+        return "parent";
+    }
+
+    public String toString() {
+        return "" + foo();
+    }   
+}'.
+
+    "Created: / 18-12-2012 / 13:47:32 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - classes'!
+
+test_classes_01a
+    "
+    1) compile simple class with static method that returns an instance
+       **non-existent** class Missing
+    2) 
+    3) compile Missing class
+    4) call that static method, should return an instance of Missing
+    "
+
+    | user missing  |
+    user := self compileAndRegister:'
+public class test_classes_01a_user { 
+    public static Object foo() {
+        return new test_classes_01a_Missing();
+    }
+}'.
+
+    self should: [ user new foo ] raise: JavaUnresolvedCompilationError.
+
+    missing := self compileAndRegister:'
+public class test_classes_01a_Missing {
+}
+'.
+
+    self shouldnt: [ user new foo ] raise: JavaUnresolvedCompilationError.
+    self assert: user new foo class == missing.
+
+    "Created: / 16-10-2013 / 13:26:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - fields'!
+
+test_fields_00a
+    "
+     1) compile simple class with one field
+     2) change type of the field from int to Object
+"
+    
+    | jclass1  jinst1  jclass2  jinst2  callerClass |
+    jclass1 := self 
+            compileAndRegister: '
+public class test_01 { 
+    public int foo = 1;
+    public int bar() {
+        return 1;
+    }
+}'.
+
+    self assert: jclass1 hasMultipleVersions not message: 'java class should not have multiple versions initially'.
+
+    jinst1 := jclass1 new.
+    jclass2 := self 
+            compileAndRegister: '
+public class test_01 { 
+    public Object foo = new Object();
+    public int bar() {
+        return 2;
+    }
+}'.
+    jinst2 := jclass2 new.
+    callerClass := self 
+            compileAndRegister: '
+public class CallerClass {
+    public static Object getFoo(test_01 inst) {
+        return inst.foo;
+    }
+}'.
+    self assert: jclass1 ~~ jclass2.
+    self assert: jclass1 fields size == 1.
+    self assert: jclass1 fields anElement descriptor = 'I'.
+    self assert: jinst1 bar == 1.
+    self assert: jclass2 fields size == 1.
+    self assert: jclass2 fields anElement descriptor = 'Ljava/lang/Object;'.
+    self assert: jinst2 bar == 2.
+    self shouldnt: [ callerClass getFoo: jinst1 ] raise: Error.
+    self shouldnt: [ callerClass getFoo: jinst2 ] raise: Error.
+
+    "Created: / 09-04-2013 / 15:00:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 09-04-2013 / 16:17:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 28-10-2013 / 12:51:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_fields_00b
+    "
+     1) compile simple class with one field
+     2) change type of the field from Object to int
+"
+    
+    | jclass1  jinst1  jclass2  jinst2  callerClass |
+    jclass1 := self 
+            compileAndRegister: '
+public class test_01 { 
+    public Object foo = new Object();
+    public int bar() {
+        return 1;
+    }
+}'.
+    jinst1 := jclass1 new.
+    jclass2 := self 
+            compileAndRegister: '
+public class test_01 { 
+    public int foo = 42;
+    public int bar() {
+        return 2;
+    }
+}'.
+    jinst2 := jclass2 new.
+    callerClass := self 
+            compileAndRegister: '
+public class CallerClass {
+    public static int getFoo(test_01 inst) {
+        return inst.foo;
+    }
+}'.
+    self assert: jclass1 ~~ jclass2.
+    self assert: jclass1 fields size == 1.
+    self assert: jclass1 fields anElement descriptor = 'Ljava/lang/Object;'.
+    self assert: jinst1 bar == 1.
+    self assert: jclass2 fields size == 1.
+    self assert: jclass2 fields anElement descriptor = 'I'.
+    self assert: jinst2 bar == 2.
+    self shouldnt: [ callerClass getFoo: jinst1 ] raise: Error.
+    self shouldnt: [ callerClass getFoo: jinst2 ] raise: Error.
+
+    "Created: / 20-09-2013 / 00:05:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 12-10-2013 / 18:19:51 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_fields_01a
+    "
+    1) compile simple class with one field
+    2) change type of the field from String to Object
+    3) as this is type generalization, no new class version
+        should be introduced, new field type is used by old class
+
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_01 { 
+    public String foo = "xxx";
+    public int bar() {
+        return 1;
+    }
+}'.
+    jinst1 := jclass1 new.
+
+    jclass2 := self compileAndRegister:'
+public class test_01 { 
+    public Object foo = new Object();
+    public int bar() {
+        return 2;
+    }
+}'.
+    jinst2 := jclass2 new.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass {
+    public static Object getFoo(test_01 inst) {
+        return inst.foo;
+    }
+}'.
+
+    self assert: jclass1 == jclass2.
+
+    self assert: jclass1 fields size == 1.
+    self assert: jclass1 fields anElement descriptor = 'Ljava/lang/Object;'.
+    self assert: jinst1 bar == 2.
+
+    self assert: jclass2 fields size == 1.
+    self assert: jclass2 fields anElement descriptor = 'Ljava/lang/Object;'.
+    self assert: jinst2 bar == 2.
+
+    self shouldnt:   [ callerClass getFoo: jinst1 ] raise: Error.
+    self shouldnt: [ callerClass getFoo: jinst2 ] raise: Error.
+
+    "Created: / 09-04-2013 / 15:24:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 12-10-2013 / 19:28:02 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_fields_01b
+    "
+    1) compile simple class with one field
+    2) change type of the field from Object to String
+    3) new class version should be created
+
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_01 { 
+    public Object foo = new Object();
+    public int bar() {
+        return 1;
+    }
+}'.
+    jinst1 := jclass1 new.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass {
+    public static Object getFoo(test_01 inst) {
+        return inst.foo;
+    }
+}'.
+
+    jclass2 := self compileAndRegister:'
+public class test_01 { 
+    public String foo = "XXX";
+    public int bar() {
+        return 2;
+    }
+}'.
+    jinst2 := jclass2 new.
+
+
+
+    self assert: jclass1 ~~ jclass2.
+
+    self assert: jclass1 fields size == 1.
+    self assert: jclass1 fields anElement descriptor = 'Ljava/lang/Object;'.
+    self assert: jinst1 bar == 1.
+
+    self assert: jclass2 fields size == 1.
+    self assert: jclass2 fields anElement descriptor = 'Ljava/lang/String;'.
+    self assert: jinst2 bar == 2.
+
+    self shouldnt: [ callerClass getFoo: jinst1 ] raise: Error.
+    self shouldnt:   [ callerClass getFoo: jinst2 ] raise: Error.
+
+    "Created: / 09-04-2013 / 15:25:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 12-10-2013 / 19:28:25 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_fields_02a
+    "
+    1) compile simple class with one public field
+    2) add second field after the first one
+    3) create caller class that accesses the public field
+    4) check that caller class accesses the right field
+       on both old and new instance
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_02a { 
+    public String foo = "foo";
+}'.
+    jinst1 := jclass1 new.
+
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_02a { 
+    public String foo = "foo+bar";
+    public String bar = "foo+bar";
+}'.
+    jinst2 := jclass2 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_02a_caller {
+    public static String getFoo(test_fields_02a x) {
+        return x.foo;
+    }
+}'.
+
+    self assert: jclass2 fields size == 2.
+
+    self assert: (callerClass getFoo: jinst1) = 'foo'.   
+    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
+
+    "Created: / 09-04-2013 / 15:32:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_02b
+    "
+    1) compile simple class with one public field
+    2) add second field after the first one
+    3) create caller class that accesses the public field
+    4) check that caller class accesses the right field
+       on both old and new instance
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_02b { 
+    public String foo = "foo";
+}'.
+    jinst1 := jclass1 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_02b_caller {
+    public static String getFoo(test_fields_02b x) {
+        return x.foo;
+    }
+}'.
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_02b { 
+    public String foo = "foo+bar";
+    public String bar = "foo+bar";
+}'.
+    jinst2 := jclass2 new.
+
+    self assert: jclass2 fields size == 2.
+
+    self assert: (callerClass getFoo: jinst1) = 'foo'.   
+    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
+
+    "Created: / 09-04-2013 / 15:30:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_03a
+    "
+    1) compile simple class with one public field
+    2) add second field before the first one
+    3) create caller class that accesses the public field
+    4) check that caller class accesses the right field
+       on both old and new instance
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_03a { 
+    public String foo = "foo";
+}'.
+    jinst1 := jclass1 new.
+
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_03a { 
+    public String bar = "foo+bar";
+    public String foo = "foo+bar";
+}'.
+    jinst2 := jclass2 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_03a_caller {
+    public static String getFoo(test_fields_03a x) {
+        return x.foo;
+    }
+}'.
+
+    self assert: jclass2 fields size == 2.
+
+    self assert: (callerClass getFoo: jinst1) = 'foo'.   
+    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
+
+    "Created: / 09-04-2013 / 15:33:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_03b
+    "
+    1) compile simple class with one public field
+    2) add second field before the first one
+    3) create caller class that accesses the public field
+    4) check that caller class accesses the right field
+       on both old and new instance
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_03b { 
+    public String foo = "foo";
+}'.
+    jinst1 := jclass1 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_03b_caller {
+    public static String getFoo(test_fields_03b x) {
+        return x.foo;
+    }
+}'.
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_03b { 
+    public String bar = "foo+bar";
+    public String foo = "foo+bar";
+}'.
+    jinst2 := jclass2 new.
+
+
+
+    self assert: jclass2 fields size == 2.
+
+    self assert: (callerClass getFoo: jinst1) = 'foo'.   
+    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
+
+    "Created: / 09-04-2013 / 15:34:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_03c
+    "
+    1) compile simple class with one public field
+    2) add second field before the first one
+    3) create caller class that accesses the new field
+    4) check that caller class accesses the new field
+       on new instance
+    5) check that caller class accessing new field on
+       old instances throws exception
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_03c { 
+    public String foo = "foo";
+}'.
+    jinst1 := jclass1 new.
+
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_03c { 
+    public String bar = "foo+bar";
+    public String foo = "foo+bar";
+}'.
+    jinst2 := jclass2 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_03c_caller {
+    public static String getBar(test_fields_03c x) {
+        return x.bar;
+    }
+}'.
+
+    self assert: jclass2 fields size == 2.
+
+    self assert: (callerClass getBar: jinst2) = 'foo+bar'.
+    self should: [ callerClass getBar: jinst1 ] raise: Error.
+
+    "Created: / 09-04-2013 / 15:53:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_04a
+    "
+    1) compile simple class with two public fields
+    2) remove first field
+    3) create caller class that accesses the second field
+    4) check that caller class accesses the right field
+       on both old and new instances
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_04a { 
+    public String foo = "foo";
+    public String bar = "bar+foo";
+}'.
+    jinst1 := jclass1 new.
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_04a { 
+    public String bar = "bar";
+}'.
+    jinst2 := jclass2 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_04a_caller {
+    public static String getBar(test_fields_04a x) {
+        return x.bar;
+    }
+}'.
+
+    self assert: jclass2 fields size == 1.
+
+    self assert: (callerClass getBar: jinst1) = 'bar+foo'.   
+    self assert: (callerClass getBar: jinst2) = 'bar'.
+
+    "Created: / 09-04-2013 / 15:46:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_04b
+    "
+    1) compile simple class with two public fields
+    2) remove first field
+    3) create caller class that accesses the second field
+    4) check that caller class accesses the right field
+       on both old and new instances
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_04b { 
+    public String foo = "foo";
+    public String bar = "bar+foo";
+}'.
+    jinst1 := jclass1 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_04b_caller {
+    public static String getBar(test_fields_04b x) {
+        return x.bar;
+    }
+}'.
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_04b { 
+    public String bar = "bar";
+}'.
+    jinst2 := jclass2 new.
+
+
+
+    self assert: jclass2 fields size == 1.
+
+    self assert: (callerClass getBar: jinst1) = 'bar+foo'.   
+    self assert: (callerClass getBar: jinst2) = 'bar'.
+
+    "Created: / 09-04-2013 / 15:45:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_04c
+    "
+    1) compile simple class with two public fields
+    2) create caller class that accesses the first field
+    3) remove first field
+    4) check that caller class accesses the first field
+       on old instances
+    5) check that accessing the first field on new instances
+       raises exception
+    "
+
+    | jclass1 jinst1 jclass2 jinst2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_04c { 
+    public String foo = "foo";
+    public String bar = "bar+foo";
+}'.
+    jinst1 := jclass1 new.
+
+    callerClass := self compileAndRegister:'
+public class test_fields_04c_caller {
+    public static String getFoo(test_fields_04c x) {
+        return x.foo;
+    }
+}'.
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_04c { 
+    public String bar = "bar";
+}'.
+    jinst2 := jclass2 new.
+
+
+    self assert: jclass1 ~~ jclass2.
+    self assert: jclass2 fields size == 1.
+
+    self assert: (callerClass getFoo: jinst1) = 'foo'.   
+    self should: [ callerClass getFoo: jinst2 ] raise: Error.
+
+    "Created: / 09-04-2013 / 15:57:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 13-10-2013 / 18:14:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_fields_05a
+    "
+    1) compile simple class with one field
+    2) change visibility of the field
+    3) accessing the field should raise exception
+    "
+
+    | jclass1 jinst1 jclass2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_05a { 
+    public String foo = "public_foo";
+}'.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass {
+    public static String getFoo(test_fields_05a inst) {
+        return inst.foo;
+    }
+}'.  
+
+    jinst1 := jclass1 new.
+    self assert: (callerClass getFoo: jinst1) = 'public_foo'.  
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_05a { 
+    private String foo = "private_foo";
+}'.       
+    self should:   [ callerClass getFoo: jinst1 ] raise: Error.
+
+    "Created: / 09-04-2013 / 16:16:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 13-10-2013 / 18:17:00 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_fields_05b
+    "
+    1) compile simple class with private field
+    2) change visibility of the field to public
+    3) accessing the field should not raise exception anymore
+    "
+
+    | jclass1 jinst1 jclass2 callerClass |
+
+    jclass1 := self compileAndRegister:'
+public class test_fields_05b { 
+    private String foo = "private_foo";
+}'.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass {
+    public static String getFoo(test_fields_05b inst) {
+        return inst.foo;
+    }
+}'. 
+
+    jinst1 := jclass1 new.
+    self should: [ callerClass getFoo: jinst1 ] raise: Error.
+
+    jclass2 := self compileAndRegister:'
+public class test_fields_05b { 
+    public String foo = "public_foo";
+}'.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass {
+    public static String getFoo(test_fields_05b inst) {
+        return inst.foo;
+    }
+}'.
+    self assert: jclass1 == jclass2.
+    self assert: (callerClass getFoo: jinst1) = 'private_foo'.
+
+    "Created: / 11-04-2013 / 10:41:52 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (format): / 13-10-2013 / 21:05:17 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 15-10-2013 / 00:03:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_fields_in_parent_01a
+    "
+    1) compile Parent class with one public field
+    2) subclass it by Child
+    3) add field to parent
+    4) check that Child has multivers
+    "
+
+    | parentClass parentClass2 childClass |
+
+    parentClass := self compileAndRegister:'
+public class test_fields_in_parent_01a { 
+    public String foo = "foo";
+}'.
+
+    childClass := self compileAndRegister:'
+public class test_fields_in_parent_01a_child extends test_fields_in_parent_01a {     
+}'.   
+
+    self assert: childClass hasMultipleVersions not.  
+
+    parentClass2 := self compileAndRegister:'
+public class test_fields_in_parent_01a {     
+    public String bar = "bar";
+    public String foo = "foo";  
+}'. 
+
+    self assert: childClass hasMultipleVersions.
+
+    "Created: / 28-10-2013 / 12:41:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - garbage versions'!
+
+test_old_versions_cleaned_01
+    "
+    1) compile simple class with one public field
+    2) compile new version - add second field after the first one
+    3) check that both versions exist after GC
+    4) throw away the reference to the first version
+    5) check only second version exists after GC
+    "
+
+    <skip> "/ Has to be reviewd
+
+    | jclass1 jinst1 jclass2 jinst2 |
+
+    jclass1 := self compileAndRegister:'
+public class test_old_versions_cleaned_01 { 
+    public String foo = "foo";
+}'.
+    jinst1 := jclass1 new.
+
+    jclass2 := self compileAndRegister:'
+public class test_old_versions_cleaned_01 { 
+    public String foo = "foo+bar";
+    public String bar = "foo+bar";
+}'.
+    jinst2 := jclass2 new.
+
+    ObjectMemory garbageCollect.
+    ObjectMemory scavenge.
+
+    self assert: jclass1 hasMultipleVersions.
+    self assert: jclass2 hasMultipleVersions.
+
+    jclass1 :=  nil.
+    jinst1 :=  nil.
+
+    ObjectMemory garbageCollect.
+    ObjectMemory scavenge.  
+
+    self assert: jclass2 hasMultipleVersions not.
+
+    "Created: / 28-10-2013 / 12:28:50 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 17-08-2014 / 08:42:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 20-01-2015 / 10:45:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - hierarchy'!
+
+test_hierarchy_00
+
+    "
+    1) compile a parent and a child class, parent having a method
+    2) change parent's method
+    3) assert the method is changed in child
+    "
+
+    | jclass1_A jclass1_B jinst1_B jclass_caller jinst2_B jclass2_B |
+
+    jclass1_A := self compileAndRegister:'
+public class test_hierarchy_00_A { 
+    public int foo() {
+        return 1;
+    }
+}'.
+
+     jclass1_B := self compileAndRegister:'
+public class test_hierarchy_00_B extends test_hierarchy_00_A { 
+}'.
+
+    jclass_caller :=  self compileAndRegister:'
+public class test_hierarchy_00_caller  {
+    public int call(test_hierarchy_00_B b) {
+        return b.foo();
+    }
+}'.
+
+    jinst1_B := jclass1_B new.
+
+    self assert: (jclass_caller new call: jinst1_B) == 1.
+
+    jclass2_B := self compileAndRegister:'
+public class test_hierarchy_00_B extends test_hierarchy_00_A { 
+  public int foo() {
+        return 2;
+    }
+}'.
+
+    jinst2_B := jclass2_B new.
+
+    self assert: (jclass_caller new call: jinst1_B) == 2.
+    self assert: (jclass_caller new call: jinst2_B) == 2.
+
+    "Created: / 09-04-2013 / 16:09:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 11-04-2013 / 11:24:33 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_hierarchy_01a
+
+    "
+    1) compile a parent and a child class
+    2) add field to parent
+    3) assert the field is present in new instances of child
+    "
+
+    | jclass1_A jclass2_A jclass1_B jinst1_B jclass_caller jinst2_B jclass2_B |
+
+    jclass1_A := self compileAndRegister:'
+public class test_hierarchy_01_A {}'.
+
+     jclass1_B := self compileAndRegister:'
+public class test_hierarchy_01_B extends test_hierarchy_01_A {}'.
+
+    jinst1_B := jclass1_B new.    
+
+    jclass2_A := self compileAndRegister:'
+public class test_hierarchy_01_A {
+    public int foo = 1;
+}'.
+
+    jclass2_B := self compileAndRegister:'
+public class test_hierarchy_01_B extends test_hierarchy_01_A {}'. 
+
+    jclass_caller :=  self compileAndRegister:'
+public class test_hierarchy_01_caller  {
+    public int call(test_hierarchy_01_B b) {
+        return b.foo;
+    }
+}'.
+
+    jinst2_B := jclass2_B new.
+
+    self should: [ jclass_caller new call: jinst1_B ] raise: Error.
+    self assert: (jclass_caller new call: jinst2_B) == 1.
+
+    "Created: / 11-04-2013 / 11:37:21 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 13-10-2013 / 16:17:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_hierarchy_02a
+
+    "
+    1) compile a grandparent, a parent and a child class, 
+          grandparent having a method, child overriding
+          the method and calling super.
+    2) override method in parent
+    3) assert the method from parent is called by super in child's method
+    "
+
+    | jclass1_A jclass1_B jclass1_C jinst1_C jclass_caller jinst2_C jclass2_B |
+
+    jclass1_A := self compileAndRegister:'
+public class test_hierarchy_02_A { 
+    public int foo() {
+        return 1;
+    }
+}'.
+
+     jclass1_B := self compileAndRegister:'
+public class test_hierarchy_02_B extends test_hierarchy_02_A {}'.
+
+     jclass1_C := self compileAndRegister:'
+public class test_hierarchy_02_C extends test_hierarchy_02_B {
+    public int foo() {
+        return super.foo();
+    }
+}'.
+
+    jclass_caller :=  self compileAndRegister:'
+public class test_hierarchy_02_caller  {
+    public int call(test_hierarchy_02_C c) {
+        return c.foo();
+    }
+}'.
+
+    jinst1_C := jclass1_C new.
+
+    self assert: (jclass_caller new call: jinst1_C) == 1.
+
+    jclass2_B := self compileAndRegister:'
+public class test_hierarchy_02_B extends test_hierarchy_02_A { 
+  public int foo() {
+        return 2;
+    }
+}'.
+
+    jinst2_C := jclass1_C new.
+
+    self assert: (jclass_caller new call: jinst1_C) == 2.
+    self assert: (jclass_caller new call: jinst2_C) == 2.
+
+    "Created: / 11-04-2013 / 11:07:26 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (comment): / 21-08-2013 / 23:39:24 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_hierarchy_02b
+
+    "
+    only a variation of test_hierarchy_02a
+    1) compile a grandparent, a parent and a child class, 
+          grandparent having a method, child overriding
+          the method and calling super.
+    2) override method in parent
+    3) assert the method from parent is called by super in child's method    
+    "
+
+    | jclass1_A jclass1_B jclass1_C jinst1_C jclass_caller jinst2_C jclass2_B |
+
+    jclass1_A := self compileAndRegister:'
+public class test_hierarchy_02_A { 
+    public int foo() {
+        return 1;
+    }
+
+    public int bar() {
+        return 10;
+    }
+}'.
+
+     jclass1_B := self compileAndRegister:'
+public class test_hierarchy_02_B extends test_hierarchy_02_A {}'.
+
+     jclass1_C := self compileAndRegister:'
+public class test_hierarchy_02_C extends test_hierarchy_02_B {
+    public int foo() {
+        return super.foo();
+    }
+
+    public int bar() {
+        return super.bar();
+    }
+}'.
+
+    jclass_caller :=  self compileAndRegister:'
+public class test_hierarchy_02_caller  {
+    public int callFoo(test_hierarchy_02_C c) {
+        return c.foo();
+    }
+
+    public int callBar(test_hierarchy_02_C c) {
+        return c.bar();
+    }
+}'.
+
+    jinst1_C := jclass1_C new.
+
+    self assert: (jclass_caller new callFoo: jinst1_C) == 1.
+    self assert: (jclass_caller new callBar: jinst1_C) == 10.
+
+    jclass2_B := self compileAndRegister:'
+public class test_hierarchy_02_B extends test_hierarchy_02_A { 
+    public int bar() {
+        return 20;
+    }        
+}'.
+
+    jinst2_C := jclass1_C new.
+
+    self assert: (jclass_caller new callFoo: jinst1_C) == 1.
+    self assert: (jclass_caller new callFoo: jinst2_C) == 1.
+    self assert: (jclass_caller new callBar: jinst1_C) == 20.
+    self assert: (jclass_caller new callBar: jinst2_C) == 20.
+
+    "Created: / 11-04-2013 / 11:07:49 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (comment): / 21-08-2013 / 23:39:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_hierarchy_03a
+
+    "
+    1) compile a grandparent, a parent and a child class, 
+          grandparent and child having a constructor, child calling
+          super in its constructor
+    2) add constructor to parent class
+    3) assert the constructor from parent is called from child's contructor    
+    "
+
+    | jclass1_A jclass1_B jclass1_C jinst1_C jclass_caller jinst2_C jclass2_B |
+
+    jclass1_A := self compileAndRegister:'
+public class test_hierarchy_03_A {
+    protected int foo;
+
+    public test_hierarchy_03_A(int foo) {
+        this.foo = foo;
+    }
+
+    public int getFoo() {
+        return foo;
+    }
+}'.
+
+     jclass1_B := self compileAndRegister:'
+public class test_hierarchy_03_B extends test_hierarchy_03_A {
+    public test_hierarchy_03_B(int foo) {
+        super(foo);
+    }  
+}'.
+
+     jclass1_C := self compileAndRegister:'
+public class test_hierarchy_03_C extends test_hierarchy_03_B {
+    public test_hierarchy_03_C(int foo) {
+        super(foo);
+    }    
+}'.
+
+    jclass_caller :=  self compileAndRegister:'
+public class test_hierarchy_03_caller  {
+    public int getFoo(test_hierarchy_03_C c) {
+        return c.getFoo();
+    }
+}'.
+
+    jinst1_C := jclass1_C new: 1.
+
+    self assert: (jclass_caller new getFoo: jinst1_C) == 1.
+
+    jclass2_B := self compileAndRegister:'
+public class test_hierarchy_03_B extends test_hierarchy_03_A { 
+    public test_hierarchy_03_B(int foo) {
+        super(2 * foo);
+    }        
+}'.
+
+    jinst2_C := jclass1_C new: 2.
+
+    self assert: (jclass_caller new getFoo: jinst1_C) == 1.
+    self assert: (jclass_caller new getFoo: jinst2_C) == 4.
+
+    "Created: / 11-04-2013 / 11:14:12 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 21-08-2013 / 23:47:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_hierarchy_04a
+
+    "
+    1) compile a parent1, parent2 and a child class, 
+          parent1 having an Integer field, parent2 having a String field.
+          Child extends parent1.
+    2) change child's superclass to parent2
+    3) assert new instances of child have new field
+    "
+
+    | jclass1_A1 jclass1_A2 jclass1_B jclass2_B jinst1_B jinst2_B jclass_caller |
+
+    jclass1_A1 := self compileAndRegister:'
+public class test_hierarchy_04_A1 {
+    public Integer foo = 1;
+}'.
+
+    jclass1_A2 := self compileAndRegister:'
+public class test_hierarchy_04_A2 {
+    public String foo = "foo";
+}'.
+
+     jclass1_B := self compileAndRegister:'
+public class test_hierarchy_04_B extends test_hierarchy_04_A1 {}'.     
+
+    jclass_caller :=  self compileAndRegister:'
+public class test_hierarchy_04_caller  {
+    public Object getFoo(test_hierarchy_04_B c) {
+        return c.foo;
+    }
+}'.
+
+    jinst1_B := jclass1_B new.
+
+    self assert: ((jclass_caller new getFoo: jinst1_B) equals: (Java as_Integer: 1)).
+
+    jclass2_B := self compileAndRegister:'
+public class test_hierarchy_04_B extends test_hierarchy_04_A2 {}'.
+
+    jinst2_B := jclass2_B new.
+
+
+    self assert: ((jclass_caller new getFoo: jinst1_B) equals: (Java as_Integer: 1)).
+    self assert: (jclass_caller new getFoo: jinst2_B) = (Java as_String: 'foo').
+
+    "Created: / 11-04-2013 / 13:16:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 12-10-2013 / 18:04:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - methods'!
+
+testAddingMethod    
+    "    
+    1) compile a class inheriting from ChangingClassParent.
+    2) instantiate inheriting class.
+    3) assert calling foo on subclass uses method from superclass'.
+    4) recompile inheriting class with overridden foo method.
+    5) assert overridden method is used.
+    "
+   | caller inst |
+   caller := self callerClass new.
+   self compileAndRegisterChangingClassParent.
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass extends ChangingClassParent {}
+'.
+     
+    inst := JAVA classReloadingTests ChangingClass new.
+    self assert: (caller callFooToString: inst) = 'parent'.        
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass extends ChangingClassParent {
+    public String foo() {
+        return "child";
+    }
+}'.
+    self assert: (caller callFooToString: inst) = 'child'.
+
+    "Created: / 06-12-2012 / 21:52:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified (comment): / 18-12-2012 / 14:12:06 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+testChangingSignatureOfMethod
+    "
+    1) compile a class with foo method returning string.    
+    2) instantiate the class.    
+    3) assert method returns string.
+    4) recompile class with foo method returning int.
+    5) assert new method is used.
+    "
+
+    | caller inst |
+    caller := self callerClass new.
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass {
+    public String toString() {
+        return "" + foo();
+    }
+
+    public String foo() {
+        return "child";
+    }
+}
+'.
+    inst := JAVA classReloadingTests ChangingClass new.
+    self assert: (caller callFooToString: inst) = 'child'.        
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass {
+    public String toString() {
+        return "" + foo();
+    }
+
+    public int foo() {
+        return 5;
+    }
+}'.
+    self assert: (caller callFooToString: inst) = '5'.
+
+    "Created: / 06-12-2012 / 21:50:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified (comment): / 18-12-2012 / 14:08:36 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+testModifyingMethod
+    "
+    1) compile a class with foo method.    
+    2) instantiate the class.    
+    3) assert method returns string.
+    4) recompile class with foo method returning different string.
+    5) assert new method is used.
+    "
+
+    | caller inst |
+    caller := self callerClass new.
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass {
+    public String toString() {
+        return "" + foo();
+    }
+
+    public String foo() {
+        return "child";
+    }
+}
+'.
+    inst := JAVA classReloadingTests ChangingClass new.
+    self assert: (caller callFooToString: inst) = 'child'.        
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass {
+    public String toString() {
+        return "" + foo();
+    }
+
+    public String foo() {
+        return "modified child";
+    }
+}'.
+        self assert: (caller callFooToString: inst) = 'modified child'.
+
+    "Created: / 06-12-2012 / 21:51:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
+    "Modified (comment): / 18-12-2012 / 14:09:48 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+testRemovingMethod   
+  "    
+    1) compile a class inheriting from ChangingClassParent, which overrides foo method.
+    2) instantiate inheriting class.
+    3) assert calling foo on subclass uses overridden method'.
+    4) recompile inheriting class without foo method.
+    5) assert parent method is used.
+    "
+   | caller inst |
+   caller := self callerClass new.
+   self compileAndRegisterChangingClassParent.
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass extends ChangingClassParent {
+    public String foo() {
+        return "child";
+    }
+}'.
+
+    inst := JAVA classReloadingTests ChangingClass new.
+    self assert: (caller callFooToString: inst) = 'child'.
+
+    self compileAndRegister: '
+package classReloadingTests;
+public class ChangingClass extends ChangingClassParent {}'.
+    self assert: (caller callFooToString: inst) = 'parent'.
+
+    "Created: / 16-12-2012 / 16:01:58 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (comment): / 18-12-2012 / 14:11:56 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_00
+    "
+    1) compile simple class with no method
+    3) recompile same source again.
+    4) check that class does not change
+    "
+
+    | jclass1 jclass2 |
+    jclass1 := self compileAndRegister:'
+public class test_01 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+    self assert: jclass1 new foo == 10.
+
+    jclass2 := self compileAndRegister:'
+public class test_01 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+
+    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == jclass1 message: 'compiled classes should be registered in testClassLoader'.
+
+    "Created: / 16-12-2012 / 23:51:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_00b
+    "
+    1) compile simple class with no method but in package
+    3) recompile same source again.
+    4) check that class does not change
+    "
+
+    | jclass1 jclass2 |
+    jclass1 := self compileAndRegister:'
+package zork;
+public class test_01 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+    self assert: jclass1 new foo == 10.
+
+    jclass2 := self compileAndRegister:'
+package zork;
+public class test_01 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+
+    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == jclass1 message: 'compiled classes should be registered in testClassLoader'.
+
+    "Created: / 16-12-2012 / 23:56:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified (comment): / 18-12-2012 / 12:02:24 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_01
+    "
+    1) compile simple class with one method return 10
+    2) call that method, check that it returns 10
+    3) recompile to return 20
+    4) call that method, check that it returns 20
+    "
+
+    | jclass1 jclass2 |
+    jclass1 := self compileAndRegister:'
+public class test_01 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+    self assert: jclass1 new foo == 10.
+
+    jclass2 := self compileAndRegister:'
+public class test_01 { 
+    public int foo() { 
+        return 20; 
+    }
+}'.
+
+    self assert: jclass2 new foo == 20.
+    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
+
+    "Created: / 16-12-2012 / 23:48:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_02a
+    "
+    1) compile simple class with one method return 10
+    2) call that method indirectly, check that it returns 10
+    3) recompile to return 20
+    4) call that method indirectly, check that it returns 20
+    "
+
+    | jclass1 jclass2 caller |
+    jclass1 := self compileAndRegister:'
+public class test_02 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+    caller := self compileAndRegister:'
+public class test_02_caller {
+    public int qux(test_02 t) {
+        return t.foo();
+    }
+}
+'.
+    self assert: (caller new qux: (jclass1 new)) == 10.
+
+    jclass2 := self compileAndRegister:'
+public class test_02 { 
+    public int foo() { 
+        return 20; 
+    }
+}'.
+    self assert: (caller new qux: (jclass2 new)) == 20.
+
+    "Created: / 17-12-2012 / 00:02:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_02b
+    "
+    1) compile simple class with one method return 10
+    2) call that method indirectly using fresh instance (NEW), 
+       check that it returns 10
+    3) recompile to return 20
+    4) call that method indirectly, check that it returns 20
+    "
+
+    | jclass1 jclass2 caller |
+    jclass1 := self compileAndRegister:'
+public class test_02 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+    caller := self compileAndRegister:'
+public class test_02_caller {
+    public int qux() {
+        test_02 t = new test_02();
+        return t.foo();
+    }
+}
+'.
+    self assert: (caller new qux) == 10.
+
+    jclass2 := self compileAndRegister:'
+public class test_02 { 
+    public int foo() { 
+        return 20; 
+    }
+}'.
+    self assert: (caller new qux) == 20.
+
+    "Created: / 17-12-2012 / 00:04:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_02c
+    "
+    Same as 02a, but with static methods
+    "
+
+    | jclass1 jclass2 caller |
+    jclass1 := self compileAndRegister:'
+public class test_02 { 
+    public static int foo() {
+        return 10; 
+    }
+}'.
+    caller := self compileAndRegister:'
+public class test_02_caller {
+    public int qux() {
+        return test_02.foo();
+    }
+}
+'.
+    self assert: (caller new qux) == 10.
+
+    jclass2 := self compileAndRegister:'
+public class test_02 { 
+    public static int foo() { 
+        return 20; 
+    }
+}'.
+    self assert: (caller new qux) == 20.
+
+    "Created: / 17-12-2012 / 00:03:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 18-12-2012 / 12:07:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_03a
+    "
+    1) compile simple class with one public **static** method that returns 10
+    2) call that method indirectly, check that it returns 10
+    3) change it to private method
+    4) calling method should raise exception
+    "
+
+    | jclass1 jclass2 caller |
+    jclass1 := self compileAndRegister:'
+public class test_03 { 
+    public static int foo() {
+        return 10; 
+    }
+}'.
+    caller := self compileAndRegister:'
+public class test_03_caller {
+    public static int qux() {
+        return test_03.foo();
+    }
+}
+'.
+    self assert: (caller new qux) == 10.
+
+    jclass2 := self compileAndRegister:'
+public class test_03 { 
+    private static int foo() { 
+        return 20; 
+    }
+}'.
+    self should: [ caller new qux ] raise: Error.
+
+    "Created: / 11-04-2013 / 10:44:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 21-08-2013 / 23:09:27 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (comment): / 16-10-2013 / 11:12:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_03b
+    "
+    1) compile simple class with one private **static** method that returns 10
+    2) call that method indirectly, check that it raises exception
+    3) change it to public method
+    4) calling method should not raise exception anymore
+    "
+
+    | jclass1 jclass2 jclass3 caller |
+    jclass1 := self compileAndRegister:'
+public class test_03 { 
+    public static int foo() {
+        return 10; 
+    }
+}'.
+    caller := self compileAndRegister:'
+public class test_03_caller {
+    public static int qux() {
+        return test_03.foo();
+    }
+}
+'.
+    self assert: (caller new qux) == 10.      
+
+    jclass2 := self compileAndRegister:'
+public class test_03 { 
+    private static int foo() { 
+        return 20; 
+    }
+}'.
+
+    self should: [ caller new qux ] raise: Error. 
+ 
+    jclass3 := self compileAndRegister:'
+public class test_03 { 
+    public static int foo() { 
+        return 42; 
+    }
+}'.
+    self assert: (caller new qux) == 42.
+
+    "Created: / 11-04-2013 / 10:46:31 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 21-08-2013 / 23:11:15 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified (comment): / 16-10-2013 / 11:11:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_04b
+    "
+    1) compile simple class with one private **static** method that returns 10
+    2) call that method indirectly, check that it raises exception
+    3) change it to public method
+    4) calling method should not raise exception anymore
+    "
+
+    | jclass1 jclass2 jclass3 caller |
+    jclass1 := self compileAndRegister:'
+public class test_04 { 
+    public int foo() {
+        return 10; 
+    }
+}'.
+    caller := self compileAndRegister:'
+public class test_03_caller {
+    public int qux(test_04 test) {
+        return test.foo();
+    }
+}
+'.
+    self assert: (caller new qux: jclass1 new) == 10.      
+
+    jclass2 := self compileAndRegister:'
+public class test_04 { 
+    private int foo() { 
+        return 20; 
+    }
+}'.
+
+    self should: [ caller new qux: jclass1 new ] raise: Error. 
+ 
+    jclass3 := self compileAndRegister:'
+public class test_04 { 
+    public int foo() { 
+        return 42; 
+    }
+}'.
+    self assert: (caller new qux: jclass1 new) == 42.
+
+    "Created: / 16-10-2013 / 11:17:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_05
+    "
+    1) compile simple class with one method, set a method-level breakpoint on it
+    3) recompile same source again.
+    4) check that class does not change
+    "
+
+    | jclass1 jclass2 |
+    jclass1 := self compileAndRegister:'
+public class test_01 { 
+    public int foo() { 
+        return 10; 
+    }
+}'.
+    self assert: jclass1 new foo == 10.
+    MessageTracer trapMethod: (jclass1 >> #'foo()V').
+
+    jclass2 := self compileAndRegister:'
+public class test_01 { 
+    public int foo() { 
+        return 15; 
+    }
+}'.
+
+    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
+    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == jclass1 message: 'compiled classes should be registered in testClassLoader'.
+
+    "Created: / 17-08-2014 / 08:34:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - overloads'!
+
+test_overloads_00a
+    "
+    1) compile simple class with one method taking Object arg
+    3) compile caller class passing in String
+    4) recompile simple class, overload the method with one taking String arg
+    5) assert caller class invokes the String method
+    "
+
+    | jclass1 jclass2 callerClass jinst1 jinst2 |
+    jclass1 := self compileAndRegister:'
+public class test_overloads_00 { 
+    public int foo(Object o) { 
+        return 1; 
+    }
+}'.    
+
+    callerClass := self compileAndRegister:'
+public class CallerClass { 
+    public int call(test_overloads_00 o) { 
+        return o.foo("foo"); 
+    }
+}'.
+    jinst1 := jclass1 new.
+
+    self assert: (callerClass new call: jinst1) = 1.
+
+    jclass2 := self compileAndRegister:'
+public class test_overloads_00 { 
+    public int foo(Object o) { 
+        return 1; 
+    }
+
+    public int foo(String s) { 
+        return 2; 
+    }
+}'. 
+    jinst2 := jclass2 new.
+
+    self assert: (callerClass new call: jinst1) = 2.
+    self assert: (callerClass new call: jinst2) = 2.
+
+    "Created: / 11-04-2013 / 13:29:44 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_overloads_00b
+    "
+    1) compile simple class with two methods taking Object and String arg
+    3) compile caller class passing in String
+    4) recompile simple class, remove overloaded method taking String arg
+    5) assert caller class invokes the Object method
+    "
+
+    | jclass1 jclass2 callerClass jinst1 jinst2 |
+    jclass1 := self compileAndRegister:'
+public class test_overloads_00 { 
+    public int foo(Object o) { 
+        return 1; 
+    }
+
+    public int foo(String s) { 
+        return 2; 
+    }
+}'.    
+
+    callerClass := self compileAndRegister:'
+public class CallerClass { 
+    public int call(test_overloads_00 o) { 
+        return o.foo("foo"); 
+    }
+}'.
+    jinst1 := jclass1 new.
+
+    self assert: (callerClass new call: jinst1) = 2.
+
+    jclass2 := self compileAndRegister:'
+public class test_overloads_00 { 
+    public int foo(Object o) { 
+        return 1; 
+    }
+}'. 
+    jinst2 := jclass2 new.
+
+    self assert: (callerClass new call: jinst1) = 1.
+    self assert: (callerClass new call: jinst2) = 1.
+
+    "Created: / 11-04-2013 / 13:30:38 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+!
+
+test_overloads_01a
+    "
+    1) compile simple class with one method taking Object arg
+    3) compile caller class passing in String
+    4) recompile simple class, overload the method with one taking String arg
+    5) assert caller class invokes the String method
+    "
+
+    | jclass1A jclass1B jclass2A callerClass jinst1 jinst2 |
+    jclass1A := self compileAndRegister:'
+public class test_overloads_01_A { 
+    public int foo(Object o) { 
+        return 1; 
+    }
+}'.    
+
+    jclass1B := self compileAndRegister:'
+public class test_overloads_01_B extends test_overloads_01_A {
+    public int foo(String foo) {
+        return super.foo(foo) + 10;
+    }
+}'.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass { 
+    public int call(test_overloads_01_B o) { 
+        return o.foo("foo"); 
+    }
+}'.
+    jinst1 := jclass1B new.
+
+    self assert: (callerClass new call: jinst1) = 11.
+
+    jclass2A := self compileAndRegister:'
+public class test_overloads_01_A { 
+    public int foo(Object o) { 
+        return 1; 
+    }
+
+    public int foo(String s) { 
+        return 2; 
+    }
+}'. 
+    jinst2 := jclass1B new.
+
+    self assert: (callerClass new call: jinst1) = 12.
+    self assert: (callerClass new call: jinst2) = 12.
+
+    "Created: / 11-04-2013 / 13:34:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 15-10-2013 / 23:33:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_overloads_01b
+    "
+    1) compile simple class with two overloaded methods taking Object and String arg
+    3) compile caller class passing in String
+    4) recompile simple class, remove overloaded method aking String arg
+    5) assert caller class invokes the Object method
+    "
+
+    | jclass1A jclass1B jclass2A callerClass jinst1 jinst2 |
+    jclass1A := self compileAndRegister:'
+public class test_overloads_01_A { 
+    public int foo(Object o) { 
+        return 1; 
+    }    
+
+    public int foo(String s) { 
+        return 2; 
+    }
+}'.    
+
+    jclass1B := self compileAndRegister:'
+public class test_overloads_01_B extends test_overloads_01_A {
+    public int foo(String foo) {
+        return super.foo(foo) + 10;
+    }
+}'.
+
+    callerClass := self compileAndRegister:'
+public class CallerClass { 
+    public int call(test_overloads_01_B o) { 
+        return o.foo("foo"); 
+    }
+}'.
+    jinst1 := jclass1B new.
+
+    self assert: (callerClass new call: jinst1) = 12.
+
+    jclass2A := self compileAndRegister:'
+public class test_overloads_01_A { 
+    public int foo(Object o) { 
+        return 1; 
+    } 
+}'. 
+    jinst2 := jclass1B new.
+
+    self assert: (callerClass new call: jinst1) = 11.
+    self assert: (callerClass new call: jinst2) = 11.
+
+    "Created: / 11-04-2013 / 13:35:15 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
+    "Modified: / 15-10-2013 / 23:34:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests methodsFor:'tests - unloading'!
+
+test_unloading_01
+    "
+    1) compile class A1 and class A2 inheriting from A1 
+    2) compile class B that instantiates A and  call its method A2.bar from B.foo
+    3) remove class A1 (should remove A2 as well)
+    4) call B.foo and checks it raises ClassNotFoundException
+    5) compile class A2
+    6) call B.foo and checks it returns new value
+    "
+
+    | jclassA1 jclassA2 jclassB jinstB |
+
+    jclassA1 := self compileAndRegister:'
+public class test_unloading_01_A1 { 
+    public int bar() {
+        return 1;
+    }
+}'.
+
+    jclassA2 := self compileAndRegister:'
+public class test_unloading_01_A2 extends test_unloading_01_A1 { 
+}'.
+
+
+    jclassB := self compileAndRegister:'
+public class test_unloading_01_B { 
+    public int foo() {
+        return (new test_unloading_01_A2()).bar();
+    }
+}'.
+    jinstB := jclassB new.
+    self assert: jinstB foo == 1.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA1).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA2).
+
+
+    jclassA1 removeFromSystem.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA1) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA2) not.
+
+    [
+        jinstB foo.
+        self assert: false "/ should raise ClassNotFoundException
+    ] on: JAVA java lang ClassNotFoundException do:[
+        self assert: true.
+    ].
+
+    jclassA2 := self compileAndRegister:'
+public class test_unloading_01_A2 { 
+    public int bar() {
+        return 20;
+    }
+}'.
+
+    self assert: jinstB foo == 20.
+
+    "Created: / 14-09-2013 / 18:57:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_02
+    "
+    1) compile class A 
+    2) compile class B that instantiates A and  call its method A. bar from B.foo
+    3) remove class A
+    4) call B.foo and checks it raises ClassNotFoundException
+    5) compile class A
+    6) call B.foo and checks it returns new value
+    "
+
+    | jclassA jclassB jinstB |
+
+    jclassA := self compileAndRegister:'
+public class test_unloading_01_A { 
+    public int bar() {
+        return 1;
+    }
+}'.
+
+    jclassB := self compileAndRegister:'
+public class test_unloading_01_B { 
+    public int foo() {
+        return (new test_unloading_01_A()).bar();
+    }
+}'.
+    jinstB := jclassB new.
+    self assert: jinstB foo == 1.
+
+    jclassA removeFromSystem.
+    [
+        jinstB foo.
+        self assert: false "/ should raise ClassNotFoundException
+    ] on: JAVA java lang ClassNotFoundException do:[
+        self assert: true.
+    ].
+
+    jclassA := self compileAndRegister:'
+public class test_unloading_01_A { 
+    public int bar() {
+        return 20;
+    }
+}'.
+
+    self assert: jinstB foo == 20.
+
+    "Created: / 16-10-2013 / 10:11:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_02a
+    "
+    1) compile interface I1 and class A2 implementing I1
+    2) compile class B that instantiates A and  call its method A2.bar from B.foo
+    3) remove class I1 (should remove A2 as well)
+    4) call B.foo and checks it raises ClassNotFoundException
+    5) compile class A2
+    6) call B.foo and checks it returns new value
+    "
+
+    | jclassI1 jclassA2 jclassB jinstB |
+
+    jclassI1 := self compileAndRegister:'
+public interface test_unloading_01_I1 { 
+    public int bar()
+}'.
+
+    jclassA2 := self compileAndRegister:'
+public class test_unloading_01_A2 implements test_unloading_01_I1 { 
+    public int bar() { return 1; }
+}'.
+
+
+    jclassB := self compileAndRegister:'
+public class test_unloading_01_B { 
+    public int foo() {
+        return (new test_unloading_01_A2()).bar();
+    }
+}'.
+    jinstB := jclassB new.
+    self assert: jinstB foo == 1.
+    self assert: (Smalltalk allClasses includesIdentical: jclassI1).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA2).
+
+
+    jclassI1 removeFromSystem.
+    self assert: (Smalltalk allClasses includesIdentical: jclassI1) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA2) not.
+
+    [
+        jinstB foo.
+        self assert: false "/ should raise ClassNotFoundException
+    ] on: JAVA java lang ClassNotFoundException do:[
+        self assert: true.
+    ].
+
+    jclassA2 := self compileAndRegister:'
+public class test_unloading_01_A2 { 
+    public int bar() {
+        return 20;
+    }
+}'.
+
+    self assert: jinstB foo == 20.
+
+    "Created: / 14-09-2013 / 19:02:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_02b
+    "
+    1) compile interface I1, I2, I2 implenting I1, and class A2 implementing I2
+    2) compile class B that instantiates A and  call its method A2.bar from B.foo
+    3) remove class I1 (should remove A2 as well)
+    4) call B.foo and checks it raises ClassNotFoundException
+    5) compile class A2
+    6) call B.foo and checks it returns new value
+    "
+
+    | jclassI1 jclassI2 jclassA2 jclassB jinstB |
+
+    jclassI1 := self compileAndRegister:'
+public interface test_unloading_01_I1 { 
+    public int bar()
+}'.
+
+    jclassI2 := self compileAndRegister:'
+public interface test_unloading_01_I2 extends  test_unloading_01_I1 { 
+}'.
+
+
+    jclassA2 := self compileAndRegister:'
+public class test_unloading_01_A2 implements test_unloading_01_I1 { 
+    public int bar() { return 1; }
+}'.
+
+
+    jclassB := self compileAndRegister:'
+public class test_unloading_01_B { 
+    public int foo() {
+        return (new test_unloading_01_A2()).bar();
+    }
+}'.
+    jinstB := jclassB new.
+    self assert: jinstB foo == 1.
+    self assert: (Smalltalk allClasses includesIdentical: jclassI1).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA2).
+
+
+    jclassI1 removeFromSystem.
+    self assert: (Smalltalk allClasses includesIdentical: jclassI1) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassI2) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA2) not.
+
+    [
+        jinstB foo.
+        self assert: false "/ should raise ClassNotFoundException
+    ] on: JAVA java lang ClassNotFoundException do:[
+        self assert: true.
+    ].
+
+    jclassA2 := self compileAndRegister:'
+public class test_unloading_01_A2 { 
+    public int bar() {
+        return 20;
+    }
+}'.
+
+    self assert: jinstB foo == 20.
+
+    "Created: / 14-09-2013 / 19:04:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 15-09-2013 / 00:40:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_03a
+    "
+    1) compile class A with inner class InnerA
+    2) remove class A
+    3) check that InnerA has been removed too.
+    "
+
+    | jclassA jclassInnerA |
+
+    self compileAndRegister:'
+public class test_unloading_03a_A { 
+    public static class InnerA {
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
+    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
+
+    jclassA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
+
+    "Created: / 08-08-2014 / 22:00:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+    "Modified: / 08-08-2014 / 23:02:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_03b
+    "
+    1) compile class A with inner class InnerA
+    2) remove class A
+    3) check that both classes are gone
+    "
+
+    | jclassA jclassInnerA |
+
+    self compileAndRegister:'
+public class test_unloading_03a_A { 
+    public static class InnerA {
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
+    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
+
+    jclassInnerA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) .
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) notNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
+
+    "Created: / 11-08-2014 / 09:25:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_03c
+    "
+    1) compile class A with inner class InnerA
+    2) remove class A
+    3) check that both classes are gone
+    "
+
+    | jclassA jclassInnerA |
+
+    self compileAndRegister:'
+public class test_unloading_03a_A { 
+    public static class InnerA {
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
+    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
+
+    jclassA removeFromSystem.
+    jclassInnerA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
+
+    "Created: / 11-08-2014 / 09:25:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_03d
+    "
+    1) compile class A with inner class InnerA
+    2) remove class A
+    3) check that both classes are gone
+    "
+
+    | jclassA jclassInnerA |
+
+    self compileAndRegister:'
+public class test_unloading_03a_A { 
+    public static class InnerA {
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
+    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
+
+    jclassInnerA removeFromSystem.
+    jclassA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
+
+    "Created: / 11-08-2014 / 09:26:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_04a
+    "
+    1) compile class A with annonymous class A$1
+    2) remove class A then A$1
+    3) check that A$1 has been removed too.
+    "
+
+    | jclassA jclassA_1 |
+
+    self compileAndRegister:'
+public class test_unloading_04a_A { 
+    public Object foo() {
+        return new Object() { public void bar() { } };
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_04a_A' definedBy: testClassLoader.
+    jclassA_1 := JavaVM classNamed: #'test_unloading_04a_A$1' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
+
+    jclassA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_04a_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_04a_A$1' definedBy: testClassLoader) isNil.
+
+    "Created: / 12-08-2014 / 22:17:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_04b
+    "
+    1) compile class A with annonymous class A$1
+    2) remove class A$1
+    3) check that A$1 has been removed too.
+    "
+
+    | jclassA jclassA_1 |
+
+    self compileAndRegister:'
+public class test_unloading_04b_A { 
+    public Object foo() {
+        return new Object() { public void bar() { } };
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_04b_A' definedBy: testClassLoader.
+    jclassA_1 := JavaVM classNamed: #'test_unloading_04b_A$1' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
+
+    jclassA_1 removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_04b_A' definedBy: testClassLoader) notNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_04b_A$1' definedBy: testClassLoader) isNil.
+
+    "Created: / 12-08-2014 / 22:23:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_04c
+    "
+    1) compile class A with annonymous class A$1
+    2) remove class A then A$1
+    3) check that A$1 has been removed too.
+    "
+
+    | jclassA jclassA_1 |
+
+    self compileAndRegister:'
+public class test_unloading_04c_A { 
+    public Object foo() {
+        return new Object() { public void bar() { } };
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_04c_A' definedBy: testClassLoader.
+    jclassA_1 := JavaVM classNamed: #'test_unloading_04c_A$1' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
+
+    jclassA removeFromSystem.
+    jclassA_1 removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_04c_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_04c_A$1' definedBy: testClassLoader) isNil.
+
+    "Created: / 12-08-2014 / 22:24:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_04d
+    "
+    1) compile class A with annonymous class A$1
+    2) remove class A then A$1
+    3) check that A$1 has been removed too.
+    "
+
+    | jclassA jclassA_1 |
+
+    self compileAndRegister:'
+public class test_unloading_04d_A { 
+    public Object foo() {
+        return new Object() { public void bar() { } };
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_04d_A' definedBy: testClassLoader.
+    jclassA_1 := JavaVM classNamed: #'test_unloading_04d_A$1' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
+
+    jclassA_1 removeFromSystem.
+    jclassA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_04d_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_04d_A$1' definedBy: testClassLoader) isNil.
+
+    "Created: / 12-08-2014 / 22:25:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+!
+
+test_unloading_04e
+    "
+    1) compile class A with nested class A$Nested and annonymous class A$1
+    2) remove class A then A$Nested
+    3) check that A$1 has been removed too.
+    "
+
+    | jclassA jclassA_Nested jclassA_1 |
+
+    self compileAndRegister:'
+public class test_unloading_04e_A {
+    public static class Nested {
+        public Object foo() {
+            return new Object() { public int bar() { return 10; } };
+        }
+    }
+}'.
+
+    jclassA := JavaVM classNamed: #'test_unloading_04e_A' definedBy: testClassLoader.
+    jclassA_Nested := JavaVM classNamed: #'test_unloading_04e_A$Nested' definedBy: testClassLoader.
+    jclassA_1 := JavaVM classNamed: #'test_unloading_04e_A$1' definedBy: testClassLoader.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_Nested).
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
+
+    jclassA removeFromSystem.
+
+    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_Nested) not.
+    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
+
+    self assert: (JavaVM classNamed: #'test_unloading_04e_A' definedBy: testClassLoader) isNil.    
+    self assert: (JavaVM classNamed: #'test_unloading_04e_A$Nested' definedBy: testClassLoader) isNil.
+    self assert: (JavaVM classNamed: #'test_unloading_04e_A$1' definedBy: testClassLoader) isNil.
+
+    "Created: / 10-10-2014 / 12:08:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
+! !
+
+!JavaClassReloaderTests class methodsFor:'documentation'!
+
+version_CVS
+    ^ '$Header: /cvs/stx/stx/libjava/experiments/ClassReloadingTests.st,v 1.2 2013-02-25 11:15:34 vrany Exp $'
+!
+
+version_HG
+
+    ^ '$Changeset: <not expanded> $'
+!
+
+version_SVN
+    ^ '§Id::                                                                                                                        §'
+! !
+
--- a/abbrev.stc	Tue Jan 20 10:41:54 2015 +0100
+++ b/abbrev.stc	Tue Jan 20 10:49:24 2015 +0100
@@ -3,6 +3,7 @@
 # it provides information about a classes filename, category and especially namespace.
 GroovyCompiler GroovyCompiler stx:libjava 'Languages-Groovy-Compiler' 0
 GroovyEvaluator GroovyEvaluator stx:libjava 'Languages-Groovy-Compiler' 0
+GroovyEvaluatorTests GroovyEvaluatorTests stx:libjava 'Languages-Groovy-Tests' 1
 GroovyLanguage GroovyLanguage stx:libjava 'Languages-Groovy-Support' 1
 GroovySourceFileWriter GroovySourceFileWriter stx:libjava 'Languages-Groovy-Support' 0
 JavaAnnotation JavaAnnotation stx:libjava 'Languages-Java-Reader-Support' 0
@@ -10,14 +11,18 @@
 JavaAnnotationDefault JavaAnnotationDefault stx:libjava 'Languages-Java-Annotations' 1
 JavaAnnotationDictionary JavaAnnotationDictionary stx:libjava 'Languages-Java-Annotations' 1
 JavaAnnotationValue JavaAnnotationValue stx:libjava 'Languages-Java-Reader-Support' 0
+JavaAntProjectResource JavaAntProjectResource stx:libjava 'Languages-Java-Tests' 2
 JavaArray JavaArray stx:libjava 'Languages-Java-Classes' 1
 JavaBooleanArray JavaBooleanArray stx:libjava 'Languages-Java-Support' 0
 JavaByte JavaByte stx:libjava 'Languages-Java-Support' 0
 JavaByteCodeProcessor JavaByteCodeProcessor stx:libjava 'Languages-Java-Bytecode' 0
+JavaByteCodeProcessorTests JavaByteCodeProcessorTests stx:libjava 'Languages-Java-Tests' 1
 JavaClassAccessor JavaClassAccessor stx:libjava 'Languages-Java-Classes' 0
 JavaClassEnvironment JavaClassEnvironment stx:libjava 'Languages-Java-Support' 0
+JavaClassLoadingTests JavaClassLoadingTests stx:libjava 'Languages-Java-Tests-ClassLoading' 1
 JavaClassQuery JavaClassQuery stx:libjava 'Languages-Java-Classes' 1
 JavaClassReloader JavaClassReloader stx:libjava 'Languages-Java-Support' 0
+JavaClassReloaderTests JavaClassReloaderTests stx:libjava 'Languages-Java-Tests-ClassReloading' 1
 JavaCodeLibraryOrBundle JavaCodeLibraryOrBundle stx:libjava 'Languages-Java-Support-Libraries' 0
 JavaCompilerForSmalltalkExtensionsOnly JavaCompilerForSmalltalkExtensionsOnly stx:libjava 'Languages-Java-Support-Compiling' 0
 JavaCompiler_Eclipse JavaCompiler_Eclipse stx:libjava 'Languages-Java-Tools-Eclipse' 0
@@ -28,33 +33,46 @@
 JavaDescriptor JavaDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaError JavaError stx:libjava 'Languages-Java-Support' 1
 JavaExceptionTable JavaExceptionTable stx:libjava 'Languages-Java-Support' 0
+JavaExceptionTests JavaExceptionTests stx:libjava 'Languages-Java-Tests' 1
 JavaField JavaField stx:libjava 'Languages-Java-Reader-Support' 0
 JavaFinalizationRegistry JavaFinalizationRegistry stx:libjava 'Languages-Java-Support' 0
+JavaFreshlyInitializedResource JavaFreshlyInitializedResource stx:libjava 'Languages-Java-Tests' 1
 JavaInnerClasses JavaInnerClasses stx:libjava 'Languages-Java-Support' 0
+JavaJUnitTests JavaJUnitTests stx:libjava 'Languages-Java-Tests-Libraries' 1
 JavaLanguage JavaLanguage stx:libjava 'Languages-Java-Support' 1
 JavaLibraries JavaLibraries stx:libjava 'Languages-Java-Support' 0
+JavaLibrariesResource JavaLibrariesResource stx:libjava 'Languages-Java-Tests' 1
 JavaLocalVariableTable JavaLocalVariableTable stx:libjava 'Languages-Java-Support' 0
 JavaLocalVariableTableEntry JavaLocalVariableTableEntry stx:libjava 'Languages-Java-Support' 0
 JavaLookup JavaLookup stx:libjava 'Languages-Java-Interop' 0
+JavaLookupResolutionAlgorithmTests JavaLookupResolutionAlgorithmTests stx:libjava 'Languages-Java-Tests-Interop' 1
+JavaLookupTests JavaLookupTests stx:libjava 'Languages-Java-Tests-Interop' 1
 JavaMetaclass JavaMetaclass stx:libjava 'Languages-Java-Classes' 0
 JavaMonitor JavaMonitor stx:libjava 'Languages-Java-Support' 0
+JavaMonitorsTests JavaMonitorsTests stx:libjava 'Languages-Java-Tests' 1
 JavaNameAndType2 JavaNameAndType2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaNativeMemory JavaNativeMemory stx:libjava 'Languages-Java-Support' 0
+JavaNativeMemoryTests JavaNativeMemoryTests stx:libjava 'Languages-Java-Tests' 1
 JavaNioSupport JavaNioSupport stx:libjava 'Languages-Java-Support-Native' 0
 JavaObject JavaObject stx:libjava 'Languages-Java-Classes' 0
 JavaObjectDictionary JavaObjectDictionary stx:libjava 'Languages-Java-Support' 0
 JavaPopUpView JavaPopUpView stx:libjava 'Languages-Java-Views-Support' 2
 JavaProcess JavaProcess stx:libjava 'Languages-Java-Classes' 0
 JavaRef2 JavaRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
+JavaRefsAndConstantPoolTestCase JavaRefsAndConstantPoolTestCase stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaRelease JavaRelease stx:libjava 'Languages-Java-Support' 1
+JavaReleaseTests JavaReleaseTests stx:libjava 'Languages-Java-Tests' 1
 JavaResolver JavaResolver stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaShort JavaShort stx:libjava 'Languages-Java-Support' 0
 JavaSlotIndexCache JavaSlotIndexCache stx:libjava 'Languages-Java-Support' 0
 JavaSocket JavaSocket stx:libjava 'Languages-Java-Support' 0
 JavaSourceCodeCache JavaSourceCodeCache stx:libjava 'Languages-Java-Support' 1
 JavaSourceFileWriter JavaSourceFileWriter stx:libjava 'Languages-Java-Support' 0
+JavaTestCaseProxy JavaTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
 JavaTestsLoader JavaTestsLoader stx:libjava 'Languages-Java-Tests' 0
+JavaThreadingTests JavaThreadingTests stx:libjava 'Languages-Java-Tests' 1
 JavaTopView JavaTopView stx:libjava 'Languages-Java-Views-Support' 2
+JavaUTF8Tests JavaUTF8Tests stx:libjava 'Languages-Java-Tests' 1
 JavaUnresolvedCompilationError JavaUnresolvedCompilationError stx:libjava 'Languages-Java-Support' 1
 JavaUnresolvedConstant JavaUnresolvedConstant stx:libjava 'Languages-Java-Reader-Support' 0
 JavaUtilities JavaUtilities stx:libjava 'Languages-Java-Utilities' 0
@@ -70,6 +88,7 @@
 SmalltalkAppletStub SmalltalkAppletStub stx:libjava 'Languages-Java-Views-Support' 0
 stx_libjava stx_libjava stx:libjava '* Projects & Packages *' 3
 GroovyMetaclass GroovyMetaclass stx:libjava 'Languages-Groovy-Classes' 0
+JUnitTestCaseProxy JUnitTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
 Java Java stx:libjava 'Languages-Java-Support' 0
 JavaAnnotationArrayValue JavaAnnotationArrayValue stx:libjava 'Languages-Java-Reader-Support' 0
 JavaAnnotationClassValue JavaAnnotationClassValue stx:libjava 'Languages-Java-Reader-Support' 0
@@ -78,12 +97,15 @@
 JavaAnnotationPrimitiveValue JavaAnnotationPrimitiveValue stx:libjava 'Languages-Java-Reader-Support' 0
 JavaBehavior JavaBehavior stx:libjava 'Languages-Java-Classes' 0
 JavaByteCodeDisassembler JavaByteCodeDisassembler stx:libjava 'Languages-Java-Bytecode' 0
+JavaByteCodeDisassemblerTests JavaByteCodeDisassemblerTests stx:libjava 'Languages-Java-Tests' 1
 JavaByteCodeEnumerator JavaByteCodeEnumerator stx:libjava 'Languages-Java-Support-Decompiling' 0
 JavaByteCodeProcessorAdapter JavaByteCodeProcessorAdapter stx:libjava 'Languages-Java-Bytecode' 0
 JavaClassAnnotationContainer JavaClassAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaClassMemberRef2 JavaClassMemberRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaClassReader JavaClassReader stx:libjava 'Languages-Java-Support' 0
+JavaClassReaderTests JavaClassReaderTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaClassRef2 JavaClassRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
+JavaClassRefTests JavaClassRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaClassRegistry JavaClassRegistry stx:libjava 'Languages-Java-Support' 0
 JavaCodeBundle JavaCodeBundle stx:libjava 'Languages-Java-Support-Libraries' 0
 JavaCodeLibrary JavaCodeLibrary stx:libjava 'Languages-Java-Support-Libraries' 0
@@ -91,16 +113,23 @@
 JavaFieldAnnotationContainer JavaFieldAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaFieldDescriptor JavaFieldDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaFieldDescriptorWithUnionType JavaFieldDescriptorWithUnionType stx:libjava 'Languages-Java-Support' 0
+JavaFieldRefTests JavaFieldRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
+JavaInitializedResource JavaInitializedResource stx:libjava 'Languages-Java-Tests' 2
+JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaInvalidRefError JavaInvalidRefError stx:libjava 'Languages-Java-Support' 1
 JavaInvokeDynamic2 JavaInvokeDynamic2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaMethod JavaMethod stx:libjava 'Languages-Java-Classes' 0
 JavaMethodAnnotationContainer JavaMethodAnnotationContainer stx:libjava 'Languages-Java-Annotations' 1
 JavaMethodDescriptor JavaMethodDescriptor stx:libjava 'Languages-Java-Support' 0
 JavaMethodHandle2 JavaMethodHandle2 stx:libjava 'Languages-Java-Reader-Support-new' 0
+JavaMethodRefTests JavaMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaMethodType2 JavaMethodType2 stx:libjava 'Languages-Java-Reader-Support-new' 0
 JavaMirror JavaMirror stx:libjava 'Languages-Java-Classes' 0
 JavaNativeMethodImpl_OpenJDK6 JavaNativeMethodImpl_OpenJDK6 stx:libjava 'Languages-Java-Support-Java 6' 0
+JavaRefMock JavaRefMock stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 0
+JavaRuntimeConstantPoolTests JavaRuntimeConstantPoolTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
 JavaStringRef2 JavaStringRef2 stx:libjava 'Languages-Java-Reader-Support-new' 0
+JavaTestsResource JavaTestsResource stx:libjava 'Languages-Java-Tests' 2
 JavaUnhandledExceptionError JavaUnhandledExceptionError stx:libjava 'Languages-Java-Support' 1
 JavaUnhandledThreadDeathError JavaUnhandledThreadDeathError stx:libjava 'Languages-Java-Support' 1
 JavaUnresolvedClassConstant JavaUnresolvedClassConstant stx:libjava 'Languages-Java-Reader-Support' 0
@@ -110,6 +139,7 @@
 ProxyMethodGuardNode ProxyMethodGuardNode stx:libjava 'System-Compiler-Interop' 0
 ProxyMethodInvocationNode ProxyMethodInvocationNode stx:libjava 'System-Compiler-Interop' 0
 ProxyMethodJavaFieldAccessor ProxyMethodJavaFieldAccessor stx:libjava 'Languages-Java-Interop' 0
+TestletTestCaseProxy TestletTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
 JavaAlienMirror JavaAlienMirror stx:libjava 'Languages-Java-Classes' 0
 JavaArrayMirror JavaArrayMirror stx:libjava 'Languages-Java-Classes' 0
 JavaByteCodePreresolver JavaByteCodePreresolver stx:libjava 'Languages-Java-Bytecode' 0
@@ -139,32 +169,3 @@
 ProxyMethodJavaTypeCheckNode ProxyMethodJavaTypeCheckNode stx:libjava 'Languages-Java-Interop' 0
 JavaNativeMethod JavaNativeMethod stx:libjava 'Languages-Java-Classes' 0
 JavaNativeMethodImpl_OracleJDK8 JavaNativeMethodImpl_OracleJDK8 stx:libjava 'Languages-Java-Support-Java 8' 0
-GroovyEvaluatorTests GroovyEvaluatorTests stx:libjava 'Languages-Groovy-Tests' 1
-JUnitTestCaseProxy JUnitTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
-JavaAntProjectResource JavaAntProjectResource stx:libjava 'Languages-Java-Tests' 2
-JavaByteCodeDisassemblerTests JavaByteCodeDisassemblerTests stx:libjava 'Languages-Java-Tests' 1
-JavaByteCodeProcessorTests JavaByteCodeProcessorTests stx:libjava 'Languages-Java-Tests' 1
-JavaClassLoadingTests JavaClassLoadingTests stx:libjava 'Languages-Java-Tests-ClassLoading' 1
-JavaClassReaderTests JavaClassReaderTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaClassRefTests JavaClassRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaExceptionTests JavaExceptionTests stx:libjava 'Languages-Java-Tests' 1
-JavaFieldRefTests JavaFieldRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaFreshlyInitializedResource JavaFreshlyInitializedResource stx:libjava 'Languages-Java-Tests' 1
-JavaInitializedResource JavaInitializedResource stx:libjava 'Languages-Java-Tests' 2
-JavaInterfaceMethodRefTests JavaInterfaceMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaJUnitTests JavaJUnitTests stx:libjava 'Languages-Java-Tests-Libraries' 1
-JavaLibrariesResource JavaLibrariesResource stx:libjava 'Languages-Java-Tests' 1
-JavaLookupResolutionAlgorithmTests JavaLookupResolutionAlgorithmTests stx:libjava 'Languages-Java-Tests-Interop' 1
-JavaLookupTests JavaLookupTests stx:libjava 'Languages-Java-Tests-Interop' 1
-JavaMethodRefTests JavaMethodRefTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaMonitorsTests JavaMonitorsTests stx:libjava 'Languages-Java-Tests' 1
-JavaNativeMemoryTests JavaNativeMemoryTests stx:libjava 'Languages-Java-Tests' 1
-JavaRefMock JavaRefMock stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 0
-JavaRefsAndConstantPoolTestCase JavaRefsAndConstantPoolTestCase stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaReleaseTests JavaReleaseTests stx:libjava 'Languages-Java-Tests' 1
-JavaRuntimeConstantPoolTests JavaRuntimeConstantPoolTests stx:libjava 'Languages-Java-Tests-RuntimeConstantPool' 1
-JavaTestCaseProxy JavaTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
-JavaTestsResource JavaTestsResource stx:libjava 'Languages-Java-Tests' 2
-JavaThreadingTests JavaThreadingTests stx:libjava 'Languages-Java-Tests' 1
-JavaUTF8Tests JavaUTF8Tests stx:libjava 'Languages-Java-Tests' 1
-TestletTestCaseProxy TestletTestCaseProxy stx:libjava 'Languages-Java-Tests-Proxies' 3
--- a/experiments/JavaClassReloaderTests.st	Tue Jan 20 10:41:54 2015 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,2531 +0,0 @@
-"
- Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
-                         SWING Research Group, Czech Technical University 
-                         in Prague
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the 'Software'), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-"
-"{ Package: 'stx:libjava/experiments' }"
-
-"{ NameSpace: Smalltalk }"
-
-TestCase subclass:#JavaClassReloaderTests
-	instanceVariableNames:'testClassLoader'
-	classVariableNames:''
-	poolDictionaries:''
-	category:'Languages-Java-Tests-ClassReloading'
-!
-
-!JavaClassReloaderTests class methodsFor:'documentation'!
-
-copyright
-"
- Copyright (c) 2010-2011 Jan Vrany, Jan Kurs & Marcel Hlopko,
-                         SWING Research Group, Czech Technical University 
-                         in Prague
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the 'Software'), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-
-"
-!
-
-history
-
-    "Created: #resources / 21-12-2012 / 18:09:27 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: #setUp / 02-10-2013 / 22:54:13 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: #tearDown / 02-10-2013 / 22:54:16 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests class methodsFor:'resources'!
-
-resources
-
-  ^ Array 
-        with: JavaInitializedResource.
-
-    "Created: / 21-12-2012 / 18:09:27 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'interfaces'!
-
-testAddingInterface
-    OperatingSystem getLoginName = 'm' ifTrue:[
-        self assert: false message: 'implement me!!'
-    ]
-
-    "Created: / 16-12-2012 / 17:40:40 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 03-04-2013 / 22:07:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'private'!
-
-compile: sourceCode
-    | classes |
-
-    classes := JavaCompiler compile: sourceCode.
-"/    classes do:[:cls|cls classLoader: testClassLoader] .
-    ^classes
-
-    "Created: / 16-12-2012 / 17:02:41 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 09-04-2013 / 22:39:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-compileAndRegister: sourceCode
-    |compiledClasses|
-
-    compiledClasses := self compile: sourceCode.
-    ^ self register: compiledClasses.
-
-    "Created: / 16-12-2012 / 16:59:19 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-performTest
-
-    JavaClassReader classLoaderQuerySignal answer: testClassLoader do:[
-        super performTest
-    ].
-
-    "Created: / 16-12-2012 / 16:35:01 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-register: aClassOrArray
-
-    ^aClassOrArray isArray ifTrue:[
-        JavaVM registry registerClasses: aClassOrArray .
-        JavaVM registry classNamed: aClassOrArray anElement binaryName loader: aClassOrArray anElement classLoader
-    ] ifFalse:[
-        JavaVM registry registerClass: aClassOrArray.
-        JavaVM registry classNamed: aClassOrArray binaryName loader: aClassOrArray classLoader
-    ].
-
-    "Created: / 16-12-2012 / 17:02:04 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 14-10-2013 / 23:12:02 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-testInfrastructure
-
-    |compiledClass|
-
-    self assert: (JavaClassReader classLoaderQuerySignal query = testClassLoader ) 
-        message: 'tests should run in testClassLoader sandbox'.
-    compiledClass := self compileAndRegister: '
-public class HelloSun {
-
-    public String hello() {
-        return "helloooo";
-    }
-
-}
-'.
-    self assert: compiledClass notNil message: 'Java compiler should be working for these tests to run'.
-    self assert: compiledClass classLoader = testClassLoader message: 'compiled classes should have testClassLoader as their defining cl'.
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == compiledClass message: 'compiled classes should be registered in testClassLoader'.
-
-    "Created: / 16-12-2012 / 16:38:17 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'running'!
-
-setUp
-    testClassLoader := JAVA java lang ClassLoader new.
-    ObjectMemory garbageCollect.
-
-    "Created: / 16-12-2012 / 16:32:32 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 02-10-2013 / 22:54:13 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-tearDown
-    JavaVM registry unregisterClassLoader: testClassLoader.
-    ObjectMemory garbageCollect.
-
-    "Created: / 16-12-2012 / 16:33:31 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 02-10-2013 / 22:54:16 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'test helpers'!
-
-callerClass
-    | callerClass |
-    callerClass := (JavaCompiler 
-            compile: '
-package classReloadingTests;
-public class Caller {
-    public String callFooToString(Object c) {
-        return c.toString();
-    }   
-}
-') anElement.
-    callerClass 
-        ifNil: [ self error: 'callerClass is expected to be not nil in these tests' ].
-    ^ callerClass.
-
-    "Created: / 06-12-2012 / 21:41:35 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified: / 18-12-2012 / 14:00:12 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 04-01-2013 / 14:51:47 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-compileAndRegisterChangingClassParent
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClassParent {
-    public String foo() {
-        return "parent";
-    }
-
-    public String toString() {
-        return "" + foo();
-    }   
-}'.
-
-    "Created: / 18-12-2012 / 13:47:32 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - classes'!
-
-test_classes_01a
-    "
-    1) compile simple class with static method that returns an instance
-       **non-existent** class Missing
-    2) 
-    3) compile Missing class
-    4) call that static method, should return an instance of Missing
-    "
-
-    | user missing  |
-    user := self compileAndRegister:'
-public class test_classes_01a_user { 
-    public static Object foo() {
-        return new test_classes_01a_Missing();
-    }
-}'.
-
-    self should: [ user new foo ] raise: JavaUnresolvedCompilationError.
-
-    missing := self compileAndRegister:'
-public class test_classes_01a_Missing {
-}
-'.
-
-    self shouldnt: [ user new foo ] raise: JavaUnresolvedCompilationError.
-    self assert: user new foo class == missing.
-
-    "Created: / 16-10-2013 / 13:26:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - fields'!
-
-test_fields_00a
-    "
-     1) compile simple class with one field
-     2) change type of the field from int to Object
-"
-    
-    | jclass1  jinst1  jclass2  jinst2  callerClass |
-    jclass1 := self 
-            compileAndRegister: '
-public class test_01 { 
-    public int foo = 1;
-    public int bar() {
-        return 1;
-    }
-}'.
-
-    self assert: jclass1 hasMultipleVersions not message: 'java class should not have multiple versions initially'.
-
-    jinst1 := jclass1 new.
-    jclass2 := self 
-            compileAndRegister: '
-public class test_01 { 
-    public Object foo = new Object();
-    public int bar() {
-        return 2;
-    }
-}'.
-    jinst2 := jclass2 new.
-    callerClass := self 
-            compileAndRegister: '
-public class CallerClass {
-    public static Object getFoo(test_01 inst) {
-        return inst.foo;
-    }
-}'.
-    self assert: jclass1 ~~ jclass2.
-    self assert: jclass1 fields size == 1.
-    self assert: jclass1 fields anElement descriptor = 'I'.
-    self assert: jinst1 bar == 1.
-    self assert: jclass2 fields size == 1.
-    self assert: jclass2 fields anElement descriptor = 'Ljava/lang/Object;'.
-    self assert: jinst2 bar == 2.
-    self shouldnt: [ callerClass getFoo: jinst1 ] raise: Error.
-    self shouldnt: [ callerClass getFoo: jinst2 ] raise: Error.
-
-    "Created: / 09-04-2013 / 15:00:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 09-04-2013 / 16:17:26 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 28-10-2013 / 12:51:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_fields_00b
-    "
-     1) compile simple class with one field
-     2) change type of the field from Object to int
-"
-    
-    | jclass1  jinst1  jclass2  jinst2  callerClass |
-    jclass1 := self 
-            compileAndRegister: '
-public class test_01 { 
-    public Object foo = new Object();
-    public int bar() {
-        return 1;
-    }
-}'.
-    jinst1 := jclass1 new.
-    jclass2 := self 
-            compileAndRegister: '
-public class test_01 { 
-    public int foo = 42;
-    public int bar() {
-        return 2;
-    }
-}'.
-    jinst2 := jclass2 new.
-    callerClass := self 
-            compileAndRegister: '
-public class CallerClass {
-    public static int getFoo(test_01 inst) {
-        return inst.foo;
-    }
-}'.
-    self assert: jclass1 ~~ jclass2.
-    self assert: jclass1 fields size == 1.
-    self assert: jclass1 fields anElement descriptor = 'Ljava/lang/Object;'.
-    self assert: jinst1 bar == 1.
-    self assert: jclass2 fields size == 1.
-    self assert: jclass2 fields anElement descriptor = 'I'.
-    self assert: jinst2 bar == 2.
-    self shouldnt: [ callerClass getFoo: jinst1 ] raise: Error.
-    self shouldnt: [ callerClass getFoo: jinst2 ] raise: Error.
-
-    "Created: / 20-09-2013 / 00:05:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 12-10-2013 / 18:19:51 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_fields_01a
-    "
-    1) compile simple class with one field
-    2) change type of the field from String to Object
-    3) as this is type generalization, no new class version
-        should be introduced, new field type is used by old class
-
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_01 { 
-    public String foo = "xxx";
-    public int bar() {
-        return 1;
-    }
-}'.
-    jinst1 := jclass1 new.
-
-    jclass2 := self compileAndRegister:'
-public class test_01 { 
-    public Object foo = new Object();
-    public int bar() {
-        return 2;
-    }
-}'.
-    jinst2 := jclass2 new.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass {
-    public static Object getFoo(test_01 inst) {
-        return inst.foo;
-    }
-}'.
-
-    self assert: jclass1 == jclass2.
-
-    self assert: jclass1 fields size == 1.
-    self assert: jclass1 fields anElement descriptor = 'Ljava/lang/Object;'.
-    self assert: jinst1 bar == 2.
-
-    self assert: jclass2 fields size == 1.
-    self assert: jclass2 fields anElement descriptor = 'Ljava/lang/Object;'.
-    self assert: jinst2 bar == 2.
-
-    self shouldnt:   [ callerClass getFoo: jinst1 ] raise: Error.
-    self shouldnt: [ callerClass getFoo: jinst2 ] raise: Error.
-
-    "Created: / 09-04-2013 / 15:24:13 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-10-2013 / 19:28:02 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_fields_01b
-    "
-    1) compile simple class with one field
-    2) change type of the field from Object to String
-    3) new class version should be created
-
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_01 { 
-    public Object foo = new Object();
-    public int bar() {
-        return 1;
-    }
-}'.
-    jinst1 := jclass1 new.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass {
-    public static Object getFoo(test_01 inst) {
-        return inst.foo;
-    }
-}'.
-
-    jclass2 := self compileAndRegister:'
-public class test_01 { 
-    public String foo = "XXX";
-    public int bar() {
-        return 2;
-    }
-}'.
-    jinst2 := jclass2 new.
-
-
-
-    self assert: jclass1 ~~ jclass2.
-
-    self assert: jclass1 fields size == 1.
-    self assert: jclass1 fields anElement descriptor = 'Ljava/lang/Object;'.
-    self assert: jinst1 bar == 1.
-
-    self assert: jclass2 fields size == 1.
-    self assert: jclass2 fields anElement descriptor = 'Ljava/lang/String;'.
-    self assert: jinst2 bar == 2.
-
-    self shouldnt: [ callerClass getFoo: jinst1 ] raise: Error.
-    self shouldnt:   [ callerClass getFoo: jinst2 ] raise: Error.
-
-    "Created: / 09-04-2013 / 15:25:10 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 12-10-2013 / 19:28:25 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_fields_02a
-    "
-    1) compile simple class with one public field
-    2) add second field after the first one
-    3) create caller class that accesses the public field
-    4) check that caller class accesses the right field
-       on both old and new instance
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_02a { 
-    public String foo = "foo";
-}'.
-    jinst1 := jclass1 new.
-
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_02a { 
-    public String foo = "foo+bar";
-    public String bar = "foo+bar";
-}'.
-    jinst2 := jclass2 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_02a_caller {
-    public static String getFoo(test_fields_02a x) {
-        return x.foo;
-    }
-}'.
-
-    self assert: jclass2 fields size == 2.
-
-    self assert: (callerClass getFoo: jinst1) = 'foo'.   
-    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
-
-    "Created: / 09-04-2013 / 15:32:20 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_02b
-    "
-    1) compile simple class with one public field
-    2) add second field after the first one
-    3) create caller class that accesses the public field
-    4) check that caller class accesses the right field
-       on both old and new instance
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_02b { 
-    public String foo = "foo";
-}'.
-    jinst1 := jclass1 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_02b_caller {
-    public static String getFoo(test_fields_02b x) {
-        return x.foo;
-    }
-}'.
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_02b { 
-    public String foo = "foo+bar";
-    public String bar = "foo+bar";
-}'.
-    jinst2 := jclass2 new.
-
-    self assert: jclass2 fields size == 2.
-
-    self assert: (callerClass getFoo: jinst1) = 'foo'.   
-    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
-
-    "Created: / 09-04-2013 / 15:30:49 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_03a
-    "
-    1) compile simple class with one public field
-    2) add second field before the first one
-    3) create caller class that accesses the public field
-    4) check that caller class accesses the right field
-       on both old and new instance
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_03a { 
-    public String foo = "foo";
-}'.
-    jinst1 := jclass1 new.
-
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_03a { 
-    public String bar = "foo+bar";
-    public String foo = "foo+bar";
-}'.
-    jinst2 := jclass2 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_03a_caller {
-    public static String getFoo(test_fields_03a x) {
-        return x.foo;
-    }
-}'.
-
-    self assert: jclass2 fields size == 2.
-
-    self assert: (callerClass getFoo: jinst1) = 'foo'.   
-    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
-
-    "Created: / 09-04-2013 / 15:33:39 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_03b
-    "
-    1) compile simple class with one public field
-    2) add second field before the first one
-    3) create caller class that accesses the public field
-    4) check that caller class accesses the right field
-       on both old and new instance
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_03b { 
-    public String foo = "foo";
-}'.
-    jinst1 := jclass1 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_03b_caller {
-    public static String getFoo(test_fields_03b x) {
-        return x.foo;
-    }
-}'.
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_03b { 
-    public String bar = "foo+bar";
-    public String foo = "foo+bar";
-}'.
-    jinst2 := jclass2 new.
-
-
-
-    self assert: jclass2 fields size == 2.
-
-    self assert: (callerClass getFoo: jinst1) = 'foo'.   
-    self assert: (callerClass getFoo: jinst2) = 'foo+bar'.
-
-    "Created: / 09-04-2013 / 15:34:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_03c
-    "
-    1) compile simple class with one public field
-    2) add second field before the first one
-    3) create caller class that accesses the new field
-    4) check that caller class accesses the new field
-       on new instance
-    5) check that caller class accessing new field on
-       old instances throws exception
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_03c { 
-    public String foo = "foo";
-}'.
-    jinst1 := jclass1 new.
-
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_03c { 
-    public String bar = "foo+bar";
-    public String foo = "foo+bar";
-}'.
-    jinst2 := jclass2 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_03c_caller {
-    public static String getBar(test_fields_03c x) {
-        return x.bar;
-    }
-}'.
-
-    self assert: jclass2 fields size == 2.
-
-    self assert: (callerClass getBar: jinst2) = 'foo+bar'.
-    self should: [ callerClass getBar: jinst1 ] raise: Error.
-
-    "Created: / 09-04-2013 / 15:53:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_04a
-    "
-    1) compile simple class with two public fields
-    2) remove first field
-    3) create caller class that accesses the second field
-    4) check that caller class accesses the right field
-       on both old and new instances
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_04a { 
-    public String foo = "foo";
-    public String bar = "bar+foo";
-}'.
-    jinst1 := jclass1 new.
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_04a { 
-    public String bar = "bar";
-}'.
-    jinst2 := jclass2 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_04a_caller {
-    public static String getBar(test_fields_04a x) {
-        return x.bar;
-    }
-}'.
-
-    self assert: jclass2 fields size == 1.
-
-    self assert: (callerClass getBar: jinst1) = 'bar+foo'.   
-    self assert: (callerClass getBar: jinst2) = 'bar'.
-
-    "Created: / 09-04-2013 / 15:46:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_04b
-    "
-    1) compile simple class with two public fields
-    2) remove first field
-    3) create caller class that accesses the second field
-    4) check that caller class accesses the right field
-       on both old and new instances
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_04b { 
-    public String foo = "foo";
-    public String bar = "bar+foo";
-}'.
-    jinst1 := jclass1 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_04b_caller {
-    public static String getBar(test_fields_04b x) {
-        return x.bar;
-    }
-}'.
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_04b { 
-    public String bar = "bar";
-}'.
-    jinst2 := jclass2 new.
-
-
-
-    self assert: jclass2 fields size == 1.
-
-    self assert: (callerClass getBar: jinst1) = 'bar+foo'.   
-    self assert: (callerClass getBar: jinst2) = 'bar'.
-
-    "Created: / 09-04-2013 / 15:45:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_04c
-    "
-    1) compile simple class with two public fields
-    2) create caller class that accesses the first field
-    3) remove first field
-    4) check that caller class accesses the first field
-       on old instances
-    5) check that accessing the first field on new instances
-       raises exception
-    "
-
-    | jclass1 jinst1 jclass2 jinst2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_04c { 
-    public String foo = "foo";
-    public String bar = "bar+foo";
-}'.
-    jinst1 := jclass1 new.
-
-    callerClass := self compileAndRegister:'
-public class test_fields_04c_caller {
-    public static String getFoo(test_fields_04c x) {
-        return x.foo;
-    }
-}'.
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_04c { 
-    public String bar = "bar";
-}'.
-    jinst2 := jclass2 new.
-
-
-    self assert: jclass1 ~~ jclass2.
-    self assert: jclass2 fields size == 1.
-
-    self assert: (callerClass getFoo: jinst1) = 'foo'.   
-    self should: [ callerClass getFoo: jinst2 ] raise: Error.
-
-    "Created: / 09-04-2013 / 15:57:38 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 13-10-2013 / 18:14:20 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_fields_05a
-    "
-    1) compile simple class with one field
-    2) change visibility of the field
-    3) accessing the field should raise exception
-    "
-
-    | jclass1 jinst1 jclass2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_05a { 
-    public String foo = "public_foo";
-}'.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass {
-    public static String getFoo(test_fields_05a inst) {
-        return inst.foo;
-    }
-}'.  
-
-    jinst1 := jclass1 new.
-    self assert: (callerClass getFoo: jinst1) = 'public_foo'.  
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_05a { 
-    private String foo = "private_foo";
-}'.       
-    self should:   [ callerClass getFoo: jinst1 ] raise: Error.
-
-    "Created: / 09-04-2013 / 16:16:06 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 13-10-2013 / 18:17:00 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_fields_05b
-    "
-    1) compile simple class with private field
-    2) change visibility of the field to public
-    3) accessing the field should not raise exception anymore
-    "
-
-    | jclass1 jinst1 jclass2 callerClass |
-
-    jclass1 := self compileAndRegister:'
-public class test_fields_05b { 
-    private String foo = "private_foo";
-}'.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass {
-    public static String getFoo(test_fields_05b inst) {
-        return inst.foo;
-    }
-}'. 
-
-    jinst1 := jclass1 new.
-    self should: [ callerClass getFoo: jinst1 ] raise: Error.
-
-    jclass2 := self compileAndRegister:'
-public class test_fields_05b { 
-    public String foo = "public_foo";
-}'.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass {
-    public static String getFoo(test_fields_05b inst) {
-        return inst.foo;
-    }
-}'.
-    self assert: jclass1 == jclass2.
-    self assert: (callerClass getFoo: jinst1) = 'private_foo'.
-
-    "Created: / 11-04-2013 / 10:41:52 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified (format): / 13-10-2013 / 21:05:17 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 15-10-2013 / 00:03:07 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_fields_in_parent_01a
-    "
-    1) compile Parent class with one public field
-    2) subclass it by Child
-    3) add field to parent
-    4) check that Child has multivers
-    "
-
-    | parentClass parentClass2 childClass |
-
-    parentClass := self compileAndRegister:'
-public class test_fields_in_parent_01a { 
-    public String foo = "foo";
-}'.
-
-    childClass := self compileAndRegister:'
-public class test_fields_in_parent_01a_child extends test_fields_in_parent_01a {     
-}'.   
-
-    self assert: childClass hasMultipleVersions not.  
-
-    parentClass2 := self compileAndRegister:'
-public class test_fields_in_parent_01a {     
-    public String bar = "bar";
-    public String foo = "foo";  
-}'. 
-
-    self assert: childClass hasMultipleVersions.
-
-    "Created: / 28-10-2013 / 12:41:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - garbage versions'!
-
-test_old_versions_cleaned_01
-    "
-    1) compile simple class with one public field
-    2) compile new version - add second field after the first one
-    3) check that both versions exist after GC
-    4) throw away the reference to the first version
-    5) check only second version exists after GC
-    "
-
-    <skip> "/ Has to br reviewd
-
-    | jclass1 jinst1 jclass2 jinst2 |
-
-    jclass1 := self compileAndRegister:'
-public class test_old_versions_cleaned_01 { 
-    public String foo = "foo";
-}'.
-    jinst1 := jclass1 new.
-
-    jclass2 := self compileAndRegister:'
-public class test_old_versions_cleaned_01 { 
-    public String foo = "foo+bar";
-    public String bar = "foo+bar";
-}'.
-    jinst2 := jclass2 new.
-
-ObjectMemory garbageCollect.
-ObjectMemory scavenge.
-
-    self assert: jclass1 hasMultipleVersions.
-    self assert: jclass2 hasMultipleVersions.
-
-    jclass1 :=  nil.
-    jinst1 :=  nil.
-
-    ObjectMemory garbageCollect.
-    ObjectMemory scavenge.  
-
-    self assert: jclass2 hasMultipleVersions not.
-
-    "Created: / 28-10-2013 / 12:28:50 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 17-08-2014 / 08:42:57 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - hierarchy'!
-
-test_hierarchy_00
-
-    "
-    1) compile a parent and a child class, parent having a method
-    2) change parent's method
-    3) assert the method is changed in child
-    "
-
-    | jclass1_A jclass1_B jinst1_B jclass_caller jinst2_B jclass2_B |
-
-    jclass1_A := self compileAndRegister:'
-public class test_hierarchy_00_A { 
-    public int foo() {
-        return 1;
-    }
-}'.
-
-     jclass1_B := self compileAndRegister:'
-public class test_hierarchy_00_B extends test_hierarchy_00_A { 
-}'.
-
-    jclass_caller :=  self compileAndRegister:'
-public class test_hierarchy_00_caller  {
-    public int call(test_hierarchy_00_B b) {
-        return b.foo();
-    }
-}'.
-
-    jinst1_B := jclass1_B new.
-
-    self assert: (jclass_caller new call: jinst1_B) == 1.
-
-    jclass2_B := self compileAndRegister:'
-public class test_hierarchy_00_B extends test_hierarchy_00_A { 
-  public int foo() {
-        return 2;
-    }
-}'.
-
-    jinst2_B := jclass2_B new.
-
-    self assert: (jclass_caller new call: jinst1_B) == 2.
-    self assert: (jclass_caller new call: jinst2_B) == 2.
-
-    "Created: / 09-04-2013 / 16:09:24 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 11-04-2013 / 11:24:33 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_hierarchy_01a
-
-    "
-    1) compile a parent and a child class
-    2) add field to parent
-    3) assert the field is present in new instances of child
-    "
-
-    | jclass1_A jclass2_A jclass1_B jinst1_B jclass_caller jinst2_B jclass2_B |
-
-    jclass1_A := self compileAndRegister:'
-public class test_hierarchy_01_A {}'.
-
-     jclass1_B := self compileAndRegister:'
-public class test_hierarchy_01_B extends test_hierarchy_01_A {}'.
-
-    jinst1_B := jclass1_B new.    
-
-    jclass2_A := self compileAndRegister:'
-public class test_hierarchy_01_A {
-    public int foo = 1;
-}'.
-
-    jclass2_B := self compileAndRegister:'
-public class test_hierarchy_01_B extends test_hierarchy_01_A {}'. 
-
-    jclass_caller :=  self compileAndRegister:'
-public class test_hierarchy_01_caller  {
-    public int call(test_hierarchy_01_B b) {
-        return b.foo;
-    }
-}'.
-
-    jinst2_B := jclass2_B new.
-
-    self should: [ jclass_caller new call: jinst1_B ] raise: Error.
-    self assert: (jclass_caller new call: jinst2_B) == 1.
-
-    "Created: / 11-04-2013 / 11:37:21 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 13-10-2013 / 16:17:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_hierarchy_02a
-
-    "
-    1) compile a grandparent, a parent and a child class, 
-          grandparent having a method, child overriding
-          the method and calling super.
-    2) override method in parent
-    3) assert the method from parent is called by super in child's method
-    "
-
-    | jclass1_A jclass1_B jclass1_C jinst1_C jclass_caller jinst2_C jclass2_B |
-
-    jclass1_A := self compileAndRegister:'
-public class test_hierarchy_02_A { 
-    public int foo() {
-        return 1;
-    }
-}'.
-
-     jclass1_B := self compileAndRegister:'
-public class test_hierarchy_02_B extends test_hierarchy_02_A {}'.
-
-     jclass1_C := self compileAndRegister:'
-public class test_hierarchy_02_C extends test_hierarchy_02_B {
-    public int foo() {
-        return super.foo();
-    }
-}'.
-
-    jclass_caller :=  self compileAndRegister:'
-public class test_hierarchy_02_caller  {
-    public int call(test_hierarchy_02_C c) {
-        return c.foo();
-    }
-}'.
-
-    jinst1_C := jclass1_C new.
-
-    self assert: (jclass_caller new call: jinst1_C) == 1.
-
-    jclass2_B := self compileAndRegister:'
-public class test_hierarchy_02_B extends test_hierarchy_02_A { 
-  public int foo() {
-        return 2;
-    }
-}'.
-
-    jinst2_C := jclass1_C new.
-
-    self assert: (jclass_caller new call: jinst1_C) == 2.
-    self assert: (jclass_caller new call: jinst2_C) == 2.
-
-    "Created: / 11-04-2013 / 11:07:26 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified (comment): / 21-08-2013 / 23:39:24 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_hierarchy_02b
-
-    "
-    only a variation of test_hierarchy_02a
-    1) compile a grandparent, a parent and a child class, 
-          grandparent having a method, child overriding
-          the method and calling super.
-    2) override method in parent
-    3) assert the method from parent is called by super in child's method    
-    "
-
-    | jclass1_A jclass1_B jclass1_C jinst1_C jclass_caller jinst2_C jclass2_B |
-
-    jclass1_A := self compileAndRegister:'
-public class test_hierarchy_02_A { 
-    public int foo() {
-        return 1;
-    }
-
-    public int bar() {
-        return 10;
-    }
-}'.
-
-     jclass1_B := self compileAndRegister:'
-public class test_hierarchy_02_B extends test_hierarchy_02_A {}'.
-
-     jclass1_C := self compileAndRegister:'
-public class test_hierarchy_02_C extends test_hierarchy_02_B {
-    public int foo() {
-        return super.foo();
-    }
-
-    public int bar() {
-        return super.bar();
-    }
-}'.
-
-    jclass_caller :=  self compileAndRegister:'
-public class test_hierarchy_02_caller  {
-    public int callFoo(test_hierarchy_02_C c) {
-        return c.foo();
-    }
-
-    public int callBar(test_hierarchy_02_C c) {
-        return c.bar();
-    }
-}'.
-
-    jinst1_C := jclass1_C new.
-
-    self assert: (jclass_caller new callFoo: jinst1_C) == 1.
-    self assert: (jclass_caller new callBar: jinst1_C) == 10.
-
-    jclass2_B := self compileAndRegister:'
-public class test_hierarchy_02_B extends test_hierarchy_02_A { 
-    public int bar() {
-        return 20;
-    }        
-}'.
-
-    jinst2_C := jclass1_C new.
-
-    self assert: (jclass_caller new callFoo: jinst1_C) == 1.
-    self assert: (jclass_caller new callFoo: jinst2_C) == 1.
-    self assert: (jclass_caller new callBar: jinst1_C) == 20.
-    self assert: (jclass_caller new callBar: jinst2_C) == 20.
-
-    "Created: / 11-04-2013 / 11:07:49 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified (comment): / 21-08-2013 / 23:39:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_hierarchy_03a
-
-    "
-    1) compile a grandparent, a parent and a child class, 
-          grandparent and child having a constructor, child calling
-          super in its constructor
-    2) add constructor to parent class
-    3) assert the constructor from parent is called from child's contructor    
-    "
-
-    | jclass1_A jclass1_B jclass1_C jinst1_C jclass_caller jinst2_C jclass2_B |
-
-    jclass1_A := self compileAndRegister:'
-public class test_hierarchy_03_A {
-    protected int foo;
-
-    public test_hierarchy_03_A(int foo) {
-        this.foo = foo;
-    }
-
-    public int getFoo() {
-        return foo;
-    }
-}'.
-
-     jclass1_B := self compileAndRegister:'
-public class test_hierarchy_03_B extends test_hierarchy_03_A {
-    public test_hierarchy_03_B(int foo) {
-        super(foo);
-    }  
-}'.
-
-     jclass1_C := self compileAndRegister:'
-public class test_hierarchy_03_C extends test_hierarchy_03_B {
-    public test_hierarchy_03_C(int foo) {
-        super(foo);
-    }    
-}'.
-
-    jclass_caller :=  self compileAndRegister:'
-public class test_hierarchy_03_caller  {
-    public int getFoo(test_hierarchy_03_C c) {
-        return c.getFoo();
-    }
-}'.
-
-    jinst1_C := jclass1_C new: 1.
-
-    self assert: (jclass_caller new getFoo: jinst1_C) == 1.
-
-    jclass2_B := self compileAndRegister:'
-public class test_hierarchy_03_B extends test_hierarchy_03_A { 
-    public test_hierarchy_03_B(int foo) {
-        super(2 * foo);
-    }        
-}'.
-
-    jinst2_C := jclass1_C new: 2.
-
-    self assert: (jclass_caller new getFoo: jinst1_C) == 1.
-    self assert: (jclass_caller new getFoo: jinst2_C) == 4.
-
-    "Created: / 11-04-2013 / 11:14:12 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 21-08-2013 / 23:47:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_hierarchy_04a
-
-    "
-    1) compile a parent1, parent2 and a child class, 
-          parent1 having an Integer field, parent2 having a String field.
-          Child extends parent1.
-    2) change child's superclass to parent2
-    3) assert new instances of child have new field
-    "
-
-    | jclass1_A1 jclass1_A2 jclass1_B jclass2_B jinst1_B jinst2_B jclass_caller |
-
-    jclass1_A1 := self compileAndRegister:'
-public class test_hierarchy_04_A1 {
-    public Integer foo = 1;
-}'.
-
-    jclass1_A2 := self compileAndRegister:'
-public class test_hierarchy_04_A2 {
-    public String foo = "foo";
-}'.
-
-     jclass1_B := self compileAndRegister:'
-public class test_hierarchy_04_B extends test_hierarchy_04_A1 {}'.     
-
-    jclass_caller :=  self compileAndRegister:'
-public class test_hierarchy_04_caller  {
-    public Object getFoo(test_hierarchy_04_B c) {
-        return c.foo;
-    }
-}'.
-
-    jinst1_B := jclass1_B new.
-
-    self assert: ((jclass_caller new getFoo: jinst1_B) equals: (Java as_Integer: 1)).
-
-    jclass2_B := self compileAndRegister:'
-public class test_hierarchy_04_B extends test_hierarchy_04_A2 {}'.
-
-    jinst2_B := jclass2_B new.
-
-
-    self assert: ((jclass_caller new getFoo: jinst1_B) equals: (Java as_Integer: 1)).
-    self assert: (jclass_caller new getFoo: jinst2_B) = (Java as_String: 'foo').
-
-    "Created: / 11-04-2013 / 13:16:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 12-10-2013 / 18:04:03 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - methods'!
-
-testAddingMethod    
-    "    
-    1) compile a class inheriting from ChangingClassParent.
-    2) instantiate inheriting class.
-    3) assert calling foo on subclass uses method from superclass'.
-    4) recompile inheriting class with overridden foo method.
-    5) assert overridden method is used.
-    "
-   | caller inst |
-   caller := self callerClass new.
-   self compileAndRegisterChangingClassParent.
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass extends ChangingClassParent {}
-'.
-     
-    inst := JAVA classReloadingTests ChangingClass new.
-    self assert: (caller callFooToString: inst) = 'parent'.        
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass extends ChangingClassParent {
-    public String foo() {
-        return "child";
-    }
-}'.
-    self assert: (caller callFooToString: inst) = 'child'.
-
-    "Created: / 06-12-2012 / 21:52:02 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified (comment): / 18-12-2012 / 14:12:06 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-testChangingSignatureOfMethod
-    "
-    1) compile a class with foo method returning string.    
-    2) instantiate the class.    
-    3) assert method returns string.
-    4) recompile class with foo method returning int.
-    5) assert new method is used.
-    "
-
-    | caller inst |
-    caller := self callerClass new.
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass {
-    public String toString() {
-        return "" + foo();
-    }
-
-    public String foo() {
-        return "child";
-    }
-}
-'.
-    inst := JAVA classReloadingTests ChangingClass new.
-    self assert: (caller callFooToString: inst) = 'child'.        
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass {
-    public String toString() {
-        return "" + foo();
-    }
-
-    public int foo() {
-        return 5;
-    }
-}'.
-    self assert: (caller callFooToString: inst) = '5'.
-
-    "Created: / 06-12-2012 / 21:50:53 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified (comment): / 18-12-2012 / 14:08:36 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-testModifyingMethod
-    "
-    1) compile a class with foo method.    
-    2) instantiate the class.    
-    3) assert method returns string.
-    4) recompile class with foo method returning different string.
-    5) assert new method is used.
-    "
-
-    | caller inst |
-    caller := self callerClass new.
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass {
-    public String toString() {
-        return "" + foo();
-    }
-
-    public String foo() {
-        return "child";
-    }
-}
-'.
-    inst := JAVA classReloadingTests ChangingClass new.
-    self assert: (caller callFooToString: inst) = 'child'.        
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass {
-    public String toString() {
-        return "" + foo();
-    }
-
-    public String foo() {
-        return "modified child";
-    }
-}'.
-        self assert: (caller callFooToString: inst) = 'modified child'.
-
-    "Created: / 06-12-2012 / 21:51:14 / Marcel Hlopko <hlopkmar@fel.cvut.cz>"
-    "Modified (comment): / 18-12-2012 / 14:09:48 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-testRemovingMethod   
-  "    
-    1) compile a class inheriting from ChangingClassParent, which overrides foo method.
-    2) instantiate inheriting class.
-    3) assert calling foo on subclass uses overridden method'.
-    4) recompile inheriting class without foo method.
-    5) assert parent method is used.
-    "
-   | caller inst |
-   caller := self callerClass new.
-   self compileAndRegisterChangingClassParent.
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass extends ChangingClassParent {
-    public String foo() {
-        return "child";
-    }
-}'.
-
-    inst := JAVA classReloadingTests ChangingClass new.
-    self assert: (caller callFooToString: inst) = 'child'.
-
-    self compileAndRegister: '
-package classReloadingTests;
-public class ChangingClass extends ChangingClassParent {}'.
-    self assert: (caller callFooToString: inst) = 'parent'.
-
-    "Created: / 16-12-2012 / 16:01:58 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified (comment): / 18-12-2012 / 14:11:56 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_00
-    "
-    1) compile simple class with no method
-    3) recompile same source again.
-    4) check that class does not change
-    "
-
-    | jclass1 jclass2 |
-    jclass1 := self compileAndRegister:'
-public class test_01 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-    self assert: jclass1 new foo == 10.
-
-    jclass2 := self compileAndRegister:'
-public class test_01 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-
-    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == jclass1 message: 'compiled classes should be registered in testClassLoader'.
-
-    "Created: / 16-12-2012 / 23:51:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_00b
-    "
-    1) compile simple class with no method but in package
-    3) recompile same source again.
-    4) check that class does not change
-    "
-
-    | jclass1 jclass2 |
-    jclass1 := self compileAndRegister:'
-package zork;
-public class test_01 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-    self assert: jclass1 new foo == 10.
-
-    jclass2 := self compileAndRegister:'
-package zork;
-public class test_01 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-
-    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == jclass1 message: 'compiled classes should be registered in testClassLoader'.
-
-    "Created: / 16-12-2012 / 23:56:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified (comment): / 18-12-2012 / 12:02:24 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_01
-    "
-    1) compile simple class with one method return 10
-    2) call that method, check that it returns 10
-    3) recompile to return 20
-    4) call that method, check that it returns 20
-    "
-
-    | jclass1 jclass2 |
-    jclass1 := self compileAndRegister:'
-public class test_01 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-    self assert: jclass1 new foo == 10.
-
-    jclass2 := self compileAndRegister:'
-public class test_01 { 
-    public int foo() { 
-        return 20; 
-    }
-}'.
-
-    self assert: jclass2 new foo == 20.
-    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
-
-    "Created: / 16-12-2012 / 23:48:37 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_02a
-    "
-    1) compile simple class with one method return 10
-    2) call that method indirectly, check that it returns 10
-    3) recompile to return 20
-    4) call that method indirectly, check that it returns 20
-    "
-
-    | jclass1 jclass2 caller |
-    jclass1 := self compileAndRegister:'
-public class test_02 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-    caller := self compileAndRegister:'
-public class test_02_caller {
-    public int qux(test_02 t) {
-        return t.foo();
-    }
-}
-'.
-    self assert: (caller new qux: (jclass1 new)) == 10.
-
-    jclass2 := self compileAndRegister:'
-public class test_02 { 
-    public int foo() { 
-        return 20; 
-    }
-}'.
-    self assert: (caller new qux: (jclass2 new)) == 20.
-
-    "Created: / 17-12-2012 / 00:02:22 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_02b
-    "
-    1) compile simple class with one method return 10
-    2) call that method indirectly using fresh instance (NEW), 
-       check that it returns 10
-    3) recompile to return 20
-    4) call that method indirectly, check that it returns 20
-    "
-
-    | jclass1 jclass2 caller |
-    jclass1 := self compileAndRegister:'
-public class test_02 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-    caller := self compileAndRegister:'
-public class test_02_caller {
-    public int qux() {
-        test_02 t = new test_02();
-        return t.foo();
-    }
-}
-'.
-    self assert: (caller new qux) == 10.
-
-    jclass2 := self compileAndRegister:'
-public class test_02 { 
-    public int foo() { 
-        return 20; 
-    }
-}'.
-    self assert: (caller new qux) == 20.
-
-    "Created: / 17-12-2012 / 00:04:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_02c
-    "
-    Same as 02a, but with static methods
-    "
-
-    | jclass1 jclass2 caller |
-    jclass1 := self compileAndRegister:'
-public class test_02 { 
-    public static int foo() {
-        return 10; 
-    }
-}'.
-    caller := self compileAndRegister:'
-public class test_02_caller {
-    public int qux() {
-        return test_02.foo();
-    }
-}
-'.
-    self assert: (caller new qux) == 10.
-
-    jclass2 := self compileAndRegister:'
-public class test_02 { 
-    public static int foo() { 
-        return 20; 
-    }
-}'.
-    self assert: (caller new qux) == 20.
-
-    "Created: / 17-12-2012 / 00:03:54 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 18-12-2012 / 12:07:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_03a
-    "
-    1) compile simple class with one public **static** method that returns 10
-    2) call that method indirectly, check that it returns 10
-    3) change it to private method
-    4) calling method should raise exception
-    "
-
-    | jclass1 jclass2 caller |
-    jclass1 := self compileAndRegister:'
-public class test_03 { 
-    public static int foo() {
-        return 10; 
-    }
-}'.
-    caller := self compileAndRegister:'
-public class test_03_caller {
-    public static int qux() {
-        return test_03.foo();
-    }
-}
-'.
-    self assert: (caller new qux) == 10.
-
-    jclass2 := self compileAndRegister:'
-public class test_03 { 
-    private static int foo() { 
-        return 20; 
-    }
-}'.
-    self should: [ caller new qux ] raise: Error.
-
-    "Created: / 11-04-2013 / 10:44:18 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 21-08-2013 / 23:09:27 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified (comment): / 16-10-2013 / 11:12:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_03b
-    "
-    1) compile simple class with one private **static** method that returns 10
-    2) call that method indirectly, check that it raises exception
-    3) change it to public method
-    4) calling method should not raise exception anymore
-    "
-
-    | jclass1 jclass2 jclass3 caller |
-    jclass1 := self compileAndRegister:'
-public class test_03 { 
-    public static int foo() {
-        return 10; 
-    }
-}'.
-    caller := self compileAndRegister:'
-public class test_03_caller {
-    public static int qux() {
-        return test_03.foo();
-    }
-}
-'.
-    self assert: (caller new qux) == 10.      
-
-    jclass2 := self compileAndRegister:'
-public class test_03 { 
-    private static int foo() { 
-        return 20; 
-    }
-}'.
-
-    self should: [ caller new qux ] raise: Error. 
- 
-    jclass3 := self compileAndRegister:'
-public class test_03 { 
-    public static int foo() { 
-        return 42; 
-    }
-}'.
-    self assert: (caller new qux) == 42.
-
-    "Created: / 11-04-2013 / 10:46:31 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 21-08-2013 / 23:11:15 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified (comment): / 16-10-2013 / 11:11:52 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_04b
-    "
-    1) compile simple class with one private **static** method that returns 10
-    2) call that method indirectly, check that it raises exception
-    3) change it to public method
-    4) calling method should not raise exception anymore
-    "
-
-    | jclass1 jclass2 jclass3 caller |
-    jclass1 := self compileAndRegister:'
-public class test_04 { 
-    public int foo() {
-        return 10; 
-    }
-}'.
-    caller := self compileAndRegister:'
-public class test_03_caller {
-    public int qux(test_04 test) {
-        return test.foo();
-    }
-}
-'.
-    self assert: (caller new qux: jclass1 new) == 10.      
-
-    jclass2 := self compileAndRegister:'
-public class test_04 { 
-    private int foo() { 
-        return 20; 
-    }
-}'.
-
-    self should: [ caller new qux: jclass1 new ] raise: Error. 
- 
-    jclass3 := self compileAndRegister:'
-public class test_04 { 
-    public int foo() { 
-        return 42; 
-    }
-}'.
-    self assert: (caller new qux: jclass1 new) == 42.
-
-    "Created: / 16-10-2013 / 11:17:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_05
-    "
-    1) compile simple class with one method, set a method-level breakpoint on it
-    3) recompile same source again.
-    4) check that class does not change
-    "
-
-    | jclass1 jclass2 |
-    jclass1 := self compileAndRegister:'
-public class test_01 { 
-    public int foo() { 
-        return 10; 
-    }
-}'.
-    self assert: jclass1 new foo == 10.
-    MessageTracer trapMethod: (jclass1 >> #'foo()V').
-
-    jclass2 := self compileAndRegister:'
-public class test_01 { 
-    public int foo() { 
-        return 15; 
-    }
-}'.
-
-    self assert: jclass1 == jclass2. "/only method update, so reloaded class should be the same
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) size = 1 message: 'only classes from these tests should use testClassLoader'.
-    self assert: (JavaVM registry getClassesDefinedBy: testClassLoader) anElement == jclass1 message: 'compiled classes should be registered in testClassLoader'.
-
-    "Created: / 17-08-2014 / 08:34:00 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - overloads'!
-
-test_overloads_00a
-    "
-    1) compile simple class with one method taking Object arg
-    3) compile caller class passing in String
-    4) recompile simple class, overload the method with one taking String arg
-    5) assert caller class invokes the String method
-    "
-
-    | jclass1 jclass2 callerClass jinst1 jinst2 |
-    jclass1 := self compileAndRegister:'
-public class test_overloads_00 { 
-    public int foo(Object o) { 
-        return 1; 
-    }
-}'.    
-
-    callerClass := self compileAndRegister:'
-public class CallerClass { 
-    public int call(test_overloads_00 o) { 
-        return o.foo("foo"); 
-    }
-}'.
-    jinst1 := jclass1 new.
-
-    self assert: (callerClass new call: jinst1) = 1.
-
-    jclass2 := self compileAndRegister:'
-public class test_overloads_00 { 
-    public int foo(Object o) { 
-        return 1; 
-    }
-
-    public int foo(String s) { 
-        return 2; 
-    }
-}'. 
-    jinst2 := jclass2 new.
-
-    self assert: (callerClass new call: jinst1) = 2.
-    self assert: (callerClass new call: jinst2) = 2.
-
-    "Created: / 11-04-2013 / 13:29:44 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_overloads_00b
-    "
-    1) compile simple class with two methods taking Object and String arg
-    3) compile caller class passing in String
-    4) recompile simple class, remove overloaded method taking String arg
-    5) assert caller class invokes the Object method
-    "
-
-    | jclass1 jclass2 callerClass jinst1 jinst2 |
-    jclass1 := self compileAndRegister:'
-public class test_overloads_00 { 
-    public int foo(Object o) { 
-        return 1; 
-    }
-
-    public int foo(String s) { 
-        return 2; 
-    }
-}'.    
-
-    callerClass := self compileAndRegister:'
-public class CallerClass { 
-    public int call(test_overloads_00 o) { 
-        return o.foo("foo"); 
-    }
-}'.
-    jinst1 := jclass1 new.
-
-    self assert: (callerClass new call: jinst1) = 2.
-
-    jclass2 := self compileAndRegister:'
-public class test_overloads_00 { 
-    public int foo(Object o) { 
-        return 1; 
-    }
-}'. 
-    jinst2 := jclass2 new.
-
-    self assert: (callerClass new call: jinst1) = 1.
-    self assert: (callerClass new call: jinst2) = 1.
-
-    "Created: / 11-04-2013 / 13:30:38 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-!
-
-test_overloads_01a
-    "
-    1) compile simple class with one method taking Object arg
-    3) compile caller class passing in String
-    4) recompile simple class, overload the method with one taking String arg
-    5) assert caller class invokes the String method
-    "
-
-    | jclass1A jclass1B jclass2A callerClass jinst1 jinst2 |
-    jclass1A := self compileAndRegister:'
-public class test_overloads_01_A { 
-    public int foo(Object o) { 
-        return 1; 
-    }
-}'.    
-
-    jclass1B := self compileAndRegister:'
-public class test_overloads_01_B extends test_overloads_01_A {
-    public int foo(String foo) {
-        return super.foo(foo) + 10;
-    }
-}'.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass { 
-    public int call(test_overloads_01_B o) { 
-        return o.foo("foo"); 
-    }
-}'.
-    jinst1 := jclass1B new.
-
-    self assert: (callerClass new call: jinst1) = 11.
-
-    jclass2A := self compileAndRegister:'
-public class test_overloads_01_A { 
-    public int foo(Object o) { 
-        return 1; 
-    }
-
-    public int foo(String s) { 
-        return 2; 
-    }
-}'. 
-    jinst2 := jclass1B new.
-
-    self assert: (callerClass new call: jinst1) = 12.
-    self assert: (callerClass new call: jinst2) = 12.
-
-    "Created: / 11-04-2013 / 13:34:59 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 15-10-2013 / 23:33:29 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_overloads_01b
-    "
-    1) compile simple class with two overloaded methods taking Object and String arg
-    3) compile caller class passing in String
-    4) recompile simple class, remove overloaded method aking String arg
-    5) assert caller class invokes the Object method
-    "
-
-    | jclass1A jclass1B jclass2A callerClass jinst1 jinst2 |
-    jclass1A := self compileAndRegister:'
-public class test_overloads_01_A { 
-    public int foo(Object o) { 
-        return 1; 
-    }    
-
-    public int foo(String s) { 
-        return 2; 
-    }
-}'.    
-
-    jclass1B := self compileAndRegister:'
-public class test_overloads_01_B extends test_overloads_01_A {
-    public int foo(String foo) {
-        return super.foo(foo) + 10;
-    }
-}'.
-
-    callerClass := self compileAndRegister:'
-public class CallerClass { 
-    public int call(test_overloads_01_B o) { 
-        return o.foo("foo"); 
-    }
-}'.
-    jinst1 := jclass1B new.
-
-    self assert: (callerClass new call: jinst1) = 12.
-
-    jclass2A := self compileAndRegister:'
-public class test_overloads_01_A { 
-    public int foo(Object o) { 
-        return 1; 
-    } 
-}'. 
-    jinst2 := jclass1B new.
-
-    self assert: (callerClass new call: jinst1) = 11.
-    self assert: (callerClass new call: jinst2) = 11.
-
-    "Created: / 11-04-2013 / 13:35:15 / Marcel Hlopko <marcel.hlopko@fit.cvut.cz>"
-    "Modified: / 15-10-2013 / 23:34:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests methodsFor:'tests - unloading'!
-
-test_unloading_01
-    "
-    1) compile class A1 and class A2 inheriting from A1 
-    2) compile class B that instantiates A and  call its method A2.bar from B.foo
-    3) remove class A1 (should remove A2 as well)
-    4) call B.foo and checks it raises ClassNotFoundException
-    5) compile class A2
-    6) call B.foo and checks it returns new value
-    "
-
-    | jclassA1 jclassA2 jclassB jinstB |
-
-    jclassA1 := self compileAndRegister:'
-public class test_unloading_01_A1 { 
-    public int bar() {
-        return 1;
-    }
-}'.
-
-    jclassA2 := self compileAndRegister:'
-public class test_unloading_01_A2 extends test_unloading_01_A1 { 
-}'.
-
-
-    jclassB := self compileAndRegister:'
-public class test_unloading_01_B { 
-    public int foo() {
-        return (new test_unloading_01_A2()).bar();
-    }
-}'.
-    jinstB := jclassB new.
-    self assert: jinstB foo == 1.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA1).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA2).
-
-
-    jclassA1 removeFromSystem.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA1) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA2) not.
-
-    [
-        jinstB foo.
-        self assert: false "/ should raise ClassNotFoundException
-    ] on: JAVA java lang ClassNotFoundException do:[
-        self assert: true.
-    ].
-
-    jclassA2 := self compileAndRegister:'
-public class test_unloading_01_A2 { 
-    public int bar() {
-        return 20;
-    }
-}'.
-
-    self assert: jinstB foo == 20.
-
-    "Created: / 14-09-2013 / 18:57:04 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_02
-    "
-    1) compile class A 
-    2) compile class B that instantiates A and  call its method A. bar from B.foo
-    3) remove class A
-    4) call B.foo and checks it raises ClassNotFoundException
-    5) compile class A
-    6) call B.foo and checks it returns new value
-    "
-
-    | jclassA jclassB jinstB |
-
-    jclassA := self compileAndRegister:'
-public class test_unloading_01_A { 
-    public int bar() {
-        return 1;
-    }
-}'.
-
-    jclassB := self compileAndRegister:'
-public class test_unloading_01_B { 
-    public int foo() {
-        return (new test_unloading_01_A()).bar();
-    }
-}'.
-    jinstB := jclassB new.
-    self assert: jinstB foo == 1.
-
-    jclassA removeFromSystem.
-    [
-        jinstB foo.
-        self assert: false "/ should raise ClassNotFoundException
-    ] on: JAVA java lang ClassNotFoundException do:[
-        self assert: true.
-    ].
-
-    jclassA := self compileAndRegister:'
-public class test_unloading_01_A { 
-    public int bar() {
-        return 20;
-    }
-}'.
-
-    self assert: jinstB foo == 20.
-
-    "Created: / 16-10-2013 / 10:11:17 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_02a
-    "
-    1) compile interface I1 and class A2 implementing I1
-    2) compile class B that instantiates A and  call its method A2.bar from B.foo
-    3) remove class I1 (should remove A2 as well)
-    4) call B.foo and checks it raises ClassNotFoundException
-    5) compile class A2
-    6) call B.foo and checks it returns new value
-    "
-
-    | jclassI1 jclassA2 jclassB jinstB |
-
-    jclassI1 := self compileAndRegister:'
-public interface test_unloading_01_I1 { 
-    public int bar()
-}'.
-
-    jclassA2 := self compileAndRegister:'
-public class test_unloading_01_A2 implements test_unloading_01_I1 { 
-    public int bar() { return 1; }
-}'.
-
-
-    jclassB := self compileAndRegister:'
-public class test_unloading_01_B { 
-    public int foo() {
-        return (new test_unloading_01_A2()).bar();
-    }
-}'.
-    jinstB := jclassB new.
-    self assert: jinstB foo == 1.
-    self assert: (Smalltalk allClasses includesIdentical: jclassI1).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA2).
-
-
-    jclassI1 removeFromSystem.
-    self assert: (Smalltalk allClasses includesIdentical: jclassI1) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA2) not.
-
-    [
-        jinstB foo.
-        self assert: false "/ should raise ClassNotFoundException
-    ] on: JAVA java lang ClassNotFoundException do:[
-        self assert: true.
-    ].
-
-    jclassA2 := self compileAndRegister:'
-public class test_unloading_01_A2 { 
-    public int bar() {
-        return 20;
-    }
-}'.
-
-    self assert: jinstB foo == 20.
-
-    "Created: / 14-09-2013 / 19:02:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_02b
-    "
-    1) compile interface I1, I2, I2 implenting I1, and class A2 implementing I2
-    2) compile class B that instantiates A and  call its method A2.bar from B.foo
-    3) remove class I1 (should remove A2 as well)
-    4) call B.foo and checks it raises ClassNotFoundException
-    5) compile class A2
-    6) call B.foo and checks it returns new value
-    "
-
-    | jclassI1 jclassI2 jclassA2 jclassB jinstB |
-
-    jclassI1 := self compileAndRegister:'
-public interface test_unloading_01_I1 { 
-    public int bar()
-}'.
-
-    jclassI2 := self compileAndRegister:'
-public interface test_unloading_01_I2 extends  test_unloading_01_I1 { 
-}'.
-
-
-    jclassA2 := self compileAndRegister:'
-public class test_unloading_01_A2 implements test_unloading_01_I1 { 
-    public int bar() { return 1; }
-}'.
-
-
-    jclassB := self compileAndRegister:'
-public class test_unloading_01_B { 
-    public int foo() {
-        return (new test_unloading_01_A2()).bar();
-    }
-}'.
-    jinstB := jclassB new.
-    self assert: jinstB foo == 1.
-    self assert: (Smalltalk allClasses includesIdentical: jclassI1).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA2).
-
-
-    jclassI1 removeFromSystem.
-    self assert: (Smalltalk allClasses includesIdentical: jclassI1) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassI2) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA2) not.
-
-    [
-        jinstB foo.
-        self assert: false "/ should raise ClassNotFoundException
-    ] on: JAVA java lang ClassNotFoundException do:[
-        self assert: true.
-    ].
-
-    jclassA2 := self compileAndRegister:'
-public class test_unloading_01_A2 { 
-    public int bar() {
-        return 20;
-    }
-}'.
-
-    self assert: jinstB foo == 20.
-
-    "Created: / 14-09-2013 / 19:04:35 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 15-09-2013 / 00:40:36 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_03a
-    "
-    1) compile class A with inner class InnerA
-    2) remove class A
-    3) check that InnerA has been removed too.
-    "
-
-    | jclassA jclassInnerA |
-
-    self compileAndRegister:'
-public class test_unloading_03a_A { 
-    public static class InnerA {
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
-    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
-
-    jclassA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
-
-    "Created: / 08-08-2014 / 22:00:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-    "Modified: / 08-08-2014 / 23:02:11 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_03b
-    "
-    1) compile class A with inner class InnerA
-    2) remove class A
-    3) check that both classes are gone
-    "
-
-    | jclassA jclassInnerA |
-
-    self compileAndRegister:'
-public class test_unloading_03a_A { 
-    public static class InnerA {
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
-    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
-
-    jclassInnerA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) .
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) notNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
-
-    "Created: / 11-08-2014 / 09:25:08 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_03c
-    "
-    1) compile class A with inner class InnerA
-    2) remove class A
-    3) check that both classes are gone
-    "
-
-    | jclassA jclassInnerA |
-
-    self compileAndRegister:'
-public class test_unloading_03a_A { 
-    public static class InnerA {
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
-    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
-
-    jclassA removeFromSystem.
-    jclassInnerA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
-
-    "Created: / 11-08-2014 / 09:25:48 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_03d
-    "
-    1) compile class A with inner class InnerA
-    2) remove class A
-    3) check that both classes are gone
-    "
-
-    | jclassA jclassInnerA |
-
-    self compileAndRegister:'
-public class test_unloading_03a_A { 
-    public static class InnerA {
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader.
-    jclassInnerA := JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA).
-
-    jclassInnerA removeFromSystem.
-    jclassA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassInnerA) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_03a_A$InnerA' definedBy: testClassLoader) isNil.
-
-    "Created: / 11-08-2014 / 09:26:27 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_04a
-    "
-    1) compile class A with annonymous class A$1
-    2) remove class A then A$1
-    3) check that A$1 has been removed too.
-    "
-
-    | jclassA jclassA_1 |
-
-    self compileAndRegister:'
-public class test_unloading_04a_A { 
-    public Object foo() {
-        return new Object() { public void bar() { } };
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_04a_A' definedBy: testClassLoader.
-    jclassA_1 := JavaVM classNamed: #'test_unloading_04a_A$1' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
-
-    jclassA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_04a_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_04a_A$1' definedBy: testClassLoader) isNil.
-
-    "Created: / 12-08-2014 / 22:17:19 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_04b
-    "
-    1) compile class A with annonymous class A$1
-    2) remove class A$1
-    3) check that A$1 has been removed too.
-    "
-
-    | jclassA jclassA_1 |
-
-    self compileAndRegister:'
-public class test_unloading_04b_A { 
-    public Object foo() {
-        return new Object() { public void bar() { } };
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_04b_A' definedBy: testClassLoader.
-    jclassA_1 := JavaVM classNamed: #'test_unloading_04b_A$1' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
-
-    jclassA_1 removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_04b_A' definedBy: testClassLoader) notNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_04b_A$1' definedBy: testClassLoader) isNil.
-
-    "Created: / 12-08-2014 / 22:23:58 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_04c
-    "
-    1) compile class A with annonymous class A$1
-    2) remove class A then A$1
-    3) check that A$1 has been removed too.
-    "
-
-    | jclassA jclassA_1 |
-
-    self compileAndRegister:'
-public class test_unloading_04c_A { 
-    public Object foo() {
-        return new Object() { public void bar() { } };
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_04c_A' definedBy: testClassLoader.
-    jclassA_1 := JavaVM classNamed: #'test_unloading_04c_A$1' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
-
-    jclassA removeFromSystem.
-    jclassA_1 removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_04c_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_04c_A$1' definedBy: testClassLoader) isNil.
-
-    "Created: / 12-08-2014 / 22:24:51 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_04d
-    "
-    1) compile class A with annonymous class A$1
-    2) remove class A then A$1
-    3) check that A$1 has been removed too.
-    "
-
-    | jclassA jclassA_1 |
-
-    self compileAndRegister:'
-public class test_unloading_04d_A { 
-    public Object foo() {
-        return new Object() { public void bar() { } };
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_04d_A' definedBy: testClassLoader.
-    jclassA_1 := JavaVM classNamed: #'test_unloading_04d_A$1' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
-
-    jclassA_1 removeFromSystem.
-    jclassA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_04d_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_04d_A$1' definedBy: testClassLoader) isNil.
-
-    "Created: / 12-08-2014 / 22:25:01 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-!
-
-test_unloading_04e
-    "
-    1) compile class A with nested class A$Nested and annonymous class A$1
-    2) remove class A then A$Nested
-    3) check that A$1 has been removed too.
-    "
-
-    | jclassA jclassA_Nested jclassA_1 |
-
-    self compileAndRegister:'
-public class test_unloading_04e_A {
-    public static class Nested {
-        public Object foo() {
-            return new Object() { public int bar() { return 10; } };
-        }
-    }
-}'.
-
-    jclassA := JavaVM classNamed: #'test_unloading_04e_A' definedBy: testClassLoader.
-    jclassA_Nested := JavaVM classNamed: #'test_unloading_04e_A$Nested' definedBy: testClassLoader.
-    jclassA_1 := JavaVM classNamed: #'test_unloading_04e_A$1' definedBy: testClassLoader.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_Nested).
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1).
-
-    jclassA removeFromSystem.
-
-    self assert: (Smalltalk allClasses includesIdentical: jclassA) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_Nested) not.
-    self assert: (Smalltalk allClasses includesIdentical: jclassA_1) not.
-
-    self assert: (JavaVM classNamed: #'test_unloading_04e_A' definedBy: testClassLoader) isNil.    
-    self assert: (JavaVM classNamed: #'test_unloading_04e_A$Nested' definedBy: testClassLoader) isNil.
-    self assert: (JavaVM classNamed: #'test_unloading_04e_A$1' definedBy: testClassLoader) isNil.
-
-    "Created: / 10-10-2014 / 12:08:21 / Jan Vrany <jan.vrany@fit.cvut.cz>"
-! !
-
-!JavaClassReloaderTests class methodsFor:'documentation'!
-
-version_CVS
-    ^ '$Header: /cvs/stx/stx/libjava/experiments/ClassReloadingTests.st,v 1.2 2013-02-25 11:15:34 vrany Exp $'
-!
-
-version_HG
-
-    ^ '$Changeset: <not expanded> $'
-!
-
-version_SVN
-    ^ '§Id::                                                                                                                        §'
-! !
-
--- a/experiments/Make.proto	Tue Jan 20 10:41:54 2015 +0100
+++ b/experiments/Make.proto	Tue Jan 20 10:49:24 2015 +0100
@@ -34,7 +34,7 @@
 # add the path(es) here:,
 # ********** OPTIONAL: MODIFY the next lines ***
 # LOCALINCLUDES=-Ifoo -Ibar
-LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libbasic3 -I$(INCLUDE_TOP)/stx/libjava -I$(INCLUDE_TOP)/stx/libjava/tools
+LOCALINCLUDES= -I$(INCLUDE_TOP)/stx/libbasic -I$(INCLUDE_TOP)/stx/libjava
 
 
 # if you need any additional defines for embedded C code,
--- a/experiments/abbrev.stc	Tue Jan 20 10:41:54 2015 +0100
+++ b/experiments/abbrev.stc	Tue Jan 20 10:49:24 2015 +0100
@@ -1,8 +1,9 @@
 # automagically generated by the project definition
 # this file is needed for stc to be able to compile modules independently.
 # it provides information about a classes filename, category and especially namespace.
+Benchmarks::JavaLookup Benchmarks__JavaLookup stx:libjava/experiments 'benchmarks-Misc' 0
 JavaByteCodeInterpreter JavaByteCodeInterpreter stx:libjava/experiments 'Languages-Java-Bytecode' 0
-JavaClassReloaderTests JavaClassReloaderTests stx:libjava/experiments 'Languages-Java-Tests-ClassReloading' 1
+JavaByteCodeInterpreterTests JavaByteCodeInterpreterTests stx:libjava/experiments 'Languages-Java-Tests' 1
 JavaMethodWrapperCompiler JavaMethodWrapperCompiler stx:libjava/experiments 'Languages-Java-Experiments-Lookup' 0
 NoReflectionObject NoReflectionObject stx:libjava/experiments 'Languages-Java-Experiments-Lookup' 0
 PersonSample PersonSample stx:libjava/experiments 'Languages-Java-Experiments-Tests' 0
@@ -10,5 +11,3 @@
 SetSample SetSample stx:libjava/experiments 'Languages-Java-Experiments-Tests' 0
 stx_libjava_experiments stx_libjava_experiments stx:libjava/experiments '* Projects & Packages *' 3
 JavaByteCodeSteppableInterpreter JavaByteCodeSteppableInterpreter stx:libjava/experiments 'Languages-Java-Bytecode' 0
-Benchmarks::JavaLookup Benchmarks__JavaLookup stx:libjava/experiments 'benchmarks-Misc' 0
-JavaByteCodeInterpreterTests JavaByteCodeInterpreterTests stx:libjava/experiments 'Languages-Java-Tests' 1
--- a/experiments/bc.mak	Tue Jan 20 10:41:54 2015 +0100
+++ b/experiments/bc.mak	Tue Jan 20 10:49:24 2015 +0100
@@ -35,7 +35,7 @@
 
 
 
-LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libbasic3 -I$(INCLUDE_TOP)\stx\libjava -I$(INCLUDE_TOP)\stx\libjava\tools
+LOCALINCLUDES= -I$(INCLUDE_TOP)\stx\libbasic -I$(INCLUDE_TOP)\stx\libjava
 LOCALDEFINES=
 
 STCLOCALOPT=-package=$(PACKAGE) -I. $(LOCALINCLUDES) -headerDir=. $(STCLOCALOPTIMIZATIONS) $(STCWARNINGS) $(LOCALDEFINES)  -varPrefix=$(LIBNAME)
--- a/experiments/experiments.rc	Tue Jan 20 10:41:54 2015 +0100
+++ b/experiments/experiments.rc	Tue Jan 20 10:49:24 2015 +0100
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava_experiments.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,4305,4305
+  FILEVERSION     6,2,32767,32767
   PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG\0"
       VALUE "FileDescription", "Smalltalk/X Class library (LIB)\0"
-      VALUE "FileVersion", "6.2.4305.4305\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
       VALUE "InternalName", "stx:libjava/experiments\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2015\nCopyright eXept Software AG 1998-2015\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.5.0\0"
-      VALUE "ProductDate", "Tue, 20 Jan 2015 09:39:27 GMT\0"
+      VALUE "ProductDate", "Tue, 20 Jan 2015 09:48:24 GMT\0"
     END
 
   END
--- a/experiments/stx_libjava_experiments.st	Tue Jan 20 10:41:54 2015 +0100
+++ b/experiments/stx_libjava_experiments.st	Tue Jan 20 10:49:24 2015 +0100
@@ -89,7 +89,7 @@
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'stx:libbasic'    "Autoload - superclass of Benchmarks::JavaLookup"
+        #'stx:libbasic'    "Collection - superclass of SetSample"
         #'stx:libjava'    "Java - superclass of JavaMethodWrapperCompiler"
     )
 !
@@ -120,8 +120,6 @@
      by searching all classes (and their packages) which are referenced by my classes."
 
     ^ #(
-        #'stx:libbasic3'    "MessageTracer - referenced by JavaClassReloaderTests>>test_05"
-        #'stx:libjava/tools'    "JavaCompiler - referenced by JavaClassReloaderTests>>callerClass"
     )
 !
 
@@ -194,8 +192,9 @@
 
     ^ #(
         "<className> or (<className> attributes...) in load order"
+        (#'Benchmarks::JavaLookup' autoload)
         JavaByteCodeInterpreter
-        (JavaClassReloaderTests autoload)
+        (JavaByteCodeInterpreterTests autoload)
         JavaMethodWrapperCompiler
         NoReflectionObject
         PersonSample
@@ -203,8 +202,6 @@
         SetSample
         #'stx_libjava_experiments'
         JavaByteCodeSteppableInterpreter
-        (#'Benchmarks::JavaLookup' autoload)
-        (JavaByteCodeInterpreterTests autoload)
     )
 !
 
--- a/libjava.rc	Tue Jan 20 10:41:54 2015 +0100
+++ b/libjava.rc	Tue Jan 20 10:49:24 2015 +0100
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,4305,4305
+  FILEVERSION     6,2,32767,32767
   PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG & SWING Research Group\0"
       VALUE "FileDescription", "Java support for Smalltalk/X (LIB)\0"
-      VALUE "FileVersion", "6.2.4305.4305\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
       VALUE "InternalName", "stx:libjava\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\nCopyright Jan Vrany, Jan Kurs and Marcel Hlopko\n          SWING Research Group, Czech Technical University In Prague\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.5.0\0"
-      VALUE "ProductDate", "Tue, 20 Jan 2015 09:39:24 GMT\0"
+      VALUE "ProductDate", "Tue, 20 Jan 2015 09:48:22 GMT\0"
     END
 
   END
--- a/stx_libjava.st	Tue Jan 20 10:41:54 2015 +0100
+++ b/stx_libjava.st	Tue Jan 20 10:49:24 2015 +0100
@@ -310,6 +310,7 @@
         "<className> or (<className> attributes...) in load order"
         GroovyCompiler
         GroovyEvaluator
+        (GroovyEvaluatorTests autoload)
         GroovyLanguage
         GroovySourceFileWriter
         JavaAnnotation
@@ -317,14 +318,18 @@
         JavaAnnotationDefault
         JavaAnnotationDictionary
         JavaAnnotationValue
+        (JavaAntProjectResource autoload)
         JavaArray
         JavaBooleanArray
         JavaByte
         JavaByteCodeProcessor
+        (JavaByteCodeProcessorTests autoload)
         JavaClassAccessor
         JavaClassEnvironment
+        (JavaClassLoadingTests autoload)
         JavaClassQuery
         JavaClassReloader
+        (JavaClassReloaderTests autoload)
         JavaCodeLibraryOrBundle
         JavaCompilerForSmalltalkExtensionsOnly
         #'JavaCompiler_Eclipse'
@@ -335,33 +340,46 @@
         JavaDescriptor
         JavaError
         JavaExceptionTable
+        (JavaExceptionTests autoload)
         JavaField
         JavaFinalizationRegistry
+        (JavaFreshlyInitializedResource autoload)
         JavaInnerClasses
+        (JavaJUnitTests autoload)
         JavaLanguage
         JavaLibraries
+        (JavaLibrariesResource autoload)
         JavaLocalVariableTable
         JavaLocalVariableTableEntry
         JavaLookup
+        (JavaLookupResolutionAlgorithmTests autoload)
+        (JavaLookupTests autoload)
         JavaMetaclass
         JavaMonitor
+        (JavaMonitorsTests autoload)
         JavaNameAndType2
         JavaNativeMemory
+        (JavaNativeMemoryTests autoload)
         JavaNioSupport
         JavaObject
         JavaObjectDictionary
         JavaPopUpView
         JavaProcess
         JavaRef2
+        (JavaRefsAndConstantPoolTestCase autoload)
         JavaRelease
+        (JavaReleaseTests autoload)
         JavaResolver
         JavaShort
         JavaSlotIndexCache
         JavaSocket
         JavaSourceCodeCache
         JavaSourceFileWriter
+        (JavaTestCaseProxy autoload)
         JavaTestsLoader
+        (JavaThreadingTests autoload)
         JavaTopView
+        (JavaUTF8Tests autoload)
         JavaUnresolvedCompilationError
         JavaUnresolvedConstant
         JavaUtilities
@@ -377,6 +395,7 @@
         SmalltalkAppletStub
         #'stx_libjava'
         GroovyMetaclass
+        (JUnitTestCaseProxy autoload)
         Java
         JavaAnnotationArrayValue
         JavaAnnotationClassValue
@@ -385,12 +404,15 @@
         JavaAnnotationPrimitiveValue
         JavaBehavior
         JavaByteCodeDisassembler
+        (JavaByteCodeDisassemblerTests autoload)
         JavaByteCodeEnumerator
         JavaByteCodeProcessorAdapter
         JavaClassAnnotationContainer
         JavaClassMemberRef2
         JavaClassReader
+        (JavaClassReaderTests autoload)
         JavaClassRef2
+        (JavaClassRefTests autoload)
         JavaClassRegistry
         JavaCodeBundle
         JavaCodeLibrary
@@ -398,16 +420,23 @@
         JavaFieldAnnotationContainer
         JavaFieldDescriptor
         JavaFieldDescriptorWithUnionType
+        (JavaFieldRefTests autoload)
+        (JavaInitializedResource autoload)
+        (JavaInterfaceMethodRefTests autoload)
         JavaInvalidRefError
         JavaInvokeDynamic2
         JavaMethod
         JavaMethodAnnotationContainer
         JavaMethodDescriptor
         JavaMethodHandle2
+        (JavaMethodRefTests autoload)
         JavaMethodType2
         JavaMirror
         #'JavaNativeMethodImpl_OpenJDK6'
+        (JavaRefMock autoload)
+        (JavaRuntimeConstantPoolTests autoload)
         JavaStringRef2
+        (JavaTestsResource autoload)
         JavaUnhandledExceptionError
         JavaUnhandledThreadDeathError
         JavaUnresolvedClassConstant
@@ -417,6 +446,7 @@
         ProxyMethodGuardNode
         ProxyMethodInvocationNode
         ProxyMethodJavaFieldAccessor
+        (TestletTestCaseProxy autoload)
         JavaAlienMirror
         JavaArrayMirror
         JavaByteCodePreresolver
@@ -446,35 +476,6 @@
         ProxyMethodJavaTypeCheckNode
         JavaNativeMethod
         #'JavaNativeMethodImpl_OracleJDK8'
-        (GroovyEvaluatorTests autoload)
-        (JUnitTestCaseProxy autoload)
-        (JavaAntProjectResource autoload)
-        (JavaByteCodeDisassemblerTests autoload)
-        (JavaByteCodeProcessorTests autoload)
-        (JavaClassLoadingTests autoload)
-        (JavaClassReaderTests autoload)
-        (JavaClassRefTests autoload)
-        (JavaExceptionTests autoload)
-        (JavaFieldRefTests autoload)
-        (JavaFreshlyInitializedResource autoload)
-        (JavaInitializedResource autoload)
-        (JavaInterfaceMethodRefTests autoload)
-        (JavaJUnitTests autoload)
-        (JavaLibrariesResource autoload)
-        (JavaLookupResolutionAlgorithmTests autoload)
-        (JavaLookupTests autoload)
-        (JavaMethodRefTests autoload)
-        (JavaMonitorsTests autoload)
-        (JavaNativeMemoryTests autoload)
-        (JavaRefMock autoload)
-        (JavaRefsAndConstantPoolTestCase autoload)
-        (JavaReleaseTests autoload)
-        (JavaRuntimeConstantPoolTests autoload)
-        (JavaTestCaseProxy autoload)
-        (JavaTestsResource autoload)
-        (JavaThreadingTests autoload)
-        (JavaUTF8Tests autoload)
-        (TestletTestCaseProxy autoload)
     )
 !
 
--- a/tools/abbrev.stc	Tue Jan 20 10:41:54 2015 +0100
+++ b/tools/abbrev.stc	Tue Jan 20 10:49:24 2015 +0100
@@ -5,6 +5,7 @@
 JavaCodeBundleEditor JavaCodeBundleEditor stx:libjava/tools 'Languages-Java-Tools' 1
 JavaCodeLibraryEditor JavaCodeLibraryEditor stx:libjava/tools 'Languages-Java-Tools' 1
 JavaCompiler JavaCompiler stx:libjava/tools 'Languages-Java-Support-Compiling' 0
+JavaCompilerTests JavaCompilerTests stx:libjava/tools 'Languages-Java-Tests-Compiling' 1
 JavaLintAnnotation JavaLintAnnotation stx:libjava/tools 'Languages-Java-Tools-Editor-Lint' 0
 JavaLintHighlighter JavaLintHighlighter stx:libjava/tools 'Languages-Java-Tools-Editor-Lint' 0
 JavaLintPopupWindow JavaLintPopupWindow stx:libjava/tools 'Languages-Java-Tools-Editor-Lint' 1
@@ -24,4 +25,3 @@
 GroovyScanner GroovyScanner stx:libjava/tools 'Languages-Groovy-Tools-Source' 3
 JavaLexicalHighlighter JavaLexicalHighlighter stx:libjava/tools 'Languages-Java-Tools-Source' 0
 GroovySourceHighlighter GroovySourceHighlighter stx:libjava/tools 'Languages-Groovy-Tools-Source' 0
-JavaCompilerTests JavaCompilerTests stx:libjava/tools 'Languages-Java-Tests-Compiling' 1
--- a/tools/stx_libjava_tools.st	Tue Jan 20 10:41:54 2015 +0100
+++ b/tools/stx_libjava_tools.st	Tue Jan 20 10:49:24 2015 +0100
@@ -34,7 +34,7 @@
      by searching along the inheritance chain of all of my classes."
 
     ^ #(
-        #'stx:libbasic'    "Autoload - superclass of JavaCompilerTests"
+        #'stx:libbasic'    "ConfigurableFeatures - extended"
         #'stx:libjava'    "JavaObject - extended"
         #'stx:libtool'    "AbstractSettingsApplication - superclass of JavaSettingsApplication"
         #'stx:libview'    "DisplaySurface - superclass of JavaListInspectorView"
@@ -129,6 +129,7 @@
         JavaCodeBundleEditor
         JavaCodeLibraryEditor
         JavaCompiler
+        (JavaCompilerTests autoload)
         JavaLintAnnotation
         JavaLintHighlighter
         JavaLintPopupWindow
@@ -148,7 +149,6 @@
         GroovyScanner
         JavaLexicalHighlighter
         GroovySourceHighlighter
-        (JavaCompilerTests autoload)
     )
 !
 
--- a/tools/tools.rc	Tue Jan 20 10:41:54 2015 +0100
+++ b/tools/tools.rc	Tue Jan 20 10:49:24 2015 +0100
@@ -3,7 +3,7 @@
 // automagically generated from the projectDefinition: stx_libjava_tools.
 //
 VS_VERSION_INFO VERSIONINFO
-  FILEVERSION     6,2,4305,4305
+  FILEVERSION     6,2,32767,32767
   PRODUCTVERSION  6,2,5,0
 #if (__BORLANDC__)
   FILEFLAGSMASK   VS_FF_DEBUG | VS_FF_PRERELEASE
@@ -20,12 +20,12 @@
     BEGIN
       VALUE "CompanyName", "eXept Software AG\0"
       VALUE "FileDescription", "Smalltalk/X Class library (LIB)\0"
-      VALUE "FileVersion", "6.2.4305.4305\0"
+      VALUE "FileVersion", "6.2.32767.32767\0"
       VALUE "InternalName", "stx:libjava/tools\0"
       VALUE "LegalCopyright", "Copyright Claus Gittinger 1988-2011\nCopyright eXept Software AG 1998-2011\0"
       VALUE "ProductName", "Smalltalk/X\0"
       VALUE "ProductVersion", "6.2.5.0\0"
-      VALUE "ProductDate", "Tue, 20 Jan 2015 09:39:29 GMT\0"
+      VALUE "ProductDate", "Tue, 20 Jan 2015 09:48:26 GMT\0"
     END
 
   END