blob: 625e81c2707cff7a8de20b898ba967dd927d6e09 [file] [log] [blame]
var fs = require('fs');
var mkdirp = require('mkdirp');
var util;
try {
util = require('util')
} catch(e) {
util = require('sys')
}
var path = require('path');
var filename = __dirname + '/jasmine-1.3.1.js';
var isWindowUndefined = typeof global.window === 'undefined';
if (isWindowUndefined) {
global.window = {
setTimeout: setTimeout,
clearTimeout: clearTimeout,
setInterval: setInterval,
clearInterval: clearInterval
};
}
var src = fs.readFileSync(filename);
// Put jasmine in the global context, this is somewhat like running in a
// browser where every file will have access to `jasmine`
var jasmine = require('vm').runInThisContext(src + "\njasmine;", filename);
if (isWindowUndefined) {
delete global.window;
}
require("./async-callback");
require("jasmine-reporters");
var nodeReporters = require('./reporter').jasmineNode;
jasmine.TerminalVerboseReporter = nodeReporters.TerminalVerboseReporter;
jasmine.TerminalReporter = nodeReporters.TerminalReporter;
jasmine.TeamcityReporter = nodeReporters.TeamcityReporter;
jasmine.GrowlReporter = require('jasmine-growl-reporter');
jasmine.loadHelpersInFolder = function(folder, matcher) {
// Check to see if the folder is actually a file, if so, back up to the
// parent directory and find some helpers
folderStats = fs.statSync(folder);
if (folderStats.isFile()) {
folder = path.dirname(folder);
}
var helpers = [],
helperCollection = require('./spec-collection');
helperCollection.load([folder], matcher);
helpers = helperCollection.getSpecs();
for (var i = 0, len = helpers.length; i < len; ++i) {
var file = helpers[i].path();
try {
var helper = require(file.replace(/\.*$/, ""));
} catch (e) {
console.log("Exception loading helper: " + file)
console.log(e);
throw e; // If any of the helpers fail to load, fail everything
}
for (var key in helper) {
global[key]= helper[key];
}
}
};
function removeJasmineFrames(text) {
if (!text) {
return text;
}
var lines = [];
text.split(/\n/).forEach(function(line){
if (line.indexOf(filename) == -1) {
lines.push(line);
}
});
return lines.join('\n');
}
jasmine.executeSpecsInFolder = function(options){
var folders = options['specFolders'];
var done = options['onComplete'];
var isVerbose = options['isVerbose'];
var showColors = options['showColors'];
var teamcity = options['teamcity'];
var useRequireJs = options['useRequireJs'];
var matcher = options['regExpSpec'];
var junitreport = options['junitreport'];
var includeStackTrace = options['includeStackTrace'];
var growl = options['growl'];
// Overwriting it allows us to handle custom async specs
it = function(desc, func, timeout) {
return jasmine.getEnv().it(desc, func, timeout);
}
beforeEach = function(func, timeout) {
return jasmine.getEnv().beforeEach(func, timeout);
}
afterEach = function(func, timeout) {
return jasmine.getEnv().afterEach(func, timeout);
}
var fileMatcher = matcher || new RegExp(".(js)$", "i"),
colors = showColors || false,
specs = require('./spec-collection'),
jasmineEnv = jasmine.getEnv();
specs.load(folders, fileMatcher);
if(junitreport && junitreport.report) {
var existsSync = fs.existsSync || path.existsSync;
if(!existsSync(junitreport.savePath)) {
util.puts('creating junit xml report save path: ' + junitreport.savePath);
mkdirp.sync(junitreport.savePath, "0755");
}
jasmineEnv.addReporter(new jasmine.JUnitXmlReporter(junitreport.savePath,
junitreport.consolidate,
junitreport.useDotNotation));
}
if(teamcity){
jasmineEnv.addReporter(new jasmine.TeamcityReporter({onComplete: done}));
} else if(isVerbose) {
jasmineEnv.addReporter(new jasmine.TerminalVerboseReporter({ print: print,
color: showColors,
onComplete: done,
stackFilter: removeJasmineFrames}));
} else {
jasmineEnv.addReporter(new jasmine.TerminalReporter({print: print,
color: showColors,
includeStackTrace: includeStackTrace,
onComplete: done,
stackFilter: removeJasmineFrames}));
}
if (growl) {
jasmineEnv.addReporter(new jasmine.GrowlReporter());
}
if (useRequireJs) {
require('./requirejs-runner').executeJsRunner(
specs,
done,
jasmineEnv,
typeof useRequireJs === 'string' ? useRequireJs : null
);
} else {
var specsList = specs.getSpecs();
for (var i = 0, len = specsList.length; i < len; ++i) {
var filename = specsList[i];
delete require.cache[filename.path()];
// Catch exceptions in loading the spec
try {
require(filename.path().replace(/\.\w+$/, ""));
} catch (e) {
console.log("Exception loading: " + filename.path());
console.log(e);
throw e;
}
}
jasmineEnv.execute();
}
};
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;
};
function print(str) {
process.stdout.write(util.format(str));
}
for ( var key in jasmine) {
exports[key] = jasmine[key];
}