Browse Source

graceTime: now works and produces timeouts.

Herbert Vojčík 11 years ago
parent
commit
53ebc7f826
6 changed files with 244 additions and 3 deletions
  1. 82 0
      js/SUnit-Tests.deploy.js
  2. 102 0
      js/SUnit-Tests.js
  3. 8 0
      js/SUnit.deploy.js
  4. 10 2
      js/SUnit.js
  5. 37 0
      st/SUnit-Tests.st
  6. 5 1
      st/SUnit.st

+ 82 - 0
js/SUnit-Tests.deploy.js

@@ -49,6 +49,54 @@ return self}
 }),
 smalltalk.SUnitAsyncTest);
 
+smalltalk.addMethod(
+"_fakeMultipleGraceTimeFailing",
+smalltalk.method({
+selector: "fakeMultipleGraceTimeFailing",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_graceTime_",[(100)]);
+smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+smalltalk.send(self,"_graceTime_",[(5)]);
+return smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_finished",[]);
+})]),"_valueWithTimeout_",[(10)]);
+})]),"_valueWithTimeout_",[(5)]);
+return self}
+}),
+smalltalk.SUnitAsyncTest);
+
+smalltalk.addMethod(
+"_fakeMultipleGraceTimePassing",
+smalltalk.method({
+selector: "fakeMultipleGraceTimePassing",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_graceTime_",[(10)]);
+smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+smalltalk.send(self,"_graceTime_",[(20)]);
+return smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_finished",[]);
+})]),"_valueWithTimeout_",[(10)]);
+})]),"_valueWithTimeout_",[(5)]);
+return self}
+}),
+smalltalk.SUnitAsyncTest);
+
+smalltalk.addMethod(
+"_fakeTimeout",
+smalltalk.method({
+selector: "fakeTimeout",
+fn: function (){
+var self=this;
+smalltalk.send(self,"_graceTime_",[(4)]);
+smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_finished",[]);
+})]),"_valueWithTimeout_",[(5)]);
+return self}
+}),
+smalltalk.SUnitAsyncTest);
+
 smalltalk.addMethod(
 "_setUp",
 smalltalk.method({
@@ -190,6 +238,40 @@ return self}
 }),
 smalltalk.SUnitAsyncTest);
 
+smalltalk.addMethod(
+"_testTimeoutsWork",
+smalltalk.method({
+selector: "testTimeoutsWork",
+fn: function (){
+var self=this;
+var $1,$2;
+var suite;
+var runner;
+var result;
+var assertBlock;
+suite=smalltalk.send(["fakeTimeout", "fakeMultipleGraceTimeFailing", "fakeMultipleGraceTimePassing", "testPass"],"_collect_",[(function(each){
+return smalltalk.send(smalltalk.send(self,"_class",[]),"_selector_",[each]);
+})]);
+runner=smalltalk.send((smalltalk.TestSuiteRunner || TestSuiteRunner),"_on_",[suite]);
+smalltalk.send(self,"_graceTime_",[(200)]);
+result=smalltalk.send(runner,"_result",[]);
+assertBlock=smalltalk.send(self,"_async_",[(function(){
+smalltalk.send(self,"_assert_",[smalltalk.send(smalltalk.send(result,"_errors",[]),"_isEmpty",[])]);
+smalltalk.send(self,"_assert_equals_",[["fakeMultipleGraceTimeFailing", "fakeTimeout"],smalltalk.send(self,"_sortedSelectors_",[smalltalk.send(result,"_failures",[])])]);
+return smalltalk.send(self,"_finished",[]);
+})]);
+smalltalk.send(smalltalk.send(runner,"_announcer",[]),"_on_do_",[(smalltalk.ResultAnnouncement || ResultAnnouncement),(function(ann){
+$1=smalltalk.send(smalltalk.send(ann,"_result",[]),"__eq_eq",[result]);
+if(smalltalk.assert($1)){
+$2=smalltalk.send(smalltalk.send(result,"_runs",[]),"__eq",[smalltalk.send(result,"_total",[])]);
+return smalltalk.send($2,"_ifTrue_",[assertBlock]);
+};
+})]);
+smalltalk.send(runner,"_run",[]);
+return self}
+}),
+smalltalk.SUnitAsyncTest);
+
 smalltalk.addMethod(
 "_testTwoAsyncPassesWithFinishedOnlyOneIsRun",
 smalltalk.method({

+ 102 - 0
js/SUnit-Tests.js

@@ -64,6 +64,69 @@ referencedClasses: []
 }),
 smalltalk.SUnitAsyncTest);
 
+smalltalk.addMethod(
+"_fakeMultipleGraceTimeFailing",
+smalltalk.method({
+selector: "fakeMultipleGraceTimeFailing",
+category: 'tests',
+fn: function (){
+var self=this;
+smalltalk.send(self,"_graceTime_",[(100)]);
+smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+smalltalk.send(self,"_graceTime_",[(5)]);
+return smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_finished",[]);
+})]),"_valueWithTimeout_",[(10)]);
+})]),"_valueWithTimeout_",[(5)]);
+return self},
+args: [],
+source: "fakeMultipleGraceTimeFailing\x0a\x09self graceTime: 100.\x0a    (self async: [\x0a\x09\x09self graceTime: 5.\x0a        (self async: [ self finished ]) valueWithTimeout: 10\x0a\x09]) valueWithTimeout: 5\x0a",
+messageSends: ["graceTime:", "valueWithTimeout:", "async:", "finished"],
+referencedClasses: []
+}),
+smalltalk.SUnitAsyncTest);
+
+smalltalk.addMethod(
+"_fakeMultipleGraceTimePassing",
+smalltalk.method({
+selector: "fakeMultipleGraceTimePassing",
+category: 'tests',
+fn: function (){
+var self=this;
+smalltalk.send(self,"_graceTime_",[(10)]);
+smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+smalltalk.send(self,"_graceTime_",[(20)]);
+return smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_finished",[]);
+})]),"_valueWithTimeout_",[(10)]);
+})]),"_valueWithTimeout_",[(5)]);
+return self},
+args: [],
+source: "fakeMultipleGraceTimePassing\x0a\x09self graceTime: 10.\x0a    (self async: [\x0a\x09\x09self graceTime: 20.\x0a        (self async: [ self finished ]) valueWithTimeout: 10\x0a\x09]) valueWithTimeout: 5\x0a",
+messageSends: ["graceTime:", "valueWithTimeout:", "async:", "finished"],
+referencedClasses: []
+}),
+smalltalk.SUnitAsyncTest);
+
+smalltalk.addMethod(
+"_fakeTimeout",
+smalltalk.method({
+selector: "fakeTimeout",
+category: 'tests',
+fn: function (){
+var self=this;
+smalltalk.send(self,"_graceTime_",[(4)]);
+smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_finished",[]);
+})]),"_valueWithTimeout_",[(5)]);
+return self},
+args: [],
+source: "fakeTimeout\x0a\x09self graceTime: 4.\x0a    (self async: [ self finished ]) valueWithTimeout: 5\x0a",
+messageSends: ["graceTime:", "valueWithTimeout:", "async:", "finished"],
+referencedClasses: []
+}),
+smalltalk.SUnitAsyncTest);
+
 smalltalk.addMethod(
 "_setUp",
 smalltalk.method({
@@ -245,6 +308,45 @@ referencedClasses: []
 }),
 smalltalk.SUnitAsyncTest);
 
+smalltalk.addMethod(
+"_testTimeoutsWork",
+smalltalk.method({
+selector: "testTimeoutsWork",
+category: 'tests',
+fn: function (){
+var self=this;
+var $1,$2;
+var suite;
+var runner;
+var result;
+var assertBlock;
+suite=smalltalk.send(["fakeTimeout", "fakeMultipleGraceTimeFailing", "fakeMultipleGraceTimePassing", "testPass"],"_collect_",[(function(each){
+return smalltalk.send(smalltalk.send(self,"_class",[]),"_selector_",[each]);
+})]);
+runner=smalltalk.send((smalltalk.TestSuiteRunner || TestSuiteRunner),"_on_",[suite]);
+smalltalk.send(self,"_graceTime_",[(200)]);
+result=smalltalk.send(runner,"_result",[]);
+assertBlock=smalltalk.send(self,"_async_",[(function(){
+smalltalk.send(self,"_assert_",[smalltalk.send(smalltalk.send(result,"_errors",[]),"_isEmpty",[])]);
+smalltalk.send(self,"_assert_equals_",[["fakeMultipleGraceTimeFailing", "fakeTimeout"],smalltalk.send(self,"_sortedSelectors_",[smalltalk.send(result,"_failures",[])])]);
+return smalltalk.send(self,"_finished",[]);
+})]);
+smalltalk.send(smalltalk.send(runner,"_announcer",[]),"_on_do_",[(smalltalk.ResultAnnouncement || ResultAnnouncement),(function(ann){
+$1=smalltalk.send(smalltalk.send(ann,"_result",[]),"__eq_eq",[result]);
+if(smalltalk.assert($1)){
+$2=smalltalk.send(smalltalk.send(result,"_runs",[]),"__eq",[smalltalk.send(result,"_total",[])]);
+return smalltalk.send($2,"_ifTrue_",[assertBlock]);
+};
+})]);
+smalltalk.send(runner,"_run",[]);
+return self},
+args: [],
+source: "testTimeoutsWork\x0a\x09| suite runner result assertBlock |\x0a\x09suite := #('fakeTimeout' 'fakeMultipleGraceTimeFailing' 'fakeMultipleGraceTimePassing' 'testPass') collect: [ :each | self class selector: each ].\x0a    runner := TestSuiteRunner on: suite.\x0a    self graceTime: 200.\x0a\x09result := runner result.\x0a    assertBlock := self async: [\x0a\x09\x09self assert: result errors isEmpty.\x0a\x09\x09self assert: #('fakeMultipleGraceTimeFailing' 'fakeTimeout') equals: (self sortedSelectors: result failures).\x0a\x09\x09self finished\x0a  \x09].\x0a    runner announcer on: ResultAnnouncement do: [:ann |\x0a    \x09ann result == result  ifTrue: [ result runs = result total ifTrue: assertBlock ]].\x0a\x09runner run",
+messageSends: ["collect:", "selector:", "class", "on:", "graceTime:", "result", "async:", "assert:", "isEmpty", "errors", "assert:equals:", "sortedSelectors:", "failures", "finished", "on:do:", "ifTrue:", "=", "total", "runs", "==", "announcer", "run"],
+referencedClasses: ["TestSuiteRunner", "ResultAnnouncement"]
+}),
+smalltalk.SUnitAsyncTest);
+
 smalltalk.addMethod(
 "_testTwoAsyncPassesWithFinishedOnlyOneIsRun",
 smalltalk.method({

+ 8 - 0
js/SUnit.deploy.js

@@ -289,7 +289,15 @@ smalltalk.method({
 selector: "graceTime:",
 fn: function (millis){
 var self=this;
+if(($receiver = self["@asyncTimeout"]) == nil || $receiver == undefined){
+self["@asyncTimeout"];
+} else {
+smalltalk.send(self["@asyncTimeout"],"_clearTimeout",[]);
+};
 self["@asyncTimeout"]=true;
+self["@asyncTimeout"]=smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_assert_description_",[false,"SUnit grace time exhausted"]);
+})]),"_valueWithTimeout_",[millis]);
 return self}
 }),
 smalltalk.TestCase);

+ 10 - 2
js/SUnit.js

@@ -380,11 +380,19 @@ selector: "graceTime:",
 category: 'async',
 fn: function (millis){
 var self=this;
+if(($receiver = self["@asyncTimeout"]) == nil || $receiver == undefined){
+self["@asyncTimeout"];
+} else {
+smalltalk.send(self["@asyncTimeout"],"_clearTimeout",[]);
+};
 self["@asyncTimeout"]=true;
+self["@asyncTimeout"]=smalltalk.send(smalltalk.send(self,"_async_",[(function(){
+return smalltalk.send(self,"_assert_description_",[false,"SUnit grace time exhausted"]);
+})]),"_valueWithTimeout_",[millis]);
 return self},
 args: ["millis"],
-source: "graceTime: millis\x0a\x09asyncTimeout := true",
-messageSends: [],
+source: "graceTime: millis\x0a\x09asyncTimeout ifNotNil: [ asyncTimeout clearTimeout ].\x0a\x09asyncTimeout := true. \x22to allow async:\x22\x0a\x09asyncTimeout :=\x0a\x09\x09(self async: [ self assert: false description: 'SUnit grace time exhausted' ])\x0a        valueWithTimeout: millis",
+messageSends: ["ifNotNil:", "clearTimeout", "valueWithTimeout:", "async:", "assert:description:"],
 referencedClasses: []
 }),
 smalltalk.TestCase);

+ 37 - 0
st/SUnit-Tests.st

@@ -39,6 +39,27 @@ fakeFailure
     flag := (self async: [ flag := 'ok'. self assert: false ]) valueWithTimeout: 5
 !
 
+fakeMultipleGraceTimeFailing
+	self graceTime: 100.
+    (self async: [
+		self graceTime: 5.
+        (self async: [ self finished ]) valueWithTimeout: 10
+	]) valueWithTimeout: 5
+!
+
+fakeMultipleGraceTimePassing
+	self graceTime: 10.
+    (self async: [
+		self graceTime: 20.
+        (self async: [ self finished ]) valueWithTimeout: 10
+	]) valueWithTimeout: 5
+!
+
+fakeTimeout
+	self graceTime: 4.
+    (self async: [ self finished ]) valueWithTimeout: 5
+!
+
 testAsyncErrorsAndFailuresWork
 	| suite runner result assertBlock |
 	suite := #('fakeError' 'fakeErrorFailingInTearDown' 'fakeFailure' 'testPass') collect: [ :each | self class selector: each ].
@@ -82,6 +103,22 @@ testPass
     flag := (self async: [ self assert: true. self finished. flag := 'ok' ]) valueWithTimeout: 5
 !
 
+testTimeoutsWork
+	| suite runner result assertBlock |
+	suite := #('fakeTimeout' 'fakeMultipleGraceTimeFailing' 'fakeMultipleGraceTimePassing' 'testPass') collect: [ :each | self class selector: each ].
+    runner := TestSuiteRunner on: suite.
+    self graceTime: 200.
+	result := runner result.
+    assertBlock := self async: [
+		self assert: result errors isEmpty.
+		self assert: #('fakeMultipleGraceTimeFailing' 'fakeTimeout') equals: (self sortedSelectors: result failures).
+		self finished
+  	].
+    runner announcer on: ResultAnnouncement do: [:ann |
+    	ann result == result  ifTrue: [ result runs = result total ifTrue: assertBlock ]].
+	runner run
+!
+
 testTwoAsyncPassesWithFinishedOnlyOneIsRun
 	| x |
 	flag := 'bad'.

+ 5 - 1
st/SUnit.st

@@ -118,7 +118,11 @@ finished
 !
 
 graceTime: millis
-	asyncTimeout := true
+	asyncTimeout ifNotNil: [ asyncTimeout clearTimeout ].
+	asyncTimeout := true. "to allow async:"
+	asyncTimeout :=
+		(self async: [ self assert: false description: 'SUnit grace time exhausted' ])
+        valueWithTimeout: millis
 !
 
 isAsync