diff --git a/lib/jasmine-core/example/SpecRunner.html b/lib/jasmine-core/example/SpecRunner.html deleted file mode 100644 index ea58503d..00000000 --- a/lib/jasmine-core/example/SpecRunner.html +++ /dev/null @@ -1,54 +0,0 @@ - - - - Jasmine Spec Runner - - - - - - - - - - - - - - - - - - - - - - diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index d4364bee..1633aae5 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -27,6 +27,9 @@ jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { }; jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { + if (!child.results) { + return; + } var results = child.results(); var status = results.passed() ? 'passed' : 'failed'; if (results.skipped) { @@ -488,195 +491,3 @@ jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); -/* @deprecated Use jasmine.HtmlReporter instead - */ -jasmine.TrivialReporter = function(doc) { - this.document = doc || document; - this.suiteDivs = {}; - this.logRunningSpecs = false; -}; - -jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { - var el = document.createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(document.createTextNode(child)); - } else { - if (child) { el.appendChild(child); } - } - } - - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; -}; - -jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { - var showPassed, showSkipped; - - this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, - this.createDom('div', { className: 'banner' }, - this.createDom('div', { className: 'logo' }, - this.createDom('span', { className: 'title' }, "Jasmine"), - this.createDom('span', { className: 'version' }, runner.env.versionString())), - this.createDom('div', { className: 'options' }, - "Show ", - showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), - showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), - this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") - ) - ), - - this.runnerDiv = this.createDom('div', { className: 'runner running' }, - this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), - this.runnerMessageSpan = this.createDom('span', {}, "Running..."), - this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) - ); - - this.document.body.appendChild(this.outerDiv); - - var suites = runner.suites(); - for (var i = 0; i < suites.length; i++) { - var suite = suites[i]; - var suiteDiv = this.createDom('div', { className: 'suite' }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), - this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); - this.suiteDivs[suite.id] = suiteDiv; - var parentDiv = this.outerDiv; - if (suite.parentSuite) { - parentDiv = this.suiteDivs[suite.parentSuite.id]; - } - parentDiv.appendChild(suiteDiv); - } - - this.startedAt = new Date(); - - var self = this; - showPassed.onclick = function(evt) { - if (showPassed.checked) { - self.outerDiv.className += ' show-passed'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); - } - }; - - showSkipped.onclick = function(evt) { - if (showSkipped.checked) { - self.outerDiv.className += ' show-skipped'; - } else { - self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); - } - }; -}; - -jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { - var results = runner.results(); - var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; - this.runnerDiv.setAttribute("class", className); - //do it twice for IE - this.runnerDiv.setAttribute("className", className); - var specs = runner.specs(); - var specCount = 0; - for (var i = 0; i < specs.length; i++) { - if (this.specFilter(specs[i])) { - specCount++; - } - } - var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); - message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; - this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); - - this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); -}; - -jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { - var results = suite.results(); - var status = results.passed() ? 'passed' : 'failed'; - if (results.totalCount === 0) { // todo: change this to check results.skipped - status = 'skipped'; - } - this.suiteDivs[suite.id].className += " " + status; -}; - -jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { - if (this.logRunningSpecs) { - this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); - } -}; - -jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { - var results = spec.results(); - var status = results.passed ? 'passed' : 'failed'; - if (results.skipped) { - status = 'skipped'; - } - var specDiv = this.createDom('div', { className: 'spec ' + status }, - this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), - this.createDom('a', { - className: 'description', - href: '?spec=' + encodeURIComponent(spec.getFullName()), - title: spec.getFullName() - }, spec.description)); - - - var resultItems = results.getItems(); - var messagesDiv = this.createDom('div', { className: 'messages' }); - for (var i = 0; i < resultItems.length; i++) { - var result = resultItems[i]; - - if (result.type == 'log') { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); - } else if (result.type == 'expect' && !result.passed) { - messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - - if (result.trace.stack) { - messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); - } - } - } - - if (messagesDiv.childNodes.length > 0) { - specDiv.appendChild(messagesDiv); - } - - this.suiteDivs[spec.suite.id].appendChild(specDiv); -}; - -jasmine.TrivialReporter.prototype.log = function() { - var console = jasmine.getGlobal().console; - if (console && console.log) { - if (console.log.apply) { - console.log.apply(console, arguments); - } else { - console.log(arguments); // ie fix: console.log.apply doesn't exist on ie - } - } -}; - -jasmine.TrivialReporter.prototype.getLocation = function() { - return this.document.location; -}; - -jasmine.TrivialReporter.prototype.specFilter = function(spec) { - var paramMap = {}; - var params = this.getLocation().search.substring(1).split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); - } - - if (!paramMap.spec) { - return true; - } - return spec.getFullName().indexOf(paramMap.spec) === 0; -}; diff --git a/lib/jasmine-core/jasmine.css b/lib/jasmine-core/jasmine.css index 8c008dc7..69e6db8b 100644 --- a/lib/jasmine-core/jasmine.css +++ b/lib/jasmine-core/jasmine.css @@ -50,33 +50,3 @@ body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } #HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } #HTMLReporter .resultMessage span.result { display: block; } #HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } - -#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } -#TrivialReporter a:visited, #TrivialReporter a { color: #303; } -#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } -#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } -#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } -#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } -#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } -#TrivialReporter .runner.running { background-color: yellow; } -#TrivialReporter .options { text-align: right; font-size: .8em; } -#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } -#TrivialReporter .suite .suite { margin: 5px; } -#TrivialReporter .suite.passed { background-color: #dfd; } -#TrivialReporter .suite.failed { background-color: #fdd; } -#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } -#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } -#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } -#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } -#TrivialReporter .spec.skipped { background-color: #bbb; } -#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } -#TrivialReporter .passed { background-color: #cfc; display: none; } -#TrivialReporter .failed { background-color: #fbb; } -#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } -#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } -#TrivialReporter .resultMessage .mismatch { color: black; } -#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } -#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } -#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } -#TrivialReporter #jasmine_content { position: fixed; right: 100%; } -#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 0892ee37..268cd769 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -510,15 +510,13 @@ jasmine.util.extend = function(destination, source) { //TODO: expectation result may make more sense as a presentation of an expectation. jasmine.buildExpectationResult = function(params) { - var trace = (params.trace || new Error(this.message)); - var message = params.passed ? 'Passed.' : params.message; return { type: 'expect', matcherName: params.matcherName, expected: params.expected, actual: params.actual, - message: message, - trace: params.passed ? '' : trace, + message: params.passed ? 'Passed.' : params.message, + trace: params.passed ? '' : (params.trace || new Error(this.message)), passed: params.passed }; }; @@ -527,301 +525,308 @@ jasmine.buildExpectationResult = function(params) { * * @constructor */ -jasmine.Env = function() { - this.currentSpec = null; - this.currentSuite = null; - this.currentRunner_ = new jasmine.Runner(this); +(function() { - this.reporter = new jasmine.MultiReporter(); + function createSpec(env, suite, description) { + return new jasmine.Spec(env, suite, description); + } - this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; - this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; - this.lastUpdate = 0; - this.specFilter = function() { - return true; + jasmine.Env = function() { + this.currentSpec = null; + this.currentSuite = null; + this.currentRunner_ = new jasmine.Runner(this); + + this.reporter = new jasmine.MultiReporter(); + + this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; + this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; + this.lastUpdate = 0; + this.specFilter = function() { + return true; + }; + + this.nextSpecId_ = 0; + this.nextSuiteId_ = 0; + this.equalityTesters_ = []; + + // wrap matchers + this.matchersClass = function() { + jasmine.Matchers.apply(this, arguments); + }; + jasmine.util.inherit(this.matchersClass, jasmine.Matchers); + + jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); }; - this.nextSpecId_ = 0; - this.nextSuiteId_ = 0; - this.equalityTesters_ = []; - // wrap matchers - this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); - }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); + jasmine.Env.prototype.setTimeout = jasmine.setTimeout; + jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; + jasmine.Env.prototype.setInterval = jasmine.setInterval; + jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); -}; - - -jasmine.Env.prototype.setTimeout = jasmine.setTimeout; -jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; -jasmine.Env.prototype.setInterval = jasmine.setInterval; -jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - -/** - * @returns an object containing jasmine version build info, if set. - */ -jasmine.Env.prototype.version = function () { - if (jasmine.version_) { - return jasmine.version_; - } else { - throw new Error('Version not set'); - } -}; - -/** - * @returns string containing jasmine version build info, if set. - */ -jasmine.Env.prototype.versionString = function() { - if (!jasmine.version_) { - return "version unknown"; - } - - var version = this.version(); - var versionString = version.major + "." + version.minor + "." + version.build; - if (version.release_candidate) { - versionString += ".rc" + version.release_candidate; - } - versionString += " revision " + version.revision; - return versionString; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSpecId = function () { - return this.nextSpecId_++; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSuiteId = function () { - return this.nextSuiteId_++; -}; - -/** - * Register a reporter to receive status updates from Jasmine. - * @param {jasmine.Reporter} reporter An object which will receive status updates. - */ -jasmine.Env.prototype.addReporter = function(reporter) { - this.reporter.addReporter(reporter); -}; - -jasmine.Env.prototype.execute = function() { - this.currentRunner_.execute(); -}; - -jasmine.Env.prototype.describe = function(description, specDefinitions) { - var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); - - var parentSuite = this.currentSuite; - if (parentSuite) { - parentSuite.add(suite); - } else { - this.currentRunner_.add(suite); - } - - this.currentSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch(e) { - declarationError = e; - } - - if (declarationError) { - this.it("encountered a declaration exception", function() { - throw declarationError; - }); - } - - this.currentSuite = parentSuite; - - return suite; -}; - -jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { - if (this.currentSuite) { - this.currentSuite.beforeEach(beforeEachFunction); - } else { - this.currentRunner_.beforeEach(beforeEachFunction); - } -}; - -jasmine.Env.prototype.currentRunner = function () { - return this.currentRunner_; -}; - -jasmine.Env.prototype.afterEach = function(afterEachFunction) { - if (this.currentSuite) { - this.currentSuite.afterEach(afterEachFunction); - } else { - this.currentRunner_.afterEach(afterEachFunction); - } - -}; - -jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { - return { - execute: function() { + /** + * @returns an object containing jasmine version build info, if set. + */ + jasmine.Env.prototype.version = function () { + if (jasmine.version_) { + return jasmine.version_; + } else { + throw new Error('Version not set'); } }; -}; -jasmine.Env.prototype.it = function(description, func) { - var spec = new jasmine.Spec(this, this.currentSuite, description); - this.currentSuite.add(spec); - this.currentSpec = spec; - - if (func) { - spec.runs(func); - } - - return spec; -}; - -jasmine.Env.prototype.xit = function(desc, func) { - return { - id: this.nextSpecId(), - runs: function() { + /** + * @returns string containing jasmine version build info, if set. + */ + jasmine.Env.prototype.versionString = function() { + if (!jasmine.version_) { + return "version unknown"; } - }; -}; -jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.source != b.source) - mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/"); - - if (a.ignoreCase != b.ignoreCase) - mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.global != b.global) - mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.multiline != b.multiline) - mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier"); - - if (a.sticky != b.sticky) - mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier"); - - return (mismatchValues.length === 0); -}; - -jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { - if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { - return true; - } - - a.__Jasmine_been_here_before__ = b; - b.__Jasmine_been_here_before__ = a; - - var hasKey = function(obj, keyName) { - return obj !== null && obj[keyName] !== jasmine.undefined; + var version = this.version(); + var versionString = version.major + "." + version.minor + "." + version.build; + if (version.release_candidate) { + versionString += ".rc" + version.release_candidate; + } + versionString += " revision " + version.revision; + return versionString; }; - for (var property in b) { - if (!hasKey(a, property) && hasKey(b, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + /** + * @returns a sequential integer starting at 0 + */ + jasmine.Env.prototype.nextSpecId = function () { + return this.nextSpecId_++; + }; + + /** + * @returns a sequential integer starting at 0 + */ + jasmine.Env.prototype.nextSuiteId = function () { + return this.nextSuiteId_++; + }; + + /** + * Register a reporter to receive status updates from Jasmine. + * @param {jasmine.Reporter} reporter An object which will receive status updates. + */ + jasmine.Env.prototype.addReporter = function(reporter) { + this.reporter.addReporter(reporter); + }; + + jasmine.Env.prototype.execute = function() { + this.currentRunner_.execute(); + }; + + jasmine.Env.prototype.describe = function(description, specDefinitions) { + var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); + + var parentSuite = this.currentSuite; + if (parentSuite) { + parentSuite.add(suite); + } else { + this.currentRunner_.add(suite); } - } - for (property in a) { - if (!hasKey(b, property) && hasKey(a, property)) { - mismatchKeys.push("expected missing key '" + property + "', but present in actual."); + + this.currentSuite = suite; + + var declarationError = null; + try { + specDefinitions.call(suite); + } catch(e) { + declarationError = e; } - } - for (property in b) { - if (property == '__Jasmine_been_here_before__') continue; - if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); + + if (declarationError) { + this.it("encountered a declaration exception", function() { + throw declarationError; + }); } - } - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { - mismatchValues.push("arrays were not the same length"); - } + this.currentSuite = parentSuite; - delete a.__Jasmine_been_here_before__; - delete b.__Jasmine_been_here_before__; - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; + return suite; + }; -jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - for (var i = 0; i < this.equalityTesters_.length; i++) { - var equalityTester = this.equalityTesters_[i]; - var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); - if (result !== jasmine.undefined) return result; - } - - if (a === b) return true; - - if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { - return (a == jasmine.undefined && b == jasmine.undefined); - } - - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { - return a === b; - } - - if (a instanceof Date && b instanceof Date) { - return a.getTime() == b.getTime(); - } - - if (a.jasmineMatches) { - return a.jasmineMatches(b); - } - - if (b.jasmineMatches) { - return b.jasmineMatches(a); - } - - if (a instanceof jasmine.Matchers.ObjectContaining) { - return a.matches(b); - } - - if (b instanceof jasmine.Matchers.ObjectContaining) { - return b.matches(a); - } - - if (jasmine.isString_(a) && jasmine.isString_(b)) { - return (a == b); - } - - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { - return (a == b); - } - - if (a instanceof RegExp && b instanceof RegExp) { - return this.compareRegExps_(a, b, mismatchKeys, mismatchValues); - } - - if (typeof a === "object" && typeof b === "object") { - return this.compareObjects_(a, b, mismatchKeys, mismatchValues); - } - - //Straight check - return (a === b); -}; - -jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { - for (var i = 0; i < haystack.length; i++) { - if (this.equals_(haystack[i], needle)) return true; + jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { + if (this.currentSuite) { + this.currentSuite.beforeEach(beforeEachFunction); + } else { + this.currentRunner_.beforeEach(beforeEachFunction); } - return false; - } - return haystack.indexOf(needle) >= 0; -}; + }; -jasmine.Env.prototype.addEqualityTester = function(equalityTester) { - this.equalityTesters_.push(equalityTester); -}; + jasmine.Env.prototype.currentRunner = function () { + return this.currentRunner_; + }; + + jasmine.Env.prototype.afterEach = function(afterEachFunction) { + if (this.currentSuite) { + this.currentSuite.afterEach(afterEachFunction); + } else { + this.currentRunner_.afterEach(afterEachFunction); + } + + }; + + jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { + return { + execute: function() { + } + }; + }; + + jasmine.Env.prototype.it = function(description, func) { + var spec = createSpec(this, this.currentSuite, description); + this.currentSuite.add(spec); + this.currentSpec = spec; + + if (func) { + spec.runs(func); + } + + return spec; + }; + + jasmine.Env.prototype.xit = function(desc, func) { + return { + id: this.nextSpecId(), + runs: function() { + } + }; + }; + + jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { + if (a.source != b.source) + mismatchValues.push("expected pattern /" + b.source + "/ is not equal to the pattern /" + a.source + "/"); + + if (a.ignoreCase != b.ignoreCase) + mismatchValues.push("expected modifier i was" + (b.ignoreCase ? " " : " not ") + "set and does not equal the origin modifier"); + + if (a.global != b.global) + mismatchValues.push("expected modifier g was" + (b.global ? " " : " not ") + "set and does not equal the origin modifier"); + + if (a.multiline != b.multiline) + mismatchValues.push("expected modifier m was" + (b.multiline ? " " : " not ") + "set and does not equal the origin modifier"); + + if (a.sticky != b.sticky) + mismatchValues.push("expected modifier y was" + (b.sticky ? " " : " not ") + "set and does not equal the origin modifier"); + + return (mismatchValues.length === 0); + }; + + jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { + if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { + return true; + } + + a.__Jasmine_been_here_before__ = b; + b.__Jasmine_been_here_before__ = a; + + var hasKey = function(obj, keyName) { + return obj !== null && obj[keyName] !== jasmine.undefined; + }; + + for (var property in b) { + if (!hasKey(a, property) && hasKey(b, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + } + for (property in a) { + if (!hasKey(b, property) && hasKey(a, property)) { + mismatchKeys.push("expected missing key '" + property + "', but present in actual."); + } + } + for (property in b) { + if (property == '__Jasmine_been_here_before__') continue; + if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); + } + } + + if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { + mismatchValues.push("arrays were not the same length"); + } + + delete a.__Jasmine_been_here_before__; + delete b.__Jasmine_been_here_before__; + return (mismatchKeys.length === 0 && mismatchValues.length === 0); + }; + + jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + for (var i = 0; i < this.equalityTesters_.length; i++) { + var equalityTester = this.equalityTesters_[i]; + var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); + if (result !== jasmine.undefined) return result; + } + + if (a === b) return true; + + if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { + return (a == jasmine.undefined && b == jasmine.undefined); + } + + if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { + return a === b; + } + + if (a instanceof Date && b instanceof Date) { + return a.getTime() == b.getTime(); + } + + if (a.jasmineMatches) { + return a.jasmineMatches(b); + } + + if (b.jasmineMatches) { + return b.jasmineMatches(a); + } + + if (a instanceof jasmine.Matchers.ObjectContaining) { + return a.matches(b); + } + + if (b instanceof jasmine.Matchers.ObjectContaining) { + return b.matches(a); + } + + if (jasmine.isString_(a) && jasmine.isString_(b)) { + return (a == b); + } + + if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { + return (a == b); + } + + if (a instanceof RegExp && b instanceof RegExp) { + return this.compareRegExps_(a, b, mismatchKeys, mismatchValues); + } + + if (typeof a === "object" && typeof b === "object") { + return this.compareObjects_(a, b, mismatchKeys, mismatchValues); + } + + //Straight check + return (a === b); + }; + + jasmine.Env.prototype.contains_ = function(haystack, needle) { + if (jasmine.isArray_(haystack)) { + for (var i = 0; i < haystack.length; i++) { + if (this.equals_(haystack[i], needle)) return true; + } + return false; + } + return haystack.indexOf(needle) >= 0; + }; + + jasmine.Env.prototype.addEqualityTester = function(equalityTester) { + this.equalityTesters_.push(equalityTester); + }; +}()); /** No-op base class for Jasmine reporters. * * @constructor @@ -994,7 +999,6 @@ jasmine.Matchers = function(env, actual, spec, opt_isNot) { this.actual = actual; this.spec = spec; this.isNot = opt_isNot || false; - this.reportWasCalled_ = false; }; // todo: @deprecated as of Jasmine 0.11, remove soon [xw] @@ -1002,14 +1006,8 @@ jasmine.Matchers.pp = function(str) { throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); }; -// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] -jasmine.Matchers.prototype.report = function(result, failing_message, details) { - throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); -}; - jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { for (var methodName in prototype) { - if (methodName == 'report') continue; var orig = prototype[methodName]; matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); } @@ -1024,8 +1022,6 @@ jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { result = !result; } - if (this.reportWasCalled_) return result; - var message; if (!result) { if (this.message) { @@ -1875,7 +1871,7 @@ jasmine.Queue.prototype.next_ = function() { while (goAgain) { goAgain = false; - + if (self.index < self.blocks.length && !(this.abort && !this.ensured[self.index])) { var calledSynchronously = true; var completedSynchronously = false; @@ -1913,7 +1909,7 @@ jasmine.Queue.prototype.next_ = function() { if (completedSynchronously) { onComplete(); } - + } else { self.running = false; if (self.onComplete) { @@ -1922,18 +1918,6 @@ jasmine.Queue.prototype.next_ = function() { } } }; - -jasmine.Queue.prototype.results = function() { - var results = new jasmine.NestedResults(); - for (var i = 0; i < this.blocks.length; i++) { - if (this.blocks[i].results) { - results.addResult(this.blocks[i].results()); - } - } - return results; -}; - - /** * Runner * @@ -2007,10 +1991,6 @@ jasmine.Runner.prototype.topLevelSuites = function() { } return topLevelSuites; }; - -jasmine.Runner.prototype.results = function() { - return this.queue.results(); -}; /** * Internal representation of a Jasmine specification, or test. * @@ -2303,10 +2283,6 @@ jasmine.Suite.prototype.afterEach = function(afterEachFunction) { this.after_.unshift(afterEachFunction); }; -jasmine.Suite.prototype.results = function() { - return this.queue.results(); -}; - jasmine.Suite.prototype.add = function(suiteOrSpec) { this.children_.push(suiteOrSpec); if (suiteOrSpec instanceof jasmine.Suite) { diff --git a/spec/core/ExceptionsSpec.js b/spec/core/ExceptionsSpec.js index a7aa8aeb..06ed46c4 100644 --- a/spec/core/ExceptionsSpec.js +++ b/spec/core/ExceptionsSpec.js @@ -59,117 +59,36 @@ describe('Exceptions:', function() { describe("with catch on exception", function() { it('should handle exceptions thrown, but continue', function() { - var fakeTimer = new jasmine.FakeTimer(); - env.setTimeout = fakeTimer.setTimeout; - env.clearTimeout = fakeTimer.clearTimeout; - env.setInterval = fakeTimer.setInterval; - env.clearInterval = fakeTimer.clearInterval; - - //we run two exception tests to make sure we continue after throwing an exception - var suite = env.describe('Suite for handles exceptions', function () { + var ranSecondTest = false, + suite = env.describe('Suite for handles exceptions', function () { env.it('should be a test that fails because it throws an exception', function() { - throw new Error('fake error 1'); + throw new Error(); }); - - env.it('should be another test that fails because it throws an exception', function() { - this.runs(function () { - throw new Error('fake error 2'); - }); - this.runs(function () { - this.expect(true).toEqual(true); - }); - }); - - env.it('should be a passing test that runs after exceptions are thrown', function() { - this.expect(true).toEqual(true); - }); - - env.it('should be another test that fails because it throws an exception after a wait', function() { - this.runs(function () { - var foo = 'foo'; - }); - this.waits(250); - this.runs(function () { - throw new Error('fake error 3'); - }); - }); - env.it('should be a passing test that runs after exceptions are thrown from a async test', function() { - this.expect(true).toEqual(true); + ranSecondTest = true; }); }); - var runner = env.currentRunner(); suite.execute(); - fakeTimer.tick(2500); - - var suiteResults = suite.results(); - var specResults = suiteResults.getItems(); - - expect(suiteResults.passed()).toEqual(false); - // - expect(specResults.length).toEqual(5); - expect(specResults[0].passed()).toMatch(false); - var blockResults = specResults[0].getItems(); - expect(blockResults[0].passed).toEqual(false); - expect(blockResults[0].message).toMatch(/fake error 1/); - - expect(specResults[1].passed()).toEqual(false); - blockResults = specResults[1].getItems(); - expect(blockResults[0].passed).toEqual(false); - expect(blockResults[0].message).toMatch(/fake error 2/); - expect(blockResults[1].passed).toEqual(true); - - expect(specResults[2].passed()).toEqual(true); - - expect(specResults[3].passed()).toEqual(false); - blockResults = specResults[3].getItems(); - expect(blockResults[0].message).toMatch(/fake error 3/); - - expect(specResults[4].passed()).toEqual(true); + expect(ranSecondTest).toBe(true); }); it("should handle exceptions thrown directly in top-level describe blocks and continue", function () { - var suite = env.describe("a top level describe block that throws an exception", function () { + var ranSecondDescribe = false, suite, suite2, runner = env.currentRunner(); + suite = env.describe("a suite that throws an exception", function () { env.it("is a test that should pass", function () { this.expect(true).toEqual(true); }); throw new Error("top level error"); }); - - suite.execute(); - var suiteResults = suite.results(); - var specResults = suiteResults.getItems(); - - expect(suiteResults.passed()).toEqual(false); - expect(specResults.length).toEqual(2); - - expect(specResults[1].description).toMatch(/encountered a declaration exception/); - }); - - it("should handle exceptions thrown directly in nested describe blocks and continue", function () { - var suite = env.describe("a top level describe", function () { - env.describe("a mid-level describe that throws an exception", function () { - env.it("is a test that should pass", function () { - this.expect(true).toEqual(true); - }); - - throw new Error("a mid-level error"); - }); + suite2 = env.describe("a suite that doesn't throw an exception", function () { + ranSecondDescribe = true; }); - suite.execute(); - var suiteResults = suite.results(); - var specResults = suiteResults.getItems(); - - expect(suiteResults.passed()).toEqual(false); - expect(specResults.length).toEqual(1); - - var nestedSpecResults = specResults[0].getItems(); - - expect(nestedSpecResults.length).toEqual(2); - expect(nestedSpecResults[1].description).toMatch(/encountered a declaration exception/); + runner.execute(); + expect(ranSecondDescribe).toBe(true); }); }); + }); diff --git a/spec/core/RunnerSpec.js b/spec/core/RunnerSpec.js index 5d00bbd6..6bea56e3 100644 --- a/spec/core/RunnerSpec.js +++ b/spec/core/RunnerSpec.js @@ -14,105 +14,83 @@ describe('RunnerTest', function() { }); describe('beforeEach', function() { - it('should run before each spec for all suites', function () { + it('should run before each spec for all suites', function() { var foo; - env.beforeEach(function () { + env.beforeEach(function() { foo = 0; }); - env.describe('suite 1', function () { + env.describe('suite 1', function() { env.it('test 1-1', function() { foo++; - this.expect(foo).toEqual(1); + expect(foo).toEqual(1); }); env.it('test 1-2', function() { foo++; - this.expect(foo).toEqual(1); + expect(foo).toEqual(1); }); }); - env.describe('suite 2', function () { + env.describe('suite 2', function() { env.it('test 2-1', function() { foo++; - this.expect(foo).toEqual(1); + expect(foo).toEqual(1); }); }); env.currentRunner().execute(); - - var runnerResults = env.currentRunner().results(); - expect(runnerResults.totalCount).toEqual(3); - expect(runnerResults.passedCount).toEqual(3); }); + it('should provide all specs', function() { - it('should provide all specs', function () { - var foo; - env.beforeEach(function () { - foo = 0; - }); - - env.describe('suite 1', function () { + env.describe('suite 1', function() { env.it('test 1-1', function() { - foo++; - this.expect(foo).toEqual(1); }); env.it('test 1-2', function() { - foo++; - this.expect(foo).toEqual(1); }); }); - env.describe('suite 2', function () { + env.describe('suite 2', function() { env.it('test 2-1', function() { - foo++; - this.expect(foo).toEqual(1); }); }); - env.currentRunner().execute(); - - expect(env.currentRunner().specs().length).toEqual(3); }); }); describe('afterEach', function() { - it('should run after each spec for all suites', function () { + it('should run after each spec for all suites', function() { var foo = 3; - env.afterEach(function () { + env.afterEach(function() { foo = foo - 1; }); - env.describe('suite 1', function () { + env.describe('suite 1', function() { env.it('test 1-1', function() { - this.expect(foo).toEqual(3); + expect(foo).toEqual(3); }); env.it('test 1-2', function() { - this.expect(foo).toEqual(2); + expect(foo).toEqual(2); }); }); - env.describe('suite 2', function () { + env.describe('suite 2', function() { env.it('test 2-1', function() { - this.expect(foo).toEqual(1); + expect(foo).toEqual(1); }); }); env.currentRunner().execute(); - - var runnerResults = env.currentRunner().results(); - expect(runnerResults.totalCount).toEqual(3); - expect(runnerResults.passedCount).toEqual(3); }); it('should run after a failing spec', function () { var afterEach = originalJasmine.createSpy(); env.afterEach(afterEach); - env.describe('suite', function () { - env.it('fails', function () { - this.explodes(); + env.describe('suite',function() { + env.it('fails', function() { + this.fail(); }); }).execute(); @@ -120,103 +98,32 @@ describe('RunnerTest', function() { }); }); - - it('should run child suites and specs and generate results when execute is called', function() { - env.describe('one suite description', function () { - env.it('should be a test', function() { - this.runs(function () { - this.expect(true).toEqual(true); - }); - }); - }); - - env.describe('another suite description', function () { - env.it('should be another test', function() { - this.runs(function () { - this.expect(true).toEqual(false); - }); - }); - }); - - env.currentRunner().execute(); - - var runnerResults = env.currentRunner().results(); - expect(runnerResults.totalCount).toEqual(2); - expect(runnerResults.passedCount).toEqual(1); - expect(runnerResults.failedCount).toEqual(1); - }); - - it('should ignore suites that have been x\'d', function() { - env.xdescribe('one suite description', function () { - env.it('should be a test', function() { - this.runs(function () { - this.expect(true).toEqual(true); - }); - }); - }); - - env.describe('another suite description', function () { - env.it('should be another test', function() { - this.runs(function () { - this.expect(true).toEqual(false); - }); - }); - }); - + var disabledDescribe = jasmine.createSpy('xdescribe'); + env.xdescribe('one suite description', disabledDescribe); env.currentRunner().execute(); - - var runnerResults = env.currentRunner().results(); - expect(runnerResults.totalCount).toEqual(1); - expect(runnerResults.passedCount).toEqual(0); - expect(runnerResults.failedCount).toEqual(1); + expect(disabledDescribe).not.toHaveBeenCalled(); }); - it('should roll up results from all specs', function() { - env.describe('one suite description', function () { - env.it('should be a test', function() { - this.runs(function () { - this.expect(true).toEqual(true); - }); - }); - }); - - env.describe('another suite description', function () { - env.it('should be another test', function() { - this.runs(function () { - this.expect(true).toEqual(false); - }); - }); - }); - - env.currentRunner().execute(); - - var results = env.currentRunner().results(); - expect(results.totalCount).toEqual(2); - expect(results.passedCount).toEqual(1); - expect(results.failedCount).toEqual(1); - }); - - describe('reporting', function () { + describe('reporting', function() { var fakeReporter; - beforeEach(function () { fakeReporter = originalJasmine.createSpyObj("fakeReporter", ["log", "reportRunnerStarting", "reportRunnerResults"]); env.addReporter(fakeReporter); }); it('should report runner results when the runner has completed running', function() { - env.describe('one suite description', function () { + env.describe('one suite description', function() { env.it('should be a test', function() { - this.runs(function () { + this.runs(function() { this.expect(true).toEqual(true); }); }); }); - env.describe('another suite description', function () { + env.describe('another suite description', function() { env.it('should be another test', function() { this.waits(200); - this.runs(function () { + this.runs(function() { this.expect(true).toEqual(false); }); }); @@ -225,10 +132,7 @@ describe('RunnerTest', function() { env.currentRunner().execute(); expect(fakeReporter.reportRunnerResults).not.toHaveBeenCalled(); fakeTimer.tick(200); - //This blows up the JSApiReporter. - //expect(fakeReporter.reportRunnerResults).toHaveBeenCalledWith(env.currentRunner); - expect(fakeReporter.reportRunnerResults).toHaveBeenCalled(); - expect(fakeReporter.reportRunnerResults.mostRecentCall.args[0].results()).toEqual(env.currentRunner().results()); + expect(fakeReporter.reportRunnerResults).toHaveBeenCalledWith(env.currentRunner()); }); }); @@ -264,7 +168,8 @@ describe('RunnerTest', function() { suite2 = env.describe("suite 2", function() { }); }); - suite3 = env.describe("suite 3", function() {}); + suite3 = env.describe("suite 3", function() { + }); }); it("#suites should return a flat array of all suites, including nested suites", function() { diff --git a/spec/core/SpecRunningSpec.js b/spec/core/SpecRunningSpec.js index 98e7146b..bf06f989 100644 --- a/spec/core/SpecRunningSpec.js +++ b/spec/core/SpecRunningSpec.js @@ -576,66 +576,6 @@ describe("jasmine spec running", function () { }); - it("testBeforeAndAfterCallbacks", function () { - var suiteWithBefore = env.describe('one suite with a before', function () { - - this.beforeEach(function () { - this.foo = 1; - }); - - env.it('should be a spec', function () { - this.runs(function() { - this.foo++; - this.expect(this.foo).toEqual(2); - }); - }); - - env.it('should be another spec', function () { - this.runs(function() { - this.foo++; - this.expect(this.foo).toEqual(2); - }); - }); - }); - - suiteWithBefore.execute(); - - var suite = suiteWithBefore; - - expect(suite.results().getItems()[0].passed()).toEqual(true); // "testBeforeAndAfterCallbacks: the first spec's foo should have been 2"); - expect(suite.results().getItems()[1].passed()).toEqual(true); // "testBeforeAndAfterCallbacks: the second spec's this.foo should have been 2"); - - - var foo = 1; - var suiteWithAfter = env.describe('one suite with an after_each', function () { - - env.it('should be a spec with an after_each', function () { - this.expect(foo).toEqual(1); - foo++; - this.expect(foo).toEqual(2); - }); - - env.it('should be another spec with an after_each', function () { - this.expect(foo).toEqual(0); - foo++; - this.expect(foo).toEqual(1); - }); - - this.afterEach(function () { - foo = 0; - }); - }); - - suiteWithAfter.execute(); - - suite = suiteWithAfter; - expect(suite.afterEach.length).toEqual(1); - expect(suite.results().getItems()[0].passed()).toEqual(true); - expect(suite.results().getItems()[1].passed()).toEqual(true); - expect(foo).toEqual(0); - - }); - it('#waits should allow consecutive waits calls', function () { var foo = 0; var waitsSuite = env.describe('suite that waits', function () { @@ -873,85 +813,6 @@ describe("jasmine spec running", function () { expect(secondSpecHasRun).toEqual(true); }); - it("testBeforeExecutesSafely", function() { - var report = ""; - var suite = env.describe('before fails on first test, passes on second', function() { - var counter = 0; - this.beforeEach(function() { - counter++; - if (counter == 1) { - throw "before failure"; - } - }); - env.it("first should not run because before fails", function() { - this.runs(function() { - report += "first"; - this.expect(true).toEqual(true); - }); - }); - env.it("second should run and pass because before passes", function() { - this.runs(function() { - report += "second"; - this.expect(true).toEqual(true); - }); - }); - }); - - suite.execute(); - - expect(report).toEqual("firstsecond"); - var suiteResults = suite.results(); - expect(suiteResults.getItems()[0].getItems()[0].passed).toEqual(false); - expect(suiteResults.getItems()[1].getItems()[0].passed).toEqual(true); - }); - - it("testAfterExecutesSafely", function() { - var report = ""; - var suite = env.describe('after fails on first test, then passes', function() { - var counter = 0; - this.afterEach(function() { - counter++; - if (counter == 1) { - throw "after failure"; - } - }); - env.it("first should run, expectation passes, but spec fails because after fails", function() { - this.runs(function() { - report += "first"; - this.expect(true).toEqual(true); - }); - }); - env.it("second should run and pass because after passes", function() { - this.runs(function() { - report += "second"; - this.expect(true).toEqual(true); - }); - }); - env.it("third should run and pass because after passes", function() { - this.runs(function() { - report += "third"; - this.expect(true).toEqual(true); - }); - }); - }); - - suite.execute(); - - expect(report).toEqual("firstsecondthird"); // "all tests should run"); - //After each errors should not go in spec results because it confuses the count. - var suiteResults = suite.results(); - expect(suiteResults.getItems().length).toEqual(3, 'testAfterExecutesSafely should have results for three specs'); - - expect(suiteResults.getItems()[0].getItems()[0].passed).toEqual(true, "testAfterExecutesSafely 1st spec should pass"); - expect(suiteResults.getItems()[1].getItems()[0].passed).toEqual(true, "testAfterExecutesSafely 2nd spec should pass"); - expect(suiteResults.getItems()[2].getItems()[0].passed).toEqual(true, "testAfterExecutesSafely 3rd spec should pass"); - - expect(suiteResults.getItems()[0].getItems()[0].passed).toEqual(true, "testAfterExecutesSafely 1st result for 1st suite spec should pass"); - expect(suiteResults.getItems()[0].getItems()[1].passed).toEqual(false, "testAfterExecutesSafely 2nd result for 1st suite spec should fail because afterEach failed"); - expect(suiteResults.getItems()[1].getItems()[0].passed).toEqual(true, "testAfterExecutesSafely 2nd suite spec should pass"); - expect(suiteResults.getItems()[2].getItems()[0].passed).toEqual(true, "testAfterExecutesSafely 3rd suite spec should pass"); - }); - it("should permit nested describes", function() { var actions = []; @@ -1115,101 +976,36 @@ describe("jasmine spec running", function () { expect(nestedSpec.getFullName()).toEqual('Test Subject when under circumstance A and circumstance B behaves thusly.'); //, "Spec.fullName was incorrect: " + nestedSpec.getFullName()); }); - it("should skip empty suites", function () { - env.describe('NonEmptySuite1', function() { - env.it('should pass', function() { - this.expect(true).toEqual(true); - }); - env.describe('NestedEmptySuite', function() { - }); - env.it('should pass', function() { - this.expect(true).toEqual(true); - }); - }); - - env.describe('EmptySuite', function() { - }); - - env.describe('NonEmptySuite2', function() { - env.it('should pass', function() { - this.expect(true).toEqual(true); - }); - }); - - env.execute(); - - var runnerResults = env.currentRunner_.results(); - expect(runnerResults.totalCount).toEqual(3); - expect(runnerResults.passedCount).toEqual(3); - expect(runnerResults.failedCount).toEqual(0); - }); - it("should bind 'this' to the running spec within the spec body", function() { - var spec; - var suite = env.describe('one suite description', function () { - env.it('should be a test with queuedFunctions', function() { - spec = this.runs(function() { + var specExecuted = jasmine.createSpy(), spec; + + env.describe('Test Subject', function() { + spec = env.it('should be a test with queuedFunctions', function() { + this.runs(function() { this.foo = 0; + expect(this.foo).toBe(0); + specExecuted(); + }); + + this.runs(function() { this.foo++; - }); - - this.runs(function() { - var that = this; - fakeTimer.setTimeout(function() { - that.foo++; - }, 250); - }); - - this.runs(function() { - this.expect(this.foo).toEqual(2); - }); - - this.waits(300); - - this.runs(function() { - this.expect(this.foo).toEqual(2); + expect(this.foo).toBe(1); + specExecuted(); }); }); - }); - suite.execute(); - fakeTimer.tick(600); - expect(spec.foo).toEqual(2); - var suiteResults = suite.results(); - expect(suiteResults.getItems()[0].getItems().length).toEqual(2); - expect(suiteResults.getItems()[0].getItems()[0].passed).toEqual(false); - expect(suiteResults.getItems()[0].getItems()[1].passed).toEqual(true); + spec.execute(); + expect(specExecuted.callCount).toBe(2); }); it("shouldn't run disabled tests", function() { - var xitSpecWasRun = false; - var suite = env.describe('default current suite', function() { - env.xit('disabled spec').runs(function () { - xitSpecWasRun = true; - }); - - env.it('enabled spec').runs(function () { - var foo = 'bar'; - expect(foo).toEqual('bar'); - }); + var disabledSpec = originalJasmine.createSpy('disabledSpec'), + suite = env.describe('default current suite', function() { + env.xit('disabled spec').runs(disabledSpec); }); - suite.execute(); - expect(xitSpecWasRun).toEqual(false); - }); - - it('shouldn\'t execute specs in disabled suites', function() { - var spy = originalJasmine.createSpy(); - var disabledSuite = env.xdescribe('a disabled suite', function() { - env.it('enabled spec, but should not be run', function() { - spy(); - }); - }); - - disabledSuite.execute(); - - expect(spy).not.toHaveBeenCalled(); + expect(disabledSpec).not.toHaveBeenCalled(); }); it('#explodes should throw an exception when it is called inside a spec', function() { diff --git a/spec/html/TrivialReporterSpec.js b/spec/html/TrivialReporterSpec.js deleted file mode 100644 index 5cfe5e21..00000000 --- a/spec/html/TrivialReporterSpec.js +++ /dev/null @@ -1,239 +0,0 @@ -describe("TrivialReporter", function() { - var env; - var trivialReporter; - var body; - var fakeDocument; - - beforeEach(function() { - env = new jasmine.Env(); - env.updateInterval = 0; - - body = document.createElement("body"); - fakeDocument = { body: body, location: { search: "" } }; - trivialReporter = new jasmine.TrivialReporter(fakeDocument); - }); - - function fakeSpec(name) { - return { - getFullName: function() { - return name; - } - }; - } - - function findElements(divs, withClass) { - var els = []; - for (var i = 0; i < divs.length; i++) { - if (divs[i].className == withClass) els.push(divs[i]); - } - return els; - } - - function findElement(divs, withClass) { - var els = findElements(divs, withClass); - if (els.length > 0) { - return els[0]; - } - throw new Error("couldn't find div with class " + withClass); - } - - it("should run only specs beginning with spec parameter", function() { - fakeDocument.location.search = "?spec=run%20this"; - expect(trivialReporter.specFilter(fakeSpec("run this"))).toBeTruthy(); - expect(trivialReporter.specFilter(fakeSpec("not the right spec"))).toBeFalsy(); - expect(trivialReporter.specFilter(fakeSpec("not run this"))).toBeFalsy(); - }); - - it("should display empty divs for every suite when the runner is starting", function() { - trivialReporter.reportRunnerStarting({ - env: env, - suites: function() { - return [ new jasmine.Suite({}, "suite 1", null, null) ]; - } - }); - - var divs = findElements(body.getElementsByTagName("div"), "suite"); - expect(divs.length).toEqual(1); - expect(divs[0].innerHTML).toContain("suite 1"); - }); - - describe('Matcher reporting', function () { - var getResultMessageDiv = function (body) { - var divs = body.getElementsByTagName("div"); - for (var i = 0; i < divs.length; i++) { - if (divs[i].className.match(/resultMessage/)) { - return divs[i]; - } - } - }; - - var runner, spec, fakeTimer; - beforeEach(function () { - fakeTimer = new originalJasmine.FakeTimer(); - env.setTimeout = fakeTimer.setTimeout; - env.clearTimeout = fakeTimer.clearTimeout; - env.setInterval = fakeTimer.setInterval; - env.clearInterval = fakeTimer.clearInterval; - runner = env.currentRunner(); - var suite = new jasmine.Suite(env, 'some suite'); - runner.add(suite); - spec = new jasmine.Spec(env, suite, 'some spec'); - suite.add(spec); - fakeDocument.location.search = "?"; - env.addReporter(trivialReporter); - }); - - describe('toContain', function () { - it('should show actual and expected', function () { - spec.runs(function () { - this.expect('foo').toContain('bar'); - }); - runner.execute(); - fakeTimer.tick(0); - - var resultEl = getResultMessageDiv(body); - expect(resultEl.innerHTML).toMatch(/foo/); - expect(resultEl.innerHTML).toMatch(/bar/); - }); - }); - }); - - describe("failure messages (integration)", function () { - var spec, results, expectationResult; - - beforeEach(function() { - results = { - passed: function() { - return false; - }, - getItems: function() { - }}; - - var suite1 = new jasmine.Suite(env, "suite 1", null, null); - - spec = { - suite: suite1, - getFullName: function() { - return "foo"; - }, - results: function() { - return results; - } - }; - - trivialReporter.reportRunnerStarting({ - env: env, - suites: function() { - return [ suite1 ]; - } - }); - }); - - it("should add the failure message to the DOM (non-toEquals matchers)", function() { - expectationResult = jasmine.buildExpectationResult({ - matcherName: "toBeNull", passed: false, message: "Expected 'a' to be null, but it was not" - }); - - spyOn(results, 'getItems').andReturn([expectationResult]); - - trivialReporter.reportSpecResults(spec); - - var divs = body.getElementsByTagName("div"); - var errorDiv = findElement(divs, 'resultMessage fail'); - expect(errorDiv.innerHTML).toEqual("Expected 'a' to be null, but it was not"); - }); - - it("should add the failure message to the DOM (non-toEquals matchers) html escaping", function() { - expectationResult = jasmine.buildExpectationResult({ - matcherName: "toBeNull", passed: false, message: "Expected '1 < 2' to e null, & it was not" - }); - - spyOn(results, 'getItems').andReturn([expectationResult]); - - trivialReporter.reportSpecResults(spec); - - var divs = body.getElementsByTagName("div"); - var errorDiv = findElement(divs, 'resultMessage fail'); - expect(errorDiv.innerHTML).toEqual("Expected '1 < 2' to <b>e null, & it was not"); - }); - }); - - describe("log messages", function() { - it("should appear in the report", function() { - env.describe("suite", function() { - env.it("will have log messages", function() { - this.log("this is a", "multipart log message"); - }); - }); - - env.addReporter(trivialReporter); - env.execute(); - - var divs = body.getElementsByTagName("div"); - var errorDiv = findElement(divs, 'resultMessage log'); - expect(errorDiv.innerHTML).toEqual("this is a multipart log message"); - }); - - xit("should work on IE without console.log.apply", function() { - }); - }); - - describe("duplicate example names", function() { - it("should report failures correctly", function() { - var suite1 = env.describe("suite", function() { - env.it("will have log messages", function() { - this.log("this one fails!"); - this.expect(true).toBeFalsy(); - }); - }); - - var suite2 = env.describe("suite", function() { - env.it("will have log messages", function() { - this.log("this one passes!"); - this.expect(true).toBeTruthy(); - }); - }); - - env.addReporter(trivialReporter); - env.execute(); - - var divs = body.getElementsByTagName("div"); - var passedSpecDiv = findElement(divs, 'suite passed'); - expect(passedSpecDiv.className).toEqual('suite passed'); - expect(passedSpecDiv.innerHTML).toContain("this one passes!"); - expect(passedSpecDiv.innerHTML).not.toContain("this one fails!"); - - var failedSpecDiv = findElement(divs, 'suite failed'); - expect(failedSpecDiv.className).toEqual('suite failed'); - expect(failedSpecDiv.innerHTML).toContain("this one fails!"); - expect(failedSpecDiv.innerHTML).not.toContain("this one passes!"); - }); - }); - - describe('#reportSpecStarting', function() { - var spec1; - beforeEach(function () { - env.describe("suite 1", function() { - spec1 = env.it("spec 1", function() { - }); - }); - }); - - it('DOES NOT log running specs by default', function() { - spyOn(trivialReporter, 'log'); - - trivialReporter.reportSpecStarting(spec1); - - expect(trivialReporter.log).not.toHaveBeenCalled(); - }); - - it('logs running specs when log_running_specs is true', function() { - trivialReporter.logRunningSpecs = true; - spyOn(trivialReporter, 'log'); - - trivialReporter.reportSpecStarting(spec1); - - expect(trivialReporter.log).toHaveBeenCalledWith('>> Jasmine Running suite 1 spec 1...'); - }); - }); -}); diff --git a/spec/runner.html b/spec/runner.html index f9862c60..94273fb7 100644 --- a/spec/runner.html +++ b/spec/runner.html @@ -21,7 +21,6 @@ - @@ -48,7 +47,6 @@ -