Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Extract watchRun into separate module #3930

Merged
merged 1 commit into from May 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
103 changes: 4 additions & 99 deletions lib/cli/run-helpers.js
Expand Up @@ -12,12 +12,13 @@ const path = require('path');
const ansi = require('ansi-colors');
const debug = require('debug')('mocha:cli:run:helpers');
const minimatch = require('minimatch');
const Context = require('../context');
const Mocha = require('../mocha');
const utils = require('../utils');
const watchRun = require('./watch-run');

const cwd = (exports.cwd = process.cwd());

exports.watchRun = watchRun;

/**
* Exits Mocha when tests + code under test has finished execution (default)
* @param {number} code - Exit code; typically # of failures
Expand Down Expand Up @@ -65,32 +66,6 @@ const exitMocha = code => {
done();
};

/**
* Hide the cursor.
* @ignore
* @private
*/
const hideCursor = () => {
process.stdout.write('\u001b[?25l');
};

/**
* Show the cursor.
* @ignore
* @private
*/
const showCursor = () => {
process.stdout.write('\u001b[?25h');
};

/**
* Stop cursor business
* @private
*/
const stop = () => {
process.stdout.write('\u001b[2K');
};

/**
* Coerce a comma-delimited string (or array thereof) into a flattened array of
* strings
Expand Down Expand Up @@ -207,76 +182,6 @@ exports.singleRun = (mocha, {files = [], exit = false} = {}) => {
return mocha.run(exit ? exitMocha : exitMochaLater);
};

/**
* Run Mocha in "watch" mode
* @param {Mocha} mocha - Mocha instance
* @param {Object} [opts] - Options
* @param {string[]} [opts.extension] - List of extensions to watch
* @param {string|RegExp} [opts.grep] - Grep for test titles
* @param {string} [opts.ui=bdd] - User interface
* @param {string[]} [files] - Array of test files
* @private
*/
exports.watchRun = (
mocha,
{extension = [], grep = '', ui = 'bdd', files = []} = {}
) => {
let runner;

console.log();
hideCursor();
process.on('SIGINT', () => {
showCursor();
console.log('\n');
process.exit(130);
});

const watchFiles = utils.files(cwd, extension);
let runAgain = false;

const loadAndRun = () => {
try {
mocha.files = files;
runAgain = false;
runner = mocha.run(() => {
runner = null;
if (runAgain) {
rerun();
}
});
} catch (e) {
console.log(e.stack);
}
};

const purge = () => {
watchFiles.forEach(Mocha.unloadFile);
};

loadAndRun();

const rerun = () => {
purge();
stop();
if (!grep) {
mocha.grep(null);
}
mocha.suite = mocha.suite.clone();
mocha.suite.ctx = new Context();
mocha.ui(ui);
loadAndRun();
};

utils.watch(watchFiles, () => {
runAgain = true;
if (runner) {
runner.abort();
} else {
rerun();
}
});
};

/**
* Actually run tests
* @param {Mocha} mocha - Mocha instance
Expand All @@ -295,7 +200,7 @@ exports.runMocha = (
files = []
) => {
if (watch) {
exports.watchRun(mocha, {extension, grep, ui, files});
watchRun(mocha, {extension, grep, ui, files});
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not just replace the exports here, eliminating "diff" lines?

} else {
exports.singleRun(mocha, {files, exit});
}
Expand Down
107 changes: 107 additions & 0 deletions lib/cli/watch-run.js
@@ -0,0 +1,107 @@
'use strict';

juergba marked this conversation as resolved.
Show resolved Hide resolved
const utils = require('../utils');
const Context = require('../context');
const Mocha = require('../mocha');

/**
* Exports the `watchRun` function that runs mocha in "watch" mode.
* @see module:lib/cli/run-helpers
* @module
* @private
*/

/**
* Run Mocha in "watch" mode
* @param {Mocha} mocha - Mocha instance
* @param {Object} opts - Options
plroebuck marked this conversation as resolved.
Show resolved Hide resolved
* @param {string[]} opts.extension - List of extensions to watch
* @param {string|RegExp} opts.grep - Grep for test titles
* @param {string} opts.ui - User interface
* @param {string[]} opts.files - Array of test files
* @private
*/
module.exports = (mocha, {extension, grep, ui, files}) => {
let runner;

console.log();
hideCursor();
process.on('SIGINT', () => {
showCursor();
console.log('\n');
// By UNIX/Posix convention this indicates that the process was
// killed by SIGINT which has portable number 2.
process.exit(128 + 2);
});

const watchFiles = utils.files(process.cwd(), extension);
let runAgain = false;

const loadAndRun = () => {
try {
mocha.files = files;
runAgain = false;
runner = mocha.run(() => {
runner = null;
if (runAgain) {
rerun();
}
});
} catch (e) {
console.log(e.stack);
}
};

const purge = () => {
watchFiles.forEach(Mocha.unloadFile);
};

loadAndRun();

const rerun = () => {
purge();
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would think there should be a clearScreen here... see #2312

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I’d like to avoid changing behavior in this PR. It is also not clear to me which behavior we exactly want.

eraseLine();
if (!grep) {
mocha.grep(null);
}
mocha.suite = mocha.suite.clone();
mocha.suite.ctx = new Context();
mocha.ui(ui);
loadAndRun();
};

utils.watch(watchFiles, () => {
runAgain = true;
if (runner) {
runner.abort();
} else {
rerun();
}
});
};

/**
* Hide the cursor.
* @ignore
* @private
*/
const hideCursor = () => {
process.stdout.write('\u001b[?25l');
};

/**
* Show the cursor.
* @ignore
* @private
*/
const showCursor = () => {
process.stdout.write('\u001b[?25h');
};

/**
* Erases the line on stdout
* @private
*/
const eraseLine = () => {
process.stdout.write('\u001b[2K');
};