11"use strict" ;
22
33require ( "ace/lib/fixoldbrowsers" ) ;
4+
45var mockdom = require ( "../test/mockdom" ) ;
5- var AsyncTest = require ( "asyncjs" ) . test ;
6- var async = require ( "asyncjs" ) ;
76var buildDom = require ( "../lib/dom" ) . buildDom ;
87var escapeRegExp = require ( "ace/lib/lang" ) . escapeRegExp ;
98
109var useMockdom = location . search . indexOf ( "mock=1" ) != - 1 ;
1110var forceShow = location . search . indexOf ( "show=1" ) != - 1 ;
1211
13- var passed = 0 ;
14- var failed = 0 ;
15- var log = document . getElementById ( "log" ) ;
12+ var documentElement = document . documentElement ;
13+ var log = buildDom ( [ "div" , { id : "log" } ] , documentElement ) ;
1614
1715// change buildDom to use real document in mockdom
1816var createElement = document . createElement . bind ( document ) ;
1917var createTextNode = document . createTextNode . bind ( document ) ;
2018var buildDom = eval ( "(" + buildDom . toString ( ) . replace ( / d o c u m e n t \. / g, "" ) + ")" ) ;
2119
20+ window . onerror = function name ( ...params ) {
21+ console . error ( ">>>>>>>>>>>>>>" , ...params )
22+ }
23+ window . addEventListener ( 'unhandledrejection' , ( event ) => {
24+ console . error ( "Unhandled promise rejection:" , event . promise , event . reason ) ;
25+ } ) ;
26+
2227var testNames = require ( "./test_list" ) ;
2328
2429var html = [
30+ [ "div" , { ref : "summary" } ] ,
2531 useMockdom
2632 ? [ "a" , { href : normalizeHref ( location . search . replace ( 'mock=1' , '' ) ) + location . hash } , "do not use mockdom" ]
2733 : [ "a" , { href : normalizeHref ( location . search + '&mock=1' ) + location . hash } , "use mockdom" ] ,
@@ -36,18 +42,24 @@ var html = [
3642for ( var i in testNames ) {
3743 html . push ( testLink ( testNames [ i ] ) , [ "br" ] ) ;
3844}
39-
45+ function testHref ( suiteName , name ) {
46+ var href = '?' + suiteName + ( useMockdom ? "&mock=1" : "" ) ;
47+ if ( name ) href += "#" + escapeRegExp ( name . replace ( / ^ t e s t \s * / , "" ) ) ;
48+ return href ;
49+ }
4050function testLink ( name ) {
41- return [ "a" , { href :'?' + name + ( useMockdom ? "&mock=1" : "" ) } , name . replace ( / ^ a c e \/ / , "" ) ] ;
51+ return [ "a" , { href : testHref ( name ) } , name . replace ( / ^ a c e \/ / , "" ) + ".js" ] ;
4252}
4353function normalizeHref ( str ) {
4454 return str . replace ( / ( [ ? & ] ) & + / g, "$1" ) ;
4555}
4656
47- var nav = buildDom ( [ "div" , { style : "position:absolute;right:0;top:0" } , html ] , document . body ) ;
57+ var refs = { } ;
58+ var nav = buildDom ( [ "div" , { id : "sidebar" } , html ] , documentElement , refs ) ;
4859
4960
5061if ( forceShow ) {
62+ // @ts -ignore
5163 require ( [ "ace/virtual_renderer" , "ace/test/mockrenderer" ] , function ( real , mock ) {
5264 var VirtualRenderer = real . VirtualRenderer ;
5365 mock . MockRenderer = function ( ) {
@@ -79,68 +91,208 @@ if (location.search) {
7991var filter = decodeURIComponent ( location . hash . substr ( 1 ) ) ;
8092window . onhashchange = function ( ) { location . reload ( ) ; } ;
8193
82- require ( selectedTests , function ( ) {
83- var tests = selectedTests . map ( function ( x ) {
94+ // @ts -ignore
95+ require ( selectedTests , async function ( ) {
96+ var testSuites = selectedTests . map ( function ( x ) {
8497 var module = require ( x ) ;
8598 module . href = x ;
8699 return module ;
87100 } ) ;
88101
89- async . list ( tests )
90- . expand ( function ( test ) {
91- if ( filter ) {
92- Object . keys ( test ) . forEach ( function ( method ) {
93- if ( method . match ( / ^ > ? t e s t / ) && ! method . match ( filter ) )
94- test [ method ] = undefined ;
95- } ) ;
96- }
97- return AsyncTest . testcase ( test ) ;
98- } , AsyncTest . TestGenerator )
99- . run ( )
100- . each ( function ( test , next ) {
101- if ( test . index == 1 && test . context . href ) {
102- var href = test . context . href ;
103- buildDom ( [ "div" , { } , testLink ( href ) ] , log ) ;
104- }
105-
102+ var failed = 0 ;
103+ var passed = 0 ;
104+ var skipped = 0 ;
105+ var reporter = {
106+ beforeEach : function ( test ) {
107+ if ( ! test . name ) return ;
106108 var messageHeader = "[" + test . index + "/" + test . count + "]" ;
107-
108- var node = buildDom ( [ "div" , { class : test . passed ? "passed" : "failed" } ,
109- [ "a" , { href : "#" + escapeRegExp ( test . name . replace ( / ^ t e s t \s * / , "" ) ) } , messageHeader ] ,
109+ var node = buildDom ( [ "div" , { class : test . skip ? "skipped" : "waiting" } ,
110+ [ "a" , { href : testHref ( test . testSuite . href , test . name ) } , messageHeader ] ,
110111 " " ,
111- ( test . suiteName ? test . suiteName + ": " : "" ) ,
112112 test . name ,
113- ( test . passed ? " OK " : " FAIL" )
113+ [ "span" , ( test . skip ? " SKIP " : " ..." ) ] ,
114114 ] , log ) ;
115-
116- if ( ! test . passed ) {
117- if ( test . err . stack )
118- var err = test . err . stack ;
119- else
120- var err = test . err ;
121-
122- console . error ( node . textContent ) ;
123- console . error ( err ) ;
124- buildDom ( [ "pre" , { class : "error" } , err + "" ] , node ) ;
115+ test . reportNode = node ;
116+ console . log ( messageHeader + test . name ) ;
117+ } ,
118+ afterEach : function ( test ) {
119+ if ( ! log . parentElement ) {
120+ documentElement . appendChild ( log )
121+ debugger
122+ }
123+ if ( ! test . name ) return ;
124+ if ( test . skip ) {
125+ skipped ++
126+ return ;
127+ } else if ( test . passed ) {
128+ passed ++ ;
125129 } else {
126- console . log ( node . textContent ) ;
130+ failed ++ ;
127131 }
132+
133+ test . reportNode . className = test . passed ? "passed" : "failed" ;
134+ test . reportNode . lastChild . remove ( )
135+ buildDom ( [ "span" , ( test . passed ? " OK" : " FAIL" ) + " " + test . time + "ms" ] , test . reportNode )
136+ if ( test . error && test . error != true )
137+ buildDom ( [ "pre" , { class : "error" } , test . error + "" ] , log ) ;
138+ if ( test . error ) console . log ( test . fn ) ;
128139
129- next ( ) ;
130- } )
131- . each ( function ( test ) {
132- if ( test . passed )
133- passed += 1 ;
134- else
135- failed += 1 ;
136- } )
137- . end ( function ( ) {
140+ refs . summary . innerText = "Passed: " + passed + ", Failed: " + failed + ", Skipped: " + skipped ;
141+ } ,
142+ before : function ( testSuite ) {
143+ var counter = " [" + testSuite . index + "/" + testSuite . count + "]" ;
144+ var href = testSuite . href ;
145+ buildDom ( [ "div" , { } , testLink ( href ) , counter ] , log ) ;
146+ console . log ( href , counter ) ;
147+ } ,
148+ after : function ( test ) {
149+
150+ } ,
151+ done : function ( ) {
152+ if ( ! log . parentElement ) {
153+ documentElement . appendChild ( log )
154+ debugger
155+ }
138156 var node = buildDom ( [ "div" , { class : "summary" } ,
139157 [ "br" ] , "Summary:" , [ "br" ] , [ "br" ] ,
140- "Total number of tests: " + ( passed + failed ) , [ "br" ] ,
158+ "Total number of tests: " + ( passed + failed + skipped ) , [ "br" ] ,
141159 ( passed && [ null , "Passed tests: " + passed , [ "br" ] ] ) ,
160+ ( passed && [ null , "Passed tests: " + skipped , [ "br" ] ] ) ,
142161 ( failed && [ null , "Failed tests: " + failed ] )
143162 ] , log ) ;
144163 console . log ( node . innerText ) ;
164+ }
165+ } ;
166+
167+ var stepIndex = 0
168+ async function runStep ( ) {
169+ try {
170+ var step = steps [ stepIndex ++ ] ;
171+ if ( ! step ) return ;
172+ if ( step . type == "before" ) {
173+ reporter . before ( step . testSuite ) ;
174+ }
175+ try {
176+ if ( step . fn ) await runTimed ( step )
177+ } finally {
178+ if ( step . type == "after" ) {
179+ reporter . after ( step . testSuite ) ;
180+ } else if ( step . type == "done" ) {
181+ reporter . done ( ) ;
182+ }
183+ }
184+ } finally {
185+ if ( ! step ) return ;
186+ setTimeout ( runStep , 0 ) ;
187+ }
188+ }
189+ async function runTimed ( step , callback ) {
190+ var fn = step . fn ;
191+ var testSuite = step . testSuite ;
192+
193+ var resolve ;
194+ var result = new Promise ( function ( resolve_ , reject_ ) {
195+ resolve = resolve_ ;
145196 } ) ;
197+ result . name = step . name ;
198+
199+ var doneCalled = false ;
200+ var done = function ( error ) {
201+ if ( doneCalled ) return ;
202+ if ( error ) step . error = error ;
203+ step . passed = ! step . error ;
204+ clearTimeout ( timeoutId ) ;
205+ step . time = Date . now ( ) - t ;
206+ doneCalled = true ;
207+ resolve ( ) ;
208+ reporter . afterEach ( step ) ;
209+ } ;
210+ var timeout = testSuite . timeout || 3000 ;
211+ var interactiveTimeStep = 100 ;
212+ var remainingTime = timeout ;
213+ var timeoutId = setTimeout ( function wait ( ) {
214+ remainingTime -= interactiveTimeStep ;
215+ if ( remainingTime > 0 ) {
216+ timeoutId = setTimeout ( wait , Math . min ( interactiveTimeStep , remainingTime ) )
217+ } else {
218+ done ( new Error ( "Source did not respond after " + timeout + "ms!" ) )
219+ }
220+ } , Math . min ( interactiveTimeStep , remainingTime ) ) ;
221+
222+ var t = Date . now ( ) ;
223+ step . passed = false ;
224+ reporter . beforeEach ( step ) ;
225+ var callFailed = true ;
226+ try {
227+ ( fn . length ? fn . call ( testSuite , done ) : fn . call ( testSuite ) ) ;
228+ callFailed = false ;
229+ } finally {
230+ if ( ! fn . length )
231+ done ( callFailed )
232+ return result ;
233+ }
234+ }
235+
236+ var currentStep
237+ var waitForStepCallback ;
238+ var watchdog
239+ async function runAll ( ) {
240+ watchdog = setInterval ( ( ) => {
241+ if ( ! currentStep ) return ;
242+ currentStep . interactiveTime = ( currentStep . interactiveTime || 0 ) + 50 ;
243+ if ( currentStep . interactiveTime >= currentStep . timeout ) {
244+ if ( currentStep . error == undefined )
245+ currentStep . error = new Error ( "Source did not respond after " + ( currentStep . timeout || 0 ) + "ms!" ) ;
246+ waitForStepCallback ( )
247+ }
248+ } , 50 ) ;
249+ while ( currentStep = steps . shift ( ) ) {
250+ currentStep . timeout = ( currentStep ?. testSuite . timeout || 3000 ) ;
251+ var waitForStep = new Promise ( resolve => { waitForStepCallback = resolve } ) ;
252+ setTimeout ( runOne , 0 ) ;
253+ await waitForStep
254+ }
255+ clearInterval ( watchdog ) ;
256+ }
257+ async function runOne ( ) {
258+ debugger
259+ waitForStepCallback ( )
260+ }
261+
262+ var steps = [ ] ;
263+ for ( var i = 0 ; i < testSuites . length ; i ++ ) {
264+ var testSuite = testSuites [ i ] ;
265+ testSuite . index = i + 1 ;
266+ testSuite . count = testSuites . length ;
267+
268+ var testArray = [ ] ;
269+ Object . keys ( testSuite ) . forEach ( name => {
270+ if ( ! name . match ( / ^ > ? t e s t / ) )
271+ return ;
272+ var test = { name, testSuite, fn : testSuite [ name ] } ;
273+ if ( filter && ! test . name . match ( filter ) ) {
274+ test . skip = true ;
275+ }
276+ testArray . push ( test ) ;
277+ } )
278+
279+ if ( ! testArray . length ) continue ;
280+
281+ steps . push ( { type : "before" , testSuite, fn : testSuite . setUpSuite } )
282+ for ( var j = 0 ; j < testArray . length ; j ++ ) {
283+ var test = testArray [ j ] ;
284+ test . index = j + 1 ;
285+ test . count = testArray . length ;
286+ steps . push ( { type : "beforeEach" , testSuite, fn : testSuite . setUp } ) ;
287+ steps . push ( test ) ;
288+ steps . push ( { type : "afterEach" , testSuite, fn : testSuite . tearDown } ) ;
289+ }
290+ steps . push ( { type : "after" , testSuite, fn : testSuite . tearDownSuite } ) ;
291+ }
292+
293+ steps . push ( { type : "done" } )
294+
295+ runStep ( ) ;
296+
297+ // runAll()
146298} ) ;
0 commit comments