~caneypuggies/reformedchurcheslocator/couchapp-backbone

« back to all changes in this revision

Viewing changes to _attachments/js/vendor/requirejs/tests/doh/_browserRunner.js

  • Committer: Tim Black
  • Date: 2013-09-16 22:50:16 UTC
  • Revision ID: tim@alwaysreformed.com-20130916225016-zk8jiba25z33ew7h
Versioned Bower vendor directory

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
if(window["dojo"]){
 
2
        dojo.provide("doh._browserRunner");
 
3
}
 
4
 
 
5
// FIXME: need to add prompting for monkey-do testing
 
6
 
 
7
(function(){
 
8
 
 
9
        doh.setTimeout = function (fn, time) {
 
10
            return setTimeout(fn, time);
 
11
        };
 
12
 
 
13
        try{
 
14
                var topdog = (window.parent == window) || !Boolean(window.parent.doh);
 
15
        }catch(e){
 
16
                //can't access window.parent.doh, then consider ourselves as topdog
 
17
                topdog=true;
 
18
        }
 
19
        if(topdog){
 
20
                // we're the top-dog window.
 
21
 
 
22
                // borrowed from Dojo, etc.
 
23
                var byId = function(id){
 
24
                        return document.getElementById(id);
 
25
                };
 
26
 
 
27
                var _addOnEvt = function(       type,           // string
 
28
                                                                        refOrName,      // function or string
 
29
                                                                        scope){         // object, defaults is window
 
30
 
 
31
                        if(!scope){ scope = window; }
 
32
 
 
33
                        var funcRef = refOrName;
 
34
                        if(typeof refOrName == "string"){
 
35
                                funcRef = scope[refOrName];
 
36
                        }
 
37
                        var enclosedFunc = function(){ return funcRef.apply(scope, arguments); };
 
38
 
 
39
                        if((window["dojo"])&&(type == "load")){
 
40
                                dojo.addOnLoad(enclosedFunc);
 
41
                        }else{
 
42
                                if(window["attachEvent"]){
 
43
                                        window.attachEvent("on"+type, enclosedFunc);
 
44
                                }else if(window["addEventListener"]){
 
45
                                        window.addEventListener(type, enclosedFunc, false);
 
46
                                }else if(document["addEventListener"]){
 
47
                                        document.addEventListener(type, enclosedFunc, false);
 
48
                                }
 
49
                        }
 
50
                };
 
51
 
 
52
                //
 
53
                // Over-ride or implement base runner.js-provided methods
 
54
                //
 
55
                var escapeXml = function(str){
 
56
                        //summary:
 
57
                        //              Adds escape sequences for special characters in XML: &<>"'
 
58
                        //              Optionally skips escapes for single quotes
 
59
                        return str.replace(/&/gm, "&amp;").replace(/</gm, "&lt;").replace(/>/gm, "&gt;").replace(/"/gm, "&quot;"); // string
 
60
                };
 
61
 
 
62
                var _logBacklog = [], _loggedMsgLen = 0;
 
63
                var sendToLogPane = function(args, skip){
 
64
                        var msg = "";
 
65
                        for(var x=0; x<args.length; x++){
 
66
                                msg += " "+args[x];
 
67
                        }
 
68
 
 
69
                        msg = escapeXml(msg);
 
70
 
 
71
                        // workarounds for IE. Wheeee!!!
 
72
                        msg = msg.replace("\t", "&nbsp;&nbsp;&nbsp;&nbsp;")
 
73
                                .replace(" ", "&nbsp;")
 
74
                                .replace("\n", "<br>&nbsp;");
 
75
                        if(!byId("logBody")){
 
76
                                _logBacklog.push(msg);
 
77
                                return;
 
78
                        }else if(_logBacklog.length && !skip){
 
79
                                var tm;
 
80
                                while((tm=_logBacklog.shift())){
 
81
                                        sendToLogPane(tm, true);
 
82
                                }
 
83
                        }
 
84
                        var logBody=byId("logBody");
 
85
                        var tn = document.createElement("div");
 
86
                        tn.innerHTML = msg;
 
87
                        //tn.id="logmsg_"+logBody.childNodes.length;
 
88
                        logBody.appendChild(tn);
 
89
                        _loggedMsgLen++;
 
90
                }
 
91
 
 
92
                var findTarget = function(n){
 
93
                        while(n && !n.getAttribute('_target')){
 
94
                                n=n.parentNode;
 
95
                                if(!n.getAttribute){
 
96
                                        n=null;
 
97
                                }
 
98
                        }
 
99
                        return n;
 
100
                }
 
101
 
 
102
                doh._jumpToLog = function(e){
 
103
                        //console.log(e);
 
104
 
 
105
                        var node = findTarget(e?e.target:window.event.srcElement);
 
106
                        if(!node){
 
107
                                return;
 
108
                        }
 
109
                        var _t = Number(node.getAttribute('_target'));
 
110
                        var lb = byId("logBody");
 
111
                        if(_t>=lb.childNodes.length){
 
112
                                return;
 
113
                        }
 
114
                        var t = lb.childNodes[_t];
 
115
                        t.scrollIntoView();
 
116
                        if(window.dojo){
 
117
                                //t.parentNode.parentNode is <div class="tabBody">, only it has a explicitly set background-color,
 
118
                                //all children of it are transparent
 
119
                                var bgColor = dojo.style(t.parentNode.parentNode,'backgroundColor');
 
120
                                //node.parentNode is the tr which has background-color set explicitly
 
121
                                var hicolor = dojo.style(node.parentNode,'backgroundColor');
 
122
                                var unhilight = dojo.animateProperty({
 
123
                                        node: t,
 
124
                                        duration: 500,
 
125
                                        properties:
 
126
                                        {
 
127
                                                backgroundColor: { start:hicolor, end: bgColor }
 
128
                                        },
 
129
                                        onEnd: function(){
 
130
                                                t.style.backgroundColor="";
 
131
                                        }
 
132
                                });
 
133
                                var hilight = dojo.animateProperty({
 
134
                                        node: t,
 
135
                                        duration: 500,
 
136
                                        properties:
 
137
                                        {
 
138
                                                backgroundColor: { start:bgColor, end: hicolor }
 
139
                                        },
 
140
                                        onEnd: function(){
 
141
                                                unhilight.play();
 
142
                                        }
 
143
                                });
 
144
                                hilight.play();
 
145
                        }
 
146
                };
 
147
 
 
148
                doh._jumpToSuite = function(e){
 
149
                        var node = findTarget(e ? e.target : window.event.srcElement);
 
150
                        if(!node){
 
151
                                return;
 
152
                        }
 
153
                        var _g = node.getAttribute('_target');
 
154
                        var gn = getGroupNode(_g);
 
155
                        if(!gn){
 
156
                                return;
 
157
                        }
 
158
                        gn.scrollIntoView();
 
159
                };
 
160
 
 
161
                doh._init = (function(oi){
 
162
                        return function(){
 
163
                                var lb = byId("logBody");
 
164
                                if(lb){
 
165
                                        // clear the console before each run
 
166
                                        while(lb.firstChild){
 
167
                                                lb.removeChild(lb.firstChild);
 
168
                                        }
 
169
                                        _loggedMsgLen = 0;
 
170
                                }
 
171
                                this._totalTime = 0;
 
172
                                this._suiteCount = 0;
 
173
                                oi.apply(doh, arguments);
 
174
                        }
 
175
                })(doh._init);
 
176
 
 
177
                doh._setupGroupForRun = (function(os){
 
178
                        //overload _setupGroupForRun to record which log line to jump to when a suite is clicked
 
179
                        return function(groupName){
 
180
                                var tg = doh._groups[groupName];
 
181
                                doh._curTestCount = tg.length;
 
182
                                doh._curGroupCount = 1;
 
183
                                var gn = getGroupNode(groupName);
 
184
                                if(gn){
 
185
                                        //two lines will be added, scroll the second line into view
 
186
                                        gn.getElementsByTagName("td")[2].setAttribute('_target',_loggedMsgLen+1);
 
187
                                }
 
188
                                os.apply(doh,arguments);
 
189
                        }
 
190
                })(doh._setupGroupForRun);
 
191
 
 
192
                doh._report = (function(or){
 
193
                        //overload _report to insert a tfoot
 
194
                        return function(){
 
195
                                var tb = byId("testList");
 
196
                                if(tb){
 
197
                                        var tfoots=tb.getElementsByTagName('tfoot');
 
198
                                        if(tfoots.length){
 
199
                                                tb.removeChild(tfoots[0]);
 
200
                                        }
 
201
                                        var foot = tb.createTFoot();
 
202
                                        var row = foot.insertRow(-1);
 
203
                                        row.className = 'inProgress';
 
204
                                        var cell=row.insertCell(-1);
 
205
                                        cell.colSpan=2;
 
206
                                        cell.innerHTML="Result";
 
207
                                        cell = row.insertCell(-1);
 
208
                                        cell.innerHTML=this._testCount+" tests in "+this._groupCount+" groups /<span class='failure'>"+this._errorCount+"</span> errors, <span class='failure'>"+this._failureCount+"</span> failures";
 
209
                                        cell.setAttribute('_target',_loggedMsgLen+1);
 
210
                                        row.insertCell(-1).innerHTML=doh._totalTime+"ms";
 
211
                                }
 
212
 
 
213
                                //This location can do the final performance rendering for the results
 
214
                                //of any performance tests.
 
215
                                var plotResults = null;
 
216
                                var standby;
 
217
                                if(doh.perfTestResults){
 
218
                                        if(window.dojo){
 
219
                                                //If we have dojo and here are perf tests results,
 
220
                                                //well, we'll use the dojo charting functions
 
221
                                                dojo.require("dojox.charting.Chart2D");
 
222
                                                dojo.require("dojox.charting.DataChart");
 
223
                                                dojo.require("dojox.charting.plot2d.Scatter");
 
224
                                                dojo.require("dojox.charting.plot2d.Lines");
 
225
                                                dojo.require("dojo.data.ItemFileReadStore");
 
226
                                                plotResults = doh._dojoPlotPerfResults;
 
227
                                        }else{
 
228
                                                plotResults = doh._asciiPlotPerfResults;
 
229
                                        }
 
230
                                        try{
 
231
                                                var g;
 
232
                                                var pBody = byId("perfTestsBody");
 
233
                                                var chartsToRender = [];
 
234
 
 
235
                                                if(doh.perfTestResults){
 
236
                                                        doh.showPerfTestsPage();
 
237
                                                }
 
238
                                                for(g in doh.perfTestResults){
 
239
                                                        var grp = doh.perfTestResults[g];
 
240
                                                        var hdr = document.createElement("h1");
 
241
                                                        hdr.appendChild(document.createTextNode("Group: " + g));
 
242
                                                        pBody.appendChild(hdr);
 
243
                                                        var ind = document.createElement("blockquote");
 
244
                                                        pBody.appendChild(ind);
 
245
                                                        var f;
 
246
                                                        for(f in grp){
 
247
                                                                var fResults = grp[f];
 
248
                                                                if(!fResults){ continue; }
 
249
                                                                var fhdr = document.createElement("h3");
 
250
                                                                fhdr.appendChild(document.createTextNode("TEST: " + f));
 
251
                                                                fhdr.style.textDecoration = "underline";
 
252
                                                                ind.appendChild(fhdr);
 
253
                                                                var div = document.createElement("div");
 
254
                                                                ind.appendChild(div);
 
255
 
 
256
                                                                //Figure out the basic info
 
257
                                                                var results = "<b>TRIAL SIZE: </b>"  + fResults.trials[0].testIterations + " iterations<br>" +
 
258
                                                                        "<b>NUMBER OF TRIALS: </b>" + fResults.trials.length + "<br>";
 
259
 
 
260
                                                                //Figure out the average test pass cost.
 
261
                                                                var i;
 
262
                                                                var iAvgArray = [];
 
263
                                                                var tAvgArray = [];
 
264
                                                                for(i = 0; i < fResults.trials.length; i++){
 
265
                                                                        iAvgArray.push(fResults.trials[i].average);
 
266
                                                                        tAvgArray.push(fResults.trials[i].executionTime);
 
267
                                                                }
 
268
                                                                results += "<b>AVERAGE TRIAL EXECUTION TIME: </b>" + doh.average(tAvgArray).toFixed(10) + "ms.<br>";
 
269
                                                                results += "<b>MAXIMUM TEST ITERATION TIME: </b>" + doh.max(iAvgArray).toFixed(10) + "ms.<br>";
 
270
                                                                results += "<b>MINIMUM TEST ITERATION TIME: </b>" + doh.min(iAvgArray).toFixed(10) + "ms.<br>";
 
271
                                                                results += "<b>AVERAGE TEST ITERATION TIME: </b>" + doh.average(iAvgArray).toFixed(10) + "ms.<br>";
 
272
                                                                results += "<b>MEDIAN TEST ITERATION TIME: </b>" + doh.median(iAvgArray).toFixed(10) + "ms.<br>";
 
273
                                                                results += "<b>VARIANCE TEST ITERATION TIME: </b>" + doh.variance(iAvgArray).toFixed(10) + "ms.<br>";
 
274
                                                                results += "<b>STANDARD DEVIATION ON TEST ITERATION TIME: </b>" + doh.standardDeviation(iAvgArray).toFixed(10) + "ms.<br>";
 
275
 
 
276
                                                                //Okay, attach it all in.
 
277
                                                                div.innerHTML = results;
 
278
 
 
279
                                                                div = document.createElement("div");
 
280
                                                                div.innerHTML = "<h3>Average Test Execution Time (in milliseconds, with median line)</h3>";
 
281
                                                                ind.appendChild(div);
 
282
                                                                div = document.createElement("div");
 
283
                                                                dojo.style(div, "width", "600px");
 
284
                                                                dojo.style(div, "height", "250px");
 
285
                                                                ind.appendChild(div);
 
286
                                                                chartsToRender.push({
 
287
                                                                        div: div,
 
288
                                                                        title: "Average Test Execution Time",
 
289
                                                                        data: iAvgArray
 
290
                                                                });
 
291
 
 
292
                                                                div = document.createElement("div");
 
293
                                                                div.innerHTML = "<h3>Average Trial Execution Time (in milliseconds, with median line)</h3>";
 
294
                                                                ind.appendChild(div);
 
295
                                                                div = document.createElement("div");
 
296
                                                                dojo.style(div, "width", "600px");
 
297
                                                                dojo.style(div, "height", "250px");
 
298
                                                                ind.appendChild(div);
 
299
                                                                chartsToRender.push({
 
300
                                                                        div: div,
 
301
                                                                        title: "Average Trial Execution Time",
 
302
                                                                        data: tAvgArray
 
303
                                                                });
 
304
                                                        }
 
305
                                                }
 
306
 
 
307
                                                //Lazy-render these to give the browser time and not appear locked.
 
308
                                                var delayedRenders = function() {
 
309
                                                        if(chartsToRender.length){
 
310
                                                                var chartData = chartsToRender.shift();
 
311
                                                                plotResults(chartData.div, chartData.title, chartData.data);
 
312
                                                        }
 
313
                                                        doh.setTimeout(delayedRenders, 50);
 
314
                                                };
 
315
                                                doh.setTimeout(delayedRenders, 150);
 
316
                                        }catch(e){
 
317
                                                doh.debug(e);
 
318
                                        }
 
319
                                }
 
320
                                or.apply(doh,arguments);
 
321
                        }
 
322
                })(doh._report);
 
323
 
 
324
                if(this["opera"] && opera.postError){
 
325
                        doh.debug = function(){
 
326
                                var msg = "";
 
327
                                for(var x=0; x<arguments.length; x++){
 
328
                                        msg += " "+arguments[x];
 
329
                                }
 
330
                                sendToLogPane([msg]);
 
331
                                opera.postError("DEBUG:"+msg);
 
332
                        }
 
333
                }else if(window["console"]){
 
334
                        doh.debug = function(){
 
335
                                var msg = "";
 
336
                                for(var x=0; x<arguments.length; x++){
 
337
                                        msg += " "+arguments[x];
 
338
                                }
 
339
                                sendToLogPane([msg]);
 
340
                                console.log("DEBUG:"+msg);
 
341
                        };
 
342
                }else{
 
343
                        doh.debug = function(){
 
344
                                sendToLogPane.call(window, arguments);
 
345
                        }
 
346
                }
 
347
 
 
348
                var loaded = false;
 
349
                var groupTemplate = null;
 
350
                var testTemplate = null;
 
351
 
 
352
                var groupNodes = {};
 
353
 
 
354
                var _groupTogglers = {};
 
355
 
 
356
                var _getGroupToggler = function(group, toggle){
 
357
                        if(_groupTogglers[group]){ return _groupTogglers[group]; }
 
358
                        var rolledUp = true;
 
359
                        return (_groupTogglers[group] = function(evt, forceOpen){
 
360
                                var nodes = groupNodes[group].__items;
 
361
                                var x;
 
362
                                if(rolledUp||forceOpen){
 
363
                                        rolledUp = false;
 
364
                                        for(x=0; x<nodes.length; x++){
 
365
                                                nodes[x].style.display = "";
 
366
                                        }
 
367
                                        toggle.innerHTML = "&#9660;";
 
368
                                }else{
 
369
                                        rolledUp = true;
 
370
                                        for(x=0; x<nodes.length; x++){
 
371
                                                nodes[x].style.display = "none";
 
372
                                        }
 
373
                                        toggle.innerHTML = "&#9658;";
 
374
                                }
 
375
                        });
 
376
                };
 
377
 
 
378
                var addGroupToList = function(group){
 
379
                        if(!byId("testList")){ return; }
 
380
                        var tb = byId("testList").tBodies[0];
 
381
                        var tg = groupTemplate.cloneNode(true);
 
382
                        var tds = tg.getElementsByTagName("td");
 
383
                        var toggle = tds[0];
 
384
                        toggle.onclick = _getGroupToggler(group, toggle);
 
385
                        var cb = tds[1].getElementsByTagName("input")[0];
 
386
                        cb.group = group;
 
387
                        cb.onclick = function(evt){
 
388
                                doh._groups[group].skip = (!this.checked);
 
389
                        }
 
390
                        tds[2].innerHTML = "<div class='testGroupName'>"+group+"</div><div style='width:0;'>&nbsp;</div>";
 
391
                        tds[3].innerHTML = "";
 
392
 
 
393
                        tb.appendChild(tg);
 
394
                        return tg;
 
395
                }
 
396
 
 
397
                var addFixtureToList = function(group, fixture){
 
398
                        if(!testTemplate){ return; }
 
399
                        var cgn = groupNodes[group];
 
400
                        if(!cgn["__items"]){ cgn.__items = []; }
 
401
                        var tn = testTemplate.cloneNode(true);
 
402
                        var tds = tn.getElementsByTagName("td");
 
403
 
 
404
                        tds[2].innerHTML = fixture.name;
 
405
                        tds[3].innerHTML = "";
 
406
 
 
407
                        var nn = (cgn.__lastFixture||cgn.__groupNode).nextSibling;
 
408
                        if(nn){
 
409
                                nn.parentNode.insertBefore(tn, nn);
 
410
                        }else{
 
411
                                cgn.__groupNode.parentNode.appendChild(tn);
 
412
                        }
 
413
                        // FIXME: need to make group display toggleable!!
 
414
                        tn.style.display = "none";
 
415
                        cgn.__items.push(tn);
 
416
                        return (cgn.__lastFixture = tn);
 
417
                }
 
418
 
 
419
                var getFixtureNode = function(group, fixture){
 
420
                        if(groupNodes[group]){
 
421
                                return groupNodes[group][fixture.name];
 
422
                        }
 
423
                        return null;
 
424
                }
 
425
 
 
426
                var getGroupNode = function(group){
 
427
                        if(groupNodes[group]){
 
428
                                return groupNodes[group].__groupNode;
 
429
                        }
 
430
                        return null;
 
431
                }
 
432
 
 
433
                var updateBacklog = [];
 
434
                doh._updateTestList = function(group, fixture, unwindingBacklog){
 
435
                        if(!loaded){
 
436
                                if(group && fixture){
 
437
                                        updateBacklog.push([group, fixture]);
 
438
                                }
 
439
                                return;
 
440
                        }else if(updateBacklog.length && !unwindingBacklog){
 
441
                                var tr;
 
442
                                while((tr=updateBacklog.shift())){
 
443
                                        doh._updateTestList(tr[0], tr[1], true);
 
444
                                }
 
445
                        }
 
446
                        if(group && fixture){
 
447
                                if(!groupNodes[group]){
 
448
                                        groupNodes[group] = {
 
449
                                                "__groupNode": addGroupToList(group)
 
450
                                        };
 
451
                                }
 
452
                                if(!groupNodes[group][fixture.name]){
 
453
                                        groupNodes[group][fixture.name] = addFixtureToList(group, fixture)
 
454
                                }
 
455
                        }
 
456
                }
 
457
 
 
458
                doh._testRegistered = doh._updateTestList;
 
459
 
 
460
                doh._groupStarted = function(group){
 
461
                        if(this._suiteCount == 0){
 
462
                                this._runedSuite = 0;
 
463
                                this._currentGlobalProgressBarWidth = 0;
 
464
                                this._suiteCount = this._testCount;
 
465
                        }
 
466
                        // console.debug("_groupStarted", group);
 
467
                        if(doh._inGroup != group){
 
468
                                doh._groupTotalTime = 0;
 
469
                                doh._runed = 0;
 
470
                                doh._inGroup = group;
 
471
                                this._runedSuite++;
 
472
                        }
 
473
                        var gn = getGroupNode(group);
 
474
                        if(gn){
 
475
                                gn.className = "inProgress";
 
476
                        }
 
477
                }
 
478
 
 
479
                doh._groupFinished = function(group, success){
 
480
                        // console.debug("_groupFinished", group);
 
481
                        var gn = getGroupNode(group);
 
482
                        if(gn && doh._inGroup == group){
 
483
                                doh._totalTime += doh._groupTotalTime;
 
484
                                gn.getElementsByTagName("td")[3].innerHTML = doh._groupTotalTime+"ms";
 
485
                                gn.getElementsByTagName("td")[2].lastChild.className = "";
 
486
                                doh._inGroup = null;
 
487
                                //doh._runedSuite++;
 
488
                                var failure = doh._updateGlobalProgressBar(this._runedSuite/this._groupCount,success,group);
 
489
                                gn.className = failure ? "failure" : "success";
 
490
                                //doh._runedSuite--;
 
491
                                doh._currentGlobalProgressBarWidth = parseInt(this._runedSuite/this._groupCount*10000)/100;
 
492
                                //byId("progressOuter").style.width = parseInt(this._runedSuite/this._suiteCount*100)+"%";
 
493
                        }
 
494
                        if(doh._inGroup == group){
 
495
                                this.debug("Total time for GROUP \"",group,"\" is ",doh._groupTotalTime,"ms");
 
496
                        }
 
497
                }
 
498
 
 
499
                doh._testStarted = function(group, fixture){
 
500
                        // console.debug("_testStarted", group, fixture.name);
 
501
                        var fn = getFixtureNode(group, fixture);
 
502
                        if(fn){
 
503
                                fn.className = "inProgress";
 
504
                        }
 
505
                }
 
506
 
 
507
                var _nameTimes = {};
 
508
                var _playSound = function(name){
 
509
                        if(byId("hiddenAudio") && byId("audio") && byId("audio").checked){
 
510
                                // console.debug("playing:", name);
 
511
                                var nt = _nameTimes[name];
 
512
                                // only play sounds once every second or so
 
513
                                if((!nt)||(((new Date)-nt) > 700)){
 
514
                                        _nameTimes[name] = new Date();
 
515
                                        var tc = document.createElement("span");
 
516
                                        byId("hiddenAudio").appendChild(tc);
 
517
                                        tc.innerHTML = '<embed src="_sounds/'+name+'.wav" autostart="true" loop="false" hidden="true" width="1" height="1"></embed>';
 
518
                                }
 
519
                        }
 
520
                }
 
521
 
 
522
                doh._updateGlobalProgressBar = function(p,success,group){
 
523
                        var outerContainer=byId("progressOuter");
 
524
 
 
525
                        var gdiv=outerContainer.childNodes[doh._runedSuite-1];
 
526
                        if(!gdiv){
 
527
                                gdiv=document.createElement('div');
 
528
                                outerContainer.appendChild(gdiv);
 
529
                                gdiv.className='success';
 
530
                                gdiv.setAttribute('_target',group);
 
531
                        }
 
532
                        if(!success && !gdiv._failure){
 
533
                                gdiv._failure=true;
 
534
                                gdiv.className='failure';
 
535
                                if(group){
 
536
                                        gdiv.setAttribute('title','failed group '+group);
 
537
                                }
 
538
                        }
 
539
                        var tp=parseInt(p*10000)/100;
 
540
                        gdiv.style.width = (tp-doh._currentGlobalProgressBarWidth)+"%";
 
541
                        return gdiv._failure;
 
542
                }
 
543
                doh._testFinished = function(group, fixture, success){
 
544
                        var fn = getFixtureNode(group, fixture);
 
545
                        var elapsed = fixture.endTime-fixture.startTime;
 
546
                        if(fn){
 
547
                                fn.getElementsByTagName("td")[3].innerHTML = elapsed+"ms";
 
548
                                fn.className = (success) ? "success" : "failure";
 
549
                                fn.getElementsByTagName("td")[2].setAttribute('_target', _loggedMsgLen);
 
550
                                if(!success){
 
551
                                        _playSound("doh");
 
552
                                        var gn = getGroupNode(group);
 
553
                                        if(gn){
 
554
                                                gn.className = "failure";
 
555
                                                _getGroupToggler(group)(null, true);
 
556
                                        }
 
557
                                }
 
558
                        }
 
559
                        if(doh._inGroup == group){
 
560
                                var gn = getGroupNode(group);
 
561
                                doh._runed++;
 
562
                                if(gn && doh._curTestCount){
 
563
                                        var p = doh._runed/doh._curTestCount;
 
564
                                        var groupfail = this._updateGlobalProgressBar((doh._runedSuite+p-1)/doh._groupCount,success,group);
 
565
 
 
566
                                        var pbar = gn.getElementsByTagName("td")[2].lastChild;
 
567
                                        pbar.className = groupfail?"failure":"success";
 
568
                                        pbar.style.width = parseInt(p*100)+"%";
 
569
                                        gn.getElementsByTagName("td")[3].innerHTML = parseInt(p*10000)/100+"%";
 
570
                                }
 
571
                        }
 
572
                        this._groupTotalTime += elapsed;
 
573
                        this.debug((success ? "PASSED" : "FAILED"), "test:", fixture.name, elapsed, 'ms');
 
574
                }
 
575
 
 
576
                // FIXME: move implementation to _browserRunner?
 
577
                doh.registerUrl = function(     /*String*/ group,
 
578
                                                                                /*String*/ url,
 
579
                                                                                /*Integer*/ timeout){
 
580
                        var tg = new String(group);
 
581
                        this.register(group, {
 
582
                                name: url,
 
583
                                setUp: function(){
 
584
                                        doh.currentGroupName = tg;
 
585
                                        doh.currentGroup = this;
 
586
                                        doh.currentUrl = url;
 
587
                                        this.d = new doh.Deferred();
 
588
                                        doh.currentTestDeferred = this.d;
 
589
                                        doh.showTestPage();
 
590
                                        byId("testBody").src = url;
 
591
                                },
 
592
                                timeout: timeout||10000, // 10s
 
593
                                // timeout: timeout||1000, // 10s
 
594
                                runTest: function(){
 
595
                                        // FIXME: implement calling into the url's groups here!!
 
596
                                        return this.d;
 
597
                                },
 
598
                                tearDown: function(){
 
599
                                        doh.currentGroupName = null;
 
600
                                        doh.currentGroup = null;
 
601
                                        doh.currentTestDeferred = null;
 
602
                                        doh.currentUrl = null;
 
603
                                        // this.d.errback(false);
 
604
                                        // byId("testBody").src = "about:blank";
 
605
                                        doh.showLogPage();
 
606
                                }
 
607
                        });
 
608
                }
 
609
 
 
610
                //
 
611
                // Utility code for runner.html
 
612
                //
 
613
                // var isSafari = navigator.appVersion.indexOf("Safari") >= 0;
 
614
                var tabzidx = 1;
 
615
                var _showTab = function(toShow, toHide){
 
616
                        // FIXME: I don't like hiding things this way.
 
617
                        var i;
 
618
                        for(i = 0; i < toHide.length; i++){
 
619
                                var node = byId(toHide[i]);
 
620
                                if(node){
 
621
                                        node.style.display="none";
 
622
                                }
 
623
                        }
 
624
                        toShow = byId(toShow);
 
625
                        if(toShow){
 
626
                                with(toShow.style){
 
627
                                        display = "";
 
628
                                        zIndex = ++tabzidx;
 
629
                                }
 
630
                        }
 
631
                }
 
632
 
 
633
                doh.showTestPage = function(){
 
634
                        _showTab("testBody", ["logBody", "perfTestsBody"]);
 
635
                }
 
636
 
 
637
                doh.showLogPage = function(){
 
638
                        _showTab("logBody", ["testBody", "perfTestsBody"]);
 
639
                }
 
640
 
 
641
                doh.showPerfTestsPage = function(){
 
642
                        _showTab("perfTestsBody", ["testBody", "logBody"]);
 
643
                }
 
644
 
 
645
                var runAll = true;
 
646
                doh.toggleRunAll = function(){
 
647
                        // would be easier w/ query...sigh
 
648
                        runAll = !runAll;
 
649
                        if(!byId("testList")){ return; }
 
650
                        var tb = byId("testList").tBodies[0];
 
651
                        var inputs = tb.getElementsByTagName("input");
 
652
                        var x=0; var tn;
 
653
                        while((tn=inputs[x++])){
 
654
                                tn.checked = runAll;
 
655
                                doh._groups[tn.group].skip = (!runAll);
 
656
                        }
 
657
                }
 
658
 
 
659
                var listHeightTimer = null;
 
660
                var setListHeight = function(){
 
661
                        if(listHeightTimer){
 
662
                                clearTimeout(listHeightTimer);
 
663
                        }
 
664
                        var tl = byId("testList");
 
665
                        if(!tl){ return; }
 
666
                        listHeightTimer = doh.setTimeout(function(){
 
667
                                tl.style.display = "none";
 
668
                                tl.style.display = "";
 
669
 
 
670
                        }, 10);
 
671
                }
 
672
 
 
673
                _addOnEvt("resize", setListHeight);
 
674
                _addOnEvt("load", setListHeight);
 
675
                _addOnEvt("load", function(){
 
676
                        if(loaded){ return; }
 
677
                        loaded = true;
 
678
                        groupTemplate = byId("groupTemplate");
 
679
                        if(!groupTemplate){
 
680
                                // make sure we've got an ammenable DOM structure
 
681
                                return;
 
682
                        }
 
683
                        groupTemplate.parentNode.removeChild(groupTemplate);
 
684
                        groupTemplate.style.display = "";
 
685
                        testTemplate = byId("testTemplate");
 
686
                        testTemplate.parentNode.removeChild(testTemplate);
 
687
                        testTemplate.style.display = "";
 
688
                        doh._updateTestList();
 
689
                });
 
690
 
 
691
                _addOnEvt("load",
 
692
                        function(){
 
693
                                // let robot code run if it gets to this first
 
694
                                var __onEnd = doh._onEnd;
 
695
                                doh._onEnd = function(){
 
696
                                        __onEnd.apply(doh, arguments);
 
697
                                        if(doh._failureCount == 0){
 
698
                                                doh.debug("WOOHOO!!");
 
699
                                                _playSound("woohoo");
 
700
                                        }else{
 
701
                                                console.debug("doh._failureCount:", doh._failureCount);
 
702
                                        }
 
703
                                        if(byId("play")){
 
704
                                                toggleRunning();
 
705
                                        }
 
706
                                }
 
707
                                if(!byId("play")){
 
708
                                        // make sure we've got an amenable DOM structure
 
709
                                        return;
 
710
                                }
 
711
                                var isRunning = false;
 
712
                                var toggleRunning = function(){
 
713
                                        // ugg, this would be so much better w/ dojo.query()
 
714
                                        if(isRunning){
 
715
                                                byId("play").style.display = byId("pausedMsg").style.display = "";
 
716
                                                byId("playingMsg").style.display = byId("pause").style.display = "none";
 
717
                                                isRunning = false;
 
718
                                        }else{
 
719
                                                byId("play").style.display = byId("pausedMsg").style.display = "none";
 
720
                                                byId("playingMsg").style.display = byId("pause").style.display = "";
 
721
                                                isRunning = true;
 
722
                                        }
 
723
                                }
 
724
                                doh.run = (function(oldRun){
 
725
                                        return function(){
 
726
                                                if(!doh._currentGroup){
 
727
                                                        toggleRunning();
 
728
                                                }
 
729
                                                return oldRun.apply(doh, arguments);
 
730
                                        }
 
731
                                })(doh.run);
 
732
                                var btns = byId("toggleButtons").getElementsByTagName("span");
 
733
                                var node; var idx=0;
 
734
                                while((node=btns[idx++])){
 
735
                                        node.onclick = toggleRunning;
 
736
                                }
 
737
 
 
738
                                //Performance report generating functions!
 
739
                                doh._dojoPlotPerfResults = function(div, name, dataArray) {
 
740
                                        var median = doh.median(dataArray);
 
741
                                        var medarray = [];
 
742
 
 
743
                                        var i;
 
744
                                        for(i = 0; i < dataArray.length; i++){
 
745
                                                medarray.push(median);
 
746
                                        }
 
747
 
 
748
                                        var data = {
 
749
                                                label: "name",
 
750
                                                items: [
 
751
                                                        {name: name, trials: dataArray},
 
752
                                                        {name: "Median", trials: medarray}
 
753
                                                ]
 
754
                                        };
 
755
                                        var ifs = new dojo.data.ItemFileReadStore({data: data});
 
756
 
 
757
                                        var min = Math.floor(doh.min(dataArray));
 
758
                                        var max = Math.ceil(doh.max(dataArray));
 
759
                                        var step = (max - min)/10;
 
760
 
 
761
                                        //Lets try to pad out the bottom and top a bit
 
762
                                        //Then recalc the step.
 
763
                                        if(min > 0){
 
764
                                                min = min - step;
 
765
                                                if(min < 0){
 
766
                                                        min = 0;
 
767
                                                }
 
768
                                                min = Math.floor(min);
 
769
                                        }
 
770
                                        if(max > 0){
 
771
                                                max = max + step;
 
772
                                                max = Math.ceil(max);
 
773
                                        }
 
774
                                        step = (max - min)/10;
 
775
 
 
776
                                        var chart = new dojox.charting.DataChart(div, {
 
777
                                                type: dojox.charting.plot2d.Lines,
 
778
                                                displayRange:dataArray.length,
 
779
                                                xaxis: {min: 1, max: dataArray.length, majorTickStep: Math.ceil((dataArray.length - 1)/10), htmlLabels: false},
 
780
                                                yaxis: {min: min, max: max, majorTickStep: step, vertical: true, htmlLabels: false}
 
781
                                        });
 
782
                                        chart.setStore(ifs, {name:"*"}, "trials");
 
783
                                };
 
784
 
 
785
                                doh._asciiPlotPerfResults = function(){
 
786
                                        //TODO:  Implement!
 
787
                                };
 
788
                        }
 
789
                );
 
790
        }else{
 
791
                // we're in an iframe environment. Time to mix it up a bit.
 
792
 
 
793
                _doh = window.parent.doh;
 
794
                var _thisGroup = _doh.currentGroupName;
 
795
                var _thisUrl = _doh.currentUrl;
 
796
                if(_thisGroup){
 
797
                        doh._testRegistered = function(group, tObj){
 
798
                                _doh._updateTestList(_thisGroup, tObj);
 
799
                        }
 
800
                        doh._onEnd = function(){
 
801
                                _doh._errorCount += doh._errorCount;
 
802
                                _doh._failureCount += doh._failureCount;
 
803
                                _doh._testCount += doh._testCount;
 
804
                                // should we be really adding raw group counts?
 
805
                                //_doh._groupCount += doh._groupCount;
 
806
                                _doh.currentTestDeferred.callback(true);
 
807
                        }
 
808
                        var otr = doh._getTestObj;
 
809
                        doh._getTestObj = function(){
 
810
                                var tObj = otr.apply(doh, arguments);
 
811
                                tObj.name = _thisUrl+"::"+arguments[0]+"::"+tObj.name;
 
812
                                return tObj;
 
813
                        }
 
814
                        doh.debug = doh.hitch(_doh, "debug");
 
815
                        doh.registerUrl = doh.hitch(_doh, "registerUrl");
 
816
                        doh._testStarted = function(group, fixture){
 
817
                                _doh._testStarted(_thisGroup, fixture);
 
818
                        }
 
819
                        doh._testFinished = function(g, f, s){
 
820
                                _doh._testFinished(_thisGroup, f, s);
 
821
 
 
822
                                //Okay, there may be performance info we need to filter back
 
823
                                //to the parent, so do that here.
 
824
                                if(doh.perfTestResults){
 
825
                                        try{
 
826
                                                gName = g.toString();
 
827
                                                var localFName = f.name;
 
828
                                                while(localFName.indexOf("::") >= 0){
 
829
                                                        localFName = localFName.substring(localFName.indexOf("::") + 2, localFName.length);
 
830
                                                }
 
831
                                                if(!_doh.perfTestResults){
 
832
                                                        _doh.perfTestResults = {};
 
833
                                                }
 
834
                                                if(!_doh.perfTestResults[gName]){
 
835
                                                        _doh.perfTestResults[gName] = {};
 
836
                                                }
 
837
                                                _doh.perfTestResults[gName][f.name] = doh.perfTestResults[gName][localFName];
 
838
                                        }catch (e){
 
839
                                                doh.debug(e);
 
840
                                        }
 
841
                                }
 
842
                        }
 
843
                        doh._groupStarted = function(g){
 
844
                                if(!this._setParent){
 
845
                                        _doh._curTestCount = this._testCount;
 
846
                                        _doh._curGroupCount = this._groupCount;
 
847
                                        this._setParent = true;
 
848
                                }
 
849
                        }
 
850
                        doh._report = function(){
 
851
                        };
 
852
                }
 
853
        }
 
854
 
 
855
})();