Hi guys. I have a simple scenario where I create classes and then I remove
them. I just want to be sure the amount of metaclasses and Class subclasses
is correct.
Hence, I have the following test. What I don't understand is that the test
only works when I do a #removeAllObsoleteSubclasses to all classes.
So…my questions is, is that correct? I am doing something wrong? because I
would expect that #removeFromSystem takes care about that… this means that
there will be obsolete classes/metaclasses hanging around until I send
#removeAllObsoleteSubclasses ?
Even more…the values in WeakKeyToCollectionDictionary (the class of the
class var ObsoleteSubclasses in Behavior) are WeakArray… so they shouldn't
be bothering.
Sometimes the test is yellow…a wait a little bit and then if I run it is
greed again. When it fails, it is always the same, metaclassesBeforeTest has
1 less inst than Metaclass instanceCount. Sometimes it is the other way
around and it has 1 more instead of one less.
Thanks a lot for any clue…
testXXX
"Tests materialization of a hierarchy of classes that are not defined in
the image and classes that indeed are defined. In addition we test to
correctly create the necessary amount of classes and metaclasses."
| classes a b c d metaclassesBeforeTest classSubclassesBeforeTest |
3 timesRepeat: [Smalltalk garbageCollect].
metaclassesBeforeTest := Metaclass instanceCount.
classSubclassesBeforeTest := Class allSubclasses size.
a := Object subclass: #Xaaa instanceVariableNames: ''
classVariableNames: '' poolDictionaries: '' category: ''.
b := a subclass: #Xbbb instanceVariableNames: ''
classVariableNames: '' poolDictionaries: '' category: ''.
c := a subclass: #Xccc instanceVariableNames: '' classVariableNames:
'' poolDictionaries: '' category: ''.
d := Date subclass: #Xddd instanceVariableNames: ''
classVariableNames: '' poolDictionaries: '' category: ''.
classes := Array with: a with: b with: c with: d.
classes do: [ :aClassOrTrait | aClassOrTrait removeFromSystem ].
classes := nil.
a := b := c := d := nil.
6 timesRepeat: [Smalltalk garbageCollect].
Smalltalk allClasses do: [:each | each removeAllObsoleteSubclasses].
self assert: metaclassesBeforeTest = Metaclass instanceCount .
self assert: classSubclassesBeforeTest = Class allSubclasses size.
--
Mariano
http://marianopeck.wordpress.com