blob: cf57b0763fbaaabb85ecc883c99c8c4a51b1790f [file] [log] [blame]
exports.executeJsRunner = function(specCollection, done, jasmineEnv, setupFile) {
var specs,
specLoader = require('./requirejs-spec-loader'),
requirejs = require('requirejs'),
vm = require('vm'),
fs = require('fs'),
coffeescript = require('coffee-script'),
template = fs.readFileSync(
setupFile || (__dirname + '/requirejs-wrapper-template.js'),
'utf8'
),
ensureUnixPath = function(path){
return path.replace(/^(.):/, '/$1').replace(/\\/g, '/');
},
buildNewContext = function(spec){
var context = {
describe: describe,
it: it,
xdescribe: xdescribe,
xit: xit,
beforeEach: beforeEach,
afterEach: afterEach,
spyOn: spyOn,
waitsFor: waitsFor,
waits: waits,
runs: runs,
jasmine: jasmine,
expect: expect,
require: require,
console: console,
process: process,
module: module,
specLoader: specLoader,
__dirname: spec.directory(),
__filename: spec.path(),
baseUrl: buildRelativeDirName(spec.directory()),
csPath: __dirname + '/cs'
};
context.global = context;
return context;
},
buildRelativeDirName = function(dir){
var retVal = "",
thisDir = ensureUnixPath(process.cwd()),
toDir = ensureUnixPath(dir).split('/'),
index = 0;
thisDir = thisDir.split('/');
for(; index < thisDir.length || index < toDir.length; index++) {
if(thisDir[index] != toDir[index]){
for(var i = index; i < thisDir.length-1; i++){
retVal += '../';
}
for(var i = index; i < toDir.length; i++){
retVal += toDir[i] + '/';
}
break;
}
}
return retVal.trim('/');
};
specCollection.getSpecs().forEach(function(s){
var script = fs.readFileSync(s.path(), 'utf8');
if (s.filename().substr(-6).toLowerCase() == 'coffee') {
script = coffeescript.compile(script);
}
var newContext = buildNewContext(s);
newContext.setTimeout = jasmine.getGlobal().setTimeout;
newContext.setInterval = jasmine.getGlobal().setInterval;
var vmContext = vm.createContext(newContext);
vm.runInContext(template, vmContext);
vm.runInContext(script, vmContext, s.path());
});
specLoader.executeWhenAllSpecsAreComplete(jasmineEnv);
};