| 
					
				 | 
			
			
				@@ -2,6 +2,10 @@ Smalltalk current createPackage: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Object subclass: #ResultAnnouncement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: 'result' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+!ResultAnnouncement commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I get signaled when a `TestCase` has been run. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+My instances hold the result (instance of `TestResult`) of the test run.! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !ResultAnnouncement methodsFor: 'accessing'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -17,9 +21,11 @@ Object subclass: #TestCase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: 'testSelector asyncTimeout context' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestCase commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-A TestCase is an implementation of the command pattern to run a test. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I am an implementation of the command pattern to run a test. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+## API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-`TestCase` instances are created with the class method `#selector:`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+My instances are created with the class method `#selector:`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 passing the symbol that names the method to be executed when the test case runs. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 When you discover a new fixture, subclass `TestCase` and create a `#test...` method for the first test. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -188,11 +194,9 @@ Object subclass: #TestContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: 'testCase' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestContext commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-TestContext governs running a particular test case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I govern running a particular test case. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-It's main added value is `#execute:` method which runs a block 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-as a part of test case (restores context, nilling it afterwards, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-cleaning/calling tearDown as appropriate for sync/async scenario).! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+My main added value is `#execute:` method which runs a block as a part of test case (restores context, nilling it afterwards, cleaning/calling `#tearDown` as appropriate for sync/async scenario).! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestContext methodsFor: 'accessing'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -238,12 +242,10 @@ TestContext subclass: #ReportingTestContext 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: 'finished result' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !ReportingTestContext commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-ReportingTestContext adds `TestResult` reporting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-to `TestContext`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I add `TestResult` reporting to `TestContext`. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Errors are caught and save into a `TestResult`, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-When test case is finished (which can be later for async tests), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-a callback block is executed; this is used by a `TestSuiteRunner`.! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+When test case is finished (which can be later for async tests), a callback block is executed; this is used by a `TestSuiteRunner`.! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !ReportingTestContext methodsFor: 'accessing'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -290,21 +292,21 @@ Error subclass: #TestFailure 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: '' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestFailure commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I am raised when the boolean parameter of an #`assert:` or `#deny:` call is the opposite of what the assertion claims. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 The test framework distinguishes between failures and errors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 A failure is an event whose possibiity is explicitly anticipated and checked for in an assertion, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-whereas an error is an unanticipated problem like a division by 0 or an index out of bounds. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-TestFailure is raised when the boolean parameter of an #`assert:` or `#deny:` call is the opposite of what the assertion claims.! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+whereas an error is an unanticipated problem like a division by 0 or an index out of bounds.! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Object subclass: #TestResult 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: 'timestamp runs errors failures total' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestResult commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-A TestResult implements the collecting parameter pattern for running a bunch of tests. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I implement the collecting parameter pattern for running a bunch of tests. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-A TestResult holds tests that have run, sorted into the result categories of passed, failures and errors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+My instances hold tests that have run, sorted into the result categories of passed, failures and errors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-TestResult is an interesting object to subclass or substitute. `#runCase:` is the external protocol you need to reproduce! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+`TestResult` is an interesting object to subclass or substitute. `#runCase:` is the external protocol you need to reproduce! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestResult methodsFor: 'accessing'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -383,6 +385,13 @@ runCase: aTestCase 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Object subclass: #TestSuiteRunner 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	instanceVariableNames: 'suite result announcer runNextTest' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	package: 'SUnit'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+!TestSuiteRunner commentStamp! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+I am responsible for running a collection (`suite`) of tests. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+## API 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Instances should be created using the class-side `#on:` method, taking a collection of tests to run as parameter. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+To run the test suite, use `#run`.! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 !TestSuiteRunner methodsFor: 'accessing'! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |