UNPKG

jasmine-node

Version:

DOM-less simple JavaScript BDD testing framework for Node

119 lines (91 loc) 3.3 kB
var walkdir = require('walkdir'); var collection = require('./spec-collection'); var path = require('path'); var fs = require('fs'); var child_process = require('child_process'); var gaze = require('gaze'); var _ = require('underscore'); var baseArgv = []; for(var i = 0; i < process.argv.length; i++) { if(process.argv[i] !== '--autotest') { baseArgv.push(process.argv[i]); } } var run_external = function(command, args, callback) { var child = child_process.spawn(command, args); child.stdout.on('data', function(data) { process.stdout.write(data); }); child.stderr.on('data', function(data) { process.stderr.write(data); }); if(typeof callback == 'function') { child.on('exit', callback); } } var last_run_successful = false; var run_everything = function() { // run the suite when it starts var argv = [].concat(baseArgv); run_external(argv.shift(), argv, function (code) { last_run_successful = code === 0 }); } exports.start = function(loadpaths, watchFolders, patterns) { var watchPatterns; loadpaths.forEach(function(loadpath){ // If loadpath is just a single file, we should just watch that file stats = fs.statSync(loadpath); if (stats.isFile()) { watchPatterns = loadpath; } else { watchPatterns = patterns.map(function(p) { return path.join(loadpath, p); }); } changedFunc = function(event, file) { console.log(file + ' was changed'); var match = path.basename(file, path.extname(file)) + ".*"; match = match.replace(new RegExp("spec", "i"), ""); var argv = [].concat(baseArgv, ["--match", match]); run_external(argv.shift(), argv, function(code) { // run everything if we fixed some bugs if(code == 0) { if(!last_run_successful) { run_everything(); } } else { last_run_successful = false; } }); } // Vim seems to change a file multiple times, with non-scientific testing // the only time we didn't duplicate the call to onChanged was at 2.5s // Passing true to have onChanged run on the leading edge of the timeout var onChanged = _.debounce(changedFunc, 2500, true); gaze(watchPatterns, function(err, watcher) { // Get all watched files console.log("Watching for changes in " + loadpath); // On file changed this.on('all', onChanged); }); }); watchFolders.forEach(function(watchPath) { // If watchPath is just a single file, we should just watch that file stats = fs.statSync(watchPath); if (stats.isFile()) { watchPatterns = watchPath; } else { watchPatterns = patterns.map(function(p) { return path.join(watchPath, p); }); } // We debounce run_everything here due to the Vim issue described above. var onChanged = _.debounce(run_everything, 2500, true); gaze(watchPatterns, function(err, watcher) { console.log("Watching for changes in " + watchPath); this.on('all', onChanged); }); }); run_everything(); };