#FEATURE by cg
authorClaus Gittinger <cg@exept.de>
Wed, 29 May 2019 01:35:49 +0200
changeset 749 d8addd588fc0
parent 748 96c1372d5e54
child 750 1719905cad36
#FEATURE by cg class: TestCase added: #ensureRequiredPackagesAreLoaded comment/format in: #runCaseAsFailure: changed: #runCase #runCaseAsFailure class: TestCase class added: #requiredPackageNames comment/format in: #coveredClassNames #coveredClasses
TestCase.st
--- a/TestCase.st	Wed May 29 01:13:02 2019 +0200
+++ b/TestCase.st	Wed May 29 01:35:49 2019 +0200
@@ -389,6 +389,7 @@
     ^ self coveredClassNames collect:[:each | Smalltalk classNamed:each]
 
     "Modified (comment): / 30-08-2017 / 11:09:22 / cg"
+    "Modified: / 29-05-2019 / 01:30:01 / Claus Gittinger"
 !
 
 lastTestRunResultChanged: selector
@@ -414,8 +415,8 @@
 !TestCase class methodsFor:'queries'!
 
 coveredClassNames
-    "should be redefined to return a collection of classes which are tested by
-     this suite/case. 
+    "should be redefined to return a collection of class names 
+     which are tested by this suite/case. 
      If not redefined, coveredPackageNames should be.
 
      These classes can be instrumented for coverage analysis,
@@ -424,6 +425,7 @@
     ^ #()
 
     "Created: / 06-07-2011 / 21:27:03 / cg"
+    "Modified (comment): / 29-05-2019 / 01:32:23 / Claus Gittinger"
 !
 
 coveredPackageNames
@@ -442,6 +444,16 @@
         TestCase instances built from it"
 
         ^self == TestCase
+!
+
+requiredPackageNames
+    "can be redefined to return a collection of packages 
+     which are required to be present when running tests.
+     If not redefined, coveredPackageNames is used."
+
+    ^ nil
+
+    "Created: / 29-05-2019 / 01:31:59 / Claus Gittinger"
 ! !
 
 !TestCase class methodsFor:'quick testing'!
@@ -729,6 +741,25 @@
 
 !TestCase methodsFor:'private'!
 
+ensureRequiredPackagesAreLoaded
+    |names|
+
+    (names := self class requiredPackageNames) isNil ifTrue:[
+        (names := self class coveredPackageNames)
+    ].
+    names notEmptyOrNil ifTrue:[
+        "/ ensure that the packages are loaded
+        names do:[:each |
+            (Smalltalk loadPackage:each) ifFalse:[
+                self error:('package not loaded: %1' bindWith:each)
+            ].
+        ].    
+    ].
+    self setUp
+
+    "Created: / 29-05-2019 / 01:32:58 / Claus Gittinger"
+!
+
 executeShould: aBlock inScopeOf: anExceptionalEvent
 "/        ^[aBlock value.
 "/        false] sunitOn: anExceptionalEvent
@@ -1091,6 +1122,7 @@
 runCase
     |didSetup|
 
+    self ensureRequiredPackagesAreLoaded.
     self resources do: [:each | each availableFor: self].
 
     [
@@ -1109,18 +1141,22 @@
     ]
 
     "Modified: / 13-07-2017 / 14:03:01 / cg"
+    "Modified: / 29-05-2019 / 01:34:01 / Claus Gittinger"
 !
 
 runCaseAsFailure
+    self ensureRequiredPackagesAreLoaded.
     self setUp.
     [
-	[self openDebuggerOnFailingTestMethod] ensure: [self safeTearDown]
+        [self openDebuggerOnFailingTestMethod] ensure: [self safeTearDown]
     ] fork
 
-    "Modified: / 21.6.2000 / 10:04:33 / Sames"
+    "Modified: / 21-06-2000 / 10:04:33 / Sames"
+    "Modified: / 29-05-2019 / 01:34:10 / Claus Gittinger"
 !
 
 runCaseAsFailure: aSemaphore
+    self ensureRequiredPackagesAreLoaded.
     [
         |didSetup|
 
@@ -1142,6 +1178,7 @@
     ] ensure: [aSemaphore signal].
 
     "Modified: / 13-07-2017 / 14:03:44 / cg"
+    "Modified: / 29-05-2019 / 01:34:30 / Claus Gittinger"
 ! !
 
 !TestCase::Should class methodsFor:'documentation'!