123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- 'use strict';
- /* eslint no-unused-vars: off */
- /* eslint-env commonjs */
- /**
- * Shim process.stdout.
- */
- process.stdout = require('browser-stdout')({label: false});
- var Mocha = require('./lib/mocha');
- /**
- * Create a Mocha instance.
- *
- * @return {undefined}
- */
- var mocha = new Mocha({reporter: 'html'});
- /**
- * Save timer references to avoid Sinon interfering (see GH-237).
- */
- var Date = global.Date;
- var setTimeout = global.setTimeout;
- var setInterval = global.setInterval;
- var clearTimeout = global.clearTimeout;
- var clearInterval = global.clearInterval;
- var uncaughtExceptionHandlers = [];
- var originalOnerrorHandler = global.onerror;
- /**
- * Remove uncaughtException listener.
- * Revert to original onerror handler if previously defined.
- */
- process.removeListener = function(e, fn) {
- if (e === 'uncaughtException') {
- if (originalOnerrorHandler) {
- global.onerror = originalOnerrorHandler;
- } else {
- global.onerror = function() {};
- }
- var i = uncaughtExceptionHandlers.indexOf(fn);
- if (i !== -1) {
- uncaughtExceptionHandlers.splice(i, 1);
- }
- }
- };
- /**
- * Implements uncaughtException listener.
- */
- process.on = function(e, fn) {
- if (e === 'uncaughtException') {
- global.onerror = function(err, url, line) {
- fn(new Error(err + ' (' + url + ':' + line + ')'));
- return !mocha.allowUncaught;
- };
- uncaughtExceptionHandlers.push(fn);
- }
- };
- // The BDD UI is registered by default, but no UI will be functional in the
- // browser without an explicit call to the overridden `mocha.ui` (see below).
- // Ensure that this default UI does not expose its methods to the global scope.
- mocha.suite.removeAllListeners('pre-require');
- var immediateQueue = [];
- var immediateTimeout;
- function timeslice() {
- var immediateStart = new Date().getTime();
- while (immediateQueue.length && new Date().getTime() - immediateStart < 100) {
- immediateQueue.shift()();
- }
- if (immediateQueue.length) {
- immediateTimeout = setTimeout(timeslice, 0);
- } else {
- immediateTimeout = null;
- }
- }
- /**
- * High-performance override of Runner.immediately.
- */
- Mocha.Runner.immediately = function(callback) {
- immediateQueue.push(callback);
- if (!immediateTimeout) {
- immediateTimeout = setTimeout(timeslice, 0);
- }
- };
- /**
- * Function to allow assertion libraries to throw errors directly into mocha.
- * This is useful when running tests in a browser because window.onerror will
- * only receive the 'message' attribute of the Error.
- */
- mocha.throwError = function(err) {
- uncaughtExceptionHandlers.forEach(function(fn) {
- fn(err);
- });
- throw err;
- };
- /**
- * Override ui to ensure that the ui functions are initialized.
- * Normally this would happen in Mocha.prototype.loadFiles.
- */
- mocha.ui = function(ui) {
- Mocha.prototype.ui.call(this, ui);
- this.suite.emit('pre-require', global, null, this);
- return this;
- };
- /**
- * Setup mocha with the given setting options.
- */
- mocha.setup = function(opts) {
- if (typeof opts === 'string') {
- opts = {ui: opts};
- }
- for (var opt in opts) {
- if (opts.hasOwnProperty(opt)) {
- this[opt](opts[opt]);
- }
- }
- return this;
- };
- /**
- * Run mocha, returning the Runner.
- */
- mocha.run = function(fn) {
- var options = mocha.options;
- mocha.globals('location');
- var query = Mocha.utils.parseQuery(global.location.search || '');
- if (query.grep) {
- mocha.grep(query.grep);
- }
- if (query.fgrep) {
- mocha.fgrep(query.fgrep);
- }
- if (query.invert) {
- mocha.invert();
- }
- return Mocha.prototype.run.call(mocha, function(err) {
- // The DOM Document is not available in Web Workers.
- var document = global.document;
- if (
- document &&
- document.getElementById('mocha') &&
- options.noHighlighting !== true
- ) {
- Mocha.utils.highlightTags('code');
- }
- if (fn) {
- fn(err);
- }
- });
- };
- /**
- * Expose the process shim.
- * https://github.com/mochajs/mocha/pull/916
- */
- Mocha.process = process;
- /**
- * Expose mocha.
- */
- global.Mocha = Mocha;
- global.mocha = mocha;
- // this allows test/acceptance/required-tokens.js to pass; thus,
- // you can now do `const describe = require('mocha').describe` in a
- // browser context (assuming browserification). should fix #880
- module.exports = global;
|