123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- var system = require('system');
- function waitFor(testFx, onReady, timeOutMillis) {
- var maxtimeOutMillis = timeOutMillis ? timeOutMillis : 10001,
- start = new Date().getTime(),
- condition = false,
- interval = setInterval(function() {
- if ( (new Date().getTime() - start < maxtimeOutMillis) && !condition ) {
-
- condition = (typeof(testFx) === "string" ? eval(testFx) : testFx());
- } else {
- if(!condition) {
-
- console.log("'waitFor()' timeout");
- phantom.exit(1);
- } else {
-
-
- typeof(onReady) === "string" ? eval(onReady) : onReady();
- clearInterval(interval);
- }
- }
- }, 100);
- };
- if (system.args.length !== 2) {
- console.log('Usage: run-qunit.js URL');
- phantom.exit(1);
- }
- var fs = require('fs');
- var page = require('webpage').create();
- page.onConsoleMessage = function(msg) {
- console.log(msg);
- };
- page.onError = function (msg, trace) {
- console.log(msg);
- trace.forEach(function(item) {
- console.log(' ', item.file, ':', item.line);
- })
- }
- var _openPath = phantom.args[0].replace(/^.*(\\|\/)/, '');
- var openPath = _openPath;
- var origdir = '../js/';
- var basedir = '../instrumented/';
- var coverageBase = fs.read('_coverage.html');
- if (fs.exists(basedir)){
- var script = /<script.*><\/script>/g,
- src = /src=(["'])(.*?)\1/,
- contents = fs.read(openPath),
- _contents = contents,
- srcs = [],
- s;
- while (script.exec(contents)){
- s = src.exec(RegExp.lastMatch)[2];
- if (s && s.indexOf(origdir) != -1)
- _contents = _contents.replace(s, s.replace(origdir, basedir))
- }
- if (_contents != contents){
- openPath += '.cov.html';
- fs.write(openPath, _contents);
- }
- }
- page.open(openPath, function(status){
- if (status !== "success") {
- console.log("Unable to access network");
- phantom.exit(1);
- } else {
-
- if (fs.exists(basedir))
- for (var i=0; i<srcs.length; i++)
- page.includeJs(srcs[i]);
- waitFor(function(){
- return page.evaluate(function(){
- var el = document.getElementById('qunit-testresult');
- if (el && el.innerText.match('completed')) {
- return true;
- }
- return false;
- });
- }, function(){
-
-
- var coverageInfo = JSON.parse(page.evaluate(function() { return JSON.stringify(getCoverageByLine()); }));
- if (coverageInfo.key){
- var lineCoverage = coverageInfo.lines;
- var originalFile = origdir + fs.separator + coverageInfo.key;
- var source = coverageInfo.source;
- var fileLines = readFileLines(originalFile);
- var colorized = '';
- for (var idx=0; idx < lineCoverage.length; idx++) {
-
- var cvg = lineCoverage[idx + 1];
- var hitmiss = '';
- if (typeof cvg === 'number') {
- hitmiss = ' ' + (cvg>0 ? 'hit' : 'miss');
- } else {
- hitmiss = ' ' + 'undef';
- }
- var htmlLine = fileLines[idx]
- if (!source)
- htmlLine = htmlLine.replace('<', '<').replace('>', '>');
- colorized += '<div class="code' + hitmiss + '">' + htmlLine + '</div>\n';
- };
- colorized = coverageBase.replace('COLORIZED_LINE_HTML', colorized);
- fs.write('coverage.html', colorized, 'w');
- console.log('Coverage for ' + coverageInfo.key + ' in coverage.html');
- }
- if (_openPath != openPath)
- fs.remove(openPath);
- var failedNum = page.evaluate(function(){
- var el = document.getElementById('qunit-testresult');
- console.log(el.innerText);
- try {
- return el.getElementsByClassName('failed')[0].innerHTML;
- } catch (e) { }
- return 10000;
- });
- phantom.exit((parseInt(failedNum, 10) > 0) ? 1 : 0);
- });
- }
- });
- function readFileLines(filename) {
- var stream = fs.open(filename, 'r');
- var lines = [];
- var line;
- while (!stream.atEnd()) {
- lines.push(stream.readLine());
- }
- stream.close();
- return lines;
- }
|