--- /dev/null
+//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';
+ });
+ }
+
+ };
+
+
+};
\ No newline at end of file