|
|
|
|
@@ -48,19 +48,21 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function HtmlReporter(options) {
|
|
|
|
|
var config = function() {
|
|
|
|
|
return (options.env && options.env.configuration()) || {};
|
|
|
|
|
},
|
|
|
|
|
getContainer = options.getContainer,
|
|
|
|
|
createElement = options.createElement,
|
|
|
|
|
createTextNode = options.createTextNode,
|
|
|
|
|
navigateWithNewParam = options.navigateWithNewParam || function() {},
|
|
|
|
|
addToExistingQueryString =
|
|
|
|
|
options.addToExistingQueryString || defaultQueryString,
|
|
|
|
|
filterSpecs = options.filterSpecs,
|
|
|
|
|
htmlReporterMain,
|
|
|
|
|
symbols,
|
|
|
|
|
deprecationWarnings = [];
|
|
|
|
|
function config() {
|
|
|
|
|
return (options.env && options.env.configuration()) || {};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getContainer = options.getContainer;
|
|
|
|
|
const createElement = options.createElement;
|
|
|
|
|
const createTextNode = options.createTextNode;
|
|
|
|
|
const navigateWithNewParam = options.navigateWithNewParam || function() {};
|
|
|
|
|
const addToExistingQueryString =
|
|
|
|
|
options.addToExistingQueryString || defaultQueryString;
|
|
|
|
|
const filterSpecs = options.filterSpecs;
|
|
|
|
|
let htmlReporterMain;
|
|
|
|
|
let symbols;
|
|
|
|
|
const deprecationWarnings = [];
|
|
|
|
|
const failures = [];
|
|
|
|
|
|
|
|
|
|
this.initialize = function() {
|
|
|
|
|
clearPrior();
|
|
|
|
|
@@ -88,14 +90,14 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
getContainer().appendChild(htmlReporterMain);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var totalSpecsDefined;
|
|
|
|
|
let totalSpecsDefined;
|
|
|
|
|
this.jasmineStarted = function(options) {
|
|
|
|
|
totalSpecsDefined = options.totalSpecsDefined || 0;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var summary = createDom('div', { className: 'jasmine-summary' });
|
|
|
|
|
const summary = createDom('div', { className: 'jasmine-summary' });
|
|
|
|
|
|
|
|
|
|
var stateBuilder = new ResultsStateBuilder();
|
|
|
|
|
const stateBuilder = new ResultsStateBuilder();
|
|
|
|
|
|
|
|
|
|
this.suiteStarted = function(result) {
|
|
|
|
|
stateBuilder.suiteStarted(result);
|
|
|
|
|
@@ -114,12 +116,11 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
stateBuilder.specStarted(result);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var failures = [];
|
|
|
|
|
this.specDone = function(result) {
|
|
|
|
|
stateBuilder.specDone(result);
|
|
|
|
|
|
|
|
|
|
if (noExpectations(result)) {
|
|
|
|
|
var noSpecMsg = "Spec '" + result.fullName + "' has no expectations.";
|
|
|
|
|
const noSpecMsg = "Spec '" + result.fullName + "' has no expectations.";
|
|
|
|
|
if (result.status === 'failed') {
|
|
|
|
|
console.error(noSpecMsg);
|
|
|
|
|
} else {
|
|
|
|
|
@@ -163,10 +164,10 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
|
|
|
|
|
this.jasmineDone = function(doneResult) {
|
|
|
|
|
stateBuilder.jasmineDone(doneResult);
|
|
|
|
|
var banner = find('.jasmine-banner');
|
|
|
|
|
var alert = find('.jasmine-alert');
|
|
|
|
|
var order = doneResult && doneResult.order;
|
|
|
|
|
var i;
|
|
|
|
|
const banner = find('.jasmine-banner');
|
|
|
|
|
const alert = find('.jasmine-alert');
|
|
|
|
|
const order = doneResult && doneResult.order;
|
|
|
|
|
|
|
|
|
|
alert.appendChild(
|
|
|
|
|
createDom(
|
|
|
|
|
'span',
|
|
|
|
|
@@ -178,14 +179,14 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
banner.appendChild(optionsMenu(config()));
|
|
|
|
|
|
|
|
|
|
if (stateBuilder.specsExecuted < totalSpecsDefined) {
|
|
|
|
|
var skippedMessage =
|
|
|
|
|
const skippedMessage =
|
|
|
|
|
'Ran ' +
|
|
|
|
|
stateBuilder.specsExecuted +
|
|
|
|
|
' of ' +
|
|
|
|
|
totalSpecsDefined +
|
|
|
|
|
' specs - run all';
|
|
|
|
|
// include window.location.pathname to fix issue with karma-jasmine-html-reporter in angular: see https://github.com/jasmine/jasmine/issues/1906
|
|
|
|
|
var skippedLink =
|
|
|
|
|
const skippedLink =
|
|
|
|
|
(window.location.pathname || '') +
|
|
|
|
|
addToExistingQueryString('spec', '');
|
|
|
|
|
alert.appendChild(
|
|
|
|
|
@@ -200,10 +201,11 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
var statusBarMessage = '';
|
|
|
|
|
var statusBarClassName = 'jasmine-overall-result jasmine-bar ';
|
|
|
|
|
var globalFailures = (doneResult && doneResult.failedExpectations) || [];
|
|
|
|
|
var failed = stateBuilder.failureCount + globalFailures.length > 0;
|
|
|
|
|
let statusBarMessage = '';
|
|
|
|
|
let statusBarClassName = 'jasmine-overall-result jasmine-bar ';
|
|
|
|
|
const globalFailures =
|
|
|
|
|
(doneResult && doneResult.failedExpectations) || [];
|
|
|
|
|
const failed = stateBuilder.failureCount + globalFailures.length > 0;
|
|
|
|
|
|
|
|
|
|
if (totalSpecsDefined > 0 || failed) {
|
|
|
|
|
statusBarMessage +=
|
|
|
|
|
@@ -229,7 +231,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
statusBarClassName += ' jasmine-failed ';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var seedBar;
|
|
|
|
|
let seedBar;
|
|
|
|
|
if (order && order.random) {
|
|
|
|
|
seedBar = createDom(
|
|
|
|
|
'span',
|
|
|
|
|
@@ -255,10 +257,10 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
var errorBarClassName = 'jasmine-bar jasmine-errored';
|
|
|
|
|
var afterAllMessagePrefix = 'AfterAll ';
|
|
|
|
|
const errorBarClassName = 'jasmine-bar jasmine-errored';
|
|
|
|
|
const afterAllMessagePrefix = 'AfterAll ';
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < globalFailures.length; i++) {
|
|
|
|
|
for (let i = 0; i < globalFailures.length; i++) {
|
|
|
|
|
alert.appendChild(
|
|
|
|
|
createDom(
|
|
|
|
|
'span',
|
|
|
|
|
@@ -270,7 +272,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
|
|
|
|
|
function globalFailureMessage(failure) {
|
|
|
|
|
if (failure.globalErrorType === 'load') {
|
|
|
|
|
var prefix = 'Error during loading: ' + failure.message;
|
|
|
|
|
const prefix = 'Error during loading: ' + failure.message;
|
|
|
|
|
|
|
|
|
|
if (failure.filename) {
|
|
|
|
|
return (
|
|
|
|
|
@@ -288,9 +290,9 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
|
|
|
|
|
addDeprecationWarnings(doneResult);
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < deprecationWarnings.length; i++) {
|
|
|
|
|
var children = [],
|
|
|
|
|
context;
|
|
|
|
|
for (let i = 0; i < deprecationWarnings.length; i++) {
|
|
|
|
|
const children = [];
|
|
|
|
|
let context;
|
|
|
|
|
|
|
|
|
|
switch (deprecationWarnings[i].runnableType) {
|
|
|
|
|
case 'spec':
|
|
|
|
|
@@ -324,7 +326,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var results = find('.jasmine-results');
|
|
|
|
|
const results = find('.jasmine-results');
|
|
|
|
|
results.appendChild(summary);
|
|
|
|
|
|
|
|
|
|
summaryList(stateBuilder.topResults, summary);
|
|
|
|
|
@@ -366,8 +368,8 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
|
|
|
|
|
setMenuModeTo('jasmine-failure-list');
|
|
|
|
|
|
|
|
|
|
var failureNode = find('.jasmine-failures');
|
|
|
|
|
for (i = 0; i < failures.length; i++) {
|
|
|
|
|
const failureNode = find('.jasmine-failures');
|
|
|
|
|
for (let i = 0; i < failures.length; i++) {
|
|
|
|
|
failureNode.appendChild(failures[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@@ -376,16 +378,16 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
return this;
|
|
|
|
|
|
|
|
|
|
function failureDom(result) {
|
|
|
|
|
var failure = createDom(
|
|
|
|
|
const failure = createDom(
|
|
|
|
|
'div',
|
|
|
|
|
{ className: 'jasmine-spec-detail jasmine-failed' },
|
|
|
|
|
failureDescription(result, stateBuilder.currentParent),
|
|
|
|
|
createDom('div', { className: 'jasmine-messages' })
|
|
|
|
|
);
|
|
|
|
|
var messages = failure.childNodes[1];
|
|
|
|
|
const messages = failure.childNodes[1];
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < result.failedExpectations.length; i++) {
|
|
|
|
|
var expectation = result.failedExpectations[i];
|
|
|
|
|
for (let i = 0; i < result.failedExpectations.length; i++) {
|
|
|
|
|
const expectation = result.failedExpectations[i];
|
|
|
|
|
messages.appendChild(
|
|
|
|
|
createDom(
|
|
|
|
|
'div',
|
|
|
|
|
@@ -420,7 +422,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function debugLogTable(debugLogs) {
|
|
|
|
|
var tbody = createDom('tbody');
|
|
|
|
|
const tbody = createDom('tbody');
|
|
|
|
|
|
|
|
|
|
debugLogs.forEach(function(entry) {
|
|
|
|
|
tbody.appendChild(
|
|
|
|
|
@@ -460,14 +462,14 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function summaryList(resultsTree, domParent) {
|
|
|
|
|
var specListNode;
|
|
|
|
|
for (var i = 0; i < resultsTree.children.length; i++) {
|
|
|
|
|
var resultNode = resultsTree.children[i];
|
|
|
|
|
let specListNode;
|
|
|
|
|
for (let i = 0; i < resultsTree.children.length; i++) {
|
|
|
|
|
const resultNode = resultsTree.children[i];
|
|
|
|
|
if (filterSpecs && !hasActiveSpec(resultNode)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (resultNode.type === 'suite') {
|
|
|
|
|
var suiteListNode = createDom(
|
|
|
|
|
const suiteListNode = createDom(
|
|
|
|
|
'ul',
|
|
|
|
|
{ className: 'jasmine-suite', id: 'suite-' + resultNode.result.id },
|
|
|
|
|
createDom(
|
|
|
|
|
@@ -492,7 +494,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
specListNode = createDom('ul', { className: 'jasmine-specs' });
|
|
|
|
|
domParent.appendChild(specListNode);
|
|
|
|
|
}
|
|
|
|
|
var specDescription = resultNode.result.description;
|
|
|
|
|
let specDescription = resultNode.result.description;
|
|
|
|
|
if (noExpectations(resultNode.result)) {
|
|
|
|
|
specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription;
|
|
|
|
|
}
|
|
|
|
|
@@ -524,7 +526,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function optionsMenu(config) {
|
|
|
|
|
var optionsMenuDom = createDom(
|
|
|
|
|
const optionsMenuDom = createDom(
|
|
|
|
|
'div',
|
|
|
|
|
{ className: 'jasmine-run-options' },
|
|
|
|
|
createDom('span', { className: 'jasmine-trigger' }, 'Options'),
|
|
|
|
|
@@ -590,13 +592,15 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast');
|
|
|
|
|
const failFastCheckbox = optionsMenuDom.querySelector(
|
|
|
|
|
'#jasmine-fail-fast'
|
|
|
|
|
);
|
|
|
|
|
failFastCheckbox.checked = config.stopOnSpecFailure;
|
|
|
|
|
failFastCheckbox.onclick = function() {
|
|
|
|
|
navigateWithNewParam('stopOnSpecFailure', !config.stopOnSpecFailure);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var throwCheckbox = optionsMenuDom.querySelector(
|
|
|
|
|
const throwCheckbox = optionsMenuDom.querySelector(
|
|
|
|
|
'#jasmine-throw-failures'
|
|
|
|
|
);
|
|
|
|
|
throwCheckbox.checked = config.stopSpecOnExpectationFailure;
|
|
|
|
|
@@ -607,7 +611,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var randomCheckbox = optionsMenuDom.querySelector(
|
|
|
|
|
const randomCheckbox = optionsMenuDom.querySelector(
|
|
|
|
|
'#jasmine-random-order'
|
|
|
|
|
);
|
|
|
|
|
randomCheckbox.checked = config.random;
|
|
|
|
|
@@ -615,13 +619,15 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
navigateWithNewParam('random', !config.random);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var hideDisabled = optionsMenuDom.querySelector('#jasmine-hide-disabled');
|
|
|
|
|
const hideDisabled = optionsMenuDom.querySelector(
|
|
|
|
|
'#jasmine-hide-disabled'
|
|
|
|
|
);
|
|
|
|
|
hideDisabled.checked = config.hideDisabled;
|
|
|
|
|
hideDisabled.onclick = function() {
|
|
|
|
|
navigateWithNewParam('hideDisabled', !config.hideDisabled);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
|
|
|
|
const optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
|
|
|
|
optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'),
|
|
|
|
|
isOpen = /\bjasmine-open\b/;
|
|
|
|
|
|
|
|
|
|
@@ -640,7 +646,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function failureDescription(result, suite) {
|
|
|
|
|
var wrapper = createDom(
|
|
|
|
|
const wrapper = createDom(
|
|
|
|
|
'div',
|
|
|
|
|
{ className: 'jasmine-description' },
|
|
|
|
|
createDom(
|
|
|
|
|
@@ -649,7 +655,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
result.description
|
|
|
|
|
)
|
|
|
|
|
);
|
|
|
|
|
var suiteLink;
|
|
|
|
|
let suiteLink;
|
|
|
|
|
|
|
|
|
|
while (suite && suite.parent) {
|
|
|
|
|
wrapper.insertBefore(createTextNode(' > '), wrapper.firstChild);
|
|
|
|
|
@@ -667,7 +673,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function suiteHref(suite) {
|
|
|
|
|
var els = [];
|
|
|
|
|
const els = [];
|
|
|
|
|
|
|
|
|
|
while (suite && suite.parent) {
|
|
|
|
|
els.unshift(suite.result.description);
|
|
|
|
|
@@ -683,8 +689,8 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
|
|
|
|
|
function addDeprecationWarnings(result, runnableType) {
|
|
|
|
|
if (result && result.deprecationWarnings) {
|
|
|
|
|
for (var i = 0; i < result.deprecationWarnings.length; i++) {
|
|
|
|
|
var warning = result.deprecationWarnings[i].message;
|
|
|
|
|
for (let i = 0; i < result.deprecationWarnings.length; i++) {
|
|
|
|
|
const warning = result.deprecationWarnings[i].message;
|
|
|
|
|
deprecationWarnings.push({
|
|
|
|
|
message: warning,
|
|
|
|
|
stack: result.deprecationWarnings[i].stack,
|
|
|
|
|
@@ -696,8 +702,8 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function createExpander(stackTrace) {
|
|
|
|
|
var expandLink = createDom('a', { href: '#' }, 'Show stack trace');
|
|
|
|
|
var root = createDom(
|
|
|
|
|
const expandLink = createDom('a', { href: '#' }, 'Show stack trace');
|
|
|
|
|
const root = createDom(
|
|
|
|
|
'div',
|
|
|
|
|
{ className: 'jasmine-expander' },
|
|
|
|
|
expandLink,
|
|
|
|
|
@@ -728,8 +734,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function clearPrior() {
|
|
|
|
|
// return the reporter
|
|
|
|
|
var oldReporter = find('');
|
|
|
|
|
const oldReporter = find('');
|
|
|
|
|
|
|
|
|
|
if (oldReporter) {
|
|
|
|
|
getContainer().removeChild(oldReporter);
|
|
|
|
|
@@ -737,22 +742,21 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function createDom(type, attrs, childrenArrayOrVarArgs) {
|
|
|
|
|
var el = createElement(type),
|
|
|
|
|
children,
|
|
|
|
|
i;
|
|
|
|
|
const el = createElement(type);
|
|
|
|
|
let children;
|
|
|
|
|
|
|
|
|
|
if (j$.isArray_(childrenArrayOrVarArgs)) {
|
|
|
|
|
children = childrenArrayOrVarArgs;
|
|
|
|
|
} else {
|
|
|
|
|
children = [];
|
|
|
|
|
|
|
|
|
|
for (i = 2; i < arguments.length; i++) {
|
|
|
|
|
for (let i = 2; i < arguments.length; i++) {
|
|
|
|
|
children.push(arguments[i]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < children.length; i++) {
|
|
|
|
|
var child = children[i];
|
|
|
|
|
for (let i = 0; i < children.length; i++) {
|
|
|
|
|
const child = children[i];
|
|
|
|
|
|
|
|
|
|
if (typeof child === 'string') {
|
|
|
|
|
el.appendChild(createTextNode(child));
|
|
|
|
|
@@ -763,7 +767,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var attr in attrs) {
|
|
|
|
|
for (const attr in attrs) {
|
|
|
|
|
if (attr == 'className') {
|
|
|
|
|
el[attr] = attrs[attr];
|
|
|
|
|
} else {
|
|
|
|
|
@@ -775,7 +779,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function pluralize(singular, count) {
|
|
|
|
|
var word = count == 1 ? singular : singular + 's';
|
|
|
|
|
const word = count == 1 ? singular : singular + 's';
|
|
|
|
|
|
|
|
|
|
return '' + count + ' ' + word;
|
|
|
|
|
}
|
|
|
|
|
@@ -805,7 +809,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function noExpectations(result) {
|
|
|
|
|
var allExpectations =
|
|
|
|
|
const allExpectations =
|
|
|
|
|
result.failedExpectations.length + result.passedExpectations.length;
|
|
|
|
|
|
|
|
|
|
return (
|
|
|
|
|
@@ -820,7 +824,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (resultNode.type == 'suite') {
|
|
|
|
|
for (var i = 0, j = resultNode.children.length; i < j; i++) {
|
|
|
|
|
for (let i = 0, j = resultNode.children.length; i < j; i++) {
|
|
|
|
|
if (hasActiveSpec(resultNode.children[i])) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|