Index: chrome/test/data/dromaeo/webrunner.js |
=================================================================== |
--- chrome/test/data/dromaeo/webrunner.js (revision 0) |
+++ chrome/test/data/dromaeo/webrunner.js (revision 0) |
@@ -0,0 +1,760 @@ |
+(function(){ |
+ |
+ // Populated from: http://www.medcalc.be/manual/t-distribution.php |
+ // 95% confidence for N - 1 = 4 |
+ var tDistribution = 2.776; |
+ |
+ // The number of individual test iterations to do |
+ var numTests = 5; |
+ |
+ // The type of run that we're doing (options are "runs/s" or "ms") |
+ var runStyle = "runs/s"; |
+ |
+ // A rough estimate, in seconds, of how long it'll take each test |
+ // iteration to run |
+ var timePerTest = runStyle === "runs/s" ? 1 : 0.5; |
+ |
+ // Initialize a batch of tests |
+ // name = The name of the test collection |
+ this.startTest = function(name, version){ |
+ numloaded++; |
+ if ( numloaded == totalTests ) |
+ setTimeout( init, 100 ); |
+ |
+ testName = name; |
+ if ( !queues[testName] ) return; |
+ testID = testName; |
+ testNames[testID] = testName; |
+ testVersions[testID] = version || 0; |
+ testSummary[testID] = testSummaryNum[testID] = testDone[testID] = testNum[testID] = 0; |
+ |
+ queues[testID].push(function(){ |
+ summary = 0; |
+ dequeue(); |
+ }); |
+ }; |
+ |
+ // Anything that you want to have run in order, but not actually test |
+ this.prep = function(fn){ |
+ if ( !queues[testName] ) return; |
+ queues[testID].push(function(){ |
+ fn(); |
+ dequeue(); |
+ }); |
+ }; |
+ |
+ // End the tests and finalize the report |
+ this.endTest = function(){ |
+ if ( !queues[testName] ) return; |
+ // Save the summary output until all the test are complete |
+ queues[testID].push(function(){ |
+ dequeue(); |
+ }); |
+ }; |
+ |
+ // Run a new test |
+ // name = The unique name of the test |
+ // num = The 'length' of the test (length of string, # of tests, etc.) |
+ // fn = A function holding the test to run |
+ this.test = function(name, num, fn){ |
+ if ( !queues[testName] ) return; |
+ // Save the summary output until all the test are complete |
+ var curTest = testName, curID = testID; |
+ |
+ if ( arguments.length === 3 ) { |
+ if ( !nameDone[name] ) |
+ nameDone[name] = 0; |
+ nameDone[name]++; |
+ |
+ if ( nameDone[name] != 3 ) |
+ return; |
+ } else { |
+ fn = num; |
+ num = 1; |
+ } |
+ |
+ time += timePerTest * numTests; |
+ |
+ testNum[curID]++; |
+ |
+ // Don't execute the test immediately |
+ queues[testID].push(function(){ |
+ title = name; |
+ var times = [], start, pos = 0, cur; |
+ |
+ setTimeout(function(){ |
+ // run tests |
+ try { |
+ if ( doShark(name) ) { |
+ connectShark(); |
+ startShark(); |
+ } |
+ |
+ start = (new Date()).getTime(); |
+ |
+ if ( runStyle === "runs/s" ) { |
+ var runs = 0; |
+ |
+ cur = (new Date()).getTime(); |
+ |
+ while ( (cur - start) < 1000 ) { |
+ fn(); |
+ cur = (new Date()).getTime(); |
+ runs++; |
+ } |
+ } else { |
+ fn(); |
+ cur = (new Date()).getTime(); |
+ } |
+ |
+ if ( doShark(name) ) { |
+ stopShark(); |
+ disconnectShark(); |
+ } |
+ |
+ // For making Median and Variance |
+ if ( runStyle === "runs/s" ) { |
+ times.push( (runs * 1000) / (cur - start) ); |
+ } else { |
+ times.push( cur - start ); |
+ } |
+ } catch( e ) { |
+ alert("FAIL " + name + " " + num + e); |
+ return; |
+ } |
+ |
+ if ( pos < numTests ) { |
+ updateTime(); |
+ updateTestPos({curID: curID, collection: testNames[curID], version: testVersions[curID]}); |
+ } |
+ |
+ if ( ++pos < numTests ) { |
+ setTimeout( arguments.callee, 1 ); |
+ |
+ } else { |
+ var data = compute( times, numTests ); |
+ |
+ data.curID = curID; |
+ data.collection = testNames[curID]; |
+ data.version = testVersions[curID]; |
+ data.name = title; |
+ data.scale = num; |
+ |
+ logTest(data); |
+ |
+ dequeue(); |
+ } |
+ }, 1); |
+ }); |
+ |
+ function compute(times, runs){ |
+ var results = {runs: runs}, num = times.length; |
+ |
+ times = times.sort(function(a,b){ |
+ return a - b; |
+ }); |
+ |
+ // Make Sum |
+ results.sum = 0; |
+ |
+ for ( var i = 0; i < num; i++ ) |
+ results.sum += times[i]; |
+ |
+ // Make Min |
+ results.min = times[0]; |
+ |
+ // Make Max |
+ results.max = times[ num - 1 ]; |
+ |
+ // Make Mean |
+ results.mean = results.sum / num; |
+ |
+ // Make Median |
+ results.median = num % 2 == 0 ? |
+ (times[Math.floor(num/2)] + times[Math.ceil(num/2)]) / 2 : |
+ times[Math.round(num/2)]; |
+ |
+ // Make Variance |
+ results.variance = 0; |
+ |
+ for ( var i = 0; i < num; i++ ) |
+ results.variance += Math.pow(times[i] - results.mean, 2); |
+ |
+ results.variance /= num - 1; |
+ |
+ // Make Standard Deviation |
+ results.deviation = Math.sqrt( results.variance ); |
+ |
+ // Compute Standard Errors Mean |
+ results.sem = (results.deviation / Math.sqrt(results.runs)) * tDistribution; |
+ |
+ // Error |
+ results.error = ((results.sem / results.mean) * 100) || 0; |
+ |
+ return results; |
+ } |
+ }; |
+ |
+ // All the test data |
+ var tests; |
+ |
+ // The number of test files to load |
+ var totalTests = 0; |
+ |
+ // The number of test files loaded |
+ var numloaded = 0; |
+ |
+ // Queue of functions to run |
+ var queue = []; |
+ var queues = {}; |
+ |
+ var catnames = { |
+ dromaeo: "Dromaeo JavaScript Tests", |
+ sunspider: "SunSpider JavaScript Tests", |
+ "v8": "V8 JavaScript Tests", |
+ dom: "DOM Core Tests", |
+ jslib: "JavaScript Library Tests", |
+ cssquery: "CSS Selector Tests" |
+ }; |
+ |
+ |
+ var testElems = {}; |
+ var testNum = {}; |
+ var testDone = {}; |
+ var testNames = {}; |
+ var testVersions = {}; |
+ var dataStore = []; |
+ var names = []; |
+ var interval; |
+ var totalTime = 0; |
+ var time = 0; |
+ var title, testName, testID, testSummary = {} , testSummaryNum = {}, maxTotal = 0, maxTotalNum = 0; |
+ var nameDone = {}; |
+ |
+ // Query String Parsing |
+ var search = (window.location.search || "?").substr(1); |
+ |
+ search = search.replace(/&runStyle=([^&]+)/, function(all, type){ |
+ runStyle = type; |
+ return ""; |
+ }); |
+ |
+ var parts = search.split("&"); |
+ |
+ if ( parts[0] === "recommended" ) { |
+ parts[0] = "dromaeo|sunspider|v8|dom|jslib"; |
+ } |
+ |
+ var none = !parts[0] || parts[0].match(/=/); |
+ var filter = parts.length && !parts[0].match(/=/) && parts[0] !== "all" ? |
+ new RegExp(parts.shift(), "i") : |
+ /./; |
+ |
+ // To enable shark debugging add &shark to the end of the URL |
+ var doShark = function(name) { return false; }; |
+ for ( var i = 0; i < parts.length; i++ ) { |
+ var m = /^shark(?:=(.*))?$/.exec(parts[i]); |
+ if (m) { |
+ if (m[1] === undefined) { |
+ doShark = function(name) { return true; }; |
+ } |
+ else { |
+ var sharkMatch = new RegExp(m[1]); |
+ doShark = function(name) { |
+ return sharkMatch.test(name); |
+ }; |
+ } |
+ } |
+ |
+ m = /^numTests=(\d+)$/.exec(parts[i]); |
+ if (m) |
+ numTests = Number(m[1]); |
+ } |
+ |
+ jQuery(function(){ |
+ var id = search.match(/id=([\d,]+)/); |
+ |
+ if ( none && !id ) { |
+ $("#overview").hide(); |
+ return; |
+ } |
+ |
+ var cat = filter.toString().slice(1,-2); |
+ |
+ if ( catnames[cat] ) { |
+ $("#overview span:first").html( catnames[cat] ); |
+ |
+ if ( catnames[cat].length > 22 ) { |
+ $("#overview span:first").css("font-size", 22); |
+ } |
+ } |
+ |
+ $("#tests").hide(); |
+ |
+ jQuery.getJSON("tests/MANIFEST.json", function(json){ |
+ tests = json; |
+ |
+ names = []; |
+ |
+ for ( var name in tests ) |
+ // Don't load tests that we aren't looking for |
+ if ( filter.test( name ) ) |
+ names.push( name ); |
+ |
+ names = names.sort(function(a, b){ |
+ return tests[a].name < tests[b].name ? -1 : |
+ tests[a].name == tests[b].name ? 0 : 1; |
+ }); |
+ |
+ // Check if we're loading a specific result set |
+ // ?id=NUM |
+ if ( id ) { |
+ jQuery.ajax({ |
+ url: "store.php?id=" + id[1], |
+ dataType: "json", |
+ success: function(data){ |
+ resultsLoaded(id[1], data); |
+ } |
+ }); |
+ |
+ // Otherwise we're loading a normal set of tests |
+ } else { |
+ $("#wrapper").append("<br style='clear:both;'/><center><a href='?" + names.join("|") + "'>Re-run tests</a></center>"); |
+ |
+ for ( var i = 0; i < names.length; i++ ) (function(name){ |
+ var test = tests[name]; |
+ |
+ queues[name] = []; |
+ makeElem(name); |
+ initTest(name); |
+ |
+ totalTests++; |
+ |
+ // Check if we're loading an HTML file |
+ if ( test.file.match(/html$/) ) { |
+ var iframe = document.createElement("iframe"); |
+ iframe.style.height = "1px"; |
+ iframe.style.width = "1px"; |
+ iframe.src = "tests/" + test.file; |
+ document.body.appendChild( iframe ); |
+ |
+ // Otherwise we're loading a pure-JS test |
+ } else { |
+ jQuery.getScript("tests/" + test.file); |
+ } |
+ })(names[i]); |
+ } |
+ }); |
+ }); |
+ |
+ // Remove the next test from the queue and execute it |
+ function dequeue(){ |
+ if ( interval && queue.length ) { |
+ queue.shift()(); |
+ |
+ } else if ( queue.length == 0 ) { |
+ interval = false; |
+ time = 0; |
+ |
+ $("#overview input").remove(); |
+ updateTimebar(); |
+ |
+ if ( dataStore && dataStore.length ) { |
+ $("body").addClass("alldone"); |
+ var div = jQuery("<div class='results'>Saving...</div>").insertBefore("#overview"); |
+ jQuery.ajax({ |
+ type: "POST", |
+ url: "store.php", |
+ data: "data=" + encodeURIComponent(JSON.stringify(dataStore)) + "&style=" + runStyle, |
+ success: function(id){ |
+ var url = window.location.href.replace(/\?.*$/, "") + "?id=" + id; |
+ div.html("Results saved. You can access them at a later time at the following URL:<br/><strong><a href='" + url + "'>" + url + "</a></strong></div>"); |
+ } |
+ }); |
+ } |
+ } |
+ } |
+ |
+ function updateTimebar(){ |
+ $("#timebar").html("<span><strong>" + (runStyle === "runs/s" ? Math.pow(Math.E, maxTotal / maxTotalNum) : maxTotal).toFixed(2) + "</strong>" + runStyle + " (Total)</span>"); |
+ } |
+ |
+ // Run once all the test files are fully loaded |
+ function init(){ |
+ for ( var n = 0; n < names.length; n++ ) { |
+ queue = queue.concat( queues[ names[n] ] ); |
+ } |
+ |
+ totalTime = time; |
+ time += timePerTest; |
+ updateTime(); |
+ |
+ $("#pause") |
+ .val("Run") |
+ .click(function(){ |
+ if ( interval ) { |
+ interval = null; |
+ this.value = "Run"; |
+ } else { |
+ if ( !interval ) { |
+ interval = true; |
+ dequeue(); |
+ } |
+ this.value = "Pause"; |
+ } |
+ }); |
+ } |
+ |
+ function initTest(curID){ |
+ $("<div class='result-item'></div>") |
+ .append( testElems[ curID ] ) |
+ .append( "<p>" + (tests[curID] ? tests[ curID ].desc : "") + "<br/><a href='" + |
+ (tests[curID] && tests[curID].origin ? tests[ curID ].origin[1] : "") + "'>Origin</a>, <a href='tests/" + |
+ (tests[curID] ? tests[ curID ].file : "") + "'>Source</a>, <b>Tests:</b> " + |
+ (tests[curID] && tests[curID].tags ? tests[ curID ].tags.join(", ") : "") + "</p>" ) |
+ .append( "<ol class='results'></ol>" ) |
+ .appendTo("#main"); |
+ } |
+ |
+ function resultsLoaded(id, datas){ |
+ var results = {}; |
+ var runs = {}; |
+ var output = ""; |
+ var excluded = []; |
+ var overview = document.getElementById("overview"); |
+ |
+ for ( var d = 0; d < datas.length; d++ ) { |
+ var data = datas[d]; |
+ |
+ runStyle = data.style; |
+ |
+ if ( datas.length == 1 ) { |
+ $("#overview").before("<div class='results'>Viewing test run #" + id + |
+ ", run on: " + data.created_at + " by:<br>" + data.useragent + "</div>"); |
+ } |
+ |
+ runs[data.id] = data; |
+ runs[data.id].mean = 0; |
+ runs[data.id].error = 0; |
+ runs[data.id].num = 0; |
+ runs[data.id].name = (data.useragent.match(/(MSIE [\d.]+)/) || |
+ data.useragent.match(/((?:WebKit|Firefox|Shiretoko|Opera)\/[\w.]+)/) || [0,data.id])[1]; |
+ |
+ for ( var i = 0; i < data.results.length; i++ ) { |
+ var result = data.results[i]; |
+ var curID = result.collection; |
+ var run = result.run_id; |
+ |
+ result.version += data.style; |
+ |
+ if ( !results[curID] ) |
+ results[curID] = {tests:{}, total:{}, version: result.version}; |
+ |
+ if ( results[curID].version == result.version ) { |
+ if ( !results[curID].total[run] ) { |
+ results[curID].total[run] = {max:0, mean:0, median:0, min:0, deviation:0, error:0, num:0}; |
+ results[curID].tests[run] = []; |
+ } |
+ |
+ result.error = ((((result.deviation / Math.sqrt(result.runs)) * tDistribution) / result.mean) * 100) || 0; |
+ results[curID].tests[run].push( result ); |
+ |
+ var error = (parseFloat(result.error) / 100) * parseFloat(result.mean); |
+ error = (runStyle === "ms" ? error : error == 0 ? 0 : Math.log(error)); |
+ var total = results[curID].total[run]; |
+ total.num++; |
+ |
+ for ( var type in total ) { |
+ if ( type == "error" ) { |
+ total.error += error; |
+ } else if ( type == "mean" ) { |
+ total.mean += (runStyle === "ms" ? parseFloat(result.mean) : Math.log(parseFloat(result.mean))); |
+ } else if ( type !== "num" ) { |
+ total[type] += parseFloat(result[type]); |
+ } |
+ } |
+ |
+ runs[run].num++; |
+ runs[run].mean += runStyle === "ms" ? parseFloat(result.mean) : Math.log(parseFloat(result.mean)); |
+ runs[run].error += error; |
+ } |
+ } |
+ } |
+ |
+ var runTests = []; |
+ |
+ if ( datas.length == 1 ) { |
+ $("body").addClass("alldone"); |
+ |
+ for ( var i = 0; i < data.results.length; i++ ) { |
+ var item = data.results[i]; |
+ var result = item.curID = item.collection; |
+ |
+ if ( !filter.test(result) ) |
+ continue; |
+ |
+ if ( !testElems[result] ) { |
+ runTests.push(result); |
+ makeElem( result ); |
+ initTest( result ); |
+ } |
+ |
+ // Compute Standard Errors Mean |
+ item.sem = (item.deviation / Math.sqrt(item.runs)) * tDistribution; |
+ |
+ // Error |
+ item.error = ((item.sem / item.mean) * 100) || 0; |
+ |
+ logTest( item ); |
+ |
+ // testDone, testNum, testSummary |
+ testDone[ result ] = numTests - 1; |
+ testNum[ result ] = 1; |
+ |
+ updateTestPos( item ); |
+ } |
+ |
+ $("div.result-item").addClass("done"); |
+ |
+ totalTime = time = timePerTest; |
+ updateTime(); |
+ |
+ $("#overview input").remove(); |
+ updateTimebar(); |
+ } else { |
+ // Remove results where there is only one comparison set |
+ for ( var id in results ) { |
+ var num = 0; |
+ |
+ for ( var ntest in results[id].tests ) { |
+ num++; |
+ if ( num > 1 ) |
+ break; |
+ } |
+ |
+ if ( num <= 1 ) { |
+ excluded.push( id ); |
+ delete results[id]; |
+ } |
+ } |
+ |
+ var preoutput = "<tr><td></td>"; |
+ for ( var run in runs ) |
+ preoutput += "<th><a href='?id=" + run + "'>" + runs[run].name + "</a></th>"; |
+ //preoutput += "<th>Winning %</th></tr>"; |
+ preoutput += "</tr>"; |
+ |
+ for ( var result in results ) { |
+ // Skip results that we're filtering out |
+ if ( !filter.test(result) ) |
+ continue; |
+ |
+ runTests.push(result); |
+ |
+ if ( runStyle === "runs/s" ) { |
+ for ( var run in runs ) { |
+ var mean = results[result].total[run].mean - 0; |
+ var error = results[result].total[run].error - 0; |
+ |
+ mean = Math.pow(Math.E, mean / results[result].total[run].num); |
+ error = Math.pow(Math.E, error / results[result].total[run].num); |
+ results[result].total[run].mean = mean; |
+ results[result].total[run].error = error; |
+ } |
+ } |
+ |
+ var name = tests[result] ? tests[result].name : result; |
+ var tmp = processWinner(results[result].total); |
+ |
+ output += "<tr><th class='name'><span onclick='toggleResults(this.nextSibling);'>▶ </span>" + |
+ "<a href='' onclick='return toggleResults(this);'>" + name + "</a></th>"; |
+ |
+ for ( var run in runs ) { |
+ var mean = results[result].total[run].mean - 0; |
+ var error = results[result].total[run].error - 0; |
+ |
+ output += "<td class='" + (tmp[run] || '') + "'>" + mean.toFixed(2) + "<small>" + runStyle + " ±" + ((error / mean) * 100).toFixed(2) + "%</small></td>"; |
+ } |
+ |
+ //showWinner(tmp); |
+ output += "</tr>"; |
+ |
+ var _tests = results[result].tests, _data = _tests[run], _num = _data.length; |
+ for ( var i = 0; i < _num; i++ ) { |
+ output += "<tr class='onetest hidden'><td><small>" + _data[i].name + "</small></td>"; |
+ for ( var run in runs ) { |
+ output += "<td>" + (_tests[run][i].mean - 0).toFixed(2) + "<small>" + runStyle + " ±" + (_tests[run][i].error - 0).toFixed(2) + "%</small></td>"; |
+ } |
+ output += "<td></td></tr>"; |
+ } |
+ } |
+ |
+ if ( runStyle === "runs/s" ) { |
+ for ( var run in runs ) { |
+ runs[run].mean = Math.pow(Math.E, runs[run].mean / runs[run].num); |
+ runs[run].error = Math.pow(Math.E, runs[run].error / runs[run].num); |
+ } |
+ } |
+ |
+ var tmp = processWinner(runs); |
+ var totaloutput = ""; |
+ |
+ if ( runStyle === "ms" ) { |
+ totaloutput += "<tr><th class='name'>Total:</th>"; |
+ } else { |
+ totaloutput += "<tr><th class='name'>Total Score:</th>"; |
+ } |
+ |
+ for ( var run in runs ) { |
+ totaloutput += "<th class='name " + (tmp[run] || '') + "' title='" + (tmp[run + "title"] || '') + "'>" + runs[run].mean.toFixed(2) + "<small>" + runStyle + " ±" + ((runs[run].error / runs[run].mean) * 100).toFixed(2) + "%</small></th>"; |
+ } |
+ |
+ //showWinner(tmp); |
+ totaloutput += "</tr>"; |
+ |
+ overview.className = ""; |
+ overview.innerHTML = "<div class='resultwrap'><table class='results'>" + preoutput + totaloutput + output + totaloutput + "</table>" + (excluded.length ? "<div style='text-align:left;'><small><b>Excluded Tests:</b> " + excluded.sort().join(", ") + "</small></div>" : "") + "</div>"; |
+ } |
+ |
+ $("#wrapper").append("<center><a href='?" + runTests.join("|") + "'>Re-run tests</a></center>"); |
+ |
+ function showWinner(tmp){ |
+ if ( datas.length > 1 ) { |
+ if ( tmp.tie ) |
+ output += "<th>Tie</th>"; |
+ else |
+ output += "<th>" + tmp.diff + "%</th>"; |
+ } |
+ } |
+ } |
+ |
+ this.toggleResults = function(elem){ |
+ var span = elem.previousSibling; |
+ |
+ elem.blur(); |
+ elem = elem.parentNode.parentNode.nextSibling; |
+ |
+ span.innerHTML = elem.className.indexOf("hidden") < 0 ? "▶ " : "▼ "; |
+ |
+ while ( elem && elem.className.indexOf("onetest") >= 0 ) { |
+ elem.className = "onetest" + (elem.className.indexOf("hidden") >= 0 ? " " : " hidden"); |
+ elem = elem.nextSibling; |
+ } |
+ |
+ return false; |
+ }; |
+ |
+ function updateTime(){ |
+ time -= timePerTest; |
+ $("#left").html(Math.floor(time / 60) + ":" + (time % 60 < 10 ? "0" : "" ) + Math.floor(time % 60)); |
+ |
+ var w = ((totalTime - time) / totalTime) * 100; |
+ |
+ $("#timebar").width((w < 1 ? 1 : w) + "%"); |
+ } |
+ |
+ function logTest(data){ |
+ // Keep a running summary going |
+ data.mean = parseFloat(data.mean); |
+ var mean = (runStyle === "runs/s" ? Math.log(data.mean) : data.mean); |
+ testSummary[data.curID] = (testSummary[data.curID] || 0) + mean; |
+ testSummaryNum[data.curID] = (testSummaryNum[data.curID] || 0) + 1; |
+ |
+ maxTotal += mean; |
+ maxTotalNum++; |
+ |
+ testDone[data.curID]--; |
+ updateTestPos(data); |
+ |
+ testElems[data.curID].next().next().append("<li><b>" + data.name + |
+ ":</b> " + data.mean.toFixed(2) + "<small>" + runStyle + " ±" + data.error.toFixed(2) + "%</small></li>"); |
+ |
+ dataStore.push(data); |
+ } |
+ |
+ function updateTestPos(data, update){ |
+ if ( !update ) |
+ testDone[data.curID]++; |
+ |
+ var per = (testDone[data.curID] / (testNum[data.curID] * numTests)) * 100; |
+ |
+ if ( update ) |
+ per = 1; |
+ |
+ var mean = (runStyle === "runs/s" ? |
+ Math.pow(Math.E, testSummary[data.curID] / testSummaryNum[data.curID]) : |
+ testSummary[data.curID]); |
+ |
+ testElems[data.curID].html("<b>" + (tests[data.curID] ? tests[data.curID].name : data.curID) + |
+ ":</b> <div class='bar'><div style='width:" + |
+ per + "%;'>" + (per >= 100 ? "<span>" + mean.toFixed(2) + runStyle + "</span>" : "") + "</div></div>"); |
+ |
+ if ( per >= 100 && testSummary[data.curID] > 0 ) { |
+ testElems[data.curID].parent().addClass("done"); |
+ } |
+ } |
+ |
+ function processWinner(data){ |
+ var minVal = -1, min2Val = -1, min, min2; |
+ |
+ for ( var i in data ) { |
+ var total = data[i].mean; |
+ if ( minVal == -1 || (runStyle === "ms" && total <= minVal || runStyle === "runs/s" && total >= minVal) ) { |
+ min2Val = minVal; |
+ min2 = min; |
+ minVal = total; |
+ min = i; |
+ } else if ( min2Val == -1 || (runStyle === "ms" && total <= minVal || runStyle === "runs/s" && total >= min2Val) ) { |
+ min2Val = total; |
+ min2 = i; |
+ } |
+ } |
+ |
+ var tieVal = (runStyle === "ms" ? minVal : min2Val) + data[min].error + data[min2].error; |
+ |
+ var ret = { |
+ winner: min, |
+ diff: runStyle === "ms" ? |
+ -1 * Math.round((1 - (min2Val / minVal)) * 100) : |
+ Math.round(((minVal / min2Val) - 1) * 100), |
+ tie: minVal == min2Val || (runStyle === "ms" ? tieVal >= min2Val : tieVal >= minVal) |
+ }; |
+ |
+ ret.tie = ret.tie || ret.diff == 0; |
+ |
+ if ( ret.tie ) { |
+ ret[ min ] = 'tie'; |
+ ret[ min2 ] = 'tie'; |
+ ret[ min + 'title' ] = "Tied with another run."; |
+ ret[ min2 + 'title' ] = "Tied with another run."; |
+ } else { |
+ ret[ min ] = 'winner'; |
+ if ( min2Val > -1 ) { |
+ ret[ min + 'title' ] = "Won by " + ret.diff + "%."; |
+ } |
+ } |
+ |
+ return ret; |
+ } |
+ |
+ function makeElem(testID){ |
+/* |
+ if ( tests[testID] ) { |
+ var cat = tests[testID].category, catsm = cat.replace(/[^\w]/g, "-"); |
+ if ( !$("#" + catsm).length ) { |
+ $("#main").append("<h2 id='" + catsm + "' class='test'><a href='?cat=" + cat +"'>" + cat + '</a><div class="bar"><div id="timebar" style="width:25%;"><span class="left">Est. Time: <strong id="left">0:00</strong></span></div></div>'); |
+ } |
+ } |
+*/ |
+ |
+ testElems[testID] = $("<div class='test'></div>") |
+ .click(function(){ |
+ var next = jQuery(this).next().next(); |
+ if ( next.children().length == 0 ) return; |
+ var display = next.css("display"); |
+ next.css("display", display == 'none' ? 'block' : 'none'); |
+ }); |
+ |
+ updateTestPos({curID: testID, collection: tests[testID] ? tests[testID].name : testID, version: testVersions[testID]}, true); |
+ } |
+})(); |