jasmine-core
Advanced tools
Comparing version 2.99.0 to 3.0.0
@@ -76,4 +76,4 @@ /* | ||
var catchingExceptions = queryString.getParam("catch"); | ||
env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); | ||
var stoppingOnSpecFailure = queryString.getParam("failFast"); | ||
env.stopOnSpecFailure(stoppingOnSpecFailure); | ||
@@ -84,4 +84,7 @@ var throwingExpectationFailures = queryString.getParam("throwFailures"); | ||
var random = queryString.getParam("random"); | ||
env.randomizeTests(random); | ||
if (random !== undefined && random !== "") { | ||
env.randomizeTests(random); | ||
} | ||
var seed = queryString.getParam("seed"); | ||
@@ -98,5 +101,3 @@ if (seed) { | ||
env: env, | ||
onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); }, | ||
onThrowExpectationsClick: function() { queryString.navigateWithNewParam("throwFailures", !env.throwingExpectationFailures()); }, | ||
onRandomClick: function() { queryString.navigateWithNewParam("random", !env.randomTests()); }, | ||
navigateWithNewParam: function(key, value) { return queryString.navigateWithNewParam(key, value); }, | ||
addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, | ||
@@ -103,0 +104,0 @@ getContainer: function() { return document.body; }, |
@@ -28,2 +28,3 @@ /* | ||
j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); | ||
j$.matchers.toHaveClass = jasmineRequire.toHaveClass(j$); | ||
}; | ||
@@ -52,5 +53,10 @@ | ||
ResultsStateBuilder.prototype.suiteDone = function(result) { | ||
this.currentParent.updateResult(result); | ||
if (this.currentParent !== this.topResults) { | ||
this.currentParent = this.currentParent.parent; | ||
} | ||
if (result.status === 'failed') { | ||
this.failureCount++; | ||
} | ||
}; | ||
@@ -64,3 +70,3 @@ | ||
if (result.status !== 'disabled') { | ||
if (result.status !== 'excluded') { | ||
this.specsExecuted++; | ||
@@ -85,12 +91,8 @@ } | ||
createTextNode = options.createTextNode, | ||
onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, | ||
onThrowExpectationsClick = options.onThrowExpectationsClick || function() {}, | ||
onRandomClick = options.onRandomClick || function() {}, | ||
navigateWithNewParam = options.navigateWithNewParam || function() {}, | ||
addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, | ||
filterSpecs = options.filterSpecs, | ||
timer = options.timer || noopTimer, | ||
results = [], | ||
htmlReporterMain, | ||
symbols, | ||
failedSuites = [], | ||
deprecationWarnings = []; | ||
@@ -129,7 +131,7 @@ | ||
this.suiteDone = function(result) { | ||
if (result.status == 'failed') { | ||
failedSuites.push(result); | ||
stateBuilder.suiteDone(result); | ||
if (result.status === 'failed') { | ||
failures.push(failureDom(result)); | ||
} | ||
stateBuilder.suiteDone(result); | ||
addDeprecationWarnings(result); | ||
@@ -161,19 +163,4 @@ }; | ||
if (result.status == 'failed') { | ||
var failure = | ||
createDom('div', {className: 'jasmine-spec-detail jasmine-failed'}, | ||
createDom('div', {className: 'jasmine-description'}, | ||
createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName) | ||
), | ||
createDom('div', {className: 'jasmine-messages'}) | ||
); | ||
var messages = failure.childNodes[1]; | ||
for (var i = 0; i < result.failedExpectations.length; i++) { | ||
var expectation = result.failedExpectations[i]; | ||
messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message)); | ||
messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack)); | ||
} | ||
failures.push(failure); | ||
if (result.status === 'failed') { | ||
failures.push(failureDom(result)); | ||
} | ||
@@ -190,56 +177,4 @@ | ||
banner.appendChild( | ||
createDom('div', { className: 'jasmine-run-options' }, | ||
createDom('span', { className: 'jasmine-trigger' }, 'Options'), | ||
createDom('div', { className: 'jasmine-payload' }, | ||
createDom('div', { className: 'jasmine-exceptions' }, | ||
createDom('input', { | ||
className: 'jasmine-raise', | ||
id: 'jasmine-raise-exceptions', | ||
type: 'checkbox' | ||
}), | ||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-raise-exceptions' }, 'raise exceptions')), | ||
createDom('div', { className: 'jasmine-throw-failures' }, | ||
createDom('input', { | ||
className: 'jasmine-throw', | ||
id: 'jasmine-throw-failures', | ||
type: 'checkbox' | ||
}), | ||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')), | ||
createDom('div', { className: 'jasmine-random-order' }, | ||
createDom('input', { | ||
className: 'jasmine-random', | ||
id: 'jasmine-random-order', | ||
type: 'checkbox' | ||
}), | ||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')) | ||
) | ||
)); | ||
banner.appendChild(optionsMenu(env)); | ||
var raiseCheckbox = find('#jasmine-raise-exceptions'); | ||
raiseCheckbox.checked = !env.catchingExceptions(); | ||
raiseCheckbox.onclick = onRaiseExceptionsClick; | ||
var throwCheckbox = find('#jasmine-throw-failures'); | ||
throwCheckbox.checked = env.throwingExpectationFailures(); | ||
throwCheckbox.onclick = onThrowExpectationsClick; | ||
var randomCheckbox = find('#jasmine-random-order'); | ||
randomCheckbox.checked = env.randomTests(); | ||
randomCheckbox.onclick = onRandomClick; | ||
var optionsMenu = find('.jasmine-run-options'), | ||
optionsTrigger = optionsMenu.querySelector('.jasmine-trigger'), | ||
optionsPayload = optionsMenu.querySelector('.jasmine-payload'), | ||
isOpen = /\bjasmine-open\b/; | ||
optionsTrigger.onclick = function() { | ||
if (isOpen.test(optionsPayload.className)) { | ||
optionsPayload.className = optionsPayload.className.replace(isOpen, ''); | ||
} else { | ||
optionsPayload.className += ' jasmine-open'; | ||
} | ||
}; | ||
if (stateBuilder.specsExecuted < totalSpecsDefined) { | ||
@@ -255,11 +190,18 @@ var skippedMessage = 'Ran ' + stateBuilder.specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; | ||
var statusBarMessage = ''; | ||
var statusBarClassName = 'jasmine-bar '; | ||
var statusBarClassName = 'jasmine-overall-result jasmine-bar '; | ||
var globalFailures = (doneResult && doneResult.failedExpectations) || []; | ||
var failed = stateBuilder.failureCount + globalFailures.length > 0; | ||
if (totalSpecsDefined > 0) { | ||
if (totalSpecsDefined > 0 || failed) { | ||
statusBarMessage += pluralize('spec', stateBuilder.specsExecuted) + ', ' + pluralize('failure', stateBuilder.failureCount); | ||
if (stateBuilder.pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', stateBuilder.pendingSpecCount); } | ||
statusBarClassName += (stateBuilder.failureCount > 0) ? 'jasmine-failed' : 'jasmine-passed'; | ||
} | ||
if (doneResult.overallStatus === 'passed') { | ||
statusBarClassName += ' jasmine-passed '; | ||
} else if (doneResult.overallStatus === 'incomplete') { | ||
statusBarClassName += ' jasmine-incomplete '; | ||
statusBarMessage = 'Incomplete: ' + doneResult.incompleteReason + ', ' + statusBarMessage; | ||
} else { | ||
statusBarClassName += 'jasmine-skipped'; | ||
statusBarMessage += 'No specs found'; | ||
statusBarClassName += ' jasmine-failed '; | ||
} | ||
@@ -278,15 +220,20 @@ | ||
var errorBarClassName = 'jasmine-bar jasmine-errored'; | ||
var errorBarMessagePrefix = 'AfterAll '; | ||
var afterAllMessagePrefix = 'AfterAll '; | ||
for(var i = 0; i < failedSuites.length; i++) { | ||
var failedSuite = failedSuites[i]; | ||
for(var j = 0; j < failedSuite.failedExpectations.length; j++) { | ||
alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failedSuite.failedExpectations[j].message)); | ||
} | ||
for(i = 0; i < globalFailures.length; i++) { | ||
alert.appendChild(createDom('span', {className: errorBarClassName}, globalFailureMessage(globalFailures[i]))); | ||
} | ||
var globalFailures = (doneResult && doneResult.failedExpectations) || []; | ||
for(i = 0; i < globalFailures.length; i++) { | ||
var failure = globalFailures[i]; | ||
alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failure.message)); | ||
function globalFailureMessage(failure) { | ||
if (failure.globalErrorType === 'load') { | ||
var prefix = 'Error during loading: ' + failure.message; | ||
if (failure.filename) { | ||
return prefix + ' in ' + failure.filename + ' line ' + failure.lineno; | ||
} else { | ||
return prefix; | ||
} | ||
} else { | ||
return afterAllMessagePrefix + failure.message; | ||
} | ||
} | ||
@@ -307,43 +254,2 @@ | ||
function summaryList(resultsTree, domParent) { | ||
var specListNode; | ||
for (var i = 0; i < resultsTree.children.length; i++) { | ||
var resultNode = resultsTree.children[i]; | ||
if (filterSpecs && !hasActiveSpec(resultNode)) { | ||
continue; | ||
} | ||
if (resultNode.type == 'suite') { | ||
var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id}, | ||
createDom('li', {className: 'jasmine-suite-detail'}, | ||
createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) | ||
) | ||
); | ||
summaryList(resultNode, suiteListNode); | ||
domParent.appendChild(suiteListNode); | ||
} | ||
if (resultNode.type == 'spec') { | ||
if (domParent.getAttribute('class') != 'jasmine-specs') { | ||
specListNode = createDom('ul', {className: 'jasmine-specs'}); | ||
domParent.appendChild(specListNode); | ||
} | ||
var specDescription = resultNode.result.description; | ||
if(noExpectations(resultNode.result)) { | ||
specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; | ||
} | ||
if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { | ||
specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; | ||
} | ||
specListNode.appendChild( | ||
createDom('li', { | ||
className: 'jasmine-' + resultNode.result.status, | ||
id: 'spec-' + resultNode.result.id | ||
}, | ||
createDom('a', {href: specHref(resultNode.result)}, specDescription) | ||
) | ||
); | ||
} | ||
} | ||
} | ||
if (failures.length) { | ||
@@ -377,2 +283,149 @@ alert.appendChild( | ||
function failureDom(result) { | ||
var failure = | ||
createDom('div', {className: 'jasmine-spec-detail jasmine-failed'}, | ||
failureDescription(result, stateBuilder.currentParent), | ||
createDom('div', {className: 'jasmine-messages'}) | ||
); | ||
var messages = failure.childNodes[1]; | ||
for (var i = 0; i < result.failedExpectations.length; i++) { | ||
var expectation = result.failedExpectations[i]; | ||
messages.appendChild(createDom('div', {className: 'jasmine-result-message'}, expectation.message)); | ||
messages.appendChild(createDom('div', {className: 'jasmine-stack-trace'}, expectation.stack)); | ||
} | ||
return failure; | ||
} | ||
function summaryList(resultsTree, domParent) { | ||
var specListNode; | ||
for (var i = 0; i < resultsTree.children.length; i++) { | ||
var resultNode = resultsTree.children[i]; | ||
if (filterSpecs && !hasActiveSpec(resultNode)) { | ||
continue; | ||
} | ||
if (resultNode.type === 'suite') { | ||
var suiteListNode = createDom('ul', {className: 'jasmine-suite', id: 'suite-' + resultNode.result.id}, | ||
createDom('li', {className: 'jasmine-suite-detail jasmine-' + resultNode.result.status}, | ||
createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) | ||
) | ||
); | ||
summaryList(resultNode, suiteListNode); | ||
domParent.appendChild(suiteListNode); | ||
} | ||
if (resultNode.type === 'spec') { | ||
if (domParent.getAttribute('class') !== 'jasmine-specs') { | ||
specListNode = createDom('ul', {className: 'jasmine-specs'}); | ||
domParent.appendChild(specListNode); | ||
} | ||
var specDescription = resultNode.result.description; | ||
if(noExpectations(resultNode.result)) { | ||
specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; | ||
} | ||
if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { | ||
specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; | ||
} | ||
specListNode.appendChild( | ||
createDom('li', { | ||
className: 'jasmine-' + resultNode.result.status, | ||
id: 'spec-' + resultNode.result.id | ||
}, | ||
createDom('a', {href: specHref(resultNode.result)}, specDescription) | ||
) | ||
); | ||
} | ||
} | ||
} | ||
function optionsMenu(env) { | ||
var optionsMenuDom = createDom('div', { className: 'jasmine-run-options' }, | ||
createDom('span', { className: 'jasmine-trigger' }, 'Options'), | ||
createDom('div', { className: 'jasmine-payload' }, | ||
createDom('div', { className: 'jasmine-stop-on-failure' }, | ||
createDom('input', { | ||
className: 'jasmine-fail-fast', | ||
id: 'jasmine-fail-fast', | ||
type: 'checkbox' | ||
}), | ||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-fail-fast' }, 'stop execution on spec failure')), | ||
createDom('div', { className: 'jasmine-throw-failures' }, | ||
createDom('input', { | ||
className: 'jasmine-throw', | ||
id: 'jasmine-throw-failures', | ||
type: 'checkbox' | ||
}), | ||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-throw-failures' }, 'stop spec on expectation failure')), | ||
createDom('div', { className: 'jasmine-random-order' }, | ||
createDom('input', { | ||
className: 'jasmine-random', | ||
id: 'jasmine-random-order', | ||
type: 'checkbox' | ||
}), | ||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')) | ||
) | ||
); | ||
var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast'); | ||
failFastCheckbox.checked = env.stoppingOnSpecFailure(); | ||
failFastCheckbox.onclick = function() { | ||
navigateWithNewParam('failFast', !env.stoppingOnSpecFailure()); | ||
}; | ||
var throwCheckbox = optionsMenuDom.querySelector('#jasmine-throw-failures'); | ||
throwCheckbox.checked = env.throwingExpectationFailures(); | ||
throwCheckbox.onclick = function() { | ||
navigateWithNewParam('throwFailures', !env.throwingExpectationFailures()); | ||
}; | ||
var randomCheckbox = optionsMenuDom.querySelector('#jasmine-random-order'); | ||
randomCheckbox.checked = env.randomTests(); | ||
randomCheckbox.onclick = function() { | ||
navigateWithNewParam('random', !env.randomTests()); | ||
}; | ||
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'), | ||
optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'), | ||
isOpen = /\bjasmine-open\b/; | ||
optionsTrigger.onclick = function() { | ||
if (isOpen.test(optionsPayload.className)) { | ||
optionsPayload.className = optionsPayload.className.replace(isOpen, ''); | ||
} else { | ||
optionsPayload.className += ' jasmine-open'; | ||
} | ||
}; | ||
return optionsMenuDom; | ||
} | ||
function failureDescription(result, suite) { | ||
var wrapper = createDom('div', {className: 'jasmine-description'}, | ||
createDom('a', {title: result.description, href: specHref(result)}, result.description) | ||
); | ||
var suiteLink; | ||
while (suite && suite.parent) { | ||
wrapper.insertBefore(createTextNode(' > '), wrapper.firstChild); | ||
suiteLink = createDom('a', {href: suiteHref(suite)}, suite.result.description); | ||
wrapper.insertBefore(suiteLink, wrapper.firstChild); | ||
suite = suite.parent; | ||
} | ||
return wrapper; | ||
} | ||
function suiteHref(suite) { | ||
var els = []; | ||
while (suite && suite.parent) { | ||
els.unshift(suite.result.description); | ||
suite = suite.parent; | ||
} | ||
return addToExistingQueryString('spec', els.join(' ')); | ||
} | ||
function addDeprecationWarnings(result) { | ||
@@ -456,3 +509,3 @@ if (result && result.deprecationWarnings) { | ||
function hasActiveSpec(resultNode) { | ||
if (resultNode.type == 'spec' && resultNode.result.status != 'disabled') { | ||
if (resultNode.type == 'spec' && resultNode.result.status != 'excluded') { | ||
return true; | ||
@@ -502,2 +555,6 @@ } | ||
}; | ||
this.updateResult = function(result) { | ||
this.result = result; | ||
}; | ||
} | ||
@@ -559,1 +616,35 @@ | ||
}; | ||
jasmineRequire.toHaveClass = function(j$) { | ||
/** | ||
* {@link expect} the actual value to be a DOM element that has the expected class | ||
* @function | ||
* @name matchers#toHaveClass | ||
* @param {Object} expected - The class name to test for | ||
* @example | ||
* var el = document.createElement('div'); | ||
* el.className = 'foo bar baz'; | ||
* expect(el).toHaveClass('bar'); | ||
*/ | ||
function toHaveClass(util, customEqualityTesters) { | ||
return { | ||
compare: function(actual, expected) { | ||
if (!isElement(actual)) { | ||
throw new Error(j$.pp(actual) + ' is not a DOM element'); | ||
} | ||
return { | ||
pass: actual.classList.contains(expected) | ||
}; | ||
} | ||
}; | ||
} | ||
function isElement(maybeEl) { | ||
return maybeEl && | ||
maybeEl.classList && | ||
j$.isFunction_(maybeEl.classList.contains); | ||
} | ||
return toHaveClass; | ||
}; |
@@ -26,5 +26,2 @@ /* | ||
var consoleFns = require('../console/console.js'); | ||
consoleFns.console(consoleFns, jasmine); | ||
var env = jasmine.getEnv(); | ||
@@ -31,0 +28,0 @@ |
{ | ||
"name": "jasmine-core", | ||
"license": "MIT", | ||
"version": "2.99.0", | ||
"version": "3.0.0", | ||
"repository": { | ||
@@ -6,0 +6,0 @@ "type": "git", |
@@ -5,6 +5,4 @@ <a name="README">[<img src="https://rawgithub.com/jasmine/jasmine/master/images/jasmine-horizontal.svg" width="400px" />](http://jasmine.github.io)</a> | ||
======= | ||
# A JavaScript Testing Framework | ||
**A JavaScript Testing Framework** | ||
Jasmine is a Behavior Driven Development testing framework for JavaScript. It does not rely on browsers, DOM, or any JavaScript framework. Thus it's suited for websites, [Node.js](http://nodejs.org) projects, or anywhere that JavaScript can run. | ||
@@ -56,3 +54,3 @@ | ||
Jasmine tests itself across many browsers (Safari, Chrome, Firefox, PhantomJS, and new Internet Explorer) as well as node. To see the exact version tests are run against look at our [.travis.yml](https://github.com/jasmine/jasmine/blob/master/.travis.yml) | ||
Jasmine tests itself across many browsers (Safari, Chrome, Firefox, PhantomJS, Microsoft Edge, and new Internet Explorer) as well as nodejs. To see the exact version tests are run against look at our [.travis.yml](https://github.com/jasmine/jasmine/blob/master/.travis.yml) | ||
@@ -59,0 +57,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is not supported yet
286907
6486
39
77