[squeak-dev] The Trunk: SUnit-pre.122.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Aug 24 13:13:32 UTC 2020


Patrick Rein uploaded a new version of SUnit to project The Trunk:
http://source.squeak.org/trunk/SUnit-pre.122.mcz

==================== Summary ====================

Name: SUnit-pre.122
Author: pre
Time: 24 August 2020, 3:13:32.049786 pm
UUID: 6755fd5f-c8d9-b94b-b7ce-61cb56b0de2e
Ancestors: SUnit-mt.121

Recateogrizes assertions and timeout infrastructure from the "accessing" category to their own method categories.

=============== Diff against SUnit-mt.121 ===============

Item was changed:
+ ----- Method: TestCase>>assert: (in category 'asserting') -----
- ----- Method: TestCase>>assert: (in category 'accessing') -----
  assert: aBooleanOrBlock
  
  	aBooleanOrBlock value ifFalse: [self signalFailure: 'Assertion failed']
  			!

Item was changed:
+ ----- Method: TestCase>>assert:description: (in category 'asserting') -----
- ----- Method: TestCase>>assert:description: (in category 'accessing') -----
  assert: aBooleanOrBlock description: aStringOrBlock
  
  	aBooleanOrBlock value ifFalse: [
  		| description |
  		description := aStringOrBlock value.
  		self logFailure: description.
  		TestResult failure signal: description ]
  			!

Item was changed:
+ ----- Method: TestCase>>assert:description:resumable: (in category 'asserting') -----
- ----- Method: TestCase>>assert:description:resumable: (in category 'accessing') -----
  assert: aBooleanOrBlock description: aString resumable: resumableBoolean 
  	| exception |
  	aBooleanOrBlock value
  		ifFalse: 
  			[self logFailure: aString.
  			exception := resumableBoolean
  						ifTrue: [TestResult resumableFailure]
  						ifFalse: [TestResult failure].
  			exception signal: aString]
  			!

Item was changed:
+ ----- Method: TestCase>>assert:equals: (in category 'asserting') -----
- ----- Method: TestCase>>assert:equals: (in category 'accessing') -----
  assert: expected equals: actual
  
  	^self
  		assert: expected = actual
  		description: [ self comparingStringBetween: expected and: actual ]
  !

Item was changed:
+ ----- Method: TestCase>>assert:equals:description: (in category 'asserting') -----
- ----- Method: TestCase>>assert:equals:description: (in category 'accessing') -----
  assert: expected equals: actual description: aString
  
  	^self
  		assert: expected = actual
  		description: [ aString , ': ', (self comparingStringBetween: expected and: actual) ]!

Item was changed:
+ ----- Method: TestCase>>assert:identical: (in category 'asserting') -----
- ----- Method: TestCase>>assert:identical: (in category 'accessing') -----
  assert: expected identical: actual
  
  	^self
  		assert: expected == actual
  		description: [ self comparingStringBetweenIdentical: expected and: actual ]
  !

Item was changed:
+ ----- Method: TestCase>>assert:identical:description: (in category 'asserting') -----
- ----- Method: TestCase>>assert:identical:description: (in category 'accessing') -----
  assert: expected identical: actual description: aString
  
  	^self
  		assert: expected == actual
  		description: [ aString , ': ', (self comparingStringBetweenIdentical: expected and: actual) ]!

Item was changed:
+ ----- Method: TestCase>>defaultTimeout (in category 'running - timeout') -----
- ----- Method: TestCase>>defaultTimeout (in category 'accessing') -----
  defaultTimeout
  	"Answer the default timeout to use for tests in this test case.
  	The timeout is a value in seconds."
  
  	^Smalltalk isLowerPerformance ifTrue:[ 25] ifFalse: [5] "seconds"!

Item was changed:
+ ----- Method: TestCase>>deny: (in category 'asserting') -----
- ----- Method: TestCase>>deny: (in category 'accessing') -----
  deny: aBooleanOrBlock
  
  	self assert: aBooleanOrBlock value not
  			!

Item was changed:
+ ----- Method: TestCase>>deny:description: (in category 'asserting') -----
- ----- Method: TestCase>>deny:description: (in category 'accessing') -----
  deny: aBooleanOrBlock description: aString
  	self assert: aBooleanOrBlock value not description: aString
  			!

Item was changed:
+ ----- Method: TestCase>>deny:description:resumable: (in category 'asserting') -----
- ----- Method: TestCase>>deny:description:resumable: (in category 'accessing') -----
  deny: aBooleanOrBlock description: aString resumable: resumableBoolean 
  	self
  		assert: aBooleanOrBlock value not
  		description: aString
  		resumable: resumableBoolean
  			!

Item was changed:
+ ----- Method: TestCase>>deny:equals: (in category 'asserting') -----
- ----- Method: TestCase>>deny:equals: (in category 'accessing') -----
  deny: unexpected equals: actual
  
  	^self
  		deny: unexpected = actual
  		description: 'Actual equals unexpected'
  !

Item was changed:
+ ----- Method: TestCase>>ensureInternetConnection (in category 'asserting - extensions') -----
- ----- Method: TestCase>>ensureInternetConnection (in category 'extensions') -----
  ensureInternetConnection
  
  	^ self ensureInternetConnectionTo: 'http://www.google.com'!

Item was changed:
+ ----- Method: TestCase>>ensureInternetConnectionTo: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>ensureInternetConnectionTo: (in category 'extensions') -----
  ensureInternetConnectionTo: url 
  
  	"(Smalltalk classNamed: 'WebClient') httpGet: 'http://www.google.com'"
  	((Smalltalk classNamed: 'WebClient') httpGet: url) isSuccess
  		ifFalse: [Error signal: 'No internet connection available, but test requires one']
  		!

Item was changed:
+ ----- Method: TestCase>>ensureSecureInternetConnection (in category 'asserting - extensions') -----
- ----- Method: TestCase>>ensureSecureInternetConnection (in category 'extensions') -----
  ensureSecureInternetConnection
  
  	^ self ensureInternetConnectionTo: 'https://www.google.com'!

Item was changed:
+ ----- Method: TestCase>>executeShould:inScopeOf:withExceptionDo: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>executeShould:inScopeOf:withExceptionDo: (in category 'extensions') -----
  executeShould: aBlock inScopeOf: anException withExceptionDo: anotherBlock
  
  	^[aBlock value.
   	false] 
  		on: anException
  		do: [:exception | 
  			anotherBlock value: exception.
  			exception return: true]!

Item was changed:
+ ----- Method: TestCase>>fail (in category 'asserting - extensions') -----
- ----- Method: TestCase>>fail (in category 'extensions') -----
  fail
  
  	^self assert: false!

Item was changed:
+ ----- Method: TestCase>>fail: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>fail: (in category 'extensions') -----
  fail: aString
  
  	^self assert: false description: aString.!

Item was changed:
+ ----- Method: TestCase>>should: (in category 'asserting') -----
- ----- Method: TestCase>>should: (in category 'accessing') -----
  should: aBlock
  	self assert: aBlock value
  			!

Item was changed:
+ ----- Method: TestCase>>should:description: (in category 'asserting') -----
- ----- Method: TestCase>>should:description: (in category 'accessing') -----
  should: aBlock description: aString
  	self assert: aBlock value description: aString
  			!

Item was changed:
+ ----- Method: TestCase>>should:notTakeMoreThan: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>should:notTakeMoreThan: (in category 'extensions') -----
  should: aBlock notTakeMoreThan: aDuration
      "Evaluate aBlock in a forked process and if it takes more than anInteger milliseconds
      to run we terminate the process and report a test failure.  It'' important to
      use the active process for the test failure so that the failure reporting works correctly
      in the context of the exception handlers."
  
      | evaluated evaluationProcess result delay testProcess |
  
      evaluated := false.
      delay := Delay forDuration: aDuration.
      testProcess := Processor activeProcess.
      "Create a new process to evaluate aBlock"
      evaluationProcess := [
          result := aBlock value.
          evaluated := true.
          delay unschedule.
          testProcess resume ] forkNamed: 'Process to evaluate should: notTakeMoreThanMilliseconds:'.
  
      "Wait the milliseconds they asked me to"
      delay wait.
      "After this point either aBlock was evaluated or not..."
      evaluated ifFalse: [
          evaluationProcess terminate.
          self assert: false description: ('Block evaluation took more than the expected <1p>' expandMacrosWith: aDuration)].
     
      ^result!

Item was changed:
+ ----- Method: TestCase>>should:notTakeMoreThanMilliseconds: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>should:notTakeMoreThanMilliseconds: (in category 'extensions') -----
  should: aBlock notTakeMoreThanMilliseconds: anInteger
      "For compatibility with other Smalltalks"
  
     self should: aBlock notTakeMoreThan: (Duration milliSeconds: anInteger).!

Item was changed:
+ ----- Method: TestCase>>should:raise: (in category 'asserting') -----
- ----- Method: TestCase>>should:raise: (in category 'accessing') -----
  should: aBlock raise: anExceptionalEvent 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent)
  			!

Item was changed:
+ ----- Method: TestCase>>should:raise:description: (in category 'asserting') -----
- ----- Method: TestCase>>should:raise:description: (in category 'accessing') -----
  should: aBlock raise: anExceptionalEvent description: aString 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent)
  		description: aString
  			!

Item was changed:
+ ----- Method: TestCase>>should:raise:whoseDescriptionDoesNotInclude:description: (in category 'asserting') -----
- ----- Method: TestCase>>should:raise:whoseDescriptionDoesNotInclude:description: (in category 'accessing') -----
  should: aBlock raise: anExceptionalEvent whoseDescriptionDoesNotInclude: subString description: aString 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent withDescriptionNotContaining: subString)
  		description: aString
  !

Item was changed:
+ ----- Method: TestCase>>should:raise:whoseDescriptionIncludes:description: (in category 'asserting') -----
- ----- Method: TestCase>>should:raise:whoseDescriptionIncludes:description: (in category 'accessing') -----
  should: aBlock raise: anExceptionalEvent whoseDescriptionIncludes: subString description: aString 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent withDescriptionContaining: subString)
  		description: aString
  !

Item was changed:
+ ----- Method: TestCase>>should:raise:withExceptionDo: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>should:raise:withExceptionDo: (in category 'extensions') -----
  should: aBlock raise: anException withExceptionDo: anotherBlock 
  
  	^self assert: (self executeShould: aBlock inScopeOf: anException withExceptionDo: anotherBlock)!

Item was changed:
+ ----- Method: TestCase>>shouldFix: (in category 'asserting - extensions') -----
- ----- Method: TestCase>>shouldFix: (in category 'extensions') -----
  shouldFix: aBlock 
  
  	^self should: aBlock raise: Exception!

Item was changed:
+ ----- Method: TestCase>>shouldnt: (in category 'asserting') -----
- ----- Method: TestCase>>shouldnt: (in category 'accessing') -----
  shouldnt: aBlock
  	self deny: aBlock value
  			!

Item was changed:
+ ----- Method: TestCase>>shouldnt:description: (in category 'asserting') -----
- ----- Method: TestCase>>shouldnt:description: (in category 'accessing') -----
  shouldnt: aBlock description: aString
  	self deny: aBlock value description: aString
  			!

Item was changed:
+ ----- Method: TestCase>>shouldnt:raise: (in category 'asserting') -----
- ----- Method: TestCase>>shouldnt:raise: (in category 'accessing') -----
  shouldnt: aBlock raise: anExceptionalEvent 
  	^ [ aBlock value ]
  		on: anExceptionalEvent
  		do: [:e | self fail: 'Block raised ', e className, ': ', e messageText].!

Item was changed:
+ ----- Method: TestCase>>shouldnt:raise:description: (in category 'asserting') -----
- ----- Method: TestCase>>shouldnt:raise:description: (in category 'accessing') -----
  shouldnt: aBlock raise: anExceptionalEvent description: aString 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent) not 		description: aString
  			!

Item was changed:
+ ----- Method: TestCase>>shouldnt:raise:whoseDescriptionDoesNotInclude:description: (in category 'asserting') -----
- ----- Method: TestCase>>shouldnt:raise:whoseDescriptionDoesNotInclude:description: (in category 'accessing') -----
  shouldnt: aBlock raise: anExceptionalEvent whoseDescriptionDoesNotInclude: subString description: aString 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent withDescriptionNotContaining: subString) not
  		description: aString
  !

Item was changed:
+ ----- Method: TestCase>>shouldnt:raise:whoseDescriptionIncludes:description: (in category 'asserting') -----
- ----- Method: TestCase>>shouldnt:raise:whoseDescriptionIncludes:description: (in category 'accessing') -----
  shouldnt: aBlock raise: anExceptionalEvent whoseDescriptionIncludes: subString description: aString 
  	^self assert: (self executeShould: aBlock inScopeOf: anExceptionalEvent withDescriptionContaining: subString) not
  		description: aString
  !

Item was changed:
+ ----- Method: TestCase>>signalFailure: (in category 'private') -----
- ----- Method: TestCase>>signalFailure: (in category 'accessing') -----
  signalFailure: aString
  	TestResult failure signal: aString!

Item was changed:
+ ----- Method: TestCase>>timeout: (in category 'running - timeout') -----
- ----- Method: TestCase>>timeout: (in category 'accessing') -----
  timeout: seconds
  	"The timeout for a test should normally be set with a method annotation.
  	However, for tests that are expected to run in images that do not support
  	method annotations, the value may be set by setting the value from the
  	#setUp method (i.e. prior to running the test method)."
  
  	timeout := seconds!

Item was changed:
+ ----- Method: TestCase>>timeout:after: (in category 'private') -----
- ----- Method: TestCase>>timeout:after: (in category 'running') -----
  timeout: aBlock after: seconds
  	"Evaluate the argument block. Time out if the evaluation is not
  	complete after the given number of seconds. Handle the situation
  	that a timeout may occur after a failure (during debug)"
  
  	| theProcess delay watchdog |
  
  	"the block will be executed in the current process"
  	theProcess := Processor activeProcess.
  	delay := Delay forSeconds: seconds.
  
  	"make a watchdog process"
  	watchdog := [
  		delay wait. 	"wait for timeout or completion"
  		theProcess ifNotNil:[ theProcess signalException: 
  			(TestFailure new messageText: 'Test timed out') ] 
  	] newProcess.
  
  	"Watchdog needs to run at high priority to do its job (but not at timing priority)"
  	watchdog priority: Processor timingPriority-1.
  
  	"catch the timeout signal"
  	watchdog resume.				"start up the watchdog"
  	^[aBlock on: TestFailure, Error, Halt do:[:ex|
  		theProcess := nil.
  		ex pass.
  	]] ensure:[							"evaluate the receiver"
  		theProcess := nil.				"it has completed, so ..."
  		delay delaySemaphore signal.	"arrange for the watchdog to exit"
  	]!

Item was changed:
+ ----- Method: TestCase>>timeoutForSetUp (in category 'running - timeout') -----
- ----- Method: TestCase>>timeoutForSetUp (in category 'accessing') -----
  timeoutForSetUp
  	"Answer the timeout to use for setUp"
  
  	| method |
  	method := self class lookupSelector: testSelector asSymbol.
  	(method pragmaAt: #timeout:) ifNotNil:[:tag| ^tag arguments first].
  	^self defaultTimeout!

Item was changed:
+ ----- Method: TestCase>>timeoutForTest (in category 'running - timeout') -----
- ----- Method: TestCase>>timeoutForTest (in category 'accessing') -----
  timeoutForTest
  	"Answer the timeout to use for this test"
  
  	| method |
  	method := self class lookupSelector: testSelector asSymbol.
  	(method pragmaAt: #timeout:) ifNotNil:[:tag| ^tag arguments first].
  	^timeout ifNil: [self defaultTimeout]!



More information about the Squeak-dev mailing list