| //base test functions |
| |
| function forEach(iterable, fn, bind){ |
| for (var i = 0, j = iterable.length; i < j; i++) fn.call(bind, iterable[i], i, iterable); |
| }; |
| |
| //test start |
| |
| window.onload = function(){ |
| |
| var frameworks = {}; |
| |
| forEach(document.getElementsByTagName('iframe'), function(iframe){ |
| frameworks[iframe.name] = { |
| 'test': window.frames[iframe.name].test, |
| 'attribute': window.frames[iframe.name].modifier || '', |
| 'selectors': [] |
| }; |
| }); |
| |
| var tbody = document.getElementById('tbody'); |
| var tfoot = document.getElementById('tfoot'); |
| var lastrow = tfoot.getElementsByTagName('tr')[0]; |
| |
| var controls = document.getElementById('controls'); |
| |
| var links = controls.getElementsByTagName('a'); |
| |
| var start = links[1]; |
| var stop = links[0]; |
| |
| start.onclick = function(){ |
| testRunner(); |
| return false; |
| }; |
| |
| stop.onclick = function(){ |
| clearTimeout(timer); |
| timer = null; |
| return false; |
| }; |
| |
| var score = []; |
| var scores = {}; |
| |
| var frxi = 0; |
| for (var name in frameworks){ |
| var framework = frameworks[name]; |
| forEach(window.selectors, function(selector){ |
| var frameworkSelector = selector.replace('%', frameworks[name].attribute); |
| framework.selectors.push(frameworkSelector); |
| }); |
| scores[name] = lastrow.getElementsByTagName('td')[frxi]; |
| score[name] = 0; |
| frxi++; |
| } |
| |
| var tests = []; |
| |
| forEach(window.selectors, function(selector, i){ |
| var frxi = 0; |
| var row = tbody.getElementsByTagName('tr')[i]; |
| for (var name in frameworks){ |
| var framework = frameworks[name]; |
| var cell = row.getElementsByTagName('td')[frxi]; |
| tests.push({ |
| 'execute': framework.test, |
| 'selector': framework.selectors[i], |
| 'name': name, |
| 'row': row, |
| 'cell' : cell |
| }); |
| frxi++; |
| } |
| }); |
| |
| var timer = null; |
| |
| var testRunner = function(){ |
| var test = tests.shift(); |
| if (!test) return; |
| var results = test.execute(test.selector); |
| test.cell.className = 'test'; |
| test.cell.innerHTML = results.time + ' ms | ' + results.found + ' found'; |
| test.cell.speed = results.time; |
| if (results.found == 0){ |
| test.cell.innerHTML = results.time + ' ms | zero results'; |
| test.cell.className += ' zero'; |
| test.cell.found = 0; |
| test.cell.error = true; |
| } else if (results.error){ |
| test.cell.innerHTML = results.time + ' ms | <span class="exception" title="' + results.error + '">error returned</a>'; |
| test.cell.className += ' exception'; |
| test.cell.found = 0; |
| test.cell.error = true; |
| } else { |
| test.cell.found = results.found; |
| test.cell.error = false; |
| } |
| |
| score[test.name] += test.cell.speed; |
| scores[test.name].innerHTML = ' ' + score[test.name] + ' '; |
| |
| if (test.cell == test.row.lastChild) colourRow(test.row); |
| timer = setTimeout(testRunner, 0); |
| }; |
| |
| var colourRow = function(row){ |
| |
| var cells = []; |
| |
| var tds = row.getElementsByTagName('td'); |
| forEach(tds, function(td){ |
| cells.push(td); |
| }); |
| |
| var speeds = []; |
| |
| forEach(cells, function(cell, i){ |
| if (!cell.error) speeds[i] = cell.speed; |
| //error, so we exclude it from colouring |
| else speeds[i] = 99999999999999999999999; |
| }); |
| |
| var min = Math.min.apply(this, speeds); |
| var max = Math.max.apply(this, speeds); |
| |
| var found = []; |
| var mismatch = false; |
| forEach(cells, function(cell, i){ |
| found.push(cell.found); |
| if (!mismatch){ |
| forEach(found, function(n){ |
| if (cell.found && n && cell.found != n){ |
| mismatch = true; |
| return; |
| } |
| }); |
| } |
| if (cell.speed == min) cell.className += ' good'; |
| else if (cell.speed == max) cell.className += ' bad'; |
| else cell.className += ' normal'; |
| }); |
| |
| if (mismatch){ |
| forEach(cells, function(cell, i){ |
| if (cell.found) cell.className += ' mismatch'; |
| }); |
| } |
| |
| }; |
| |
| |
| }; |