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

Reply via email to