added unit testing, and started implementing unit tests...phew
This commit is contained in:
168
node_modules/mocha/lib/browser/growl.js
generated
vendored
Normal file
168
node_modules/mocha/lib/browser/growl.js
generated
vendored
Normal file
@ -0,0 +1,168 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Web Notifications module.
|
||||
* @module Growl
|
||||
*/
|
||||
|
||||
/**
|
||||
* Save timer references to avoid Sinon interfering (see GH-237).
|
||||
*/
|
||||
var Date = global.Date;
|
||||
var setTimeout = global.setTimeout;
|
||||
var EVENT_RUN_END = require('../runner').constants.EVENT_RUN_END;
|
||||
|
||||
/**
|
||||
* Checks if browser notification support exists.
|
||||
*
|
||||
* @public
|
||||
* @see {@link https://caniuse.com/#feat=notifications|Browser support (notifications)}
|
||||
* @see {@link https://caniuse.com/#feat=promises|Browser support (promises)}
|
||||
* @see {@link Mocha#growl}
|
||||
* @see {@link Mocha#isGrowlCapable}
|
||||
* @return {boolean} whether browser notification support exists
|
||||
*/
|
||||
exports.isCapable = function() {
|
||||
var hasNotificationSupport = 'Notification' in window;
|
||||
var hasPromiseSupport = typeof Promise === 'function';
|
||||
return process.browser && hasNotificationSupport && hasPromiseSupport;
|
||||
};
|
||||
|
||||
/**
|
||||
* Implements browser notifications as a pseudo-reporter.
|
||||
*
|
||||
* @public
|
||||
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/notification|Notification API}
|
||||
* @see {@link https://developers.google.com/web/fundamentals/push-notifications/display-a-notification|Displaying a Notification}
|
||||
* @see {@link Growl#isPermitted}
|
||||
* @see {@link Mocha#_growl}
|
||||
* @param {Runner} runner - Runner instance.
|
||||
*/
|
||||
exports.notify = function(runner) {
|
||||
var promise = isPermitted();
|
||||
|
||||
/**
|
||||
* Attempt notification.
|
||||
*/
|
||||
var sendNotification = function() {
|
||||
// If user hasn't responded yet... "No notification for you!" (Seinfeld)
|
||||
Promise.race([promise, Promise.resolve(undefined)])
|
||||
.then(canNotify)
|
||||
.then(function() {
|
||||
display(runner);
|
||||
})
|
||||
.catch(notPermitted);
|
||||
};
|
||||
|
||||
runner.once(EVENT_RUN_END, sendNotification);
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if browser notification is permitted by user.
|
||||
*
|
||||
* @private
|
||||
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Notification/permission|Notification.permission}
|
||||
* @see {@link Mocha#growl}
|
||||
* @see {@link Mocha#isGrowlPermitted}
|
||||
* @returns {Promise<boolean>} promise determining if browser notification
|
||||
* permissible when fulfilled.
|
||||
*/
|
||||
function isPermitted() {
|
||||
var permitted = {
|
||||
granted: function allow() {
|
||||
return Promise.resolve(true);
|
||||
},
|
||||
denied: function deny() {
|
||||
return Promise.resolve(false);
|
||||
},
|
||||
default: function ask() {
|
||||
return Notification.requestPermission().then(function(permission) {
|
||||
return permission === 'granted';
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
return permitted[Notification.permission]();
|
||||
}
|
||||
|
||||
/**
|
||||
* @summary
|
||||
* Determines if notification should proceed.
|
||||
*
|
||||
* @description
|
||||
* Notification shall <strong>not</strong> proceed unless `value` is true.
|
||||
*
|
||||
* `value` will equal one of:
|
||||
* <ul>
|
||||
* <li><code>true</code> (from `isPermitted`)</li>
|
||||
* <li><code>false</code> (from `isPermitted`)</li>
|
||||
* <li><code>undefined</code> (from `Promise.race`)</li>
|
||||
* </ul>
|
||||
*
|
||||
* @private
|
||||
* @param {boolean|undefined} value - Determines if notification permissible.
|
||||
* @returns {Promise<undefined>} Notification can proceed
|
||||
*/
|
||||
function canNotify(value) {
|
||||
if (!value) {
|
||||
var why = value === false ? 'blocked' : 'unacknowledged';
|
||||
var reason = 'not permitted by user (' + why + ')';
|
||||
return Promise.reject(new Error(reason));
|
||||
}
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Displays the notification.
|
||||
*
|
||||
* @private
|
||||
* @param {Runner} runner - Runner instance.
|
||||
*/
|
||||
function display(runner) {
|
||||
var stats = runner.stats;
|
||||
var symbol = {
|
||||
cross: '\u274C',
|
||||
tick: '\u2705'
|
||||
};
|
||||
var logo = require('../../package').notifyLogo;
|
||||
var _message;
|
||||
var message;
|
||||
var title;
|
||||
|
||||
if (stats.failures) {
|
||||
_message = stats.failures + ' of ' + stats.tests + ' tests failed';
|
||||
message = symbol.cross + ' ' + _message;
|
||||
title = 'Failed';
|
||||
} else {
|
||||
_message = stats.passes + ' tests passed in ' + stats.duration + 'ms';
|
||||
message = symbol.tick + ' ' + _message;
|
||||
title = 'Passed';
|
||||
}
|
||||
|
||||
// Send notification
|
||||
var options = {
|
||||
badge: logo,
|
||||
body: message,
|
||||
dir: 'ltr',
|
||||
icon: logo,
|
||||
lang: 'en-US',
|
||||
name: 'mocha',
|
||||
requireInteraction: false,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
var notification = new Notification(title, options);
|
||||
|
||||
// Autoclose after brief delay (makes various browsers act same)
|
||||
var FORCE_DURATION = 4000;
|
||||
setTimeout(notification.close.bind(notification), FORCE_DURATION);
|
||||
}
|
||||
|
||||
/**
|
||||
* As notifications are tangential to our purpose, just log the error.
|
||||
*
|
||||
* @private
|
||||
* @param {Error} err - Why notification didn't happen.
|
||||
*/
|
||||
function notPermitted(err) {
|
||||
console.error('notification error:', err.message);
|
||||
}
|
119
node_modules/mocha/lib/browser/progress.js
generated
vendored
Normal file
119
node_modules/mocha/lib/browser/progress.js
generated
vendored
Normal file
@ -0,0 +1,119 @@
|
||||
'use strict';
|
||||
|
||||
/**
|
||||
* Expose `Progress`.
|
||||
*/
|
||||
|
||||
module.exports = Progress;
|
||||
|
||||
/**
|
||||
* Initialize a new `Progress` indicator.
|
||||
*/
|
||||
function Progress() {
|
||||
this.percent = 0;
|
||||
this.size(0);
|
||||
this.fontSize(11);
|
||||
this.font('helvetica, arial, sans-serif');
|
||||
}
|
||||
|
||||
/**
|
||||
* Set progress size to `size`.
|
||||
*
|
||||
* @public
|
||||
* @param {number} size
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.size = function(size) {
|
||||
this._size = size;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set text to `text`.
|
||||
*
|
||||
* @public
|
||||
* @param {string} text
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.text = function(text) {
|
||||
this._text = text;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set font size to `size`.
|
||||
*
|
||||
* @public
|
||||
* @param {number} size
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.fontSize = function(size) {
|
||||
this._fontSize = size;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Set font to `family`.
|
||||
*
|
||||
* @param {string} family
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.font = function(family) {
|
||||
this._font = family;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Update percentage to `n`.
|
||||
*
|
||||
* @param {number} n
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.update = function(n) {
|
||||
this.percent = n;
|
||||
return this;
|
||||
};
|
||||
|
||||
/**
|
||||
* Draw on `ctx`.
|
||||
*
|
||||
* @param {CanvasRenderingContext2d} ctx
|
||||
* @return {Progress} Progress instance.
|
||||
*/
|
||||
Progress.prototype.draw = function(ctx) {
|
||||
try {
|
||||
var percent = Math.min(this.percent, 100);
|
||||
var size = this._size;
|
||||
var half = size / 2;
|
||||
var x = half;
|
||||
var y = half;
|
||||
var rad = half - 1;
|
||||
var fontSize = this._fontSize;
|
||||
|
||||
ctx.font = fontSize + 'px ' + this._font;
|
||||
|
||||
var angle = Math.PI * 2 * (percent / 100);
|
||||
ctx.clearRect(0, 0, size, size);
|
||||
|
||||
// outer circle
|
||||
ctx.strokeStyle = '#9f9f9f';
|
||||
ctx.beginPath();
|
||||
ctx.arc(x, y, rad, 0, angle, false);
|
||||
ctx.stroke();
|
||||
|
||||
// inner circle
|
||||
ctx.strokeStyle = '#eee';
|
||||
ctx.beginPath();
|
||||
ctx.arc(x, y, rad - 1, 0, angle, true);
|
||||
ctx.stroke();
|
||||
|
||||
// text
|
||||
var text = this._text || (percent | 0) + '%';
|
||||
var w = ctx.measureText(text).width;
|
||||
|
||||
ctx.fillText(text, x - w / 2 + 1, y + fontSize / 2 - 1);
|
||||
} catch (ignore) {
|
||||
// don't fail if we can't render progress
|
||||
}
|
||||
return this;
|
||||
};
|
18
node_modules/mocha/lib/browser/template.html
generated
vendored
Normal file
18
node_modules/mocha/lib/browser/template.html
generated
vendored
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Mocha</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<link rel="stylesheet" href="mocha.css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="mocha"></div>
|
||||
<script src="mocha.js"></script>
|
||||
<script>mocha.setup('bdd');</script>
|
||||
<script src="tests.js"></script>
|
||||
<script>
|
||||
mocha.run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
13
node_modules/mocha/lib/browser/tty.js
generated
vendored
Normal file
13
node_modules/mocha/lib/browser/tty.js
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
'use strict';
|
||||
|
||||
exports.isatty = function isatty() {
|
||||
return true;
|
||||
};
|
||||
|
||||
exports.getWindowSize = function getWindowSize() {
|
||||
if ('innerHeight' in global) {
|
||||
return [global.innerHeight, global.innerWidth];
|
||||
}
|
||||
// In a Web Worker, the DOM Window is not available.
|
||||
return [640, 480];
|
||||
};
|
Reference in New Issue
Block a user