SUnit.js 57 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855
  1. define(["amber/boot", "amber_core/Kernel-Classes", "amber_core/Kernel-Exceptions", "amber_core/Kernel-Infrastructure", "amber_core/Kernel-Objects"], function($boot){"use strict";
  2. if(!$boot.nilAsReceiver)$boot.nilAsReceiver=$boot.nil;
  3. var $core=$boot.api,nil=$boot.nilAsReceiver,$recv=$boot.asReceiver,$globals=$boot.globals;
  4. if(!$boot.nilAsClass)$boot.nilAsClass=$boot.dnu;
  5. $core.addPackage("SUnit");
  6. $core.packages["SUnit"].innerEval = function (expr) { return eval(expr); };
  7. $core.packages["SUnit"].transport = {"type":"amd","amdNamespace":"amber_core"};
  8. $core.addClass("ResultAnnouncement", $globals.Object, ["result"], "SUnit");
  9. //>>excludeStart("ide", pragmas.excludeIdeData);
  10. $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.";
  11. //>>excludeEnd("ide");
  12. $core.addMethod(
  13. $core.method({
  14. selector: "result",
  15. protocol: "accessing",
  16. fn: function (){
  17. var self=this;
  18. return self["@result"];
  19. },
  20. //>>excludeStart("ide", pragmas.excludeIdeData);
  21. args: [],
  22. source: "result\x0a\x09^ result",
  23. referencedClasses: [],
  24. //>>excludeEnd("ide");
  25. messageSends: []
  26. }),
  27. $globals.ResultAnnouncement);
  28. $core.addMethod(
  29. $core.method({
  30. selector: "result:",
  31. protocol: "accessing",
  32. fn: function (aTestResult){
  33. var self=this;
  34. self["@result"]=aTestResult;
  35. return self;
  36. },
  37. //>>excludeStart("ide", pragmas.excludeIdeData);
  38. args: ["aTestResult"],
  39. source: "result: aTestResult\x0a\x09result := aTestResult",
  40. referencedClasses: [],
  41. //>>excludeEnd("ide");
  42. messageSends: []
  43. }),
  44. $globals.ResultAnnouncement);
  45. $core.addClass("TestCase", $globals.Object, ["testSelector", "asyncTimeout", "context"], "SUnit");
  46. //>>excludeStart("ide", pragmas.excludeIdeData);
  47. $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.";
  48. //>>excludeEnd("ide");
  49. $core.addMethod(
  50. $core.method({
  51. selector: "assert:",
  52. protocol: "testing",
  53. fn: function (aBoolean){
  54. var self=this;
  55. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  56. return $core.withContext(function($ctx1) {
  57. //>>excludeEnd("ctx");
  58. self._assert_description_(aBoolean,"Assertion failed");
  59. return self;
  60. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  61. }, function($ctx1) {$ctx1.fill(self,"assert:",{aBoolean:aBoolean},$globals.TestCase)});
  62. //>>excludeEnd("ctx");
  63. },
  64. //>>excludeStart("ide", pragmas.excludeIdeData);
  65. args: ["aBoolean"],
  66. source: "assert: aBoolean\x0a\x09self assert: aBoolean description: 'Assertion failed'",
  67. referencedClasses: [],
  68. //>>excludeEnd("ide");
  69. messageSends: ["assert:description:"]
  70. }),
  71. $globals.TestCase);
  72. $core.addMethod(
  73. $core.method({
  74. selector: "assert:description:",
  75. protocol: "testing",
  76. fn: function (aBoolean,aString){
  77. var self=this;
  78. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  79. return $core.withContext(function($ctx1) {
  80. //>>excludeEnd("ctx");
  81. if(!$core.assert(aBoolean)){
  82. self._signalFailure_(aString);
  83. }
  84. return self;
  85. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  86. }, function($ctx1) {$ctx1.fill(self,"assert:description:",{aBoolean:aBoolean,aString:aString},$globals.TestCase)});
  87. //>>excludeEnd("ctx");
  88. },
  89. //>>excludeStart("ide", pragmas.excludeIdeData);
  90. args: ["aBoolean", "aString"],
  91. source: "assert: aBoolean description: aString\x0a\x09aBoolean ifFalse: [ self signalFailure: aString ]",
  92. referencedClasses: [],
  93. //>>excludeEnd("ide");
  94. messageSends: ["ifFalse:", "signalFailure:"]
  95. }),
  96. $globals.TestCase);
  97. $core.addMethod(
  98. $core.method({
  99. selector: "assert:equals:",
  100. protocol: "testing",
  101. fn: function (actual,expected){
  102. var self=this;
  103. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  104. return $core.withContext(function($ctx1) {
  105. //>>excludeEnd("ctx");
  106. var $1,$5,$4,$3,$2;
  107. $1=$recv(actual).__eq(expected);
  108. $5=$recv(expected)._printString();
  109. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  110. $ctx1.sendIdx["printString"]=1;
  111. //>>excludeEnd("ctx");
  112. $4="Expected: ".__comma($5);
  113. $3=$recv($4).__comma(" but was: ");
  114. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  115. $ctx1.sendIdx[","]=2;
  116. //>>excludeEnd("ctx");
  117. $2=$recv($3).__comma($recv(actual)._printString());
  118. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  119. $ctx1.sendIdx[","]=1;
  120. //>>excludeEnd("ctx");
  121. return self._assert_description_($1,$2);
  122. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  123. }, function($ctx1) {$ctx1.fill(self,"assert:equals:",{actual:actual,expected:expected},$globals.TestCase)});
  124. //>>excludeEnd("ctx");
  125. },
  126. //>>excludeStart("ide", pragmas.excludeIdeData);
  127. args: ["actual", "expected"],
  128. source: "assert: actual equals: expected\x0a\x09^ self assert: (actual = expected) description: 'Expected: ', expected printString, ' but was: ', actual printString",
  129. referencedClasses: [],
  130. //>>excludeEnd("ide");
  131. messageSends: ["assert:description:", "=", ",", "printString"]
  132. }),
  133. $globals.TestCase);
  134. $core.addMethod(
  135. $core.method({
  136. selector: "async:",
  137. protocol: "async",
  138. fn: function (aBlock){
  139. var self=this;
  140. var c;
  141. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  142. return $core.withContext(function($ctx1) {
  143. //>>excludeEnd("ctx");
  144. var $1;
  145. self._errorIfNotAsync_("#async");
  146. c=self["@context"];
  147. return (function(){
  148. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  149. return $core.withContext(function($ctx2) {
  150. //>>excludeEnd("ctx");
  151. $1=self._isAsync();
  152. if($core.assert($1)){
  153. return $recv(c)._execute_(aBlock);
  154. }
  155. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  156. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  157. //>>excludeEnd("ctx");
  158. });
  159. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  160. }, function($ctx1) {$ctx1.fill(self,"async:",{aBlock:aBlock,c:c},$globals.TestCase)});
  161. //>>excludeEnd("ctx");
  162. },
  163. //>>excludeStart("ide", pragmas.excludeIdeData);
  164. args: ["aBlock"],
  165. source: "async: aBlock\x0a\x09| c |\x0a\x09self errorIfNotAsync: '#async'.\x0a\x09c := context.\x0a\x09^ [ self isAsync ifTrue: [ c execute: aBlock ] ]",
  166. referencedClasses: [],
  167. //>>excludeEnd("ide");
  168. messageSends: ["errorIfNotAsync:", "ifTrue:", "isAsync", "execute:"]
  169. }),
  170. $globals.TestCase);
  171. $core.addMethod(
  172. $core.method({
  173. selector: "context:",
  174. protocol: "accessing",
  175. fn: function (aRunningTestContext){
  176. var self=this;
  177. self["@context"]=aRunningTestContext;
  178. return self;
  179. },
  180. //>>excludeStart("ide", pragmas.excludeIdeData);
  181. args: ["aRunningTestContext"],
  182. source: "context: aRunningTestContext\x0a\x09context := aRunningTestContext",
  183. referencedClasses: [],
  184. //>>excludeEnd("ide");
  185. messageSends: []
  186. }),
  187. $globals.TestCase);
  188. $core.addMethod(
  189. $core.method({
  190. selector: "deny:",
  191. protocol: "testing",
  192. fn: function (aBoolean){
  193. var self=this;
  194. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  195. return $core.withContext(function($ctx1) {
  196. //>>excludeEnd("ctx");
  197. self._assert_($recv(aBoolean)._not());
  198. return self;
  199. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  200. }, function($ctx1) {$ctx1.fill(self,"deny:",{aBoolean:aBoolean},$globals.TestCase)});
  201. //>>excludeEnd("ctx");
  202. },
  203. //>>excludeStart("ide", pragmas.excludeIdeData);
  204. args: ["aBoolean"],
  205. source: "deny: aBoolean\x0a\x09self assert: aBoolean not",
  206. referencedClasses: [],
  207. //>>excludeEnd("ide");
  208. messageSends: ["assert:", "not"]
  209. }),
  210. $globals.TestCase);
  211. $core.addMethod(
  212. $core.method({
  213. selector: "errorIfNotAsync:",
  214. protocol: "error handling",
  215. fn: function (aString){
  216. var self=this;
  217. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  218. return $core.withContext(function($ctx1) {
  219. //>>excludeEnd("ctx");
  220. var $1;
  221. $1=self._isAsync();
  222. if(!$core.assert($1)){
  223. self._error_($recv(aString).__comma(" used without prior #timeout:"));
  224. }
  225. return self;
  226. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  227. }, function($ctx1) {$ctx1.fill(self,"errorIfNotAsync:",{aString:aString},$globals.TestCase)});
  228. //>>excludeEnd("ctx");
  229. },
  230. //>>excludeStart("ide", pragmas.excludeIdeData);
  231. args: ["aString"],
  232. source: "errorIfNotAsync: aString\x0a\x09self isAsync ifFalse: [\x0a\x09\x09self error: aString, ' used without prior #timeout:' ]",
  233. referencedClasses: [],
  234. //>>excludeEnd("ide");
  235. messageSends: ["ifFalse:", "isAsync", "error:", ","]
  236. }),
  237. $globals.TestCase);
  238. $core.addMethod(
  239. $core.method({
  240. selector: "finished",
  241. protocol: "async",
  242. fn: function (){
  243. var self=this;
  244. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  245. return $core.withContext(function($ctx1) {
  246. //>>excludeEnd("ctx");
  247. self._errorIfNotAsync_("#finished");
  248. self["@asyncTimeout"]=nil;
  249. return self;
  250. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  251. }, function($ctx1) {$ctx1.fill(self,"finished",{},$globals.TestCase)});
  252. //>>excludeEnd("ctx");
  253. },
  254. //>>excludeStart("ide", pragmas.excludeIdeData);
  255. args: [],
  256. source: "finished\x0a\x09self errorIfNotAsync: '#finished'.\x0a\x09asyncTimeout := nil",
  257. referencedClasses: [],
  258. //>>excludeEnd("ide");
  259. messageSends: ["errorIfNotAsync:"]
  260. }),
  261. $globals.TestCase);
  262. $core.addMethod(
  263. $core.method({
  264. selector: "isAsync",
  265. protocol: "testing",
  266. fn: function (){
  267. var self=this;
  268. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  269. return $core.withContext(function($ctx1) {
  270. //>>excludeEnd("ctx");
  271. return $recv(self["@asyncTimeout"])._notNil();
  272. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  273. }, function($ctx1) {$ctx1.fill(self,"isAsync",{},$globals.TestCase)});
  274. //>>excludeEnd("ctx");
  275. },
  276. //>>excludeStart("ide", pragmas.excludeIdeData);
  277. args: [],
  278. source: "isAsync\x0a\x09^ asyncTimeout notNil",
  279. referencedClasses: [],
  280. //>>excludeEnd("ide");
  281. messageSends: ["notNil"]
  282. }),
  283. $globals.TestCase);
  284. $core.addMethod(
  285. $core.method({
  286. selector: "performTest",
  287. protocol: "running",
  288. fn: function (){
  289. var self=this;
  290. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  291. return $core.withContext(function($ctx1) {
  292. //>>excludeEnd("ctx");
  293. self["@asyncTimeout"]=nil;
  294. self._perform_(self._selector());
  295. return self;
  296. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  297. }, function($ctx1) {$ctx1.fill(self,"performTest",{},$globals.TestCase)});
  298. //>>excludeEnd("ctx");
  299. },
  300. //>>excludeStart("ide", pragmas.excludeIdeData);
  301. args: [],
  302. source: "performTest\x0a\x09asyncTimeout := nil.\x0a\x09self perform: self selector",
  303. referencedClasses: [],
  304. //>>excludeEnd("ide");
  305. messageSends: ["perform:", "selector"]
  306. }),
  307. $globals.TestCase);
  308. $core.addMethod(
  309. $core.method({
  310. selector: "runCase",
  311. protocol: "running",
  312. fn: function (){
  313. var self=this;
  314. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  315. return $core.withContext(function($ctx1) {
  316. //>>excludeEnd("ctx");
  317. $recv($recv($globals.TestContext)._testCase_(self))._start();
  318. return self;
  319. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  320. }, function($ctx1) {$ctx1.fill(self,"runCase",{},$globals.TestCase)});
  321. //>>excludeEnd("ctx");
  322. },
  323. //>>excludeStart("ide", pragmas.excludeIdeData);
  324. args: [],
  325. source: "runCase\x0a\x09\x22Runs a test case in isolated context, leaking all errors.\x22\x0a\x0a\x09(TestContext testCase: self) start",
  326. referencedClasses: ["TestContext"],
  327. //>>excludeEnd("ide");
  328. messageSends: ["start", "testCase:"]
  329. }),
  330. $globals.TestCase);
  331. $core.addMethod(
  332. $core.method({
  333. selector: "selector",
  334. protocol: "accessing",
  335. fn: function (){
  336. var self=this;
  337. return self["@testSelector"];
  338. },
  339. //>>excludeStart("ide", pragmas.excludeIdeData);
  340. args: [],
  341. source: "selector\x0a\x09^ testSelector",
  342. referencedClasses: [],
  343. //>>excludeEnd("ide");
  344. messageSends: []
  345. }),
  346. $globals.TestCase);
  347. $core.addMethod(
  348. $core.method({
  349. selector: "setTestSelector:",
  350. protocol: "accessing",
  351. fn: function (aSelector){
  352. var self=this;
  353. self["@testSelector"]=aSelector;
  354. return self;
  355. },
  356. //>>excludeStart("ide", pragmas.excludeIdeData);
  357. args: ["aSelector"],
  358. source: "setTestSelector: aSelector\x0a\x09testSelector := aSelector",
  359. referencedClasses: [],
  360. //>>excludeEnd("ide");
  361. messageSends: []
  362. }),
  363. $globals.TestCase);
  364. $core.addMethod(
  365. $core.method({
  366. selector: "setUp",
  367. protocol: "running",
  368. fn: function (){
  369. var self=this;
  370. return self;
  371. },
  372. //>>excludeStart("ide", pragmas.excludeIdeData);
  373. args: [],
  374. source: "setUp",
  375. referencedClasses: [],
  376. //>>excludeEnd("ide");
  377. messageSends: []
  378. }),
  379. $globals.TestCase);
  380. $core.addMethod(
  381. $core.method({
  382. selector: "should:",
  383. protocol: "testing",
  384. fn: function (aBlock){
  385. var self=this;
  386. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  387. return $core.withContext(function($ctx1) {
  388. //>>excludeEnd("ctx");
  389. self._assert_($recv(aBlock)._value());
  390. return self;
  391. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  392. }, function($ctx1) {$ctx1.fill(self,"should:",{aBlock:aBlock},$globals.TestCase)});
  393. //>>excludeEnd("ctx");
  394. },
  395. //>>excludeStart("ide", pragmas.excludeIdeData);
  396. args: ["aBlock"],
  397. source: "should: aBlock\x0a\x09self assert: aBlock value",
  398. referencedClasses: [],
  399. //>>excludeEnd("ide");
  400. messageSends: ["assert:", "value"]
  401. }),
  402. $globals.TestCase);
  403. $core.addMethod(
  404. $core.method({
  405. selector: "should:raise:",
  406. protocol: "testing",
  407. fn: function (aBlock,anExceptionClass){
  408. var self=this;
  409. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  410. return $core.withContext(function($ctx1) {
  411. //>>excludeEnd("ctx");
  412. self._assert_($recv((function(){
  413. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  414. return $core.withContext(function($ctx2) {
  415. //>>excludeEnd("ctx");
  416. $recv(aBlock)._value();
  417. return false;
  418. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  419. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  420. //>>excludeEnd("ctx");
  421. }))._on_do_(anExceptionClass,(function(ex){
  422. return true;
  423. })));
  424. return self;
  425. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  426. }, function($ctx1) {$ctx1.fill(self,"should:raise:",{aBlock:aBlock,anExceptionClass:anExceptionClass},$globals.TestCase)});
  427. //>>excludeEnd("ctx");
  428. },
  429. //>>excludeStart("ide", pragmas.excludeIdeData);
  430. args: ["aBlock", "anExceptionClass"],
  431. source: "should: aBlock raise: anExceptionClass\x0a\x09self assert: ([ aBlock value. false ]\x0a\x09\x09on: anExceptionClass\x0a\x09\x09do: [ :ex | true ])",
  432. referencedClasses: [],
  433. //>>excludeEnd("ide");
  434. messageSends: ["assert:", "on:do:", "value"]
  435. }),
  436. $globals.TestCase);
  437. $core.addMethod(
  438. $core.method({
  439. selector: "shouldnt:raise:",
  440. protocol: "testing",
  441. fn: function (aBlock,anExceptionClass){
  442. var self=this;
  443. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  444. return $core.withContext(function($ctx1) {
  445. //>>excludeEnd("ctx");
  446. self._assert_($recv((function(){
  447. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  448. return $core.withContext(function($ctx2) {
  449. //>>excludeEnd("ctx");
  450. $recv(aBlock)._value();
  451. return true;
  452. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  453. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  454. //>>excludeEnd("ctx");
  455. }))._on_do_(anExceptionClass,(function(ex){
  456. return false;
  457. })));
  458. return self;
  459. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  460. }, function($ctx1) {$ctx1.fill(self,"shouldnt:raise:",{aBlock:aBlock,anExceptionClass:anExceptionClass},$globals.TestCase)});
  461. //>>excludeEnd("ctx");
  462. },
  463. //>>excludeStart("ide", pragmas.excludeIdeData);
  464. args: ["aBlock", "anExceptionClass"],
  465. source: "shouldnt: aBlock raise: anExceptionClass\x0a\x09self assert: ([ aBlock value. true ]\x0a\x09\x09on: anExceptionClass\x0a\x09\x09do: [ :ex | false ])",
  466. referencedClasses: [],
  467. //>>excludeEnd("ide");
  468. messageSends: ["assert:", "on:do:", "value"]
  469. }),
  470. $globals.TestCase);
  471. $core.addMethod(
  472. $core.method({
  473. selector: "signalFailure:",
  474. protocol: "private",
  475. fn: function (aString){
  476. var self=this;
  477. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  478. return $core.withContext(function($ctx1) {
  479. //>>excludeEnd("ctx");
  480. var $1;
  481. $1=$recv($globals.TestFailure)._new();
  482. $recv($1)._messageText_(aString);
  483. $recv($1)._signal();
  484. return self;
  485. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  486. }, function($ctx1) {$ctx1.fill(self,"signalFailure:",{aString:aString},$globals.TestCase)});
  487. //>>excludeEnd("ctx");
  488. },
  489. //>>excludeStart("ide", pragmas.excludeIdeData);
  490. args: ["aString"],
  491. source: "signalFailure: aString\x0a\x09TestFailure new\x0a\x09\x09messageText: aString;\x0a\x09\x09signal",
  492. referencedClasses: ["TestFailure"],
  493. //>>excludeEnd("ide");
  494. messageSends: ["messageText:", "new", "signal"]
  495. }),
  496. $globals.TestCase);
  497. $core.addMethod(
  498. $core.method({
  499. selector: "tearDown",
  500. protocol: "running",
  501. fn: function (){
  502. var self=this;
  503. return self;
  504. },
  505. //>>excludeStart("ide", pragmas.excludeIdeData);
  506. args: [],
  507. source: "tearDown",
  508. referencedClasses: [],
  509. //>>excludeEnd("ide");
  510. messageSends: []
  511. }),
  512. $globals.TestCase);
  513. $core.addMethod(
  514. $core.method({
  515. selector: "timeout:",
  516. protocol: "async",
  517. fn: function (aNumber){
  518. var self=this;
  519. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  520. return $core.withContext(function($ctx1) {
  521. //>>excludeEnd("ctx");
  522. var $1,$receiver;
  523. $1=self["@asyncTimeout"];
  524. if(($receiver = $1) == null || $receiver.isNil){
  525. $1;
  526. } else {
  527. $recv(self["@asyncTimeout"])._clearTimeout();
  528. }
  529. self["@asyncTimeout"]=(0);
  530. self["@asyncTimeout"]=$recv(self._async_((function(){
  531. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  532. return $core.withContext(function($ctx2) {
  533. //>>excludeEnd("ctx");
  534. return self._assert_description_(false,"SUnit grace time exhausted");
  535. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  536. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
  537. //>>excludeEnd("ctx");
  538. })))._valueWithTimeout_(aNumber);
  539. return self;
  540. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  541. }, function($ctx1) {$ctx1.fill(self,"timeout:",{aNumber:aNumber},$globals.TestCase)});
  542. //>>excludeEnd("ctx");
  543. },
  544. //>>excludeStart("ide", pragmas.excludeIdeData);
  545. args: ["aNumber"],
  546. 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",
  547. referencedClasses: [],
  548. //>>excludeEnd("ide");
  549. messageSends: ["ifNotNil:", "clearTimeout", "valueWithTimeout:", "async:", "assert:description:"]
  550. }),
  551. $globals.TestCase);
  552. $core.addMethod(
  553. $core.method({
  554. selector: "allTestSelectors",
  555. protocol: "accessing",
  556. fn: function (){
  557. var self=this;
  558. var selectors;
  559. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  560. return $core.withContext(function($ctx1) {
  561. //>>excludeEnd("ctx");
  562. var $1;
  563. selectors=self._testSelectors();
  564. $1=self._shouldInheritSelectors();
  565. if($core.assert($1)){
  566. $recv(selectors)._addAll_($recv(self._superclass())._allTestSelectors());
  567. }
  568. return selectors;
  569. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  570. }, function($ctx1) {$ctx1.fill(self,"allTestSelectors",{selectors:selectors},$globals.TestCase.klass)});
  571. //>>excludeEnd("ctx");
  572. },
  573. //>>excludeStart("ide", pragmas.excludeIdeData);
  574. args: [],
  575. source: "allTestSelectors\x0a\x09| selectors |\x0a\x09selectors := self testSelectors.\x0a\x09self shouldInheritSelectors ifTrue: [\x0a\x09\x09selectors addAll: self superclass allTestSelectors ].\x0a\x09^ selectors",
  576. referencedClasses: [],
  577. //>>excludeEnd("ide");
  578. messageSends: ["testSelectors", "ifTrue:", "shouldInheritSelectors", "addAll:", "allTestSelectors", "superclass"]
  579. }),
  580. $globals.TestCase.klass);
  581. $core.addMethod(
  582. $core.method({
  583. selector: "buildSuite",
  584. protocol: "accessing",
  585. fn: function (){
  586. var self=this;
  587. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  588. return $core.withContext(function($ctx1) {
  589. //>>excludeEnd("ctx");
  590. return $recv(self._allTestSelectors())._collect_((function(each){
  591. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  592. return $core.withContext(function($ctx2) {
  593. //>>excludeEnd("ctx");
  594. return self._selector_(each);
  595. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  596. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  597. //>>excludeEnd("ctx");
  598. }));
  599. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  600. }, function($ctx1) {$ctx1.fill(self,"buildSuite",{},$globals.TestCase.klass)});
  601. //>>excludeEnd("ctx");
  602. },
  603. //>>excludeStart("ide", pragmas.excludeIdeData);
  604. args: [],
  605. source: "buildSuite\x0a\x09^ self allTestSelectors collect: [ :each | self selector: each ]",
  606. referencedClasses: [],
  607. //>>excludeEnd("ide");
  608. messageSends: ["collect:", "allTestSelectors", "selector:"]
  609. }),
  610. $globals.TestCase.klass);
  611. $core.addMethod(
  612. $core.method({
  613. selector: "classTag",
  614. protocol: "accessing",
  615. fn: function (){
  616. var self=this;
  617. return "test";
  618. },
  619. //>>excludeStart("ide", pragmas.excludeIdeData);
  620. args: [],
  621. 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'",
  622. referencedClasses: [],
  623. //>>excludeEnd("ide");
  624. messageSends: []
  625. }),
  626. $globals.TestCase.klass);
  627. $core.addMethod(
  628. $core.method({
  629. selector: "isAbstract",
  630. protocol: "testing",
  631. fn: function (){
  632. var self=this;
  633. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  634. return $core.withContext(function($ctx1) {
  635. //>>excludeEnd("ctx");
  636. return $recv(self._name()).__eq("TestCase");
  637. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  638. }, function($ctx1) {$ctx1.fill(self,"isAbstract",{},$globals.TestCase.klass)});
  639. //>>excludeEnd("ctx");
  640. },
  641. //>>excludeStart("ide", pragmas.excludeIdeData);
  642. args: [],
  643. source: "isAbstract\x0a\x09^ self name = 'TestCase'",
  644. referencedClasses: [],
  645. //>>excludeEnd("ide");
  646. messageSends: ["=", "name"]
  647. }),
  648. $globals.TestCase.klass);
  649. $core.addMethod(
  650. $core.method({
  651. selector: "isTestClass",
  652. protocol: "testing",
  653. fn: function (){
  654. var self=this;
  655. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  656. return $core.withContext(function($ctx1) {
  657. //>>excludeEnd("ctx");
  658. return $recv(self._isAbstract())._not();
  659. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  660. }, function($ctx1) {$ctx1.fill(self,"isTestClass",{},$globals.TestCase.klass)});
  661. //>>excludeEnd("ctx");
  662. },
  663. //>>excludeStart("ide", pragmas.excludeIdeData);
  664. args: [],
  665. source: "isTestClass\x0a\x09^ self isAbstract not",
  666. referencedClasses: [],
  667. //>>excludeEnd("ide");
  668. messageSends: ["not", "isAbstract"]
  669. }),
  670. $globals.TestCase.klass);
  671. $core.addMethod(
  672. $core.method({
  673. selector: "lookupHierarchyRoot",
  674. protocol: "accessing",
  675. fn: function (){
  676. var self=this;
  677. return $globals.TestCase;
  678. },
  679. //>>excludeStart("ide", pragmas.excludeIdeData);
  680. args: [],
  681. source: "lookupHierarchyRoot\x0a\x09^ TestCase",
  682. referencedClasses: ["TestCase"],
  683. //>>excludeEnd("ide");
  684. messageSends: []
  685. }),
  686. $globals.TestCase.klass);
  687. $core.addMethod(
  688. $core.method({
  689. selector: "selector:",
  690. protocol: "accessing",
  691. fn: function (aSelector){
  692. var self=this;
  693. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  694. return $core.withContext(function($ctx1) {
  695. //>>excludeEnd("ctx");
  696. var $1;
  697. $1=self._new();
  698. $recv($1)._setTestSelector_(aSelector);
  699. return $recv($1)._yourself();
  700. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  701. }, function($ctx1) {$ctx1.fill(self,"selector:",{aSelector:aSelector},$globals.TestCase.klass)});
  702. //>>excludeEnd("ctx");
  703. },
  704. //>>excludeStart("ide", pragmas.excludeIdeData);
  705. args: ["aSelector"],
  706. source: "selector: aSelector\x0a\x09^ self new\x0a\x09\x09setTestSelector: aSelector;\x0a\x09\x09yourself",
  707. referencedClasses: [],
  708. //>>excludeEnd("ide");
  709. messageSends: ["setTestSelector:", "new", "yourself"]
  710. }),
  711. $globals.TestCase.klass);
  712. $core.addMethod(
  713. $core.method({
  714. selector: "shouldInheritSelectors",
  715. protocol: "testing",
  716. fn: function (){
  717. var self=this;
  718. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  719. return $core.withContext(function($ctx1) {
  720. //>>excludeEnd("ctx");
  721. return self.__tild_eq(self._lookupHierarchyRoot());
  722. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  723. }, function($ctx1) {$ctx1.fill(self,"shouldInheritSelectors",{},$globals.TestCase.klass)});
  724. //>>excludeEnd("ctx");
  725. },
  726. //>>excludeStart("ide", pragmas.excludeIdeData);
  727. args: [],
  728. source: "shouldInheritSelectors\x0a\x09^ self ~= self lookupHierarchyRoot",
  729. referencedClasses: [],
  730. //>>excludeEnd("ide");
  731. messageSends: ["~=", "lookupHierarchyRoot"]
  732. }),
  733. $globals.TestCase.klass);
  734. $core.addMethod(
  735. $core.method({
  736. selector: "testSelectors",
  737. protocol: "accessing",
  738. fn: function (){
  739. var self=this;
  740. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  741. return $core.withContext(function($ctx1) {
  742. //>>excludeEnd("ctx");
  743. return $recv($recv(self._methodDictionary())._keys())._select_((function(each){
  744. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  745. return $core.withContext(function($ctx2) {
  746. //>>excludeEnd("ctx");
  747. return $recv(each)._match_("^test");
  748. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  749. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  750. //>>excludeEnd("ctx");
  751. }));
  752. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  753. }, function($ctx1) {$ctx1.fill(self,"testSelectors",{},$globals.TestCase.klass)});
  754. //>>excludeEnd("ctx");
  755. },
  756. //>>excludeStart("ide", pragmas.excludeIdeData);
  757. args: [],
  758. source: "testSelectors\x0a\x09^ self methodDictionary keys select: [ :each | each match: '^test' ]",
  759. referencedClasses: [],
  760. //>>excludeEnd("ide");
  761. messageSends: ["select:", "keys", "methodDictionary", "match:"]
  762. }),
  763. $globals.TestCase.klass);
  764. $core.addClass("TestContext", $globals.Object, ["testCase"], "SUnit");
  765. //>>excludeStart("ide", pragmas.excludeIdeData);
  766. $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).";
  767. //>>excludeEnd("ide");
  768. $core.addMethod(
  769. $core.method({
  770. selector: "execute:",
  771. protocol: "running",
  772. fn: function (aBlock){
  773. var self=this;
  774. var failed;
  775. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  776. return $core.withContext(function($ctx1) {
  777. //>>excludeEnd("ctx");
  778. var $1,$2;
  779. $recv(self["@testCase"])._context_(self);
  780. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  781. $ctx1.sendIdx["context:"]=1;
  782. //>>excludeEnd("ctx");
  783. $recv((function(){
  784. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  785. return $core.withContext(function($ctx2) {
  786. //>>excludeEnd("ctx");
  787. failed=true;
  788. failed;
  789. $recv(aBlock)._value();
  790. failed=false;
  791. return failed;
  792. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  793. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  794. //>>excludeEnd("ctx");
  795. }))._ensure_((function(){
  796. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  797. return $core.withContext(function($ctx2) {
  798. //>>excludeEnd("ctx");
  799. $recv(self["@testCase"])._context_(nil);
  800. $1=$recv(failed)._and_((function(){
  801. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  802. return $core.withContext(function($ctx3) {
  803. //>>excludeEnd("ctx");
  804. return $recv(self["@testCase"])._isAsync();
  805. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  806. $ctx3.sendIdx["isAsync"]=1;
  807. //>>excludeEnd("ctx");
  808. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  809. }, function($ctx3) {$ctx3.fillBlock({},$ctx2,3)});
  810. //>>excludeEnd("ctx");
  811. }));
  812. if($core.assert($1)){
  813. $recv(self["@testCase"])._finished();
  814. }
  815. $2=$recv(self["@testCase"])._isAsync();
  816. if(!$core.assert($2)){
  817. return $recv(self["@testCase"])._tearDown();
  818. }
  819. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  820. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
  821. //>>excludeEnd("ctx");
  822. }));
  823. return self;
  824. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  825. }, function($ctx1) {$ctx1.fill(self,"execute:",{aBlock:aBlock,failed:failed},$globals.TestContext)});
  826. //>>excludeEnd("ctx");
  827. },
  828. //>>excludeStart("ide", pragmas.excludeIdeData);
  829. args: ["aBlock"],
  830. source: "execute: aBlock\x0a\x09| failed |\x0a\x09\x0a\x09testCase context: self.\x0a\x09[\x0a\x09\x09failed := true.\x0a\x09\x09aBlock value.\x0a\x09\x09failed := false\x0a\x09]\x0a\x09\x09ensure: [\x0a\x09\x09\x09testCase context: nil.\x0a\x09\x09\x09\x0a\x09\x09\x09(failed and: [ testCase isAsync ]) ifTrue: [\x0a\x09\x09\x09\x09testCase finished ].\x0a\x09\x09\x09testCase isAsync ifFalse: [\x0a\x09\x09\x09\x09testCase tearDown ] ]",
  831. referencedClasses: [],
  832. //>>excludeEnd("ide");
  833. messageSends: ["context:", "ensure:", "value", "ifTrue:", "and:", "isAsync", "finished", "ifFalse:", "tearDown"]
  834. }),
  835. $globals.TestContext);
  836. $core.addMethod(
  837. $core.method({
  838. selector: "start",
  839. protocol: "running",
  840. fn: function (){
  841. var self=this;
  842. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  843. return $core.withContext(function($ctx1) {
  844. //>>excludeEnd("ctx");
  845. self._execute_((function(){
  846. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  847. return $core.withContext(function($ctx2) {
  848. //>>excludeEnd("ctx");
  849. $recv(self["@testCase"])._setUp();
  850. return $recv(self["@testCase"])._performTest();
  851. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  852. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  853. //>>excludeEnd("ctx");
  854. }));
  855. return self;
  856. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  857. }, function($ctx1) {$ctx1.fill(self,"start",{},$globals.TestContext)});
  858. //>>excludeEnd("ctx");
  859. },
  860. //>>excludeStart("ide", pragmas.excludeIdeData);
  861. args: [],
  862. source: "start\x0a\x09self execute: [\x0a\x09\x09testCase setUp.\x0a\x09\x09testCase performTest ]",
  863. referencedClasses: [],
  864. //>>excludeEnd("ide");
  865. messageSends: ["execute:", "setUp", "performTest"]
  866. }),
  867. $globals.TestContext);
  868. $core.addMethod(
  869. $core.method({
  870. selector: "testCase:",
  871. protocol: "accessing",
  872. fn: function (aTestCase){
  873. var self=this;
  874. self["@testCase"]=aTestCase;
  875. return self;
  876. },
  877. //>>excludeStart("ide", pragmas.excludeIdeData);
  878. args: ["aTestCase"],
  879. source: "testCase: aTestCase\x0a\x09testCase := aTestCase",
  880. referencedClasses: [],
  881. //>>excludeEnd("ide");
  882. messageSends: []
  883. }),
  884. $globals.TestContext);
  885. $core.addMethod(
  886. $core.method({
  887. selector: "testCase:",
  888. protocol: "instance creation",
  889. fn: function (aTestCase){
  890. var self=this;
  891. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  892. return $core.withContext(function($ctx1) {
  893. //>>excludeEnd("ctx");
  894. var $1;
  895. $1=self._new();
  896. $recv($1)._testCase_(aTestCase);
  897. return $recv($1)._yourself();
  898. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  899. }, function($ctx1) {$ctx1.fill(self,"testCase:",{aTestCase:aTestCase},$globals.TestContext.klass)});
  900. //>>excludeEnd("ctx");
  901. },
  902. //>>excludeStart("ide", pragmas.excludeIdeData);
  903. args: ["aTestCase"],
  904. source: "testCase: aTestCase\x0a\x09^ self new\x0a\x09\x09testCase: aTestCase;\x0a\x09\x09yourself",
  905. referencedClasses: [],
  906. //>>excludeEnd("ide");
  907. messageSends: ["testCase:", "new", "yourself"]
  908. }),
  909. $globals.TestContext.klass);
  910. $core.addClass("ReportingTestContext", $globals.TestContext, ["finished", "result"], "SUnit");
  911. //>>excludeStart("ide", pragmas.excludeIdeData);
  912. $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`.";
  913. //>>excludeEnd("ide");
  914. $core.addMethod(
  915. $core.method({
  916. selector: "execute:",
  917. protocol: "running",
  918. fn: function (aBlock){
  919. var self=this;
  920. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  921. return $core.withContext(function($ctx1) {
  922. //>>excludeEnd("ctx");
  923. var $1;
  924. $recv((function(){
  925. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  926. return $core.withContext(function($ctx2) {
  927. //>>excludeEnd("ctx");
  928. return self._withErrorReporting_((function(){
  929. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  930. return $core.withContext(function($ctx3) {
  931. //>>excludeEnd("ctx");
  932. return (
  933. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  934. $ctx3.supercall = true,
  935. //>>excludeEnd("ctx");
  936. ($globals.ReportingTestContext.superclass||$boot.nilAsClass).fn.prototype._execute_.apply($recv(self), [aBlock]));
  937. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  938. $ctx3.supercall = false;
  939. //>>excludeEnd("ctx");;
  940. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  941. }, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)});
  942. //>>excludeEnd("ctx");
  943. }));
  944. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  945. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  946. //>>excludeEnd("ctx");
  947. }))._ensure_((function(){
  948. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  949. return $core.withContext(function($ctx2) {
  950. //>>excludeEnd("ctx");
  951. $1=$recv(self["@testCase"])._isAsync();
  952. if(!$core.assert($1)){
  953. $recv(self["@result"])._increaseRuns();
  954. return $recv(self["@finished"])._value();
  955. }
  956. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  957. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,3)});
  958. //>>excludeEnd("ctx");
  959. }));
  960. return self;
  961. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  962. }, function($ctx1) {$ctx1.fill(self,"execute:",{aBlock:aBlock},$globals.ReportingTestContext)});
  963. //>>excludeEnd("ctx");
  964. },
  965. //>>excludeStart("ide", pragmas.excludeIdeData);
  966. args: ["aBlock"],
  967. 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 ] ]",
  968. referencedClasses: [],
  969. //>>excludeEnd("ide");
  970. messageSends: ["ensure:", "withErrorReporting:", "execute:", "ifFalse:", "isAsync", "increaseRuns", "value"]
  971. }),
  972. $globals.ReportingTestContext);
  973. $core.addMethod(
  974. $core.method({
  975. selector: "finished:",
  976. protocol: "accessing",
  977. fn: function (aBlock){
  978. var self=this;
  979. self["@finished"]=aBlock;
  980. return self;
  981. },
  982. //>>excludeStart("ide", pragmas.excludeIdeData);
  983. args: ["aBlock"],
  984. source: "finished: aBlock\x0a\x09finished := aBlock",
  985. referencedClasses: [],
  986. //>>excludeEnd("ide");
  987. messageSends: []
  988. }),
  989. $globals.ReportingTestContext);
  990. $core.addMethod(
  991. $core.method({
  992. selector: "result:",
  993. protocol: "accessing",
  994. fn: function (aTestResult){
  995. var self=this;
  996. self["@result"]=aTestResult;
  997. return self;
  998. },
  999. //>>excludeStart("ide", pragmas.excludeIdeData);
  1000. args: ["aTestResult"],
  1001. source: "result: aTestResult\x0a\x09result := aTestResult",
  1002. referencedClasses: [],
  1003. //>>excludeEnd("ide");
  1004. messageSends: []
  1005. }),
  1006. $globals.ReportingTestContext);
  1007. $core.addMethod(
  1008. $core.method({
  1009. selector: "withErrorReporting:",
  1010. protocol: "private",
  1011. fn: function (aBlock){
  1012. var self=this;
  1013. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1014. return $core.withContext(function($ctx1) {
  1015. //>>excludeEnd("ctx");
  1016. $recv((function(){
  1017. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1018. return $core.withContext(function($ctx2) {
  1019. //>>excludeEnd("ctx");
  1020. return $recv(aBlock)._on_do_($globals.TestFailure,(function(ex){
  1021. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1022. return $core.withContext(function($ctx3) {
  1023. //>>excludeEnd("ctx");
  1024. return $recv(self["@result"])._addFailure_(self["@testCase"]);
  1025. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1026. }, function($ctx3) {$ctx3.fillBlock({ex:ex},$ctx2,2)});
  1027. //>>excludeEnd("ctx");
  1028. }));
  1029. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1030. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  1031. //>>excludeEnd("ctx");
  1032. }))._on_do_($globals.Error,(function(ex){
  1033. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1034. return $core.withContext(function($ctx2) {
  1035. //>>excludeEnd("ctx");
  1036. return $recv(self["@result"])._addError_(self["@testCase"]);
  1037. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1038. }, function($ctx2) {$ctx2.fillBlock({ex:ex},$ctx1,3)});
  1039. //>>excludeEnd("ctx");
  1040. }));
  1041. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1042. $ctx1.sendIdx["on:do:"]=1;
  1043. //>>excludeEnd("ctx");
  1044. return self;
  1045. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1046. }, function($ctx1) {$ctx1.fill(self,"withErrorReporting:",{aBlock:aBlock},$globals.ReportingTestContext)});
  1047. //>>excludeEnd("ctx");
  1048. },
  1049. //>>excludeStart("ide", pragmas.excludeIdeData);
  1050. args: ["aBlock"],
  1051. source: "withErrorReporting: 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 ]",
  1052. referencedClasses: ["TestFailure", "Error"],
  1053. //>>excludeEnd("ide");
  1054. messageSends: ["on:do:", "addFailure:", "addError:"]
  1055. }),
  1056. $globals.ReportingTestContext);
  1057. $core.addMethod(
  1058. $core.method({
  1059. selector: "testCase:result:finished:",
  1060. protocol: "instance creation",
  1061. fn: function (aTestCase,aTestResult,aBlock){
  1062. var self=this;
  1063. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1064. return $core.withContext(function($ctx1) {
  1065. //>>excludeEnd("ctx");
  1066. var $1;
  1067. $1=(
  1068. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1069. $ctx1.supercall = true,
  1070. //>>excludeEnd("ctx");
  1071. ($globals.ReportingTestContext.klass.superclass||$boot.nilAsClass).fn.prototype._testCase_.apply($recv(self), [aTestCase]));
  1072. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1073. $ctx1.supercall = false;
  1074. //>>excludeEnd("ctx");;
  1075. $recv($1)._result_(aTestResult);
  1076. $recv($1)._finished_(aBlock);
  1077. return $recv($1)._yourself();
  1078. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1079. }, function($ctx1) {$ctx1.fill(self,"testCase:result:finished:",{aTestCase:aTestCase,aTestResult:aTestResult,aBlock:aBlock},$globals.ReportingTestContext.klass)});
  1080. //>>excludeEnd("ctx");
  1081. },
  1082. //>>excludeStart("ide", pragmas.excludeIdeData);
  1083. args: ["aTestCase", "aTestResult", "aBlock"],
  1084. source: "testCase: aTestCase result: aTestResult finished: aBlock\x0a\x09^ (super testCase: aTestCase)\x0a\x09\x09result: aTestResult;\x0a\x09\x09finished: aBlock;\x0a\x09\x09yourself",
  1085. referencedClasses: [],
  1086. //>>excludeEnd("ide");
  1087. messageSends: ["result:", "testCase:", "finished:", "yourself"]
  1088. }),
  1089. $globals.ReportingTestContext.klass);
  1090. $core.addClass("TestFailure", $globals.Error, [], "SUnit");
  1091. //>>excludeStart("ide", pragmas.excludeIdeData);
  1092. $globals.TestFailure.comment="I am raised when the boolean parameter of an #`assert:` or `#deny:` call is the opposite of what the assertion claims.\x0a\x0aThe test framework distinguishes between failures and errors.\x0aA failure is an event whose possibiity is explicitly anticipated and checked for in an assertion,\x0awhereas an error is an unanticipated problem like a division by 0 or an index out of bounds.";
  1093. //>>excludeEnd("ide");
  1094. $core.addClass("TestResult", $globals.Object, ["timestamp", "runs", "errors", "failures", "total"], "SUnit");
  1095. //>>excludeStart("ide", pragmas.excludeIdeData);
  1096. $globals.TestResult.comment="I implement the collecting parameter pattern for running a bunch of tests.\x0a\x0aMy instances hold tests that have run, sorted into the result categories of passed, failures and errors.\x0a\x0a`TestResult` is an interesting object to subclass or substitute. `#runCase:` is the external protocol you need to reproduce";
  1097. //>>excludeEnd("ide");
  1098. $core.addMethod(
  1099. $core.method({
  1100. selector: "addError:",
  1101. protocol: "accessing",
  1102. fn: function (anError){
  1103. var self=this;
  1104. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1105. return $core.withContext(function($ctx1) {
  1106. //>>excludeEnd("ctx");
  1107. $recv(self._errors())._add_(anError);
  1108. return self;
  1109. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1110. }, function($ctx1) {$ctx1.fill(self,"addError:",{anError:anError},$globals.TestResult)});
  1111. //>>excludeEnd("ctx");
  1112. },
  1113. //>>excludeStart("ide", pragmas.excludeIdeData);
  1114. args: ["anError"],
  1115. source: "addError: anError\x0a\x09self errors add: anError",
  1116. referencedClasses: [],
  1117. //>>excludeEnd("ide");
  1118. messageSends: ["add:", "errors"]
  1119. }),
  1120. $globals.TestResult);
  1121. $core.addMethod(
  1122. $core.method({
  1123. selector: "addFailure:",
  1124. protocol: "accessing",
  1125. fn: function (aFailure){
  1126. var self=this;
  1127. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1128. return $core.withContext(function($ctx1) {
  1129. //>>excludeEnd("ctx");
  1130. $recv(self._failures())._add_(aFailure);
  1131. return self;
  1132. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1133. }, function($ctx1) {$ctx1.fill(self,"addFailure:",{aFailure:aFailure},$globals.TestResult)});
  1134. //>>excludeEnd("ctx");
  1135. },
  1136. //>>excludeStart("ide", pragmas.excludeIdeData);
  1137. args: ["aFailure"],
  1138. source: "addFailure: aFailure\x0a\x09self failures add: aFailure",
  1139. referencedClasses: [],
  1140. //>>excludeEnd("ide");
  1141. messageSends: ["add:", "failures"]
  1142. }),
  1143. $globals.TestResult);
  1144. $core.addMethod(
  1145. $core.method({
  1146. selector: "errors",
  1147. protocol: "accessing",
  1148. fn: function (){
  1149. var self=this;
  1150. return self["@errors"];
  1151. },
  1152. //>>excludeStart("ide", pragmas.excludeIdeData);
  1153. args: [],
  1154. source: "errors\x0a\x09^ errors",
  1155. referencedClasses: [],
  1156. //>>excludeEnd("ide");
  1157. messageSends: []
  1158. }),
  1159. $globals.TestResult);
  1160. $core.addMethod(
  1161. $core.method({
  1162. selector: "failures",
  1163. protocol: "accessing",
  1164. fn: function (){
  1165. var self=this;
  1166. return self["@failures"];
  1167. },
  1168. //>>excludeStart("ide", pragmas.excludeIdeData);
  1169. args: [],
  1170. source: "failures\x0a\x09^ failures",
  1171. referencedClasses: [],
  1172. //>>excludeEnd("ide");
  1173. messageSends: []
  1174. }),
  1175. $globals.TestResult);
  1176. $core.addMethod(
  1177. $core.method({
  1178. selector: "increaseRuns",
  1179. protocol: "accessing",
  1180. fn: function (){
  1181. var self=this;
  1182. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1183. return $core.withContext(function($ctx1) {
  1184. //>>excludeEnd("ctx");
  1185. self["@runs"]=$recv(self["@runs"]).__plus((1));
  1186. return self;
  1187. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1188. }, function($ctx1) {$ctx1.fill(self,"increaseRuns",{},$globals.TestResult)});
  1189. //>>excludeEnd("ctx");
  1190. },
  1191. //>>excludeStart("ide", pragmas.excludeIdeData);
  1192. args: [],
  1193. source: "increaseRuns\x0a\x09runs := runs + 1",
  1194. referencedClasses: [],
  1195. //>>excludeEnd("ide");
  1196. messageSends: ["+"]
  1197. }),
  1198. $globals.TestResult);
  1199. $core.addMethod(
  1200. $core.method({
  1201. selector: "initialize",
  1202. protocol: "initialization",
  1203. fn: function (){
  1204. var self=this;
  1205. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1206. return $core.withContext(function($ctx1) {
  1207. //>>excludeEnd("ctx");
  1208. (
  1209. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1210. $ctx1.supercall = true,
  1211. //>>excludeEnd("ctx");
  1212. ($globals.TestResult.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($recv(self), []));
  1213. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1214. $ctx1.supercall = false;
  1215. //>>excludeEnd("ctx");;
  1216. self["@timestamp"]=$recv($globals.Date)._now();
  1217. self["@runs"]=(0);
  1218. self["@errors"]=$recv($globals.Array)._new();
  1219. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1220. $ctx1.sendIdx["new"]=1;
  1221. //>>excludeEnd("ctx");
  1222. self["@failures"]=$recv($globals.Array)._new();
  1223. self["@total"]=(0);
  1224. return self;
  1225. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1226. }, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.TestResult)});
  1227. //>>excludeEnd("ctx");
  1228. },
  1229. //>>excludeStart("ide", pragmas.excludeIdeData);
  1230. args: [],
  1231. source: "initialize\x0a\x09super initialize.\x0a\x09timestamp := Date now.\x0a\x09runs := 0.\x0a\x09errors := Array new.\x0a\x09failures := Array new.\x0a\x09total := 0",
  1232. referencedClasses: ["Date", "Array"],
  1233. //>>excludeEnd("ide");
  1234. messageSends: ["initialize", "now", "new"]
  1235. }),
  1236. $globals.TestResult);
  1237. $core.addMethod(
  1238. $core.method({
  1239. selector: "nextRunDo:",
  1240. protocol: "running",
  1241. fn: function (aBlock){
  1242. var self=this;
  1243. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1244. return $core.withContext(function($ctx1) {
  1245. //>>excludeEnd("ctx");
  1246. var $2,$1;
  1247. $2=self._runs();
  1248. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1249. $ctx1.sendIdx["runs"]=1;
  1250. //>>excludeEnd("ctx");
  1251. $1=$recv($2).__eq_eq(self._total());
  1252. if(!$core.assert($1)){
  1253. return $recv(aBlock)._value_($recv(self._runs()).__plus((1)));
  1254. }
  1255. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1256. }, function($ctx1) {$ctx1.fill(self,"nextRunDo:",{aBlock:aBlock},$globals.TestResult)});
  1257. //>>excludeEnd("ctx");
  1258. },
  1259. //>>excludeStart("ide", pragmas.excludeIdeData);
  1260. args: ["aBlock"],
  1261. source: "nextRunDo: aBlock\x0a\x09\x22Runs aBlock with index of next run or does nothing if no more runs\x22\x0a\x09^ self runs == self total\x0a\x09\x09ifFalse: [ aBlock value: self runs + 1 ]",
  1262. referencedClasses: [],
  1263. //>>excludeEnd("ide");
  1264. messageSends: ["ifFalse:", "==", "runs", "total", "value:", "+"]
  1265. }),
  1266. $globals.TestResult);
  1267. $core.addMethod(
  1268. $core.method({
  1269. selector: "runCase:",
  1270. protocol: "running",
  1271. fn: function (aTestCase){
  1272. var self=this;
  1273. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1274. return $core.withContext(function($ctx1) {
  1275. //>>excludeEnd("ctx");
  1276. $recv((function(){
  1277. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1278. return $core.withContext(function($ctx2) {
  1279. //>>excludeEnd("ctx");
  1280. return $recv((function(){
  1281. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1282. return $core.withContext(function($ctx3) {
  1283. //>>excludeEnd("ctx");
  1284. self._increaseRuns();
  1285. return $recv(aTestCase)._runCase();
  1286. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1287. }, function($ctx3) {$ctx3.fillBlock({},$ctx2,2)});
  1288. //>>excludeEnd("ctx");
  1289. }))._on_do_($globals.TestFailure,(function(ex){
  1290. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1291. return $core.withContext(function($ctx3) {
  1292. //>>excludeEnd("ctx");
  1293. return self._addFailure_(aTestCase);
  1294. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1295. }, function($ctx3) {$ctx3.fillBlock({ex:ex},$ctx2,3)});
  1296. //>>excludeEnd("ctx");
  1297. }));
  1298. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1299. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  1300. //>>excludeEnd("ctx");
  1301. }))._on_do_($globals.Error,(function(ex){
  1302. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1303. return $core.withContext(function($ctx2) {
  1304. //>>excludeEnd("ctx");
  1305. return self._addError_(aTestCase);
  1306. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1307. }, function($ctx2) {$ctx2.fillBlock({ex:ex},$ctx1,4)});
  1308. //>>excludeEnd("ctx");
  1309. }));
  1310. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1311. $ctx1.sendIdx["on:do:"]=1;
  1312. //>>excludeEnd("ctx");
  1313. return self;
  1314. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1315. }, function($ctx1) {$ctx1.fill(self,"runCase:",{aTestCase:aTestCase},$globals.TestResult)});
  1316. //>>excludeEnd("ctx");
  1317. },
  1318. //>>excludeStart("ide", pragmas.excludeIdeData);
  1319. args: ["aTestCase"],
  1320. source: "runCase: aTestCase\x0a\x09[ [ self increaseRuns.\x0a\x09\x09aTestCase runCase ]\x0a\x09on: TestFailure do: [ :ex | self addFailure: aTestCase ]]\x0a\x09on: Error do: [ :ex | self addError: aTestCase ]",
  1321. referencedClasses: ["TestFailure", "Error"],
  1322. //>>excludeEnd("ide");
  1323. messageSends: ["on:do:", "increaseRuns", "runCase", "addFailure:", "addError:"]
  1324. }),
  1325. $globals.TestResult);
  1326. $core.addMethod(
  1327. $core.method({
  1328. selector: "runs",
  1329. protocol: "accessing",
  1330. fn: function (){
  1331. var self=this;
  1332. return self["@runs"];
  1333. },
  1334. //>>excludeStart("ide", pragmas.excludeIdeData);
  1335. args: [],
  1336. source: "runs\x0a\x09^ runs",
  1337. referencedClasses: [],
  1338. //>>excludeEnd("ide");
  1339. messageSends: []
  1340. }),
  1341. $globals.TestResult);
  1342. $core.addMethod(
  1343. $core.method({
  1344. selector: "status",
  1345. protocol: "accessing",
  1346. fn: function (){
  1347. var self=this;
  1348. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1349. return $core.withContext(function($ctx1) {
  1350. //>>excludeEnd("ctx");
  1351. var $1;
  1352. $1=$recv(self._errors())._ifNotEmpty_ifEmpty_((function(){
  1353. return "error";
  1354. }),(function(){
  1355. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1356. return $core.withContext(function($ctx2) {
  1357. //>>excludeEnd("ctx");
  1358. return $recv(self._failures())._ifNotEmpty_ifEmpty_((function(){
  1359. return "failure";
  1360. }),(function(){
  1361. return "success";
  1362. }));
  1363. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1364. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,2)});
  1365. //>>excludeEnd("ctx");
  1366. }));
  1367. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1368. $ctx1.sendIdx["ifNotEmpty:ifEmpty:"]=1;
  1369. //>>excludeEnd("ctx");
  1370. return $1;
  1371. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1372. }, function($ctx1) {$ctx1.fill(self,"status",{},$globals.TestResult)});
  1373. //>>excludeEnd("ctx");
  1374. },
  1375. //>>excludeStart("ide", pragmas.excludeIdeData);
  1376. args: [],
  1377. source: "status\x0a\x09^ self errors ifNotEmpty: [ 'error' ] ifEmpty: [\x0a\x09\x09self failures ifNotEmpty: [ 'failure' ] ifEmpty: [\x0a\x09\x09\x09'success' ]]",
  1378. referencedClasses: [],
  1379. //>>excludeEnd("ide");
  1380. messageSends: ["ifNotEmpty:ifEmpty:", "errors", "failures"]
  1381. }),
  1382. $globals.TestResult);
  1383. $core.addMethod(
  1384. $core.method({
  1385. selector: "timestamp",
  1386. protocol: "accessing",
  1387. fn: function (){
  1388. var self=this;
  1389. return self["@timestamp"];
  1390. },
  1391. //>>excludeStart("ide", pragmas.excludeIdeData);
  1392. args: [],
  1393. source: "timestamp\x0a\x09^ timestamp",
  1394. referencedClasses: [],
  1395. //>>excludeEnd("ide");
  1396. messageSends: []
  1397. }),
  1398. $globals.TestResult);
  1399. $core.addMethod(
  1400. $core.method({
  1401. selector: "total",
  1402. protocol: "accessing",
  1403. fn: function (){
  1404. var self=this;
  1405. return self["@total"];
  1406. },
  1407. //>>excludeStart("ide", pragmas.excludeIdeData);
  1408. args: [],
  1409. source: "total\x0a\x09^ total",
  1410. referencedClasses: [],
  1411. //>>excludeEnd("ide");
  1412. messageSends: []
  1413. }),
  1414. $globals.TestResult);
  1415. $core.addMethod(
  1416. $core.method({
  1417. selector: "total:",
  1418. protocol: "accessing",
  1419. fn: function (aNumber){
  1420. var self=this;
  1421. self["@total"]=aNumber;
  1422. return self;
  1423. },
  1424. //>>excludeStart("ide", pragmas.excludeIdeData);
  1425. args: ["aNumber"],
  1426. source: "total: aNumber\x0a\x09total := aNumber",
  1427. referencedClasses: [],
  1428. //>>excludeEnd("ide");
  1429. messageSends: []
  1430. }),
  1431. $globals.TestResult);
  1432. $core.addClass("TestSuiteRunner", $globals.Object, ["suite", "result", "announcer", "runNextTest"], "SUnit");
  1433. //>>excludeStart("ide", pragmas.excludeIdeData);
  1434. $globals.TestSuiteRunner.comment="I am responsible for running a collection (`suite`) of tests.\x0a\x0a## API\x0a\x0aInstances should be created using the class-side `#on:` method, taking a collection of tests to run as parameter.\x0aTo run the test suite, use `#run`.";
  1435. //>>excludeEnd("ide");
  1436. $core.addMethod(
  1437. $core.method({
  1438. selector: "announcer",
  1439. protocol: "accessing",
  1440. fn: function (){
  1441. var self=this;
  1442. return self["@announcer"];
  1443. },
  1444. //>>excludeStart("ide", pragmas.excludeIdeData);
  1445. args: [],
  1446. source: "announcer\x0a\x09^ announcer",
  1447. referencedClasses: [],
  1448. //>>excludeEnd("ide");
  1449. messageSends: []
  1450. }),
  1451. $globals.TestSuiteRunner);
  1452. $core.addMethod(
  1453. $core.method({
  1454. selector: "contextOf:",
  1455. protocol: "private",
  1456. fn: function (anInteger){
  1457. var self=this;
  1458. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1459. return $core.withContext(function($ctx1) {
  1460. //>>excludeEnd("ctx");
  1461. return $recv($globals.ReportingTestContext)._testCase_result_finished_($recv(self["@suite"])._at_(anInteger),self["@result"],(function(){
  1462. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1463. return $core.withContext(function($ctx2) {
  1464. //>>excludeEnd("ctx");
  1465. return self._resume();
  1466. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1467. }, function($ctx2) {$ctx2.fillBlock({},$ctx1,1)});
  1468. //>>excludeEnd("ctx");
  1469. }));
  1470. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1471. }, function($ctx1) {$ctx1.fill(self,"contextOf:",{anInteger:anInteger},$globals.TestSuiteRunner)});
  1472. //>>excludeEnd("ctx");
  1473. },
  1474. //>>excludeStart("ide", pragmas.excludeIdeData);
  1475. args: ["anInteger"],
  1476. source: "contextOf: anInteger\x0a\x09^ ReportingTestContext testCase: (suite at: anInteger) result: result finished: [ self resume ]",
  1477. referencedClasses: ["ReportingTestContext"],
  1478. //>>excludeEnd("ide");
  1479. messageSends: ["testCase:result:finished:", "at:", "resume"]
  1480. }),
  1481. $globals.TestSuiteRunner);
  1482. $core.addMethod(
  1483. $core.method({
  1484. selector: "initialize",
  1485. protocol: "initialization",
  1486. fn: function (){
  1487. var self=this;
  1488. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1489. return $core.withContext(function($ctx1) {
  1490. //>>excludeEnd("ctx");
  1491. var $1;
  1492. (
  1493. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1494. $ctx1.supercall = true,
  1495. //>>excludeEnd("ctx");
  1496. ($globals.TestSuiteRunner.superclass||$boot.nilAsClass).fn.prototype._initialize.apply($recv(self), []));
  1497. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1498. $ctx1.supercall = false;
  1499. //>>excludeEnd("ctx");;
  1500. self["@announcer"]=$recv($globals.Announcer)._new();
  1501. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1502. $ctx1.sendIdx["new"]=1;
  1503. //>>excludeEnd("ctx");
  1504. self["@result"]=$recv($globals.TestResult)._new();
  1505. self["@runNextTest"]=(function(){
  1506. var runs;
  1507. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1508. return $core.withContext(function($ctx2) {
  1509. //>>excludeEnd("ctx");
  1510. runs=$recv(self["@result"])._runs();
  1511. runs;
  1512. $1=$recv(runs).__lt($recv(self["@result"])._total());
  1513. if($core.assert($1)){
  1514. return $recv(self._contextOf_($recv(runs).__plus((1))))._start();
  1515. }
  1516. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1517. }, function($ctx2) {$ctx2.fillBlock({runs:runs},$ctx1,1)});
  1518. //>>excludeEnd("ctx");
  1519. });
  1520. return self;
  1521. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1522. }, function($ctx1) {$ctx1.fill(self,"initialize",{},$globals.TestSuiteRunner)});
  1523. //>>excludeEnd("ctx");
  1524. },
  1525. //>>excludeStart("ide", pragmas.excludeIdeData);
  1526. args: [],
  1527. source: "initialize\x0a\x09super initialize.\x0a\x09announcer := Announcer new.\x0a\x09result := TestResult new.\x0a\x09runNextTest := [ | runs | runs := result runs. runs < result total ifTrue: [ (self contextOf: runs + 1) start ] ].",
  1528. referencedClasses: ["Announcer", "TestResult"],
  1529. //>>excludeEnd("ide");
  1530. messageSends: ["initialize", "new", "runs", "ifTrue:", "<", "total", "start", "contextOf:", "+"]
  1531. }),
  1532. $globals.TestSuiteRunner);
  1533. $core.addMethod(
  1534. $core.method({
  1535. selector: "result",
  1536. protocol: "accessing",
  1537. fn: function (){
  1538. var self=this;
  1539. return self["@result"];
  1540. },
  1541. //>>excludeStart("ide", pragmas.excludeIdeData);
  1542. args: [],
  1543. source: "result\x0a\x09^ result",
  1544. referencedClasses: [],
  1545. //>>excludeEnd("ide");
  1546. messageSends: []
  1547. }),
  1548. $globals.TestSuiteRunner);
  1549. $core.addMethod(
  1550. $core.method({
  1551. selector: "resume",
  1552. protocol: "actions",
  1553. fn: function (){
  1554. var self=this;
  1555. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1556. return $core.withContext(function($ctx1) {
  1557. //>>excludeEnd("ctx");
  1558. $recv(self["@runNextTest"])._fork();
  1559. $recv(self["@announcer"])._announce_($recv($recv($globals.ResultAnnouncement)._new())._result_(self["@result"]));
  1560. return self;
  1561. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1562. }, function($ctx1) {$ctx1.fill(self,"resume",{},$globals.TestSuiteRunner)});
  1563. //>>excludeEnd("ctx");
  1564. },
  1565. //>>excludeStart("ide", pragmas.excludeIdeData);
  1566. args: [],
  1567. source: "resume\x0a\x09runNextTest fork.\x0a\x09announcer announce: (ResultAnnouncement new result: result)",
  1568. referencedClasses: ["ResultAnnouncement"],
  1569. //>>excludeEnd("ide");
  1570. messageSends: ["fork", "announce:", "result:", "new"]
  1571. }),
  1572. $globals.TestSuiteRunner);
  1573. $core.addMethod(
  1574. $core.method({
  1575. selector: "run",
  1576. protocol: "actions",
  1577. fn: function (){
  1578. var self=this;
  1579. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1580. return $core.withContext(function($ctx1) {
  1581. //>>excludeEnd("ctx");
  1582. $recv(self["@result"])._total_($recv(self["@suite"])._size());
  1583. self._resume();
  1584. return self;
  1585. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1586. }, function($ctx1) {$ctx1.fill(self,"run",{},$globals.TestSuiteRunner)});
  1587. //>>excludeEnd("ctx");
  1588. },
  1589. //>>excludeStart("ide", pragmas.excludeIdeData);
  1590. args: [],
  1591. source: "run\x0a\x09result total: suite size.\x0a\x09self resume",
  1592. referencedClasses: [],
  1593. //>>excludeEnd("ide");
  1594. messageSends: ["total:", "size", "resume"]
  1595. }),
  1596. $globals.TestSuiteRunner);
  1597. $core.addMethod(
  1598. $core.method({
  1599. selector: "suite:",
  1600. protocol: "accessing",
  1601. fn: function (aCollection){
  1602. var self=this;
  1603. self["@suite"]=aCollection;
  1604. return self;
  1605. },
  1606. //>>excludeStart("ide", pragmas.excludeIdeData);
  1607. args: ["aCollection"],
  1608. source: "suite: aCollection\x0a\x09suite := aCollection",
  1609. referencedClasses: [],
  1610. //>>excludeEnd("ide");
  1611. messageSends: []
  1612. }),
  1613. $globals.TestSuiteRunner);
  1614. $core.addMethod(
  1615. $core.method({
  1616. selector: "new",
  1617. protocol: "instance creation",
  1618. fn: function (){
  1619. var self=this;
  1620. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1621. return $core.withContext(function($ctx1) {
  1622. //>>excludeEnd("ctx");
  1623. self._shouldNotImplement();
  1624. return self;
  1625. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1626. }, function($ctx1) {$ctx1.fill(self,"new",{},$globals.TestSuiteRunner.klass)});
  1627. //>>excludeEnd("ctx");
  1628. },
  1629. //>>excludeStart("ide", pragmas.excludeIdeData);
  1630. args: [],
  1631. source: "new\x0a\x09self shouldNotImplement",
  1632. referencedClasses: [],
  1633. //>>excludeEnd("ide");
  1634. messageSends: ["shouldNotImplement"]
  1635. }),
  1636. $globals.TestSuiteRunner.klass);
  1637. $core.addMethod(
  1638. $core.method({
  1639. selector: "on:",
  1640. protocol: "instance creation",
  1641. fn: function (aCollection){
  1642. var self=this;
  1643. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1644. return $core.withContext(function($ctx1) {
  1645. //>>excludeEnd("ctx");
  1646. var $1;
  1647. $1=(
  1648. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1649. $ctx1.supercall = true,
  1650. //>>excludeEnd("ctx");
  1651. ($globals.TestSuiteRunner.klass.superclass||$boot.nilAsClass).fn.prototype._new.apply($recv(self), []));
  1652. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1653. $ctx1.supercall = false;
  1654. //>>excludeEnd("ctx");;
  1655. return $recv($1)._suite_(aCollection);
  1656. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1657. }, function($ctx1) {$ctx1.fill(self,"on:",{aCollection:aCollection},$globals.TestSuiteRunner.klass)});
  1658. //>>excludeEnd("ctx");
  1659. },
  1660. //>>excludeStart("ide", pragmas.excludeIdeData);
  1661. args: ["aCollection"],
  1662. source: "on: aCollection\x0a\x09^ super new suite: aCollection",
  1663. referencedClasses: [],
  1664. //>>excludeEnd("ide");
  1665. messageSends: ["suite:", "new"]
  1666. }),
  1667. $globals.TestSuiteRunner.klass);
  1668. $core.addMethod(
  1669. $core.method({
  1670. selector: "isTestClass",
  1671. protocol: "*SUnit",
  1672. fn: function (){
  1673. var self=this;
  1674. return false;
  1675. },
  1676. //>>excludeStart("ide", pragmas.excludeIdeData);
  1677. args: [],
  1678. source: "isTestClass\x0a\x09^ false",
  1679. referencedClasses: [],
  1680. //>>excludeEnd("ide");
  1681. messageSends: []
  1682. }),
  1683. $globals.TBehaviorDefaults);
  1684. $core.addMethod(
  1685. $core.method({
  1686. selector: "isTestPackage",
  1687. protocol: "*SUnit",
  1688. fn: function (){
  1689. var self=this;
  1690. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1691. return $core.withContext(function($ctx1) {
  1692. //>>excludeEnd("ctx");
  1693. return $recv(self._classes())._anySatisfy_((function(each){
  1694. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1695. return $core.withContext(function($ctx2) {
  1696. //>>excludeEnd("ctx");
  1697. return $recv(each)._isTestClass();
  1698. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1699. }, function($ctx2) {$ctx2.fillBlock({each:each},$ctx1,1)});
  1700. //>>excludeEnd("ctx");
  1701. }));
  1702. //>>excludeStart("ctx", pragmas.excludeDebugContexts);
  1703. }, function($ctx1) {$ctx1.fill(self,"isTestPackage",{},$globals.Package)});
  1704. //>>excludeEnd("ctx");
  1705. },
  1706. //>>excludeStart("ide", pragmas.excludeIdeData);
  1707. args: [],
  1708. source: "isTestPackage\x0a\x09^ self classes anySatisfy: [ :each | each isTestClass ]",
  1709. referencedClasses: [],
  1710. //>>excludeEnd("ide");
  1711. messageSends: ["anySatisfy:", "classes", "isTestClass"]
  1712. }),
  1713. $globals.Package);
  1714. $core.addMethod(
  1715. $core.method({
  1716. selector: "isTestClass",
  1717. protocol: "*SUnit",
  1718. fn: function (){
  1719. var self=this;
  1720. return false;
  1721. },
  1722. //>>excludeStart("ide", pragmas.excludeIdeData);
  1723. args: [],
  1724. source: "isTestClass\x0a\x09^ false",
  1725. referencedClasses: [],
  1726. //>>excludeEnd("ide");
  1727. messageSends: []
  1728. }),
  1729. $globals.TBehaviorDefaults);
  1730. $core.addMethod(
  1731. $core.method({
  1732. selector: "isTestClass",
  1733. protocol: "*SUnit",
  1734. fn: function (){
  1735. var self=this;
  1736. return false;
  1737. },
  1738. //>>excludeStart("ide", pragmas.excludeIdeData);
  1739. args: [],
  1740. source: "isTestClass\x0a\x09^ false",
  1741. referencedClasses: [],
  1742. //>>excludeEnd("ide");
  1743. messageSends: []
  1744. }),
  1745. $globals.TBehaviorDefaults);
  1746. });