You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
298 lines
6.4 KiB
298 lines
6.4 KiB
'use strict'; |
|
|
|
Object.defineProperty(exports, '__esModule', { |
|
value: true |
|
}); |
|
exports.default = void 0; |
|
|
|
var _assert = require('assert'); |
|
|
|
var _ExpectationFailed = _interopRequireDefault( |
|
require('../ExpectationFailed') |
|
); |
|
|
|
var _assertionErrorMessage = _interopRequireDefault( |
|
require('../assertionErrorMessage') |
|
); |
|
|
|
var _expectationResultFactory = _interopRequireDefault( |
|
require('../expectationResultFactory') |
|
); |
|
|
|
function _interopRequireDefault(obj) { |
|
return obj && obj.__esModule ? obj : {default: obj}; |
|
} |
|
|
|
function _defineProperty(obj, key, value) { |
|
if (key in obj) { |
|
Object.defineProperty(obj, key, { |
|
value: value, |
|
enumerable: true, |
|
configurable: true, |
|
writable: true |
|
}); |
|
} else { |
|
obj[key] = value; |
|
} |
|
return obj; |
|
} |
|
|
|
class Spec { |
|
static isPendingSpecException(e) { |
|
return !!( |
|
e && |
|
e.toString && |
|
e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1 |
|
); |
|
} |
|
|
|
constructor(attrs) { |
|
_defineProperty(this, 'id', void 0); |
|
|
|
_defineProperty(this, 'description', void 0); |
|
|
|
_defineProperty(this, 'resultCallback', void 0); |
|
|
|
_defineProperty(this, 'queueableFn', void 0); |
|
|
|
_defineProperty(this, 'beforeAndAfterFns', void 0); |
|
|
|
_defineProperty(this, 'userContext', void 0); |
|
|
|
_defineProperty(this, 'onStart', void 0); |
|
|
|
_defineProperty(this, 'getSpecName', void 0); |
|
|
|
_defineProperty(this, 'queueRunnerFactory', void 0); |
|
|
|
_defineProperty(this, 'throwOnExpectationFailure', void 0); |
|
|
|
_defineProperty(this, 'initError', void 0); |
|
|
|
_defineProperty(this, 'result', void 0); |
|
|
|
_defineProperty(this, 'disabled', void 0); |
|
|
|
_defineProperty(this, 'currentRun', void 0); |
|
|
|
_defineProperty(this, 'markedTodo', void 0); |
|
|
|
_defineProperty(this, 'markedPending', void 0); |
|
|
|
_defineProperty(this, 'expand', void 0); |
|
|
|
this.resultCallback = attrs.resultCallback || function () {}; |
|
|
|
this.id = attrs.id; |
|
this.description = attrs.description || ''; |
|
this.queueableFn = attrs.queueableFn; |
|
|
|
this.beforeAndAfterFns = |
|
attrs.beforeAndAfterFns || |
|
function () { |
|
return { |
|
befores: [], |
|
afters: [] |
|
}; |
|
}; |
|
|
|
this.userContext = |
|
attrs.userContext || |
|
function () { |
|
return {}; |
|
}; |
|
|
|
this.onStart = attrs.onStart || function () {}; |
|
|
|
this.getSpecName = |
|
attrs.getSpecName || |
|
function () { |
|
return ''; |
|
}; |
|
|
|
this.queueRunnerFactory = attrs.queueRunnerFactory || function () {}; |
|
|
|
this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; |
|
this.initError = new Error(); |
|
this.initError.name = ''; // Without this line v8 stores references to all closures |
|
// in the stack in the Error object. This line stringifies the stack |
|
// property to allow garbage-collecting objects on the stack |
|
// https://crbug.com/v8/7142 |
|
|
|
this.initError.stack = this.initError.stack; |
|
this.queueableFn.initError = this.initError; // @ts-expect-error |
|
|
|
this.result = { |
|
id: this.id, |
|
description: this.description, |
|
fullName: this.getFullName(), |
|
failedExpectations: [], |
|
passedExpectations: [], |
|
pendingReason: '', |
|
testPath: attrs.getTestPath() |
|
}; |
|
} |
|
|
|
addExpectationResult(passed, data, isError) { |
|
const expectationResult = (0, _expectationResultFactory.default)( |
|
data, |
|
this.initError |
|
); |
|
|
|
if (passed) { |
|
this.result.passedExpectations.push(expectationResult); |
|
} else { |
|
this.result.failedExpectations.push(expectationResult); |
|
|
|
if (this.throwOnExpectationFailure && !isError) { |
|
throw new _ExpectationFailed.default(); |
|
} |
|
} |
|
} |
|
|
|
execute(onComplete, enabled) { |
|
const self = this; |
|
this.onStart(this); |
|
|
|
if ( |
|
!this.isExecutable() || |
|
this.markedPending || |
|
this.markedTodo || |
|
enabled === false |
|
) { |
|
complete(enabled); |
|
return; |
|
} |
|
|
|
const fns = this.beforeAndAfterFns(); |
|
const allFns = fns.befores.concat(this.queueableFn).concat(fns.afters); |
|
this.currentRun = this.queueRunnerFactory({ |
|
queueableFns: allFns, |
|
|
|
onException() { |
|
// @ts-expect-error |
|
self.onException.apply(self, arguments); |
|
}, |
|
|
|
userContext: this.userContext(), |
|
setTimeout, |
|
clearTimeout, |
|
fail: () => {} |
|
}); |
|
this.currentRun.then(() => complete(true)); |
|
|
|
function complete(enabledAgain) { |
|
self.result.status = self.status(enabledAgain); |
|
self.resultCallback(self.result); |
|
|
|
if (onComplete) { |
|
onComplete(); |
|
} |
|
} |
|
} |
|
|
|
cancel() { |
|
if (this.currentRun) { |
|
this.currentRun.cancel(); |
|
} |
|
} |
|
|
|
onException(error) { |
|
if (Spec.isPendingSpecException(error)) { |
|
this.pend(extractCustomPendingMessage(error)); |
|
return; |
|
} |
|
|
|
if (error instanceof _ExpectationFailed.default) { |
|
return; |
|
} |
|
|
|
this.addExpectationResult( |
|
false, |
|
{ |
|
matcherName: '', |
|
passed: false, |
|
expected: '', |
|
actual: '', |
|
error: this.isAssertionError(error) |
|
? (0, _assertionErrorMessage.default)(error, { |
|
expand: this.expand |
|
}) |
|
: error |
|
}, |
|
true |
|
); |
|
} |
|
|
|
disable() { |
|
this.disabled = true; |
|
} |
|
|
|
pend(message) { |
|
this.markedPending = true; |
|
|
|
if (message) { |
|
this.result.pendingReason = message; |
|
} |
|
} |
|
|
|
todo() { |
|
this.markedTodo = true; |
|
} |
|
|
|
getResult() { |
|
this.result.status = this.status(); |
|
return this.result; |
|
} |
|
|
|
status(enabled) { |
|
if (this.disabled || enabled === false) { |
|
return 'disabled'; |
|
} |
|
|
|
if (this.markedTodo) { |
|
return 'todo'; |
|
} |
|
|
|
if (this.markedPending) { |
|
return 'pending'; |
|
} |
|
|
|
if (this.result.failedExpectations.length > 0) { |
|
return 'failed'; |
|
} else { |
|
return 'passed'; |
|
} |
|
} |
|
|
|
isExecutable() { |
|
return !this.disabled; |
|
} |
|
|
|
getFullName() { |
|
return this.getSpecName(this); |
|
} |
|
|
|
isAssertionError(error) { |
|
return ( |
|
error instanceof _assert.AssertionError || |
|
(error && error.name === _assert.AssertionError.name) |
|
); |
|
} |
|
} |
|
|
|
exports.default = Spec; |
|
|
|
_defineProperty(Spec, 'pendingSpecExceptionMessage', void 0); |
|
|
|
Spec.pendingSpecExceptionMessage = '=> marked Pending'; |
|
|
|
const extractCustomPendingMessage = function (e) { |
|
const fullMessage = e.toString(); |
|
const boilerplateStart = fullMessage.indexOf( |
|
Spec.pendingSpecExceptionMessage |
|
); |
|
const boilerplateEnd = |
|
boilerplateStart + Spec.pendingSpecExceptionMessage.length; |
|
return fullMessage.substr(boilerplateEnd); |
|
};
|
|
|