Files
DiceCloud/rpg-docs/public/bower_components/polymer-test-tools/ci-support.js
2014-11-26 10:18:35 +00:00

182 lines
4.6 KiB
JavaScript

(function() {
var files;
var browserId;
var socketEndpoint = window.location.protocol + '//' + window.location.host;
var thisFile = 'ci-support.js';
var thisScript = document.querySelector('script[src$="' + thisFile + '"]');
var base = thisScript.src.substring(0, thisScript.src.lastIndexOf('/')+1);
var tools = {
'mocha-tdd': [
base + 'mocha/mocha.css',
base + 'mocha/mocha.js',
base + 'mocha-htmltest.js',
function() {
var div = document.createElement('div');
div.id = 'mocha';
document.body.appendChild(div);
mocha.setup({ui: 'tdd', slow: 1000, timeout: 10000, htmlbase: ''});
}
],
'chai': [
base + 'chai/chai.js'
]
};
function addFile() {
var file = files.shift();
if (Object.prototype.toString.call(file) == '[object Function]') {
file();
nextFile();
}
else if (file.slice(-3) == '.js') {
var script = document.createElement('script');
script.src = file;
script.onload = nextFile;
script.onerror = function() { console.error('Could not load ' + script.src); };
document.head.appendChild(script);
} else if (file.slice(-4) == '.css') {
var sheet = document.createElement('link');
sheet.rel = 'stylesheet';
sheet.href = file;
document.head.appendChild(sheet);
nextFile();
}
}
function nextFile() {
if (files.length) {
addFile();
} else {
startMocha();
}
}
function getQueryVariable(variable) {
var query = window.location.search.substring(1);
var vars = query.split("&");
for (var i=0;i<vars.length;i++) {
var pair = vars[i].split("=");
if (pair[0] == variable) {
return pair[1];
}
}
return(false);
}
function runTests(setup) {
browserId = getQueryVariable('browser');
files = [];
if (browserId) {
files.push(socketEndpoint + '/socket.io/socket.io.js');
}
if (typeof setup == 'string') {
var xhr = new XMLHttpRequest();
xhr.open('GET', setup);
xhr.responseType = 'application/json';
xhr.send();
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
setupTests(JSON.parse(xhr.response));
}
};
} else {
setupTests(setup);
}
}
function setupTests(setup) {
if (setup.tools) {
setup.tools.forEach(function(tool) {
if (tools[tool]) {
files = files.concat(tools[tool]);
} else {
console.error('Unknown tool: ' + tool);
}
});
}
if (setup.dependencies) {
files = files.concat(setup.dependencies.map(function(d) {
return '../' + d;
}));
}
files = files.concat(setup.tests);
nextFile();
}
function startMocha() {
var runner = mocha.run();
var socket;
if (browserId) {
socket = io(socketEndpoint);
}
var emitEvent = function(event, data) {
var payload = {browserId: browserId, event: event, data: data};
console.log('client-event:', payload);
if (!socket) return;
socket.emit('client-event', payload);
};
var getTitles = function(runnable) {
var titles = [];
while (runnable && runnable.title) {
titles.unshift(runnable.title);
runnable = runnable.parent;
}
return titles;
};
var getState = function(runnable) {
if (runnable.state === 'passed') {
return 'passing';
} else if (runnable.state == 'failed') {
return 'failing';
} else if (runnable.pending) {
return 'pending';
} else {
return 'unknown';
}
};
var cleanError = function(error) {
if (!error) return undefined;
return {message: error.message, stack: error.stack};
};
// the runner's start event has already fired.
emitEvent('browser-start', {
total: runner.total,
url: window.location.toString(),
});
// We only emit a subset of events that we care about, and follow a more
// general event format that is hopefully applicable to test runners beyond
// mocha.
//
// For all possible mocha events, see:
// https://github.com/visionmedia/mocha/blob/master/lib/runner.js#L36
runner.on('test', function(test) {
emitEvent('test-start', {test: getTitles(test)});
});
runner.on('test end', function(test) {
emitEvent('test-end', {
state: getState(test),
test: getTitles(test),
duration: test.duration,
error: cleanError(test.err),
});
});
runner.on('end', function() {
emitEvent('browser-end');
});
}
window.runTests = runTests;
})();