UNPKG

@ambers/lang

Version:

An implementation of the Smalltalk language that runs on top of the JS runtime.

1,429 lines (1,360 loc) 73.5 kB
define(["amber/boot", "require", "amber/core/Kernel-Classes", "amber/core/Kernel-Exceptions", "amber/core/Kernel-Infrastructure", "amber/core/Kernel-Objects"], function($boot,requirejs){"use strict"; var $core=$boot.api,nil=$boot.nilAsValue,$nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals; var $pkg = $core.addPackage("SUnit"); $pkg.transport = {"type":"amd","amdNamespace":"amber/core"}; $core.addClass("ResultAnnouncement", $globals.Object, "SUnit"); $core.setSlots($globals.ResultAnnouncement, ["result"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.ResultAnnouncement.comment="I get signaled when a `TestCase` has been run.\x0a\x0aMy instances hold the result (instance of `TestResult`) of the test run."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "result", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "result\x0a\x09^ result", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.result; }; }), $globals.ResultAnnouncement); $core.addMethod( $core.method({ selector: "result:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aTestResult"], source: "result: aTestResult\x0a\x09result := aTestResult", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aTestResult){ var self=this,$self=this; $self.result=aTestResult; return self; }; }), $globals.ResultAnnouncement); $core.addClass("Teachable", $globals.Object, "SUnit"); $core.setSlots($globals.Teachable, ["learnings"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.Teachable.comment="An object you can teach how to behave. Have a look at the \x0aclass side for an example.\x0a\x0aFor more infos have a look at: http://lists.squeakfoundation.org/pipermail/squeak-dev/2002-April/038170.html"; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "acceptSend:", protocol: "teaching", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aSymbol"], source: "acceptSend: aSymbol\x0a\x0a\x09self whenSend: aSymbol return: self", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["whenSend:return:"] }, function ($methodClass){ return function (aSymbol){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._whenSend_return_(aSymbol,self); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"acceptSend:",{aSymbol:aSymbol})}); //>>excludeEnd("ctx"); }; }), $globals.Teachable); $core.addMethod( $core.method({ selector: "doesNotUnderstand:", protocol: "private", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aMessage"], source: "doesNotUnderstand: aMessage\x0a\x0a\x09| learning |\x0a\x09learning := self learnings \x0a\x09\x09at: aMessage selector \x0a\x09\x09ifAbsent:[ ^super doesNotUnderstand: aMessage ].\x0a\x09^ learning class == Association\x0a\x09\x09ifTrue: [learning value]\x0a\x09\x09ifFalse: [learning valueWithPossibleArguments: aMessage arguments]", referencedClasses: ["Association"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["at:ifAbsent:", "learnings", "selector", "doesNotUnderstand:", "ifTrue:ifFalse:", "==", "class", "value", "valueWithPossibleArguments:", "arguments"] }, function ($methodClass){ return function (aMessage){ var self=this,$self=this; var learning; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $early={}; try { learning=$recv($self._learnings())._at_ifAbsent_($recv(aMessage)._selector(),(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); throw $early=[[( //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx2.supercall = true, //>>excludeEnd("ctx"); ($methodClass.superclass||$boot.nilAsClass).fn.prototype._doesNotUnderstand_.call($self,aMessage)) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.supercall = false //>>excludeEnd("ctx"); ][0]]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })); if($core.assert($recv($recv(learning)._class()).__eq_eq($globals.Association))){ return $recv(learning)._value(); } else { return $recv(learning)._valueWithPossibleArguments_($recv(aMessage)._arguments()); } } catch(e) {if(e===$early)return e[0]; throw e} //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"doesNotUnderstand:",{aMessage:aMessage,learning:learning})}); //>>excludeEnd("ctx"); }; }), $globals.Teachable); $core.addMethod( $core.method({ selector: "learnings", protocol: "private", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "learnings\x0a\x0a\x09learnings isNil ifTrue: [learnings := Dictionary new].\x0a\x09^learnings", referencedClasses: ["Dictionary"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ifTrue:", "isNil", "new"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); if($core.assert($recv($self.learnings)._isNil())){ $self.learnings=$recv($globals.Dictionary)._new(); $self.learnings; } return $self.learnings; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"learnings",{})}); //>>excludeEnd("ctx"); }; }), $globals.Teachable); $core.addMethod( $core.method({ selector: "whenSend:evaluate:", protocol: "teaching", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aSymbol", "aBlock"], source: "whenSend: aSymbol evaluate: aBlock\x0a\x0a\x09self learnings at: aSymbol put: aBlock", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["at:put:", "learnings"] }, function ($methodClass){ return function (aSymbol,aBlock){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._learnings())._at_put_(aSymbol,aBlock); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"whenSend:evaluate:",{aSymbol:aSymbol,aBlock:aBlock})}); //>>excludeEnd("ctx"); }; }), $globals.Teachable); $core.addMethod( $core.method({ selector: "whenSend:return:", protocol: "teaching", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aSymbol", "anObject"], source: "whenSend: aSymbol return: anObject\x0a\x0a\x09self learnings at: aSymbol put: (#return -> anObject)", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["at:put:", "learnings", "->"] }, function ($methodClass){ return function (aSymbol,anObject){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($self._learnings())._at_put_(aSymbol,"return".__minus_gt(anObject)); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"whenSend:return:",{aSymbol:aSymbol,anObject:anObject})}); //>>excludeEnd("ctx"); }; }), $globals.Teachable); $core.addMethod( $core.method({ selector: "example", protocol: "examples", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "example\x0a\x09| teachable |\x0a\x09teachable := self new.\x0a\x09teachable \x0a\x09\x09whenSend: #help return: 'ok';\x0a\x09\x09whenSend: #doit evaluate: [1 inspect];\x0a\x09\x09acceptSend: #noDebugger;\x0a\x09\x09whenSend: #negate: evaluate: [:num | num negated].\x0a\x09teachable help.\x0a\x09teachable doit.\x0a\x09teachable noDebugger.\x0a\x09teachable negate: 120", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["new", "whenSend:return:", "whenSend:evaluate:", "inspect", "acceptSend:", "negated", "help", "doit", "noDebugger", "negate:"] }, function ($methodClass){ return function (){ var self=this,$self=this; var teachable; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; teachable=$self._new(); $1=teachable; $recv($1)._whenSend_return_("help","ok"); [$recv($1)._whenSend_evaluate_("doit",(function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return (1)._inspect(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["whenSend:evaluate:"]=1 //>>excludeEnd("ctx"); ][0]; $recv($1)._acceptSend_("noDebugger"); $recv($1)._whenSend_evaluate_("negate:",(function(num){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(num)._negated(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({num:num},$ctx1,2)}); //>>excludeEnd("ctx"); })); $recv(teachable)._help(); $recv(teachable)._doit(); $recv(teachable)._noDebugger(); $recv(teachable)._negate_((120)); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"example",{teachable:teachable})}); //>>excludeEnd("ctx"); }; }), $globals.Teachable.a$cls); $core.addClass("TestCase", $globals.Object, "SUnit"); $core.setSlots($globals.TestCase, ["testSelector", "asyncTimeout", "context"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.TestCase.comment="I am an implementation of the command pattern to run a test.\x0a\x0a## API\x0a\x0aMy instances are created with the class method `#selector:`,\x0apassing the symbol that names the method to be executed when the test case runs.\x0a\x0aWhen you discover a new fixture, subclass `TestCase` and create a `#test...` method for the first test.\x0aAs that method develops and more `#test...` methods are added, you will find yourself refactoring temps\x0ainto instance variables for the objects in the fixture and overriding `#setUp` to initialize these variables.\x0aAs required, override `#tearDown` to nil references, release objects and deallocate."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "assert:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBoolean"], source: "assert: aBoolean\x0a\x09self assert: aBoolean description: 'Assertion failed'", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["assert:description:"] }, function ($methodClass){ return function (aBoolean){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._assert_description_(aBoolean,"Assertion failed"); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"assert:",{aBoolean:aBoolean})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "assert:description:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBoolean", "aString"], source: "assert: aBoolean description: aString\x0a\x09aBoolean ifFalse: [ self signalFailure: aString ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ifFalse:", "signalFailure:"] }, function ($methodClass){ return function (aBoolean,aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); if(!$core.assert(aBoolean)){ $self._signalFailure_(aString); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"assert:description:",{aBoolean:aBoolean,aString:aString})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "assert:equals:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["actual", "expected"], source: "assert: actual equals: expected\x0a\x09^ self assert: (actual = expected) description: 'Expected: ', expected printString, ' but was: ', actual printString", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["assert:description:", "=", ",", "printString"] }, function ($methodClass){ return function (actual,expected){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self._assert_description_($recv(actual).__eq(expected),[$recv([$recv("Expected: ".__comma([$recv(expected)._printString() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["printString"]=1 //>>excludeEnd("ctx"); ][0])).__comma(" but was: ") //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx[","]=2 //>>excludeEnd("ctx"); ][0]).__comma($recv(actual)._printString()) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx[","]=1 //>>excludeEnd("ctx"); ][0]); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"assert:equals:",{actual:actual,expected:expected})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "async:", protocol: "async", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "async: aBlock\x0a\x09| c |\x0a\x09self errorIfNotAsync: '#async'.\x0a\x09c := context.\x0a\x09^ [ self isAsync ifTrue: [ c execute: aBlock ] ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["errorIfNotAsync:", "ifTrue:", "isAsync", "execute:"] }, function ($methodClass){ return function (aBlock){ var self=this,$self=this; var c; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._errorIfNotAsync_("#async"); c=$self.context; return (function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); if($core.assert($self._isAsync())){ return $recv(c)._execute_(aBlock); } else { return nil; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); }); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"async:",{aBlock:aBlock,c:c})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "context:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aRunningTestContext"], source: "context: aRunningTestContext\x0a\x09context := aRunningTestContext", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aRunningTestContext){ var self=this,$self=this; $self.context=aRunningTestContext; return self; }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "debugCase", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "debugCase\x0a\x09self deprecatedAPI: 'Use #runCase instead.'.\x0a\x09^ self runCase", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["deprecatedAPI:", "runCase"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._deprecatedAPI_("Use #runCase instead."); return $self._runCase(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"debugCase",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "deny:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBoolean"], source: "deny: aBoolean\x0a\x09self assert: aBoolean not", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["assert:", "not"] }, function ($methodClass){ return function (aBoolean){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._assert_($recv(aBoolean)._not()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"deny:",{aBoolean:aBoolean})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "errorIfNotAsync:", protocol: "error handling", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "errorIfNotAsync: aString\x0a\x09self isAsync ifFalse: [\x0a\x09\x09self error: aString, ' used without prior #timeout:' ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ifFalse:", "isAsync", "error:", ","] }, function ($methodClass){ return function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); if(!$core.assert($self._isAsync())){ $self._error_($recv(aString).__comma(" used without prior #timeout:")); } return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"errorIfNotAsync:",{aString:aString})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "finished", protocol: "async", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "finished\x0a\x09self errorIfNotAsync: '#finished'.\x0a\x09asyncTimeout ifNotNil: [ asyncTimeout clearTimeout ].\x0a\x09asyncTimeout := nil", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["errorIfNotAsync:", "ifNotNil:", "clearTimeout"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $self._errorIfNotAsync_("#finished"); $1=$self.asyncTimeout; if($1 != null && !$1.a$nil){ $recv($self.asyncTimeout)._clearTimeout(); } $self.asyncTimeout=nil; return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"finished",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "isAsync", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isAsync\x0a\x09^ asyncTimeout notNil", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["notNil"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self.asyncTimeout)._notNil(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"isAsync",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "performTest", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "performTest\x0a\x09asyncTimeout := nil.\x0a\x09^ self perform: self selector", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["perform:", "selector"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self.asyncTimeout=nil; return $self._perform_($self._selector()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"performTest",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "runCase", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "runCase\x0a\x09\x22Runs a test case in isolated context, leaking all errors.\x22\x0a\x0a\x09(TestContext testCase: self) start", referencedClasses: ["TestContext"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["start", "testCase:"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($recv($globals.TestContext)._testCase_(self))._start(); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"runCase",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "selector", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "selector\x0a\x09^ testSelector", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $self.testSelector; }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "setTestSelector:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aSelector"], source: "setTestSelector: aSelector\x0a\x09testSelector := aSelector", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aSelector){ var self=this,$self=this; $self.testSelector=aSelector; return self; }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "setUp", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "setUp", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return self; }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "should:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "should: aBlock\x0a\x09self assert: aBlock value", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["assert:", "value"] }, function ($methodClass){ return function (aBlock){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._assert_($recv(aBlock)._value()); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"should:",{aBlock:aBlock})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "should:raise:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock", "anExceptionClass"], source: "should: aBlock raise: anExceptionClass\x0a\x09self assert: ([ aBlock value. false ]\x0a\x09\x09on: anExceptionClass\x0a\x09\x09do: [ :ex | true ])", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["assert:", "on:do:", "value"] }, function ($methodClass){ return function (aBlock,anExceptionClass){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._assert_($recv((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $recv(aBlock)._value(); return false; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); }))._on_do_(anExceptionClass,(function(ex){ return true; }))); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"should:raise:",{aBlock:aBlock,anExceptionClass:anExceptionClass})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "shouldnt:raise:", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock", "anExceptionClass"], source: "shouldnt: aBlock raise: anExceptionClass\x0a\x09self assert: ([ aBlock value. true ]\x0a\x09\x09on: anExceptionClass\x0a\x09\x09do: [ :ex | false ])", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["assert:", "on:do:", "value"] }, function ($methodClass){ return function (aBlock,anExceptionClass){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._assert_($recv((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $recv(aBlock)._value(); return true; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); }))._on_do_(anExceptionClass,(function(ex){ return false; }))); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"shouldnt:raise:",{aBlock:aBlock,anExceptionClass:anExceptionClass})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "signalFailure:", protocol: "private", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aString"], source: "signalFailure: aString\x0a\x09TestFailure signal: aString", referencedClasses: ["TestFailure"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["signal:"] }, function ($methodClass){ return function (aString){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv($globals.TestFailure)._signal_(aString); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"signalFailure:",{aString:aString})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "tearDown", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "tearDown", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return self; }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "timeout:", protocol: "async", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aNumber"], source: "timeout: aNumber\x0a\x09\x22Set a grace time timeout in milliseconds to run the test asynchronously\x22\x0a\x09\x0a\x09asyncTimeout ifNotNil: [ asyncTimeout clearTimeout ].\x0a\x09\x0a\x09\x22to allow #async: message send without throwing an error\x22\x0a\x09asyncTimeout := 0.\x0a\x09\x0a\x09asyncTimeout := (self async: [\x0a\x09\x09self assert: false description: 'SUnit grace time exhausted' ])\x0a\x09\x09\x09valueWithTimeout: aNumber", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ifNotNil:", "clearTimeout", "valueWithTimeout:", "async:", "assert:description:"] }, function ($methodClass){ return function (aNumber){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$self.asyncTimeout; if($1 != null && !$1.a$nil){ $recv($self.asyncTimeout)._clearTimeout(); } $self.asyncTimeout=(0); $self.asyncTimeout=$recv($self._async_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._assert_description_(false,"SUnit grace time exhausted"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)}); //>>excludeEnd("ctx"); })))._valueWithTimeout_(aNumber); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"timeout:",{aNumber:aNumber})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase); $core.addMethod( $core.method({ selector: "allTestSelectors", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "allTestSelectors\x0a\x09| selectors |\x0a\x09selectors := self testSelectors.\x0a\x09self shouldInheritSelectors ifTrue: [\x0a\x09\x09selectors addAll: self superclass allTestSelectors ].\x0a\x09^ selectors asSet", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["testSelectors", "ifTrue:", "shouldInheritSelectors", "addAll:", "allTestSelectors", "superclass", "asSet"] }, function ($methodClass){ return function (){ var self=this,$self=this; var selectors; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); selectors=$self._testSelectors(); if($core.assert($self._shouldInheritSelectors())){ $recv(selectors)._addAll_($recv($self._superclass())._allTestSelectors()); } return $recv(selectors)._asSet(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"allTestSelectors",{selectors:selectors})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "buildSuite", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "buildSuite\x0a\x09^ self allTestSelectors collect: [ :each | self selector: each ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["collect:", "allTestSelectors", "selector:"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._allTestSelectors())._collect_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._selector_(each); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"buildSuite",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "classTag", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "classTag\x0a\x09\x22Returns a tag or general category for this class.\x0a\x09Typically used to help tools do some reflection.\x0a\x09Helios, for example, uses this to decide what icon the class should display.\x22\x0a\x09\x0a\x09^ 'test'", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return "test"; }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "isAbstract", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isAbstract\x0a\x09^ self name = TestCase name", referencedClasses: ["TestCase"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["=", "name"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv([$self._name() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["name"]=1 //>>excludeEnd("ctx"); ][0]).__eq($recv($globals.TestCase)._name()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"isAbstract",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "isTestClass", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "isTestClass\x0a\x09^ self isAbstract not", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["not", "isAbstract"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($self._isAbstract())._not(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"isTestClass",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "lookupHierarchyRoot", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "lookupHierarchyRoot\x0a\x09^ TestCase", referencedClasses: ["TestCase"], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (){ var self=this,$self=this; return $globals.TestCase; }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "selector:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aSelector"], source: "selector: aSelector\x0a\x09^ self new\x0a\x09\x09setTestSelector: aSelector;\x0a\x09\x09yourself", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["setTestSelector:", "new", "yourself"] }, function ($methodClass){ return function (aSelector){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$self._new(); $recv($1)._setTestSelector_(aSelector); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"selector:",{aSelector:aSelector})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "shouldInheritSelectors", protocol: "testing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "shouldInheritSelectors\x0a\x09^ self ~= self lookupHierarchyRoot", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["~=", "lookupHierarchyRoot"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $self.__tild_eq($self._lookupHierarchyRoot()); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"shouldInheritSelectors",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addMethod( $core.method({ selector: "testSelectors", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "testSelectors\x0a\x09^ self methodDictionary keys select: [ :each | each match: '^test' ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["select:", "keys", "methodDictionary", "match:"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); return $recv($recv($self._methodDictionary())._keys())._select_((function(each){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(each)._match_("^test"); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"testSelectors",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestCase.a$cls); $core.addClass("TestContext", $globals.Object, "SUnit"); $core.setSlots($globals.TestContext, ["testCase"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.TestContext.comment="I govern running a particular test case.\x0a\x0aMy 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)."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "execute:", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "execute: aBlock\x0a\x09| failed result |\x0a\x09\x0a\x09testCase context: self.\x0a\x09[\x0a\x09\x09failed := true.\x0a\x09\x09result := aBlock value.\x0a\x09\x09testCase isAsync ifFalse: [\x0a\x09\x09\x09testCase assert: result isThenable not description: testCase asString, ' returned promise without sending #timeout:' ].\x0a\x09\x09failed := false\x0a\x09]\x0a\x09\x09ensure: [\x0a\x09\x09\x09\x22testCase context: nil.\x22\x0a\x09\x09\x09\x0a\x09\x09\x09(failed and: [ testCase isAsync ]) ifTrue: [ testCase finished ].\x0a\x09\x09\x09testCase isAsync\x0a\x09\x09\x09\x09ifFalse: [ testCase tearDown ]\x0a\x09\x09\x09\x09ifTrue: [ result isThenable ifTrue: [\x0a\x09\x09\x09\x09\x09failed := false.\x0a\x09\x09\x09\x09\x09(result\x0a\x09\x09\x09\x09\x09\x09catch: [ :error | testCase isAsync ifTrue: [ self execute: [ failed := true. (Smalltalk asSmalltalkException: error) pass ] ] ])\x0a\x09\x09\x09\x09\x09\x09then: [ failed ifFalse: [ testCase isAsync ifTrue: [ self execute: [ testCase finished ] ] ] ] ] ] ]", referencedClasses: ["Smalltalk"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["context:", "ensure:", "value", "ifFalse:", "isAsync", "assert:description:", "not", "isThenable", ",", "asString", "ifTrue:", "and:", "finished", "ifFalse:ifTrue:", "tearDown", "then:", "catch:", "execute:", "pass", "asSmalltalkException:"] }, function ($methodClass){ return function (aBlock){ var self=this,$self=this; var failed,result; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $recv($self.testCase)._context_(self); $recv((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); failed=true; result=$recv(aBlock)._value(); if(!$core.assert([$recv($self.testCase)._isAsync() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["isAsync"]=1 //>>excludeEnd("ctx"); ][0])){ $recv($self.testCase)._assert_description_($recv([$recv(result)._isThenable() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["isThenable"]=1 //>>excludeEnd("ctx"); ][0])._not(),$recv($recv($self.testCase)._asString()).__comma(" returned promise without sending #timeout:")); } failed=false; return failed; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); }))._ensure_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); if($core.assert(failed)){ $1=[$recv($self.testCase)._isAsync() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["isAsync"]=2 //>>excludeEnd("ctx"); ][0]; } else { $1=false; } if($core.assert($1)){ [$recv($self.testCase)._finished() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["finished"]=1 //>>excludeEnd("ctx"); ][0]; } if($core.assert([$recv($self.testCase)._isAsync() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx2.sendIdx["isAsync"]=3 //>>excludeEnd("ctx"); ][0])){ if($core.assert($recv(result)._isThenable())){ failed=false; return $recv($recv(result)._catch_((function(error){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); if($core.assert([$recv($self.testCase)._isAsync() //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["isAsync"]=4 //>>excludeEnd("ctx"); ][0])){ return [$self._execute_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx4) { //>>excludeEnd("ctx"); failed=true; return $recv($recv($globals.Smalltalk)._asSmalltalkException_(error))._pass(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx4) {$ctx4.fillBlock({},$ctx3,11)}); //>>excludeEnd("ctx"); })) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.sendIdx["execute:"]=1 //>>excludeEnd("ctx"); ][0]; } else { return nil; } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({error:error},$ctx2,9)}); //>>excludeEnd("ctx"); })))._then_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); if($core.assert(failed)){ return nil; } else { if($core.assert($recv($self.testCase)._isAsync())){ return $self._execute_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx4) { //>>excludeEnd("ctx"); return $recv($self.testCase)._finished(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx4) {$ctx4.fillBlock({},$ctx3,15)}); //>>excludeEnd("ctx"); })); } else { return nil; } } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({},$ctx2,12)}); //>>excludeEnd("ctx"); })); } else { return nil; } } else { return $recv($self.testCase)._tearDown(); } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,3)}); //>>excludeEnd("ctx"); })); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"execute:",{aBlock:aBlock,failed:failed,result:result})}); //>>excludeEnd("ctx"); }; }), $globals.TestContext); $core.addMethod( $core.method({ selector: "start", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: [], source: "start\x0a\x09self execute: [\x0a\x09\x09testCase setUp.\x0a\x09\x09testCase performTest ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["execute:", "setUp", "performTest"] }, function ($methodClass){ return function (){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $self._execute_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); $recv($self.testCase)._setUp(); return $recv($self.testCase)._performTest(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); })); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"start",{})}); //>>excludeEnd("ctx"); }; }), $globals.TestContext); $core.addMethod( $core.method({ selector: "testCase:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aTestCase"], source: "testCase: aTestCase\x0a\x09testCase := aTestCase", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aTestCase){ var self=this,$self=this; $self.testCase=aTestCase; return self; }; }), $globals.TestContext); $core.addMethod( $core.method({ selector: "testCase:", protocol: "instance creation", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aTestCase"], source: "testCase: aTestCase\x0a\x09^ self new\x0a\x09\x09testCase: aTestCase;\x0a\x09\x09yourself", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["testCase:", "new", "yourself"] }, function ($methodClass){ return function (aTestCase){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); var $1; $1=$self._new(); $recv($1)._testCase_(aTestCase); return $recv($1)._yourself(); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"testCase:",{aTestCase:aTestCase})}); //>>excludeEnd("ctx"); }; }), $globals.TestContext.a$cls); $core.addClass("ReportingTestContext", $globals.TestContext, "SUnit"); $core.setSlots($globals.ReportingTestContext, ["finished", "result"]); //>>excludeStart("ide", pragmas.excludeIdeData); $globals.ReportingTestContext.comment="I add `TestResult` reporting to `TestContext`.\x0a\x0aErrors are caught and save into a `TestResult`,\x0aWhen test case is finished (which can be later for async tests), a callback block is executed; this is used by a `TestSuiteRunner`."; //>>excludeEnd("ide"); $core.addMethod( $core.method({ selector: "execute:", protocol: "running", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "execute: aBlock\x0a\x09[\x0a\x09\x09self withErrorReporting: [ super execute: aBlock ]\x0a\x09]\x0a\x09\x09ensure: [\x0a\x09\x09\x09testCase isAsync ifFalse: [\x0a\x09\x09\x09\x09result increaseRuns. finished value ] ]", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: ["ensure:", "withErrorReporting:", "execute:", "ifFalse:", "isAsync", "increaseRuns", "value"] }, function ($methodClass){ return function (aBlock){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); $recv((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $self._withErrorReporting_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); return [( //>>excludeStart("ctx", pragmas.excludeDebugContexts); $ctx3.supercall = true, //>>excludeEnd("ctx"); ($methodClass.superclass||$boot.nilAsClass).fn.prototype._execute_.call($self,aBlock)) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx3.supercall = false //>>excludeEnd("ctx"); ][0]; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); }))._ensure_((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); if($core.assert($recv($self.testCase)._isAsync())){ return nil; } else { $recv($self.result)._increaseRuns(); return $recv($self.finished)._value(); } //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,3)}); //>>excludeEnd("ctx"); })); return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"execute:",{aBlock:aBlock})}); //>>excludeEnd("ctx"); }; }), $globals.ReportingTestContext); $core.addMethod( $core.method({ selector: "finished:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "finished: aBlock\x0a\x09finished := aBlock", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aBlock){ var self=this,$self=this; $self.finished=aBlock; return self; }; }), $globals.ReportingTestContext); $core.addMethod( $core.method({ selector: "result:", protocol: "accessing", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aTestResult"], source: "result: aTestResult\x0a\x09result := aTestResult", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [], messageSends: [] }, function ($methodClass){ return function (aTestResult){ var self=this,$self=this; $self.result=aTestResult; return self; }; }), $globals.ReportingTestContext); $core.addMethod( $core.method({ selector: "withErrorReporting2:", protocol: "private", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "withErrorReporting2: aBlock\x0a\x09[ aBlock\x0a\x09\x09on: TestFailure\x0a\x09\x09do: [ :ex | result addFailure: testCase ]\x0a\x09]\x0a\x09\x09on: Error\x0a\x09\x09do: [ :ex | result addError: testCase ]", referencedClasses: ["TestFailure", "Error"], //>>excludeEnd("ide"); pragmas: [], messageSends: ["on:do:", "addFailure:", "addError:"] }, function ($methodClass){ return function (aBlock){ var self=this,$self=this; //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx1) { //>>excludeEnd("ctx"); [$recv((function(){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv(aBlock)._on_do_($globals.TestFailure,(function(ex){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx3) { //>>excludeEnd("ctx"); return $recv($self.result)._addFailure_($self.testCase); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx3) {$ctx3.fillBlock({ex:ex},$ctx2,2)}); //>>excludeEnd("ctx"); })); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)}); //>>excludeEnd("ctx"); }))._on_do_($globals.Error,(function(ex){ //>>excludeStart("ctx", pragmas.excludeDebugContexts); return $core.withContext(function($ctx2) { //>>excludeEnd("ctx"); return $recv($self.result)._addError_($self.testCase); //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx2) {$ctx2.fillBlock({ex:ex},$ctx1,3)}); //>>excludeEnd("ctx"); })) //>>excludeStart("ctx", pragmas.excludeDebugContexts); ,$ctx1.sendIdx["on:do:"]=1 //>>excludeEnd("ctx"); ][0]; return self; //>>excludeStart("ctx", pragmas.excludeDebugContexts); }, function($ctx1) {$ctx1.fill(self,"withErrorReporting2:",{aBlock:aBlock})}); //>>excludeEnd("ctx"); }; }), $globals.ReportingTestContext); $core.addMethod( $core.method({ selector: "withErrorReporting:", protocol: "private", //>>excludeStart("ide", pragmas.excludeIdeData); args: ["aBlock"], source: "withErrorReporting: aBlock\x0a\x09<inlineJS: '\x0a\x09try { aBlock._value(); }\x0a\x09catch (ex) {\x0a\x09\x09var smalltalkError = $globals.Smalltalk._asSmalltalkException_(ex);\x0a\x09\x09self._withErrorReporting2_(function () { smalltalkError._pass(); });\x0a\x09}'>", referencedClasses: [], //>>excludeEnd("ide"); pragmas: [["inlineJS:", ["\x0a\x09try { aBlock._value(); }\x0a\x09catch (ex) {\x0a\x09\x09var smalltalkError = $globals.Smalltalk