Browse Source

TClassBuildingTest. Clean Class[Builder]Test.

Herby Vojčík 4 years ago
parent
commit
c9bbf6cb71
2 changed files with 348 additions and 405 deletions
  1. 282 349
      lang/src/Kernel-Tests.js
  2. 66 56
      lang/src/Kernel-Tests.st

+ 282 - 349
lang/src/Kernel-Tests.js

@@ -1938,26 +1938,24 @@ selector: "tearDown",
 protocol: "running",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "tearDown\x0a\x09theClass ifNotNil: [\x0a\x09\x09Smalltalk removeClass: theClass.\x0a\x09\x09self deny: (theClass package classes includes: theClass).\x0a\x09\x09self assert: (Smalltalk globals at: theClass name) equals: nil.\x0a\x09\x09theClass := nil ]",
+source: "tearDown\x0a\x09self tearDownTheClass.\x0a\x09theClass ifNotNil: [\x0a\x09\x09self deny: (theClass package classes includes: theClass).\x0a\x09\x09self assert: (Smalltalk globals at: theClass name) equals: nil ]",
 referencedClasses: ["Smalltalk"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["ifNotNil:", "removeClass:", "deny:", "includes:", "classes", "package", "assert:equals:", "at:", "globals", "name"]
+messageSends: ["tearDownTheClass", "ifNotNil:", "deny:", "includes:", "classes", "package", "assert:equals:", "at:", "globals", "name"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
 var $1,$receiver;
+$self._tearDownTheClass();
 $1=$self.theClass;
 if(($receiver = $1) == null || $receiver.a$nil){
 $1;
 } else {
-$recv($globals.Smalltalk)._removeClass_($self.theClass);
 $self._deny_($recv($recv($recv($self.theClass)._package())._classes())._includes_($self.theClass));
 $self._assert_equals_($recv($recv($globals.Smalltalk)._globals())._at_($recv($self.theClass)._name()),nil);
-$self.theClass=nil;
-$self.theClass;
 }
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -2016,69 +2014,19 @@ selector: "testClassCopy",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testClassCopy\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09self assert: theClass superclass == ObjectMock superclass.\x0a\x09self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass package == ObjectMock package.\x0a\x09self assert: (theClass package classes includes: theClass).\x0a\x09self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys",
+source: "testClassCopy\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass isClassCopyOf: ObjectMock",
 referencedClasses: ["ObjectMock"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "assert:", "==", "superclass", "instanceVariableNames", "assert:equals:", "name", "package", "includes:", "classes", "keys", "methodDictionary"]
+messageSends: ["copyClass:named:", "assert:equals:", "name", "assert:isClassCopyOf:"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$4,$3,$6,$7,$5,$9,$8;
 $self.theClass=$recv($self.builder)._copyClass_named_($globals.ObjectMock,"ObjectMock2");
-$2=$recv($self.theClass)._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2).__eq_eq($recv($globals.ObjectMock)._superclass());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=1;
-//>>excludeEnd("ctx");
-$self._assert_($1);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=1;
-//>>excludeEnd("ctx");
-$4=$recv($self.theClass)._instanceVariableNames();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["instanceVariableNames"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($4).__eq_eq($recv($globals.ObjectMock)._instanceVariableNames());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=2;
-//>>excludeEnd("ctx");
-$self._assert_($3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=2;
-//>>excludeEnd("ctx");
 $self._assert_equals_($recv($self.theClass)._name(),"ObjectMock2");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=1;
-//>>excludeEnd("ctx");
-$6=$recv($self.theClass)._package();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=1;
-//>>excludeEnd("ctx");
-$7=$recv($globals.ObjectMock)._package();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=2;
-//>>excludeEnd("ctx");
-$5=$recv($6).__eq_eq($7);
-$self._assert_($5);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=3;
-//>>excludeEnd("ctx");
-$self._assert_($recv($recv($recv($self.theClass)._package())._classes())._includes_($self.theClass));
-$9=$recv($self.theClass)._methodDictionary();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["methodDictionary"]=1;
-//>>excludeEnd("ctx");
-$8=$recv($9)._keys();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["keys"]=1;
-//>>excludeEnd("ctx");
-$self._assert_equals_($8,$recv($recv($globals.ObjectMock)._methodDictionary())._keys());
+$self._assert_isClassCopyOf_($self.theClass,$globals.ObjectMock);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"testClassCopy",{})});
@@ -2092,11 +2040,11 @@ selector: "testClassMigration",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testClassMigration\x0a\x09| instance oldClass |\x0a\x09\x0a\x09oldClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09instance := (Smalltalk globals at: 'ObjectMock2') new.\x0a\x09\x0a\x09\x22Change the superclass of ObjectMock2\x22\x0a\x09ObjectMock subclass: #ObjectMock2\x0a\x09\x09instanceVariableNames: ''\x0a\x09\x09package: 'Kernel-Tests'.\x0a\x09\x0a\x09self deny: oldClass == ObjectMock2.\x0a\x09\x0a\x09self assert: ObjectMock2 superclass == ObjectMock.\x0a\x09self assert: ObjectMock2 instanceVariableNames isEmpty.\x0a\x09self assert: ObjectMock2 selectors equals: oldClass selectors.\x0a\x09self assert: ObjectMock2 comment equals: oldClass comment.\x0a\x09self assert: ObjectMock2 package name equals: 'Kernel-Tests'.\x0a\x09self assert: (ObjectMock2 package classes includes: ObjectMock2).\x0a\x09\x0a\x09self deny: instance class == ObjectMock2.\x0a\x09\x22Commeting this out. Tests implementation detail.\x22\x0a\x09\x22self assert: instance class name equals: 'OldObjectMock2'.\x22\x0a\x09\x0a\x09self assert: (Smalltalk globals at: instance class name) isNil.\x0a\x09\x0a\x09Smalltalk removeClass: ObjectMock2",
+source: "testClassMigration\x0a\x09| instance oldClass |\x0a\x09\x0a\x09oldClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09instance := (Smalltalk globals at: 'ObjectMock2') new.\x0a\x09\x0a\x09\x22Change the superclass of ObjectMock2\x22\x0a\x09theClass := ObjectMock subclass: #ObjectMock2\x0a\x09\x09instanceVariableNames: ''\x0a\x09\x09package: 'Kernel-Tests'.\x0a\x09\x0a\x09self deny: oldClass == ObjectMock2.\x0a\x09\x0a\x09self assert: ObjectMock2 superclass == ObjectMock.\x0a\x09self assert: ObjectMock2 instanceVariableNames isEmpty.\x0a\x09self assert: ObjectMock2 selectors equals: oldClass selectors.\x0a\x09self assert: ObjectMock2 comment equals: oldClass comment.\x0a\x09self assert: ObjectMock2 package name equals: 'Kernel-Tests'.\x0a\x09self assert: (ObjectMock2 package classes includes: ObjectMock2).\x0a\x09\x0a\x09self deny: instance class == ObjectMock2.\x0a\x09\x0a\x09self assert: (Smalltalk globals at: instance class name) isNil",
 referencedClasses: ["ObjectMock", "Smalltalk", "ObjectMock2"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "new", "at:", "globals", "subclass:instanceVariableNames:package:", "deny:", "==", "assert:", "superclass", "isEmpty", "instanceVariableNames", "assert:equals:", "selectors", "comment", "name", "package", "includes:", "classes", "class", "isNil", "removeClass:"]
+messageSends: ["copyClass:named:", "new", "at:", "globals", "subclass:instanceVariableNames:package:", "deny:", "==", "assert:", "superclass", "isEmpty", "instanceVariableNames", "assert:equals:", "selectors", "comment", "name", "package", "includes:", "classes", "class", "isNil"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 var instance,oldClass;
@@ -2114,7 +2062,7 @@ $1=$recv($2)._at_("ObjectMock2");
 $ctx1.sendIdx["at:"]=1;
 //>>excludeEnd("ctx");
 instance=$recv($1)._new();
-$recv($globals.ObjectMock)._subclass_instanceVariableNames_package_("ObjectMock2","","Kernel-Tests");
+$self.theClass=$recv($globals.ObjectMock)._subclass_instanceVariableNames_package_("ObjectMock2","","Kernel-Tests");
 $3=$recv(oldClass).__eq_eq($globals.ObjectMock2);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["=="]=1;
@@ -2171,7 +2119,6 @@ $ctx1.sendIdx["class"]=1;
 $9=$recv($10).__eq_eq($globals.ObjectMock2);
 $self._deny_($9);
 $self._assert_($recv($recv($recv($globals.Smalltalk)._globals())._at_($recv($recv(instance)._class())._name()))._isNil());
-$recv($globals.Smalltalk)._removeClass_($globals.ObjectMock2);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"testClassMigration",{instance:instance,oldClass:oldClass})});
@@ -2185,11 +2132,11 @@ selector: "testClassMigrationWithClassInstanceVariables",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testClassMigrationWithClassInstanceVariables\x0a\x09\x0a\x09builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09ObjectMock2 class instanceVariableNames: 'foo bar'.\x0a\x09\x0a\x09\x22Change the superclass of ObjectMock2\x22\x0a\x09ObjectMock subclass: (Smalltalk globals at: 'ObjectMock2') name\x0a\x09\x09instanceVariableNames: ''\x0a\x09\x09package: 'Kernel-Tests'.\x0a\x09\x0a\x09self assert: ObjectMock2 class instanceVariableNames equals: #('foo' 'bar').\x0a\x09\x0a\x09Smalltalk removeClass: ObjectMock2",
-referencedClasses: ["ObjectMock", "ObjectMock2", "Smalltalk"],
+source: "testClassMigrationWithClassInstanceVariables\x0a\x09\x0a\x09builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09ObjectMock2 class instanceVariableNames: '    foo  bar       '.\x0a\x09\x0a\x09\x22Change the superclass of ObjectMock2\x22\x0a\x09theClass := ObjectMock subclass: #ObjectMock2\x0a\x09\x09instanceVariableNames: ''\x0a\x09\x09package: 'Kernel-Tests'.\x0a\x09\x0a\x09self assert: ObjectMock2 class instanceVariableNames equals: #('foo' 'bar')",
+referencedClasses: ["ObjectMock", "ObjectMock2"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "instanceVariableNames:", "class", "subclass:instanceVariableNames:package:", "name", "at:", "globals", "assert:equals:", "instanceVariableNames", "removeClass:"]
+messageSends: ["copyClass:named:", "instanceVariableNames:", "class", "subclass:instanceVariableNames:package:", "assert:equals:", "instanceVariableNames"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -2201,10 +2148,9 @@ $1=$recv($globals.ObjectMock2)._class();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["class"]=1;
 //>>excludeEnd("ctx");
-$recv($1)._instanceVariableNames_("foo bar");
-$recv($globals.ObjectMock)._subclass_instanceVariableNames_package_($recv($recv($recv($globals.Smalltalk)._globals())._at_("ObjectMock2"))._name(),"","Kernel-Tests");
+$recv($1)._instanceVariableNames_("    foo  bar       ");
+$self.theClass=$recv($globals.ObjectMock)._subclass_instanceVariableNames_package_("ObjectMock2","","Kernel-Tests");
 $self._assert_equals_($recv($recv($globals.ObjectMock2)._class())._instanceVariableNames(),["foo", "bar"]);
-$recv($globals.Smalltalk)._removeClass_($globals.ObjectMock2);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"testClassMigrationWithClassInstanceVariables",{})});
@@ -2218,17 +2164,17 @@ selector: "testClassMigrationWithSubclasses",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testClassMigrationWithSubclasses\x0a\x09\x0a\x09builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09ObjectMock2 subclass: 'ObjectMock3' instanceVariableNames: '' package: 'Kernel-Tests'.\x0a\x09ObjectMock3 subclass: 'ObjectMock4' instanceVariableNames: '' package: 'Kernel-Tests'.\x0a\x09\x0a\x09\x22Change the superclass of ObjectMock2\x22\x0a\x09ObjectMock subclass: 'ObjectMock2'\x0a\x09\x09instanceVariableNames: ''\x0a\x09\x09package: 'Kernel-Tests'.\x0a\x09\x0a\x09self assert: (ObjectMock subclasses includes: ObjectMock2).\x0a\x09self assert: (ObjectMock2 subclasses includes: ObjectMock3).\x0a\x09self assert: (ObjectMock3 subclasses includes: ObjectMock4).\x0a\x09\x0a\x09ObjectMock allSubclasses reverseDo: [ :each | Smalltalk removeClass: each ]",
-referencedClasses: ["ObjectMock", "ObjectMock2", "ObjectMock3", "ObjectMock4", "Smalltalk"],
+source: "testClassMigrationWithSubclasses\x0a\x09\x0a\x09builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09ObjectMock2 subclass: 'ObjectMock3' instanceVariableNames: '' package: 'Kernel-Tests'.\x0a\x09ObjectMock3 subclass: 'ObjectMock4' instanceVariableNames: '' package: 'Kernel-Tests'.\x0a\x09\x0a\x09\x22Change the superclass of ObjectMock2\x22\x0a\x09theClass := ObjectMock subclass: #ObjectMock2\x0a\x09\x09instanceVariableNames: ''\x0a\x09\x09package: 'Kernel-Tests'.\x0a\x09\x0a\x09self assert: ObjectMock subclasses equals: {ObjectMock2}.\x0a\x09self assert: ObjectMock2 subclasses equals: {ObjectMock3}.\x0a\x09self assert: ObjectMock3 subclasses equals: {ObjectMock4}",
+referencedClasses: ["ObjectMock", "ObjectMock2", "ObjectMock3", "ObjectMock4"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "subclass:instanceVariableNames:package:", "assert:", "includes:", "subclasses", "reverseDo:", "allSubclasses", "removeClass:"]
+messageSends: ["copyClass:named:", "subclass:instanceVariableNames:package:", "assert:equals:", "subclasses"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$4,$3;
+var $1,$2;
 $recv($self.builder)._copyClass_named_($globals.ObjectMock,"ObjectMock2");
 $recv($globals.ObjectMock2)._subclass_instanceVariableNames_package_("ObjectMock3","","Kernel-Tests");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -2238,41 +2184,24 @@ $recv($globals.ObjectMock3)._subclass_instanceVariableNames_package_("ObjectMock
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["subclass:instanceVariableNames:package:"]=2;
 //>>excludeEnd("ctx");
-$recv($globals.ObjectMock)._subclass_instanceVariableNames_package_("ObjectMock2","","Kernel-Tests");
-$2=$recv($globals.ObjectMock)._subclasses();
+$self.theClass=$recv($globals.ObjectMock)._subclass_instanceVariableNames_package_("ObjectMock2","","Kernel-Tests");
+$1=$recv($globals.ObjectMock)._subclasses();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["subclasses"]=1;
 //>>excludeEnd("ctx");
-$1=$recv($2)._includes_($globals.ObjectMock2);
+$self._assert_equals_($1,[$globals.ObjectMock2]);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["includes:"]=1;
-//>>excludeEnd("ctx");
-$self._assert_($1);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=1;
+$ctx1.sendIdx["assert:equals:"]=1;
 //>>excludeEnd("ctx");
-$4=$recv($globals.ObjectMock2)._subclasses();
+$2=$recv($globals.ObjectMock2)._subclasses();
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["subclasses"]=2;
 //>>excludeEnd("ctx");
-$3=$recv($4)._includes_($globals.ObjectMock3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["includes:"]=2;
-//>>excludeEnd("ctx");
-$self._assert_($3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=2;
-//>>excludeEnd("ctx");
-$self._assert_($recv($recv($globals.ObjectMock3)._subclasses())._includes_($globals.ObjectMock4));
-$recv($recv($globals.ObjectMock)._allSubclasses())._reverseDo_((function(each){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($globals.Smalltalk)._removeClass_(each);
+$self._assert_equals_($2,[$globals.ObjectMock3]);
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
+$ctx1.sendIdx["assert:equals:"]=2;
 //>>excludeEnd("ctx");
-}));
+$self._assert_equals_($recv($globals.ObjectMock3)._subclasses(),[$globals.ObjectMock4]);
 return self;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 }, function($ctx1) {$ctx1.fill(self,"testClassMigrationWithSubclasses",{})});
@@ -2336,6 +2265,24 @@ return self;
 }; }),
 $globals.ClassBuilderTest);
 
+$core.addMethod(
+$core.method({
+selector: "theClass",
+protocol: "accessing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "theClass\x0a\x09^ theClass",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: []
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+return $self.theClass;
+
+}; }),
+$globals.ClassBuilderTest);
+
 
 
 $core.addClass("ClassTest", $globals.TestCase, ["builder", "theClass"], "Kernel-Tests");
@@ -2376,30 +2323,6 @@ return self;
 }; }),
 $globals.ClassTest);
 
-$core.addMethod(
-$core.method({
-selector: "is:javaScriptInstanceOf:",
-protocol: "running",
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: ["anObject", "aJavaScriptClass"],
-source: "is: anObject javaScriptInstanceOf: aJavaScriptClass\x0a\x09<inlineJS: 'return anObject instanceof aJavaScriptClass'>",
-referencedClasses: [],
-//>>excludeEnd("ide");
-pragmas: [["inlineJS:", ["return anObject instanceof aJavaScriptClass"]]],
-messageSends: []
-}, function ($methodClass){ return function (anObject,aJavaScriptClass){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-return anObject instanceof aJavaScriptClass;
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"is:javaScriptInstanceOf:",{anObject:anObject,aJavaScriptClass:aJavaScriptClass})});
-//>>excludeEnd("ctx");
-}; }),
-$globals.ClassTest);
-
 $core.addMethod(
 $core.method({
 selector: "jsConstructor",
@@ -2452,50 +2375,6 @@ return self;
 }; }),
 $globals.ClassTest);
 
-$core.addMethod(
-$core.method({
-selector: "tearDown",
-protocol: "running",
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "tearDown\x0a\x09theClass ifNotNil: [\x0a\x09\x09theClass allSubclasses reverseDo: [ :each | Smalltalk removeClass: each ].\x0a\x09\x09Smalltalk removeClass: theClass.\x0a\x09\x09theClass := nil ]",
-referencedClasses: ["Smalltalk"],
-//>>excludeEnd("ide");
-pragmas: [],
-messageSends: ["ifNotNil:", "reverseDo:", "allSubclasses", "removeClass:"]
-}, function ($methodClass){ return function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-var $1,$receiver;
-$1=$self.theClass;
-if(($receiver = $1) == null || $receiver.a$nil){
-$1;
-} else {
-$recv($recv($self.theClass)._allSubclasses())._reverseDo_((function(each){
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx2) {
-//>>excludeEnd("ctx");
-return $recv($globals.Smalltalk)._removeClass_(each);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx2.sendIdx["removeClass:"]=1;
-//>>excludeEnd("ctx");
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,2)});
-//>>excludeEnd("ctx");
-}));
-$recv($globals.Smalltalk)._removeClass_($self.theClass);
-$self.theClass=nil;
-$self.theClass;
-}
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"tearDown",{})});
-//>>excludeEnd("ctx");
-}; }),
-$globals.ClassTest);
-
 $core.addMethod(
 $core.method({
 selector: "testAllSubclasses",
@@ -2597,82 +2476,31 @@ selector: "testBeJavaScriptSubclassOf",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testBeJavaScriptSubclassOf\x0a\x09| instance constructor |\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09constructor := self jsConstructor.\x0a\x09theClass beJavaScriptSubclassOf: constructor.\x0a\x09\x22part took from copy class test\x22\x0a\x09self assert: theClass superclass == ObjectMock superclass.\x0a\x09self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass package == ObjectMock package.\x0a\x09self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys.\x0a\x09\x22testing specific to late-coupled detached root class\x22\x0a\x09instance := theClass new.\x0a\x09self assert: instance class == theClass.\x0a\x09self assert: (self is: instance javaScriptInstanceOf: constructor).\x0a\x09self assert: instance value equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
+source: "testBeJavaScriptSubclassOf\x0a\x09| instance constructor |\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09constructor := self jsConstructor.\x0a\x09theClass beJavaScriptSubclassOf: constructor.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass isClassCopyOf: ObjectMock.\x0a\x09\x22testing specific to late-coupled detached root class\x22\x0a\x09instance := theClass new.\x0a\x09self assert: instance class == theClass.\x0a\x09self assert: instance isJavaScriptInstanceOf: constructor.\x0a\x09self assert: instance value equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
 referencedClasses: ["ObjectMock", "Error"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "jsConstructor", "beJavaScriptSubclassOf:", "assert:", "==", "superclass", "instanceVariableNames", "assert:equals:", "name", "package", "keys", "methodDictionary", "new", "class", "is:javaScriptInstanceOf:", "value", "shouldnt:raise:", "foo:", "foo"]
+messageSends: ["copyClass:named:", "jsConstructor", "beJavaScriptSubclassOf:", "assert:equals:", "name", "assert:isClassCopyOf:", "new", "assert:", "==", "class", "assert:isJavaScriptInstanceOf:", "value", "shouldnt:raise:", "foo:", "foo"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 var instance,constructor;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$4,$3,$6,$5,$8,$7;
 $self.theClass=$recv($self.builder)._copyClass_named_($globals.ObjectMock,"ObjectMock2");
 constructor=$self._jsConstructor();
 $recv($self.theClass)._beJavaScriptSubclassOf_(constructor);
-$2=$recv($self.theClass)._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2).__eq_eq($recv($globals.ObjectMock)._superclass());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=1;
-//>>excludeEnd("ctx");
-$self._assert_($1);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=1;
-//>>excludeEnd("ctx");
-$4=$recv($self.theClass)._instanceVariableNames();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["instanceVariableNames"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($4).__eq_eq($recv($globals.ObjectMock)._instanceVariableNames());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=2;
-//>>excludeEnd("ctx");
-$self._assert_($3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=2;
-//>>excludeEnd("ctx");
 $self._assert_equals_($recv($self.theClass)._name(),"ObjectMock2");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["assert:equals:"]=1;
 //>>excludeEnd("ctx");
-$6=$recv($self.theClass)._package();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=1;
-//>>excludeEnd("ctx");
-$5=$recv($6).__eq_eq($recv($globals.ObjectMock)._package());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=3;
-//>>excludeEnd("ctx");
-$self._assert_($5);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=3;
-//>>excludeEnd("ctx");
-$8=$recv($self.theClass)._methodDictionary();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["methodDictionary"]=1;
-//>>excludeEnd("ctx");
-$7=$recv($8)._keys();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["keys"]=1;
-//>>excludeEnd("ctx");
-$self._assert_equals_($7,$recv($recv($globals.ObjectMock)._methodDictionary())._keys());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=2;
-//>>excludeEnd("ctx");
+$self._assert_isClassCopyOf_($self.theClass,$globals.ObjectMock);
 instance=$recv($self.theClass)._new();
 $self._assert_($recv($recv(instance)._class()).__eq_eq($self.theClass));
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=4;
-//>>excludeEnd("ctx");
-$self._assert_($self._is_javaScriptInstanceOf_(instance,constructor));
+$self._assert_isJavaScriptInstanceOf_(instance,constructor);
 $self._assert_equals_($recv(instance)._value(),(4));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=3;
+$ctx1.sendIdx["assert:equals:"]=2;
 //>>excludeEnd("ctx");
 $self._shouldnt_raise_((function(){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -2935,77 +2763,29 @@ selector: "testSetJavaScriptConstructor",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testSetJavaScriptConstructor\x0a\x09| instance |\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09theClass javaScriptConstructor: self jsConstructor.\x0a\x09\x22part took from copy class test\x22\x0a\x09self assert: theClass superclass == ObjectMock superclass.\x0a\x09self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass package == ObjectMock package.\x0a\x09self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys.\x0a\x09\x22testing specific to late-coupled detached root class\x22\x0a\x09instance := theClass new.\x0a\x09self assert: instance class == theClass.\x0a\x09self assert: instance value equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
+source: "testSetJavaScriptConstructor\x0a\x09| instance |\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09theClass javaScriptConstructor: self jsConstructor.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass isClassCopyOf: ObjectMock.\x0a\x09\x22testing specific to late-coupled detached root class\x22\x0a\x09instance := theClass new.\x0a\x09self assert: instance class == theClass.\x0a\x09self assert: instance value equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
 referencedClasses: ["ObjectMock", "Error"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "javaScriptConstructor:", "jsConstructor", "assert:", "==", "superclass", "instanceVariableNames", "assert:equals:", "name", "package", "keys", "methodDictionary", "new", "class", "value", "shouldnt:raise:", "foo:", "foo"]
+messageSends: ["copyClass:named:", "javaScriptConstructor:", "jsConstructor", "assert:equals:", "name", "assert:isClassCopyOf:", "new", "assert:", "==", "class", "value", "shouldnt:raise:", "foo:", "foo"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 var instance;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$4,$3,$6,$5,$8,$7;
 $self.theClass=$recv($self.builder)._copyClass_named_($globals.ObjectMock,"ObjectMock2");
 $recv($self.theClass)._javaScriptConstructor_($self._jsConstructor());
-$2=$recv($self.theClass)._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2).__eq_eq($recv($globals.ObjectMock)._superclass());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=1;
-//>>excludeEnd("ctx");
-$self._assert_($1);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=1;
-//>>excludeEnd("ctx");
-$4=$recv($self.theClass)._instanceVariableNames();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["instanceVariableNames"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($4).__eq_eq($recv($globals.ObjectMock)._instanceVariableNames());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=2;
-//>>excludeEnd("ctx");
-$self._assert_($3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=2;
-//>>excludeEnd("ctx");
 $self._assert_equals_($recv($self.theClass)._name(),"ObjectMock2");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["assert:equals:"]=1;
 //>>excludeEnd("ctx");
-$6=$recv($self.theClass)._package();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=1;
-//>>excludeEnd("ctx");
-$5=$recv($6).__eq_eq($recv($globals.ObjectMock)._package());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=3;
-//>>excludeEnd("ctx");
-$self._assert_($5);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=3;
-//>>excludeEnd("ctx");
-$8=$recv($self.theClass)._methodDictionary();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["methodDictionary"]=1;
-//>>excludeEnd("ctx");
-$7=$recv($8)._keys();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["keys"]=1;
-//>>excludeEnd("ctx");
-$self._assert_equals_($7,$recv($recv($globals.ObjectMock)._methodDictionary())._keys());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=2;
-//>>excludeEnd("ctx");
+$self._assert_isClassCopyOf_($self.theClass,$globals.ObjectMock);
 instance=$recv($self.theClass)._new();
 $self._assert_($recv($recv(instance)._class()).__eq_eq($self.theClass));
 $self._assert_equals_($recv(instance)._value(),(4));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=3;
+$ctx1.sendIdx["assert:equals:"]=2;
 //>>excludeEnd("ctx");
 $self._shouldnt_raise_((function(){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -3024,107 +2804,35 @@ return self;
 }; }),
 $globals.ClassTest);
 
-$core.addMethod(
-$core.method({
-selector: "testSlotsFromInstanceVariablesString",
-protocol: "tests",
-//>>excludeStart("ide", pragmas.excludeIdeData);
-args: [],
-source: "testSlotsFromInstanceVariablesString\x0a\x09self assert: '  hello   world   ' instanceVariablesStringAsSlotList equals: #('hello' 'world')",
-referencedClasses: [],
-//>>excludeEnd("ide");
-pragmas: [],
-messageSends: ["assert:equals:", "instanceVariablesStringAsSlotList"]
-}, function ($methodClass){ return function (){
-var self=this,$self=this;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-return $core.withContext(function($ctx1) {
-//>>excludeEnd("ctx");
-$self._assert_equals_("  hello   world   "._instanceVariablesStringAsSlotList(),["hello", "world"]);
-return self;
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-}, function($ctx1) {$ctx1.fill(self,"testSlotsFromInstanceVariablesString",{})});
-//>>excludeEnd("ctx");
-}; }),
-$globals.ClassTest);
-
 $core.addMethod(
 $core.method({
 selector: "testTrickySetJavaScriptConstructor",
 protocol: "tests",
 //>>excludeStart("ide", pragmas.excludeIdeData);
 args: [],
-source: "testTrickySetJavaScriptConstructor\x0a\x09| instance |\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09theClass javaScriptConstructor: self trickyJsConstructor.\x0a\x09\x22part took from copy class test\x22\x0a\x09self assert: theClass superclass == ObjectMock superclass.\x0a\x09self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass package == ObjectMock package.\x0a\x09self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys.\x0a\x09\x22testing specific to late-coupled detached root class\x22\x0a\x09instance := theClass new.\x0a\x09self assert: instance class == theClass.\x0a\x09self assert: instance value equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
+source: "testTrickySetJavaScriptConstructor\x0a\x09| instance |\x0a\x09theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.\x0a\x09theClass javaScriptConstructor: self trickyJsConstructor.\x0a\x09self assert: theClass name equals: 'ObjectMock2'.\x0a\x09self assert: theClass isClassCopyOf: ObjectMock.\x0a\x09\x22testing specific to late-coupled detached root class\x22\x0a\x09instance := theClass new.\x0a\x09self assert: instance class == theClass.\x0a\x09self assert: instance value equals: 4.\x0a\x09self shouldnt: [ instance foo: 9 ] raise: Error.\x0a\x09self assert: instance foo equals: 9",
 referencedClasses: ["ObjectMock", "Error"],
 //>>excludeEnd("ide");
 pragmas: [],
-messageSends: ["copyClass:named:", "javaScriptConstructor:", "trickyJsConstructor", "assert:", "==", "superclass", "instanceVariableNames", "assert:equals:", "name", "package", "keys", "methodDictionary", "new", "class", "value", "shouldnt:raise:", "foo:", "foo"]
+messageSends: ["copyClass:named:", "javaScriptConstructor:", "trickyJsConstructor", "assert:equals:", "name", "assert:isClassCopyOf:", "new", "assert:", "==", "class", "value", "shouldnt:raise:", "foo:", "foo"]
 }, function ($methodClass){ return function (){
 var self=this,$self=this;
 var instance;
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 return $core.withContext(function($ctx1) {
 //>>excludeEnd("ctx");
-var $2,$1,$4,$3,$6,$5,$8,$7;
 $self.theClass=$recv($self.builder)._copyClass_named_($globals.ObjectMock,"ObjectMock2");
 $recv($self.theClass)._javaScriptConstructor_($self._trickyJsConstructor());
-$2=$recv($self.theClass)._superclass();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["superclass"]=1;
-//>>excludeEnd("ctx");
-$1=$recv($2).__eq_eq($recv($globals.ObjectMock)._superclass());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=1;
-//>>excludeEnd("ctx");
-$self._assert_($1);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=1;
-//>>excludeEnd("ctx");
-$4=$recv($self.theClass)._instanceVariableNames();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["instanceVariableNames"]=1;
-//>>excludeEnd("ctx");
-$3=$recv($4).__eq_eq($recv($globals.ObjectMock)._instanceVariableNames());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=2;
-//>>excludeEnd("ctx");
-$self._assert_($3);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=2;
-//>>excludeEnd("ctx");
 $self._assert_equals_($recv($self.theClass)._name(),"ObjectMock2");
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
 $ctx1.sendIdx["assert:equals:"]=1;
 //>>excludeEnd("ctx");
-$6=$recv($self.theClass)._package();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["package"]=1;
-//>>excludeEnd("ctx");
-$5=$recv($6).__eq_eq($recv($globals.ObjectMock)._package());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["=="]=3;
-//>>excludeEnd("ctx");
-$self._assert_($5);
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:"]=3;
-//>>excludeEnd("ctx");
-$8=$recv($self.theClass)._methodDictionary();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["methodDictionary"]=1;
-//>>excludeEnd("ctx");
-$7=$recv($8)._keys();
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["keys"]=1;
-//>>excludeEnd("ctx");
-$self._assert_equals_($7,$recv($recv($globals.ObjectMock)._methodDictionary())._keys());
-//>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=2;
-//>>excludeEnd("ctx");
+$self._assert_isClassCopyOf_($self.theClass,$globals.ObjectMock);
 instance=$recv($self.theClass)._new();
 $self._assert_($recv($recv(instance)._class()).__eq_eq($self.theClass));
 $self._assert_equals_($recv(instance)._value(),(4));
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
-$ctx1.sendIdx["assert:equals:"]=3;
+$ctx1.sendIdx["assert:equals:"]=2;
 //>>excludeEnd("ctx");
 $self._shouldnt_raise_((function(){
 //>>excludeStart("ctx", pragmas.excludeDebugContexts);
@@ -3143,6 +2851,24 @@ return self;
 }; }),
 $globals.ClassTest);
 
+$core.addMethod(
+$core.method({
+selector: "theClass",
+protocol: "accessing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "theClass\x0a\x09^ theClass",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: []
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+return $self.theClass;
+
+}; }),
+$globals.ClassTest);
+
 $core.addMethod(
 $core.method({
 selector: "trickyJsConstructor",
@@ -16298,6 +16024,211 @@ return $globals.String;
 $globals.StringStreamTest.a$cls);
 
 
+$core.addTrait("TClassBuildingTest", "Kernel-Tests");
+$core.addMethod(
+$core.method({
+selector: "assert:isClassCopyOf:",
+protocol: "running",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["aClass", "anotherClass"],
+source: "assert: aClass isClassCopyOf: anotherClass\x0a\x09self assert: aClass superclass == anotherClass superclass.\x0a\x09self assert: aClass instanceVariableNames == anotherClass instanceVariableNames.\x0a\x09self assert: aClass package == anotherClass package.\x0a\x09self assert: (aClass package classes includes: aClass).\x0a\x09self assert: aClass methodDictionary keys equals: anotherClass methodDictionary keys",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["assert:", "==", "superclass", "instanceVariableNames", "package", "includes:", "classes", "assert:equals:", "keys", "methodDictionary"]
+}, function ($methodClass){ return function (aClass,anotherClass){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $2,$1,$4,$3,$6,$7,$5,$9,$8;
+$2=$recv(aClass)._superclass();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["superclass"]=1;
+//>>excludeEnd("ctx");
+$1=$recv($2).__eq_eq($recv(anotherClass)._superclass());
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["=="]=1;
+//>>excludeEnd("ctx");
+$self._assert_($1);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["assert:"]=1;
+//>>excludeEnd("ctx");
+$4=$recv(aClass)._instanceVariableNames();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["instanceVariableNames"]=1;
+//>>excludeEnd("ctx");
+$3=$recv($4).__eq_eq($recv(anotherClass)._instanceVariableNames());
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["=="]=2;
+//>>excludeEnd("ctx");
+$self._assert_($3);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["assert:"]=2;
+//>>excludeEnd("ctx");
+$6=$recv(aClass)._package();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["package"]=1;
+//>>excludeEnd("ctx");
+$7=$recv(anotherClass)._package();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["package"]=2;
+//>>excludeEnd("ctx");
+$5=$recv($6).__eq_eq($7);
+$self._assert_($5);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["assert:"]=3;
+//>>excludeEnd("ctx");
+$self._assert_($recv($recv($recv(aClass)._package())._classes())._includes_(aClass));
+$9=$recv(aClass)._methodDictionary();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["methodDictionary"]=1;
+//>>excludeEnd("ctx");
+$8=$recv($9)._keys();
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx1.sendIdx["keys"]=1;
+//>>excludeEnd("ctx");
+$self._assert_equals_($8,$recv($recv(anotherClass)._methodDictionary())._keys());
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"assert:isClassCopyOf:",{aClass:aClass,anotherClass:anotherClass})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.TClassBuildingTest);
+
+$core.addMethod(
+$core.method({
+selector: "assert:isJavaScriptInstanceOf:",
+protocol: "running",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anObject", "aJavaScriptClass"],
+source: "assert: anObject isJavaScriptInstanceOf: aJavaScriptClass\x0a\x09self assert: (self is: anObject javaScriptInstanceOf: aJavaScriptClass)",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["assert:", "is:javaScriptInstanceOf:"]
+}, function ($methodClass){ return function (anObject,aJavaScriptClass){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._assert_($self._is_javaScriptInstanceOf_(anObject,aJavaScriptClass));
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"assert:isJavaScriptInstanceOf:",{anObject:anObject,aJavaScriptClass:aJavaScriptClass})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.TClassBuildingTest);
+
+$core.addMethod(
+$core.method({
+selector: "is:javaScriptInstanceOf:",
+protocol: "private",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: ["anObject", "aJavaScriptClass"],
+source: "is: anObject javaScriptInstanceOf: aJavaScriptClass\x0a\x09<inlineJS: 'return anObject instanceof aJavaScriptClass'>",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [["inlineJS:", ["return anObject instanceof aJavaScriptClass"]]],
+messageSends: []
+}, function ($methodClass){ return function (anObject,aJavaScriptClass){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+return anObject instanceof aJavaScriptClass;
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"is:javaScriptInstanceOf:",{anObject:anObject,aJavaScriptClass:aJavaScriptClass})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.TClassBuildingTest);
+
+$core.addMethod(
+$core.method({
+selector: "tearDown",
+protocol: "running",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "tearDown\x0a\x09self theClass ifNotNil: [ :theClass |\x0a\x09\x09(Array streamContents: [ :s | theClass allSubclassesDo: [ :each | s nextPut: each ] ])\x0a\x09\x09\x09reverseDo: [ :each | Smalltalk removeClass: each ].\x0a\x09\x09Smalltalk removeClass: theClass ]",
+referencedClasses: ["Array", "Smalltalk"],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["ifNotNil:", "theClass", "reverseDo:", "streamContents:", "allSubclassesDo:", "nextPut:", "removeClass:"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+var $1,$receiver;
+$1=$self._theClass();
+if(($receiver = $1) == null || $receiver.a$nil){
+$1;
+} else {
+var theClass;
+theClass=$receiver;
+$recv($recv($globals.Array)._streamContents_((function(s){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv(theClass)._allSubclassesDo_((function(each){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx3) {
+//>>excludeEnd("ctx");
+return $recv(s)._nextPut_(each);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx3) {$ctx3.fillBlock({each:each},$ctx2,3)});
+//>>excludeEnd("ctx");
+}));
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({s:s},$ctx1,2)});
+//>>excludeEnd("ctx");
+})))._reverseDo_((function(each){
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx2) {
+//>>excludeEnd("ctx");
+return $recv($globals.Smalltalk)._removeClass_(each);
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+$ctx2.sendIdx["removeClass:"]=1;
+//>>excludeEnd("ctx");
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,4)});
+//>>excludeEnd("ctx");
+}));
+$recv($globals.Smalltalk)._removeClass_(theClass);
+}
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"tearDown",{})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.TClassBuildingTest);
+
+$core.addMethod(
+$core.method({
+selector: "theClass",
+protocol: "accessing",
+//>>excludeStart("ide", pragmas.excludeIdeData);
+args: [],
+source: "theClass\x0a\x09self subclassResponsibility",
+referencedClasses: [],
+//>>excludeEnd("ide");
+pragmas: [],
+messageSends: ["subclassResponsibility"]
+}, function ($methodClass){ return function (){
+var self=this,$self=this;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+return $core.withContext(function($ctx1) {
+//>>excludeEnd("ctx");
+$self._subclassResponsibility();
+return self;
+//>>excludeStart("ctx", pragmas.excludeDebugContexts);
+}, function($ctx1) {$ctx1.fill(self,"theClass",{})});
+//>>excludeEnd("ctx");
+}; }),
+$globals.TClassBuildingTest);
+
+
 $core.addTrait("TKeyValueCollectionTest", "Kernel-Tests");
 $core.addMethod(
 $core.method({
@@ -17058,6 +16989,8 @@ return self;
 $globals.UndefinedTest);
 
 
+$core.setTraitComposition([{trait: $globals.TClassBuildingTest, aliases: {"tearDownTheClass":"tearDown"}}], $globals.ClassBuilderTest);
+$core.setTraitComposition([{trait: $globals.TClassBuildingTest}], $globals.ClassTest);
 $core.setTraitComposition([{trait: $globals.TKeyValueCollectionTest}], $globals.AssociativeCollectionTest);
 $core.setTraitComposition([{trait: $globals.TKeyValueCollectionTest}], $globals.SequenceableCollectionTest);
 

+ 66 - 56
lang/src/Kernel-Tests.st

@@ -342,6 +342,12 @@ TestCase subclass: #ClassBuilderTest
 	slots: {#builder. #theClass}
 	package: 'Kernel-Tests'!
 
+!ClassBuilderTest methodsFor: 'accessing'!
+
+theClass
+	^ theClass
+! !
+
 !ClassBuilderTest methodsFor: 'running'!
 
 setUp
@@ -349,11 +355,10 @@ setUp
 !
 
 tearDown
+	self tearDownTheClass.
 	theClass ifNotNil: [
-		Smalltalk removeClass: theClass.
 		self deny: (theClass package classes includes: theClass).
-		self assert: (Smalltalk globals at: theClass name) equals: nil.
-		theClass := nil ]
+		self assert: (Smalltalk globals at: theClass name) equals: nil ]
 ! !
 
 !ClassBuilderTest methodsFor: 'tests'!
@@ -367,12 +372,8 @@ testAddTrait
 
 testClassCopy
 	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.
-	self assert: theClass superclass == ObjectMock superclass.
-	self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.
 	self assert: theClass name equals: 'ObjectMock2'.
-	self assert: theClass package == ObjectMock package.
-	self assert: (theClass package classes includes: theClass).
-	self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys
+	self assert: theClass isClassCopyOf: ObjectMock
 !
 
 testClassMigration
@@ -382,7 +383,7 @@ testClassMigration
 	instance := (Smalltalk globals at: 'ObjectMock2') new.
 	
 	"Change the superclass of ObjectMock2"
-	ObjectMock subclass: #ObjectMock2
+	theClass := ObjectMock subclass: #ObjectMock2
 		instanceVariableNames: ''
 		package: 'Kernel-Tests'.
 	
@@ -396,27 +397,21 @@ testClassMigration
 	self assert: (ObjectMock2 package classes includes: ObjectMock2).
 	
 	self deny: instance class == ObjectMock2.
-	"Commeting this out. Tests implementation detail."
-	"self assert: instance class name equals: 'OldObjectMock2'."
 	
-	self assert: (Smalltalk globals at: instance class name) isNil.
-	
-	Smalltalk removeClass: ObjectMock2
+	self assert: (Smalltalk globals at: instance class name) isNil
 !
 
 testClassMigrationWithClassInstanceVariables
 	
 	builder copyClass: ObjectMock named: 'ObjectMock2'.
-	ObjectMock2 class instanceVariableNames: 'foo bar'.
+	ObjectMock2 class instanceVariableNames: '    foo  bar       '.
 	
 	"Change the superclass of ObjectMock2"
-	ObjectMock subclass: (Smalltalk globals at: 'ObjectMock2') name
+	theClass := ObjectMock subclass: #ObjectMock2
 		instanceVariableNames: ''
 		package: 'Kernel-Tests'.
 	
-	self assert: ObjectMock2 class instanceVariableNames equals: #('foo' 'bar').
-	
-	Smalltalk removeClass: ObjectMock2
+	self assert: ObjectMock2 class instanceVariableNames equals: #('foo' 'bar')
 !
 
 testClassMigrationWithSubclasses
@@ -426,15 +421,13 @@ testClassMigrationWithSubclasses
 	ObjectMock3 subclass: 'ObjectMock4' instanceVariableNames: '' package: 'Kernel-Tests'.
 	
 	"Change the superclass of ObjectMock2"
-	ObjectMock subclass: 'ObjectMock2'
+	theClass := ObjectMock subclass: #ObjectMock2
 		instanceVariableNames: ''
 		package: 'Kernel-Tests'.
 	
-	self assert: (ObjectMock subclasses includes: ObjectMock2).
-	self assert: (ObjectMock2 subclasses includes: ObjectMock3).
-	self assert: (ObjectMock3 subclasses includes: ObjectMock4).
-	
-	ObjectMock allSubclasses reverseDo: [ :each | Smalltalk removeClass: each ]
+	self assert: ObjectMock subclasses equals: {ObjectMock2}.
+	self assert: ObjectMock2 subclasses equals: {ObjectMock3}.
+	self assert: ObjectMock3 subclasses equals: {ObjectMock4}
 !
 
 testSubclass
@@ -451,6 +444,12 @@ TestCase subclass: #ClassTest
 	slots: {#builder. #theClass}
 	package: 'Kernel-Tests'!
 
+!ClassTest methodsFor: 'accessing'!
+
+theClass
+	^ theClass
+! !
+
 !ClassTest methodsFor: 'running'!
 
 augmentMethodInstantiationOf: aMethod withAttachments: aHashedCollection
@@ -462,10 +461,6 @@ augmentMethodInstantiationOf: aMethod withAttachments: aHashedCollection
 			yourself ]
 !
 
-is: anObject javaScriptInstanceOf: aJavaScriptClass
-	<inlineJS: 'return anObject instanceof aJavaScriptClass'>
-!
-
 jsConstructor
 	<inlineJS: '
 		function Foo(){}
@@ -478,13 +473,6 @@ setUp
 	builder := ClassBuilder new
 !
 
-tearDown
-	theClass ifNotNil: [
-		theClass allSubclasses reverseDo: [ :each | Smalltalk removeClass: each ].
-		Smalltalk removeClass: theClass.
-		theClass := nil ]
-!
-
 trickyJsConstructor
 	<inlineJS: '
 		function Foo(){}
@@ -524,16 +512,12 @@ testBeJavaScriptSubclassOf
 	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.
 	constructor := self jsConstructor.
 	theClass beJavaScriptSubclassOf: constructor.
-	"part took from copy class test"
-	self assert: theClass superclass == ObjectMock superclass.
-	self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.
 	self assert: theClass name equals: 'ObjectMock2'.
-	self assert: theClass package == ObjectMock package.
-	self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys.
+	self assert: theClass isClassCopyOf: ObjectMock.
 	"testing specific to late-coupled detached root class"
 	instance := theClass new.
 	self assert: instance class == theClass.
-	self assert: (self is: instance javaScriptInstanceOf: constructor).
+	self assert: instance isJavaScriptInstanceOf: constructor.
 	self assert: instance value equals: 4.
 	self shouldnt: [ instance foo: 9 ] raise: Error.
 	self assert: instance foo equals: 9
@@ -605,12 +589,8 @@ testSetJavaScriptConstructor
 	| instance |
 	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.
 	theClass javaScriptConstructor: self jsConstructor.
-	"part took from copy class test"
-	self assert: theClass superclass == ObjectMock superclass.
-	self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.
 	self assert: theClass name equals: 'ObjectMock2'.
-	self assert: theClass package == ObjectMock package.
-	self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys.
+	self assert: theClass isClassCopyOf: ObjectMock.
 	"testing specific to late-coupled detached root class"
 	instance := theClass new.
 	self assert: instance class == theClass.
@@ -619,20 +599,12 @@ testSetJavaScriptConstructor
 	self assert: instance foo equals: 9
 !
 
-testSlotsFromInstanceVariablesString
-	self assert: '  hello   world   ' instanceVariablesStringAsSlotList equals: #('hello' 'world')
-!
-
 testTrickySetJavaScriptConstructor
 	| instance |
 	theClass := builder copyClass: ObjectMock named: 'ObjectMock2'.
 	theClass javaScriptConstructor: self trickyJsConstructor.
-	"part took from copy class test"
-	self assert: theClass superclass == ObjectMock superclass.
-	self assert: theClass instanceVariableNames == ObjectMock instanceVariableNames.
 	self assert: theClass name equals: 'ObjectMock2'.
-	self assert: theClass package == ObjectMock package.
-	self assert: theClass methodDictionary keys equals: ObjectMock methodDictionary keys.
+	self assert: theClass isClassCopyOf: ObjectMock.
 	"testing specific to late-coupled detached root class"
 	instance := theClass new.
 	self assert: instance class == theClass.
@@ -2998,6 +2970,42 @@ collectionClass
 	^ String
 ! !
 
+Trait named: #TClassBuildingTest
+	package: 'Kernel-Tests'!
+
+!TClassBuildingTest methodsFor: 'accessing'!
+
+theClass
+	self subclassResponsibility
+! !
+
+!TClassBuildingTest methodsFor: 'private'!
+
+is: anObject javaScriptInstanceOf: aJavaScriptClass
+	<inlineJS: 'return anObject instanceof aJavaScriptClass'>
+! !
+
+!TClassBuildingTest methodsFor: 'running'!
+
+assert: aClass isClassCopyOf: anotherClass
+	self assert: aClass superclass == anotherClass superclass.
+	self assert: aClass instanceVariableNames == anotherClass instanceVariableNames.
+	self assert: aClass package == anotherClass package.
+	self assert: (aClass package classes includes: aClass).
+	self assert: aClass methodDictionary keys equals: anotherClass methodDictionary keys
+!
+
+assert: anObject isJavaScriptInstanceOf: aJavaScriptClass
+	self assert: (self is: anObject javaScriptInstanceOf: aJavaScriptClass)
+!
+
+tearDown
+	self theClass ifNotNil: [ :theClass |
+		(Array streamContents: [ :s | theClass allSubclassesDo: [ :each | s nextPut: each ] ])
+			reverseDo: [ :each | Smalltalk removeClass: each ].
+		Smalltalk removeClass: theClass ]
+! !
+
 Trait named: #TKeyValueCollectionTest
 	package: 'Kernel-Tests'!
 
@@ -3134,6 +3142,8 @@ testIsNil
 	self deny: nil notNil.
 ! !
 
+ClassBuilderTest setTraitComposition: {TClassBuildingTest @ {#tearDownTheClass -> #tearDown}} asTraitComposition!
+ClassTest setTraitComposition: {TClassBuildingTest} asTraitComposition!
 AssociativeCollectionTest setTraitComposition: {TKeyValueCollectionTest} asTraitComposition!
 SequenceableCollectionTest setTraitComposition: {TKeyValueCollectionTest} asTraitComposition!
 ! !