node spec/node_suite.js runs all dom-independent jasmine specs. basic commonjs support for jasmine along the way. node_suite.js and runner.html are both green.
This commit is contained in:
parent
9a12b32a3a
commit
c04f1b1fa8
|
@ -0,0 +1,233 @@
|
||||||
|
var fs = require('fs');
|
||||||
|
var sys = require('sys');
|
||||||
|
var path = require('path');
|
||||||
|
|
||||||
|
// yes, really keep this here to keep us honest, but only for jasmine's own runner! [xw]
|
||||||
|
undefined = "diz be undefined yo";
|
||||||
|
|
||||||
|
var jasmineGlobals = require("../src/base")
|
||||||
|
for(var k in jasmineGlobals) {global[k] = jasmineGlobals[k]}
|
||||||
|
|
||||||
|
//load jasmine src files based on the order in runner.html
|
||||||
|
var srcFilesInProperRequireOrder = [];
|
||||||
|
var runnerHtmlLines = fs.readFileSync("spec/runner.html", "utf8").split("\n");
|
||||||
|
var srcFileLines = [];
|
||||||
|
for (var i=0; i<runnerHtmlLines.length; i++)
|
||||||
|
if (runnerHtmlLines[i].match(/script(.*?)\/src\//))
|
||||||
|
srcFileLines.push(runnerHtmlLines[i]);
|
||||||
|
for (i=0; i<srcFileLines.length; i++) srcFilesInProperRequireOrder.push(/src=\"(.*?)\"/(srcFileLines[i])[1]);
|
||||||
|
for (i=0; i<srcFilesInProperRequireOrder.length; i++) require(srcFilesInProperRequireOrder[i]);
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
Pulling in code from jasmine-node.
|
||||||
|
|
||||||
|
We can't just depend on jasmine-node because it has its own jasmine that it uses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
global.window = {
|
||||||
|
setTimeout: setTimeout,
|
||||||
|
clearTimeout: clearTimeout,
|
||||||
|
setInterval: setInterval,
|
||||||
|
clearInterval: clearInterval
|
||||||
|
};
|
||||||
|
|
||||||
|
delete global.window;
|
||||||
|
|
||||||
|
function noop(){}
|
||||||
|
|
||||||
|
jasmine.executeSpecs = function(specs, done, isVerbose, showColors){
|
||||||
|
var log = [];
|
||||||
|
var columnCounter = 0;
|
||||||
|
var start = 0;
|
||||||
|
var elapsed = 0;
|
||||||
|
var verbose = isVerbose || false;
|
||||||
|
var colors = showColors || false;
|
||||||
|
|
||||||
|
var ansi = {
|
||||||
|
green: '\033[32m',
|
||||||
|
red: '\033[31m',
|
||||||
|
yellow: '\033[33m',
|
||||||
|
none: '\033[0m'
|
||||||
|
};
|
||||||
|
|
||||||
|
for (var i = 0, len = specs.length; i < len; ++i){
|
||||||
|
var filename = specs[i];
|
||||||
|
require(filename.replace(/\.\w+$/, ""));
|
||||||
|
}
|
||||||
|
|
||||||
|
var jasmineEnv = jasmine.getEnv();
|
||||||
|
jasmineEnv.reporter = {
|
||||||
|
log: function(str){
|
||||||
|
},
|
||||||
|
|
||||||
|
reportSpecStarting: function(runner) {
|
||||||
|
},
|
||||||
|
|
||||||
|
reportRunnerStarting: function(runner) {
|
||||||
|
sys.puts('Started');
|
||||||
|
start = Number(new Date);
|
||||||
|
},
|
||||||
|
|
||||||
|
reportSuiteResults: function(suite) {
|
||||||
|
var specResults = suite.results();
|
||||||
|
var path = [];
|
||||||
|
while(suite) {
|
||||||
|
path.unshift(suite.description);
|
||||||
|
suite = suite.parentSuite;
|
||||||
|
}
|
||||||
|
var description = path.join(' ');
|
||||||
|
|
||||||
|
if (verbose)
|
||||||
|
log.push('Spec ' + description);
|
||||||
|
|
||||||
|
specResults.items_.forEach(function(spec){
|
||||||
|
if (spec.failedCount > 0 && spec.description) {
|
||||||
|
if (!verbose)
|
||||||
|
log.push(description);
|
||||||
|
log.push(' it ' + spec.description);
|
||||||
|
spec.items_.forEach(function(result){
|
||||||
|
log.push(' ' + result.trace.stack + '\n');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
reportSpecResults: function(spec) {
|
||||||
|
var result = spec.results();
|
||||||
|
var msg = '';
|
||||||
|
if (result.passed())
|
||||||
|
{
|
||||||
|
msg = (colors) ? (ansi.green + '.' + ansi.none) : '.';
|
||||||
|
// } else if (result.skipped) { TODO: Research why "result.skipped" returns false when "xit" is called on a spec?
|
||||||
|
// msg = (colors) ? (ansi.yellow + '*' + ansi.none) : '*';
|
||||||
|
} else {
|
||||||
|
msg = (colors) ? (ansi.red + 'F' + ansi.none) : 'F';
|
||||||
|
}
|
||||||
|
sys.print(msg);
|
||||||
|
if (columnCounter++ < 50) return;
|
||||||
|
columnCounter = 0;
|
||||||
|
sys.print('\n');
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
reportRunnerResults: function(runner) {
|
||||||
|
elapsed = (Number(new Date) - start) / 1000;
|
||||||
|
sys.puts('\n');
|
||||||
|
log.forEach(function(log){
|
||||||
|
sys.puts(log);
|
||||||
|
});
|
||||||
|
sys.puts('Finished in ' + elapsed + ' seconds');
|
||||||
|
|
||||||
|
var summary = jasmine.printRunnerResults(runner);
|
||||||
|
if(colors)
|
||||||
|
{
|
||||||
|
if(runner.results().failedCount === 0 )
|
||||||
|
sys.puts(ansi.green + summary + ansi.none);
|
||||||
|
else
|
||||||
|
sys.puts(ansi.red + summary + ansi.none);
|
||||||
|
} else {
|
||||||
|
sys.puts(summary);
|
||||||
|
}
|
||||||
|
(done||noop)(runner, log);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
jasmineEnv.execute();
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.getAllSpecFiles = function(dir, matcher){
|
||||||
|
var specs = [];
|
||||||
|
|
||||||
|
if (fs.statSync(dir).isFile() && dir.match(matcher)) {
|
||||||
|
specs.push(dir);
|
||||||
|
} else {
|
||||||
|
var files = fs.readdirSync(dir);
|
||||||
|
for (var i = 0, len = files.length; i < len; ++i){
|
||||||
|
var filename = dir + '/' + files[i];
|
||||||
|
if (fs.statSync(filename).isFile() && filename.match(matcher)){
|
||||||
|
specs.push(filename);
|
||||||
|
}else if (fs.statSync(filename).isDirectory()){
|
||||||
|
var subfiles = this.getAllSpecFiles(filename, matcher);
|
||||||
|
subfiles.forEach(function(result){
|
||||||
|
specs.push(result);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return specs;
|
||||||
|
};
|
||||||
|
|
||||||
|
jasmine.printRunnerResults = function(runner){
|
||||||
|
var results = runner.results();
|
||||||
|
var suites = runner.suites();
|
||||||
|
var msg = '';
|
||||||
|
msg += suites.length + ' test' + ((suites.length === 1) ? '' : 's') + ', ';
|
||||||
|
msg += results.totalCount + ' assertion' + ((results.totalCount === 1) ? '' : 's') + ', ';
|
||||||
|
msg += results.failedCount + ' failure' + ((results.failedCount === 1) ? '' : 's') + '\n';
|
||||||
|
return msg;
|
||||||
|
};
|
||||||
|
|
||||||
|
function now(){
|
||||||
|
return new Date().getTime();
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.asyncSpecWait = function(){
|
||||||
|
var wait = jasmine.asyncSpecWait;
|
||||||
|
wait.start = now();
|
||||||
|
wait.done = false;
|
||||||
|
(function innerWait(){
|
||||||
|
waits(10);
|
||||||
|
runs(function() {
|
||||||
|
if (wait.start + wait.timeout < now()) {
|
||||||
|
expect('timeout waiting for spec').toBeNull();
|
||||||
|
} else if (wait.done) {
|
||||||
|
wait.done = false;
|
||||||
|
} else {
|
||||||
|
innerWait();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
};
|
||||||
|
jasmine.asyncSpecWait.timeout = 4 * 1000;
|
||||||
|
jasmine.asyncSpecDone = function(){
|
||||||
|
jasmine.asyncSpecWait.done = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
for ( var key in jasmine) {
|
||||||
|
exports[key] = jasmine[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
End jasmine-node runner
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var isVerbose = false;
|
||||||
|
var showColors = true;
|
||||||
|
process.argv.forEach(function(arg){
|
||||||
|
switch(arg) {
|
||||||
|
case '--color': showColors = true; break;
|
||||||
|
case '--noColor': showColors = false; break;
|
||||||
|
case '--verbose': isVerbose = true; break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var specs = jasmine.getAllSpecFiles(__dirname + '/suites', new RegExp("^.+\.(js|coffee)$"));
|
||||||
|
var domIndependentSpecs = []
|
||||||
|
for(var i=0; i<specs.length; i++) {
|
||||||
|
if (fs.readFileSync(specs[i], "utf8").indexOf("document.createElement")<0) {
|
||||||
|
domIndependentSpecs.push(specs[i])
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
jasmine.executeSpecs(domIndependentSpecs, function(runner, log){
|
||||||
|
if (runner.results().failedCount == 0) {
|
||||||
|
process.exit(0);
|
||||||
|
} else {
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}, isVerbose, showColors);
|
17
src/base.js
17
src/base.js
|
@ -1,10 +1,12 @@
|
||||||
|
var isCommonJS = typeof window == "undefined";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
|
* Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework.
|
||||||
*
|
*
|
||||||
* @namespace
|
* @namespace
|
||||||
*/
|
*/
|
||||||
var jasmine = {};
|
var jasmine = {};
|
||||||
|
if (isCommonJS) exports.jasmine = jasmine;
|
||||||
/**
|
/**
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
|
@ -443,6 +445,7 @@ jasmine.log = function() {
|
||||||
var spyOn = function(obj, methodName) {
|
var spyOn = function(obj, methodName) {
|
||||||
return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
|
return jasmine.getEnv().currentSpec.spyOn(obj, methodName);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.spyOn = spyOn;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Jasmine spec that will be added to the current suite.
|
* Creates a Jasmine spec that will be added to the current suite.
|
||||||
|
@ -460,6 +463,7 @@ var spyOn = function(obj, methodName) {
|
||||||
var it = function(desc, func) {
|
var it = function(desc, func) {
|
||||||
return jasmine.getEnv().it(desc, func);
|
return jasmine.getEnv().it(desc, func);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.it = it;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a <em>disabled</em> Jasmine spec.
|
* Creates a <em>disabled</em> Jasmine spec.
|
||||||
|
@ -472,6 +476,7 @@ var it = function(desc, func) {
|
||||||
var xit = function(desc, func) {
|
var xit = function(desc, func) {
|
||||||
return jasmine.getEnv().xit(desc, func);
|
return jasmine.getEnv().xit(desc, func);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.xit = xit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Starts a chain for a Jasmine expectation.
|
* Starts a chain for a Jasmine expectation.
|
||||||
|
@ -484,6 +489,7 @@ var xit = function(desc, func) {
|
||||||
var expect = function(actual) {
|
var expect = function(actual) {
|
||||||
return jasmine.getEnv().currentSpec.expect(actual);
|
return jasmine.getEnv().currentSpec.expect(actual);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.expect = expect;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
|
* Defines part of a jasmine spec. Used in cominbination with waits or waitsFor in asynchrnous specs.
|
||||||
|
@ -493,6 +499,7 @@ var expect = function(actual) {
|
||||||
var runs = function(func) {
|
var runs = function(func) {
|
||||||
jasmine.getEnv().currentSpec.runs(func);
|
jasmine.getEnv().currentSpec.runs(func);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.runs = runs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits a fixed time period before moving to the next block.
|
* Waits a fixed time period before moving to the next block.
|
||||||
|
@ -503,6 +510,7 @@ var runs = function(func) {
|
||||||
var waits = function(timeout) {
|
var waits = function(timeout) {
|
||||||
jasmine.getEnv().currentSpec.waits(timeout);
|
jasmine.getEnv().currentSpec.waits(timeout);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.waits = waits;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Waits for the latchFunction to return true before proceeding to the next block.
|
* Waits for the latchFunction to return true before proceeding to the next block.
|
||||||
|
@ -514,6 +522,7 @@ var waits = function(timeout) {
|
||||||
var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
|
var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) {
|
||||||
jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
|
jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.waitsFor = waitsFor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A function that is called before each spec in a suite.
|
* A function that is called before each spec in a suite.
|
||||||
|
@ -525,6 +534,7 @@ var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout
|
||||||
var beforeEach = function(beforeEachFunction) {
|
var beforeEach = function(beforeEachFunction) {
|
||||||
jasmine.getEnv().beforeEach(beforeEachFunction);
|
jasmine.getEnv().beforeEach(beforeEachFunction);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.beforeEach = beforeEach;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A function that is called after each spec in a suite.
|
* A function that is called after each spec in a suite.
|
||||||
|
@ -536,6 +546,7 @@ var beforeEach = function(beforeEachFunction) {
|
||||||
var afterEach = function(afterEachFunction) {
|
var afterEach = function(afterEachFunction) {
|
||||||
jasmine.getEnv().afterEach(afterEachFunction);
|
jasmine.getEnv().afterEach(afterEachFunction);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.afterEach = afterEach;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines a suite of specifications.
|
* Defines a suite of specifications.
|
||||||
|
@ -555,6 +566,7 @@ var afterEach = function(afterEachFunction) {
|
||||||
var describe = function(description, specDefinitions) {
|
var describe = function(description, specDefinitions) {
|
||||||
return jasmine.getEnv().describe(description, specDefinitions);
|
return jasmine.getEnv().describe(description, specDefinitions);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.describe = describe;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
|
* Disables a suite of specifications. Used to disable some suites in a file, or files, temporarily during development.
|
||||||
|
@ -565,6 +577,7 @@ var describe = function(description, specDefinitions) {
|
||||||
var xdescribe = function(description, specDefinitions) {
|
var xdescribe = function(description, specDefinitions) {
|
||||||
return jasmine.getEnv().xdescribe(description, specDefinitions);
|
return jasmine.getEnv().xdescribe(description, specDefinitions);
|
||||||
};
|
};
|
||||||
|
if (isCommonJS) exports.xdescribe = xdescribe;
|
||||||
|
|
||||||
|
|
||||||
// Provide the XMLHttpRequest class for IE 5.x-6.x:
|
// Provide the XMLHttpRequest class for IE 5.x-6.x:
|
||||||
|
@ -586,4 +599,4 @@ jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() {
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
}
|
}
|
||||||
throw new Error("This browser does not support XMLHttpRequest.");
|
throw new Error("This browser does not support XMLHttpRequest.");
|
||||||
} : XMLHttpRequest;
|
} : XMLHttpRequest;
|
Loading…
Reference in New Issue