diff --git a/grunt/config/concat.js b/grunt/config/concat.js index b86e4196..dcc6624e 100644 --- a/grunt/config/concat.js +++ b/grunt/config/concat.js @@ -11,6 +11,7 @@ function license() { module.exports = { 'jasmine-html': { src: [ + 'src/html/requireHtml.js', 'src/html/HtmlReporter.js', 'src/html/HtmlSpecFilter.js', 'src/html/ResultsNode.js', @@ -20,6 +21,7 @@ module.exports = { }, jasmine: { src: [ + 'src/core/requireCore.js', 'src/core/base.js', 'src/core/util.js', 'src/core/Spec.js', @@ -37,6 +39,13 @@ module.exports = { src: ['lib/jasmine-core/boot/boot.js'], dest: 'lib/jasmine-core/boot.js' }, + console: { + src: [ + 'src/console/requireConsole.js', + 'src/console/ConsoleReporter.js' + ], + dest: 'src/console/console.js' + }, options: { banner: license(), process: { diff --git a/lib/jasmine-core.rb b/lib/jasmine-core.rb index 3bf880c3..acccb715 100644 --- a/lib/jasmine-core.rb +++ b/lib/jasmine-core.rb @@ -6,7 +6,7 @@ module Jasmine end def js_files - (["jasmine.js"] + Dir.glob(File.join(path, "*.js"))).map { |f| File.basename(f) }.uniq + (["jasmine.js"] + Dir.glob(File.join(path, "*.js"))).map { |f| File.basename(f) }.uniq - boot_files end SPEC_TYPES = ["core", "html", "node"] diff --git a/lib/jasmine-core/boot.js b/lib/jasmine-core/boot.js index c8977021..1c1345ac 100644 --- a/lib/jasmine-core/boot.js +++ b/lib/jasmine-core/boot.js @@ -22,6 +22,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Jasmine boot.js for browser runners - exposes external/global interface, builds the Jasmine environment and executes it. (function() { + window.jasmine = jasmineRequire.core(jasmineRequire); + jasmineRequire.html(jasmine); + var env = jasmine.getEnv(); var jasmineInterface = { diff --git a/lib/jasmine-core/boot/boot.js b/lib/jasmine-core/boot/boot.js index aea8e00c..908aea4c 100644 --- a/lib/jasmine-core/boot/boot.js +++ b/lib/jasmine-core/boot/boot.js @@ -1,5 +1,8 @@ // Jasmine boot.js for browser runners - exposes external/global interface, builds the Jasmine environment and executes it. (function() { + window.jasmine = jasmineRequire.core(jasmineRequire); + jasmineRequire.html(jasmine); + var env = jasmine.getEnv(); var jasmineInterface = { diff --git a/lib/jasmine-core/jasmine-html.js b/lib/jasmine-core/jasmine-html.js index b250d87c..e95c2369 100644 --- a/lib/jasmine-core/jasmine-html.js +++ b/lib/jasmine-core/jasmine-html.js @@ -20,311 +20,334 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -jasmine.HtmlReporter = function(options) { - var env = options.env || {}, - getContainer = options.getContainer, - now = options.now || function() { return new Date().getTime();}, - createElement = options.createElement, - createTextNode = options.createTextNode, - results = [], - startTime, - specsExecuted = 0, - failureCount = 0, - pendingSpecCount = 0, - htmlReporterMain, - symbols; +jasmineRequire.html = function(j$) { + j$.ResultsNode = jasmineRequire.ResultsNode(); + j$.HtmlReporter = jasmineRequire.HtmlReporter(); + j$.QueryString = jasmineRequire.QueryString(); + j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); +}; +jasmineRequire.HtmlReporter = function() { + function HtmlReporter(options) { + var env = options.env || {}, + getContainer = options.getContainer, + now = options.now || function() { return new Date().getTime();}, + createElement = options.createElement, + createTextNode = options.createTextNode, + results = [], + startTime, + specsExecuted = 0, + failureCount = 0, + pendingSpecCount = 0, + htmlReporterMain, + symbols; - this.initialize = function() { - htmlReporterMain = createDom("div", {className: "html-reporter"}, - createDom("div", {className: "banner"}, - createDom("span", {className: "title"}, "Jasmine"), - createDom("span", {className: "version"}, jasmine.version) - ), - createDom("ul", {className: "symbol-summary"}), - createDom("div", {className: "alert"}), - createDom("div", {className: "results"}, - createDom("div", {className: "failures"}) - ) - ); - getContainer().appendChild(htmlReporterMain); - - symbols = find(".symbol-summary")[0]; - }; - - var totalSpecsDefined; - this.jasmineStarted = function(options) { - totalSpecsDefined = options.totalSpecsDefined || 0; - startTime = now(); - }; - - var summary = createDom("div", {className: "summary"}); - - var topResults = new jasmine.ResultsNode({}, "", null), - currentParent = topResults; - - this.suiteStarted = function(result) { - currentParent.addChild(result, "suite"); - currentParent = currentParent.last(); - }; - - this.suiteDone = function(result) { - if (currentParent == topResults) { - return; - } - - currentParent = currentParent.parent; - }; - - this.specStarted = function(result) { - currentParent.addChild(result, "spec"); - }; - - var failures = []; - this.specDone = function(result) { - if (result.status != "disabled") { - specsExecuted++; - } - - symbols.appendChild(createDom("li", { - className: result.status, - id: "spec_" + result.id, - title: result.fullName} - )); - - if (result.status == "failed") { - failureCount++; - - var failure = - createDom("div", {className: "spec-detail failed"}, - createDom("a", {className: "description", title: result.fullName, href: specHref(result)}, result.fullName), - createDom("div", {className: "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: "result-message"}, expectation.message)); - messages.appendChild(createDom("div", {className: "stack-trace"}, expectation.stack)); - } - - failures.push(failure); - } - - if(result.status == "pending") { - pendingSpecCount++; - } - }; - - this.jasmineDone = function() { - var elapsed = now() - startTime; - - var banner = find(".banner")[0]; - banner.appendChild(createDom("span", {className: "duration"}, "finished in " + elapsed / 1000 + "s")); - - var alert = find(".alert")[0]; - - alert.appendChild(createDom("span", { className: "exceptions" }, - createDom("label", { className: "label", 'for': "raise-exceptions" }, "raise exceptions"), - createDom("input", { - className: "raise", - id: "raise-exceptions", - type: "checkbox" - }) - )); - var checkbox = find("input")[0]; - - checkbox.checked = !env.catchingExceptions(); - checkbox.onclick = options.onRaiseExceptionsClick; - - if (specsExecuted < totalSpecsDefined) { - var skippedMessage = "Ran " + specsExecuted + " of " + totalSpecsDefined + " specs - run all"; - alert.appendChild( - createDom("span", {className: "bar skipped"}, - createDom("a", {href: "?", title: "Run all specs"}, skippedMessage) + this.initialize = function() { + htmlReporterMain = createDom("div", {className: "html-reporter"}, + createDom("div", {className: "banner"}, + createDom("span", {className: "title"}, "Jasmine"), + createDom("span", {className: "version"}, jasmine.version) + ), + createDom("ul", {className: "symbol-summary"}), + createDom("div", {className: "alert"}), + createDom("div", {className: "results"}, + createDom("div", {className: "failures"}) ) ); - } - var statusBarMessage = "" + pluralize("spec", specsExecuted) + ", " + pluralize("failure", failureCount); - if(pendingSpecCount) { statusBarMessage += ", " + pluralize("pending spec", pendingSpecCount); } + getContainer().appendChild(htmlReporterMain); - var statusBarClassName = "bar " + ((failureCount > 0) ? "failed" : "passed"); - alert.appendChild(createDom("span", {className: statusBarClassName}, statusBarMessage)); + symbols = find(".symbol-summary")[0]; + }; - var results = find(".results")[0]; - results.appendChild(summary); + var totalSpecsDefined; + this.jasmineStarted = function(options) { + totalSpecsDefined = options.totalSpecsDefined || 0; + startTime = now(); + }; - summaryList(topResults, summary); + var summary = createDom("div", {className: "summary"}); - function summaryList(resultsTree, domParent) { - var specListNode; - for (var i = 0; i < resultsTree.children.length; i++) { - var resultNode = resultsTree.children[i]; - if (resultNode.type == "suite") { - var suiteListNode = createDom("ul", {className: "suite", id: "suite-" + resultNode.result.id}, - createDom("li", {className: "suite-detail"}, - createDom("a", {href: specHref(resultNode.result)}, resultNode.result.description) - ) + var topResults = new jasmine.ResultsNode({}, "", null), + currentParent = topResults; + + this.suiteStarted = function(result) { + currentParent.addChild(result, "suite"); + currentParent = currentParent.last(); + }; + + this.suiteDone = function(result) { + if (currentParent == topResults) { + return; + } + + currentParent = currentParent.parent; + }; + + this.specStarted = function(result) { + currentParent.addChild(result, "spec"); + }; + + var failures = []; + this.specDone = function(result) { + if (result.status != "disabled") { + specsExecuted++; + } + + symbols.appendChild(createDom("li", { + className: result.status, + id: "spec_" + result.id, + title: result.fullName} + )); + + if (result.status == "failed") { + failureCount++; + + var failure = + createDom("div", {className: "spec-detail failed"}, + createDom("a", {className: "description", title: result.fullName, href: specHref(result)}, result.fullName), + createDom("div", {className: "messages"}) ); + var messages = failure.childNodes[1]; - summaryList(resultNode, suiteListNode); - domParent.appendChild(suiteListNode); + for (var i = 0; i < result.failedExpectations.length; i++) { + var expectation = result.failedExpectations[i]; + messages.appendChild(createDom("div", {className: "result-message"}, expectation.message)); + messages.appendChild(createDom("div", {className: "stack-trace"}, expectation.stack)); } - if (resultNode.type == "spec") { - if (domParent.getAttribute("class") != "specs") { - specListNode = createDom("ul", {className: "specs"}); - domParent.appendChild(specListNode); + + failures.push(failure); + } + + if (result.status == "pending") { + pendingSpecCount++; + } + }; + + this.jasmineDone = function() { + var elapsed = now() - startTime; + + var banner = find(".banner")[0]; + banner.appendChild(createDom("span", {className: "duration"}, "finished in " + elapsed / 1000 + "s")); + + var alert = find(".alert")[0]; + + alert.appendChild(createDom("span", { className: "exceptions" }, + createDom("label", { className: "label", 'for': "raise-exceptions" }, "raise exceptions"), + createDom("input", { + className: "raise", + id: "raise-exceptions", + type: "checkbox" + }) + )); + var checkbox = find("input")[0]; + + checkbox.checked = !env.catchingExceptions(); + checkbox.onclick = options.onRaiseExceptionsClick; + + if (specsExecuted < totalSpecsDefined) { + var skippedMessage = "Ran " + specsExecuted + " of " + totalSpecsDefined + " specs - run all"; + alert.appendChild( + createDom("span", {className: "bar skipped"}, + createDom("a", {href: "?", title: "Run all specs"}, skippedMessage) + ) + ); + } + var statusBarMessage = "" + pluralize("spec", specsExecuted) + ", " + pluralize("failure", failureCount); + if (pendingSpecCount) { statusBarMessage += ", " + pluralize("pending spec", pendingSpecCount); } + + var statusBarClassName = "bar " + ((failureCount > 0) ? "failed" : "passed"); + alert.appendChild(createDom("span", {className: statusBarClassName}, statusBarMessage)); + + var results = find(".results")[0]; + results.appendChild(summary); + + summaryList(topResults, summary); + + function summaryList(resultsTree, domParent) { + var specListNode; + for (var i = 0; i < resultsTree.children.length; i++) { + var resultNode = resultsTree.children[i]; + if (resultNode.type == "suite") { + var suiteListNode = createDom("ul", {className: "suite", id: "suite-" + resultNode.result.id}, + createDom("li", {className: "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") != "specs") { + specListNode = createDom("ul", {className: "specs"}); + domParent.appendChild(specListNode); + } + specListNode.appendChild( + createDom("li", { + className: resultNode.result.status, + id: "spec-" + resultNode.result.id + }, + createDom("a", {href: specHref(resultNode.result)}, resultNode.result.description) + ) + ); } - specListNode.appendChild( - createDom("li", { - className: resultNode.result.status, - id: "spec-" + resultNode.result.id - }, - createDom("a", {href: specHref(resultNode.result)}, resultNode.result.description) - ) - ); } } - } - if (failures.length) { - alert.appendChild( - createDom('span', {className: "menu bar spec-list"}, - createDom("span", {}, "Spec List | "), - createDom('a', {className: "failures-menu", href: "#"}, "Failures"))); - alert.appendChild( - createDom('span', {className: "menu bar failure-list"}, - createDom('a', {className: "spec-list-menu", href: "#"}, "Spec List"), - createDom("span", {}, " | Failures "))); + if (failures.length) { + alert.appendChild( + createDom('span', {className: "menu bar spec-list"}, + createDom("span", {}, "Spec List | "), + createDom('a', {className: "failures-menu", href: "#"}, "Failures"))); + alert.appendChild( + createDom('span', {className: "menu bar failure-list"}, + createDom('a', {className: "spec-list-menu", href: "#"}, "Spec List"), + createDom("span", {}, " | Failures "))); + + find(".failures-menu")[0].onclick = function() { + setMenuModeTo('failure-list'); + }; + find(".spec-list-menu")[0].onclick = function() { + setMenuModeTo('spec-list'); + }; - find(".failures-menu")[0].onclick = function() { setMenuModeTo('failure-list'); - }; - find(".spec-list-menu")[0].onclick = function() { - setMenuModeTo('spec-list'); - }; - setMenuModeTo('failure-list'); - - var failureNode = find(".failures")[0]; - for (var i = 0; i < failures.length; i++) { - failureNode.appendChild(failures[i]); - } - } - }; - - return this; - - function find(selector) { - if (selector.match(/^\./)) { - var className = selector.substring(1); - return getContainer().getElementsByClassName(className); - } else { - return getContainer().getElementsByTagName(selector); - } - } - - function createDom(type, attrs, childrenVarArgs) { - var el = createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(createTextNode(child)); - } else { - if (child) { - el.appendChild(child); + var failureNode = find(".failures")[0]; + for (var i = 0; i < failures.length; i++) { + failureNode.appendChild(failures[i]); } } - } + }; - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; + return this; + + function find(selector) { + if (selector.match(/^\./)) { + var className = selector.substring(1); + return getContainer().getElementsByClassName(className); } else { - el.setAttribute(attr, attrs[attr]); + return getContainer().getElementsByTagName(selector); } } - return el; - } + function createDom(type, attrs, childrenVarArgs) { + var el = createElement(type); - function pluralize(singular, count) { - var word = (count == 1 ? singular : singular + "s"); + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; - return "" + count + " " + word; - } - - function specHref(result) { - return "?spec=" + encodeURIComponent(result.fullName); - } - - function setMenuModeTo(mode) { - htmlReporterMain.setAttribute("class", "html-reporter " + mode); - } -}; -jasmine.HtmlSpecFilter = function(options) { - var filterPattern = new RegExp(options && options.filterString()); - - this.matches = function(specName) { - return filterPattern.test(specName); - }; -}; -jasmine.ResultsNode = function(result, type, parent) { - this.result = result; - this.type = type; - this.parent = parent; - - this.children = []; - - this.addChild = function(result, type) { - this.children.push(new jasmine.ResultsNode(result, type, this)); - }; - - this.last = function() { - return this.children[this.children.length-1]; - }; -}; -jasmine.QueryString = function(options) { - - this.setParam = function(key, value) { - var paramMap = queryStringToParamMap(); - paramMap[key] = value; - options.getWindowLocation().search = toQueryString(paramMap); - }; - - this.getParam = function(key) { - return queryStringToParamMap()[key]; - }; - - return this; - - function toQueryString(paramMap) { - var qStrPairs = []; - for (var prop in paramMap) { - qStrPairs.push(encodeURIComponent(prop) + "=" + encodeURIComponent(paramMap[prop])); - } - return "?" + qStrPairs.join('&'); - } - - function queryStringToParamMap() { - var paramStr = options.getWindowLocation().search.substring(1), - params = [], - paramMap = {}; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - var value = decodeURIComponent(p[1]); - if (value === "true" || value === "false") { - value = JSON.parse(value); + if (typeof child === 'string') { + el.appendChild(createTextNode(child)); + } else { + if (child) { + el.appendChild(child); + } } - paramMap[decodeURIComponent(p[0])] = value; } + + for (var attr in attrs) { + if (attr == "className") { + el[attr] = attrs[attr]; + } else { + el.setAttribute(attr, attrs[attr]); + } + } + + return el; } - return paramMap; + function pluralize(singular, count) { + var word = (count == 1 ? singular : singular + "s"); + + return "" + count + " " + word; + } + + function specHref(result) { + return "?spec=" + encodeURIComponent(result.fullName); + } + + function setMenuModeTo(mode) { + htmlReporterMain.setAttribute("class", "html-reporter " + mode); + } } + return HtmlReporter; +}; + +jasmineRequire.HtmlSpecFilter = function() { + function HtmlSpecFilter(options) { + var filterPattern = new RegExp(options && options.filterString()); + + this.matches = function(specName) { + return filterPattern.test(specName); + }; + } + + return HtmlSpecFilter; +}; +jasmineRequire.ResultsNode = function() { + function ResultsNode(result, type, parent) { + this.result = result; + this.type = type; + this.parent = parent; + + this.children = []; + + this.addChild = function(result, type) { + this.children.push(new ResultsNode(result, type, this)); + }; + + this.last = function() { + return this.children[this.children.length - 1]; + }; + } + + return ResultsNode; +}; +jasmineRequire.QueryString = function() { + function QueryString(options) { + + this.setParam = function(key, value) { + var paramMap = queryStringToParamMap(); + paramMap[key] = value; + options.getWindowLocation().search = toQueryString(paramMap); + }; + + this.getParam = function(key) { + return queryStringToParamMap()[key]; + }; + + return this; + + function toQueryString(paramMap) { + var qStrPairs = []; + for (var prop in paramMap) { + qStrPairs.push(encodeURIComponent(prop) + "=" + encodeURIComponent(paramMap[prop])); + } + return "?" + qStrPairs.join('&'); + } + + function queryStringToParamMap() { + var paramStr = options.getWindowLocation().search.substring(1), + params = [], + paramMap = {}; + + if (paramStr.length > 0) { + params = paramStr.split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + var value = decodeURIComponent(p[1]); + if (value === "true" || value === "false") { + value = JSON.parse(value); + } + paramMap[decodeURIComponent(p[0])] = value; + } + } + + return paramMap; + } + + } + + return QueryString; }; \ No newline at end of file diff --git a/lib/jasmine-core/jasmine.js b/lib/jasmine-core/jasmine.js index 7b65c622..0bf51320 100644 --- a/lib/jasmine-core/jasmine.js +++ b/lib/jasmine-core/jasmine.js @@ -20,337 +20,376 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -var jasmine = {}; - -// TODO: do we need this now that we have boot.js? -if (typeof window == "undefined" && typeof exports == "object") { - exports.jasmine = jasmine; +function getJasmineRequireObj() { + if (typeof module !== "undefined" && module.exports) { + return exports; + } else { + window.jasmineRequire = window.jasmineRequire || {}; + return window.jasmineRequire; + } } -jasmine.unimplementedMethod_ = function() { - throw new Error("unimplemented method"); +getJasmineRequireObj().core = function(jRequire) { + j$ = {}; + + jRequire.base(j$); + j$.util = jRequire.util(); + j$.Clock = jRequire.Clock(); + j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); + j$.Env = jRequire.Env(j$); + j$.ExceptionFormatter = jRequire.ExceptionFormatter(); + j$.buildExpectationResult = jRequire.buildExpectationResult(); + j$.JsApiReporter = jRequire.JsApiReporter(); + j$.Matchers = jRequire.Matchers(j$); + j$.StringPrettyPrinter = jRequire.StringPrettyPrinter(j$); + j$.QueueRunner = jRequire.QueueRunner(); + j$.ReportDispatcher = jRequire.ReportDispatcher(); + j$.Spec = jRequire.Spec(); + j$.Suite = jRequire.Suite(); + j$.version = jRequire.version(); + + return j$; }; -jasmine.DEFAULT_UPDATE_INTERVAL = 250; -jasmine.MAX_PRETTY_PRINT_DEPTH = 40; -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; - -jasmine.getGlobal = function() { - function getGlobal() { - return this; - } - - return getGlobal(); -}; - -jasmine.getEnv = function(options) { - var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(options); - //jasmine. singletons in here (setTimeout blah blah). - return env; -}; - -jasmine.isArray_ = function(value) { - return jasmine.isA_("Array", value); -}; - -jasmine.isString_ = function(value) { - return jasmine.isA_("String", value); -}; - -jasmine.isNumber_ = function(value) { - return jasmine.isA_("Number", value); -}; - -jasmine.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -jasmine.pp = function(value) { - var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; -}; - -jasmine.isDomNode = function(obj) { - return obj.nodeType > 0; -}; - -jasmine.any = function(clazz) { - return new jasmine.Matchers.Any(clazz); -}; - -jasmine.objectContaining = function (sample) { - return new jasmine.Matchers.ObjectContaining(sample); -}; - -jasmine.Spy = function(name) { - this.identity = name || 'unknown'; - this.isSpy = true; - this.plan = function() { - }; - this.mostRecentCall = {}; - - this.argsForCall = []; - this.calls = []; -}; - -jasmine.Spy.prototype.andCallThrough = function() { - this.plan = this.originalValue; - return this; -}; - -jasmine.Spy.prototype.andReturn = function(value) { - this.plan = function() { - return value; - }; - return this; -}; - -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { - this.plan = function() { - throw exceptionMsg; - }; - return this; -}; - -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { - this.plan = fakeFunc; - return this; -}; - -jasmine.Spy.prototype.reset = function() { - this.wasCalled = false; - this.callCount = 0; - this.argsForCall = []; - this.calls = []; - this.mostRecentCall = {}; -}; - -jasmine.createSpy = function(name) { - - var spyObj = function() { - spyObj.wasCalled = true; - spyObj.callCount++; - var args = jasmine.util.argsToArray(arguments); - spyObj.mostRecentCall.object = this; - spyObj.mostRecentCall.args = args; - spyObj.argsForCall.push(args); - spyObj.calls.push({object: this, args: args}); - return spyObj.plan.apply(this, arguments); +getJasmineRequireObj().base = function(j$) { + j$.unimplementedMethod_ = function() { + throw new Error("unimplemented method"); }; - var spy = new jasmine.Spy(name); + j$.DEFAULT_UPDATE_INTERVAL = 250; + j$.MAX_PRETTY_PRINT_DEPTH = 40; + j$.DEFAULT_TIMEOUT_INTERVAL = 5000; - for (var prop in spy) { - spyObj[prop] = spy[prop]; - } - - spyObj.reset(); - - return spyObj; -}; - -jasmine.isSpy = function(putativeSpy) { - return putativeSpy && putativeSpy.isSpy; -}; - -jasmine.createSpyObj = function(baseName, methodNames) { - if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { - throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); - } - return obj; -}; - -jasmine.util = {}; - -jasmine.util.inherit = function(childClass, parentClass) { - var subclass = function() { - }; - subclass.prototype = parentClass.prototype; - childClass.prototype = new subclass(); -}; - -jasmine.util.formatException = function(e) { - var lineNumber; - if (e.line) { - lineNumber = e.line; - } - else if (e.lineNumber) { - lineNumber = e.lineNumber; - } - - var file; - - if (e.sourceURL) { - file = e.sourceURL; - } - else if (e.fileName) { - file = e.fileName; - } - - var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); - - if (file && lineNumber) { - message += ' in ' + file + ' (line ' + lineNumber + ')'; - } - - return message; -}; - -jasmine.util.htmlEscape = function(str) { - if (!str) return str; - return str.replace(/&/g, '&') - .replace(//g, '>'); -}; - -jasmine.util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); - return arrayOfArgs; -}; - -jasmine.util.isUndefined = function(obj) { - return obj === void 0; -}; - -jasmine.Spec = function(attrs) { - this.encounteredExpectations = false; - this.expectationFactory = attrs.expectationFactory; - this.resultCallback = attrs.resultCallback || function() {}; - this.id = attrs.id; - this.description = attrs.description || ''; - this.fn = attrs.fn; - this.beforeFns = attrs.beforeFns || function() {}; - this.afterFns = attrs.afterFns || function() {}; - this.catchingExceptions = attrs.catchingExceptions; - this.onStart = attrs.onStart || function() {}; - this.exceptionFormatter = attrs.exceptionFormatter || function() {}; - this.getSpecName = attrs.getSpecName || function() { return ''; }; - this.expectationResultFactory = attrs.expectationResultFactory || function() { }; - this.queueRunner = attrs.queueRunner || function() {}; - this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; - - if (!this.fn) { - this.pend(); - } - - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - status: this.status(), - failedExpectations: [] - }; -}; - -jasmine.Spec.prototype.addExpectationResult = function(passed, data) { - this.encounteredExpectations = true; - if (passed) { - return; - } - this.result.failedExpectations.push(this.expectationResultFactory(data)); -}; - -jasmine.Spec.prototype.expect = function(actual) { - return this.expectationFactory(actual, this); -}; - -jasmine.Spec.prototype.execute = function(onComplete) { - var self = this; - - this.onStart(this); - - if (this.markedPending || this.disabled) { - complete(); - return; - } - - var befores = this.beforeFns() || [], - afters = this.afterFns() || []; - var allFns = befores.concat(this.fn).concat(afters); - - this.queueRunner({ - fns: allFns, - onException: function(e) { - if (jasmine.Spec.isPendingSpecException(e)) { - self.pend(); - return; - } - - self.addExpectationResult(false, { - matcherName: "", - passed: false, - expected: "", - actual: "", - error: e - }); - }, - onComplete: complete - }); - - function complete() { - self.result.status = self.status(); - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); + j$.getGlobal = function() { + function getGlobal() { + return this; } - } + + return getGlobal(); + }; + + j$.getEnv = function(options) { + var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); + //jasmine. singletons in here (setTimeout blah blah). + return env; + }; + + j$.isArray_ = function(value) { + return j$.isA_("Array", value); + }; + + j$.isString_ = function(value) { + return j$.isA_("String", value); + }; + + j$.isNumber_ = function(value) { + return j$.isA_("Number", value); + }; + + j$.isA_ = function(typeName, value) { + return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; + }; + + j$.pp = function(value) { + var stringPrettyPrinter = new j$.StringPrettyPrinter(); + stringPrettyPrinter.format(value); + return stringPrettyPrinter.string; + }; + + j$.isDomNode = function(obj) { + return obj.nodeType > 0; + }; + + j$.any = function(clazz) { + return new j$.Matchers.Any(clazz); + }; + + j$.objectContaining = function(sample) { + return new j$.Matchers.ObjectContaining(sample); + }; + + j$.Spy = function(name) { + this.identity = name || 'unknown'; + this.isSpy = true; + this.plan = function() { + }; + this.mostRecentCall = {}; + + this.argsForCall = []; + this.calls = []; + }; + + j$.Spy.prototype.andCallThrough = function() { + this.plan = this.originalValue; + return this; + }; + + j$.Spy.prototype.andReturn = function(value) { + this.plan = function() { + return value; + }; + return this; + }; + + j$.Spy.prototype.andThrow = function(exceptionMsg) { + this.plan = function() { + throw exceptionMsg; + }; + return this; + }; + + j$.Spy.prototype.andCallFake = function(fakeFunc) { + this.plan = fakeFunc; + return this; + }; + + j$.Spy.prototype.reset = function() { + this.wasCalled = false; + this.callCount = 0; + this.argsForCall = []; + this.calls = []; + this.mostRecentCall = {}; + }; + + j$.createSpy = function(name) { + + var spyObj = function() { + spyObj.wasCalled = true; + spyObj.callCount++; + var args = j$.util.argsToArray(arguments); + spyObj.mostRecentCall.object = this; + spyObj.mostRecentCall.args = args; + spyObj.argsForCall.push(args); + spyObj.calls.push({object: this, args: args}); + return spyObj.plan.apply(this, arguments); + }; + + var spy = new j$.Spy(name); + + for (var prop in spy) { + spyObj[prop] = spy[prop]; + } + + spyObj.reset(); + + return spyObj; + }; + + j$.isSpy = function(putativeSpy) { + return putativeSpy && putativeSpy.isSpy; + }; + + j$.createSpyObj = function(baseName, methodNames) { + if (!j$.isArray_(methodNames) || methodNames.length === 0) { + throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); + } + var obj = {}; + for (var i = 0; i < methodNames.length; i++) { + obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]); + } + return obj; + }; }; -jasmine.Spec.prototype.disable = function() { - this.disabled = true; +getJasmineRequireObj().util = function() { + + var util = {}; + + util.inherit = function(childClass, parentClass) { + var subclass = function() { + }; + subclass.prototype = parentClass.prototype; + childClass.prototype = new subclass(); + }; + + util.formatException = function(e) { + var lineNumber; + if (e.line) { + lineNumber = e.line; + } + else if (e.lineNumber) { + lineNumber = e.lineNumber; + } + + var file; + + if (e.sourceURL) { + file = e.sourceURL; + } + else if (e.fileName) { + file = e.fileName; + } + + var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); + + if (file && lineNumber) { + message += ' in ' + file + ' (line ' + lineNumber + ')'; + } + + return message; + }; + + util.htmlEscape = function(str) { + if (!str) return str; + return str.replace(/&/g, '&') + .replace(//g, '>'); + }; + + util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); + return arrayOfArgs; + }; + + util.isUndefined = function(obj) { + return obj === void 0; + }; + + return util; }; -jasmine.Spec.prototype.pend = function() { - this.markedPending = true; -}; +getJasmineRequireObj().Spec = function() { + function Spec(attrs) { + this.encounteredExpectations = false; + this.expectationFactory = attrs.expectationFactory; + this.resultCallback = attrs.resultCallback || function() {}; + this.id = attrs.id; + this.description = attrs.description || ''; + this.fn = attrs.fn; + this.beforeFns = attrs.beforeFns || function() {}; + this.afterFns = attrs.afterFns || function() {}; + this.catchingExceptions = attrs.catchingExceptions; + this.onStart = attrs.onStart || function() {}; + this.exceptionFormatter = attrs.exceptionFormatter || function() {}; + this.getSpecName = attrs.getSpecName || function() { return ''; }; + this.expectationResultFactory = attrs.expectationResultFactory || function() { }; + this.queueRunner = attrs.queueRunner || function() {}; + this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; -jasmine.Spec.prototype.status = function() { - if (this.disabled) { - return 'disabled'; + if (!this.fn) { + this.pend(); + } + + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + status: this.status(), + failedExpectations: [] + }; } - if (this.markedPending || !this.encounteredExpectations) { - return 'pending'; - } + Spec.prototype.addExpectationResult = function(passed, data) { + this.encounteredExpectations = true; + if (passed) { + return; + } + this.result.failedExpectations.push(this.expectationResultFactory(data)); + }; - if (this.result.failedExpectations.length > 0) { - return 'failed'; - } else { - return 'passed'; - } + Spec.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Spec.prototype.execute = function(onComplete) { + var self = this; + + this.onStart(this); + + if (this.markedPending || this.disabled) { + complete(); + return; + } + + var befores = this.beforeFns() || [], + afters = this.afterFns() || []; + var allFns = befores.concat(this.fn).concat(afters); + + this.queueRunner({ + fns: allFns, + onException: function(e) { + if (Spec.isPendingSpecException(e)) { + self.pend(); + return; + } + + self.addExpectationResult(false, { + matcherName: "", + passed: false, + expected: "", + actual: "", + error: e + }); + }, + onComplete: complete + }); + + function complete() { + self.result.status = self.status(); + self.resultCallback(self.result); + + if (onComplete) { + onComplete(); + } + } + }; + + Spec.prototype.disable = function() { + this.disabled = true; + }; + + Spec.prototype.pend = function() { + this.markedPending = true; + }; + + Spec.prototype.status = function() { + if (this.disabled) { + return 'disabled'; + } + + if (this.markedPending || !this.encounteredExpectations) { + return 'pending'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'passed'; + } + }; + + Spec.prototype.getFullName = function() { + return this.getSpecName(this); + }; + + Spec.pendingSpecExceptionMessage = "=> marked Pending"; + + Spec.isPendingSpecException = function(e) { + return e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1; + }; + + return Spec; }; -jasmine.Spec.prototype.getFullName = function() { - return this.getSpecName(this); -}; +if (typeof window == void 0 && typeof exports == "object") { + exports.Spec = jasmineRequire.Spec; +} -jasmine.Spec.pendingSpecExceptionMessage = "=> marked Pending"; - -jasmine.Spec.isPendingSpecException = function(e) { - return e.toString().indexOf(jasmine.Spec.pendingSpecExceptionMessage) !== -1; -}; -(function() { - jasmine.Env = function(options) { +getJasmineRequireObj().Env = function(j$) { + function Env(options) { options = options || {}; var self = this; - var global = options.global || jasmine.getGlobal(); + var global = options.global || j$.getGlobal(); var catchExceptions = true; - this.clock = new jasmine.Clock(global, new jasmine.DelayedFunctionScheduler()); + this.clock = new j$.Clock(global, new j$.DelayedFunctionScheduler()); - this.jasmine = jasmine; this.spies_ = []; this.currentSpec = null; - this.reporter = new jasmine.ReportDispatcher([ + this.reporter = new j$.ReportDispatcher([ "jasmineStarted", "jasmineDone", "suiteStarted", @@ -370,11 +409,11 @@ jasmine.Spec.isPendingSpecException = function(e) { // wrap matchers this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); + j$.Matchers.apply(this, arguments); }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); + j$.util.inherit(this.matchersClass, j$.Matchers); - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); + j$.Matchers.wrapInto_(j$.Matchers.prototype, this.matchersClass); var expectationFactory = function(actual, spec) { var expect = new (self.matchersClass)(self, actual, spec); @@ -407,15 +446,15 @@ jasmine.Spec.isPendingSpecException = function(e) { }; }; - var specConstructor = jasmine.Spec; + var specConstructor = j$.Spec; var getSpecName = function(spec, currentSuite) { return currentSuite.getFullName() + ' ' + spec.description + '.'; }; // TODO: we may just be able to pass in the fn instead of wrapping here - var buildExpectationResult = jasmine.buildExpectationResult, - exceptionFormatter = new jasmine.ExceptionFormatter(), + var buildExpectationResult = j$.buildExpectationResult, + exceptionFormatter = new j$.ExceptionFormatter(), expectationResultFactory = function(attrs) { attrs.messageFormatter = exceptionFormatter.message; attrs.stackFormatter = exceptionFormatter.stack; @@ -434,7 +473,7 @@ jasmine.Spec.isPendingSpecException = function(e) { }; this.catchException = function(e){ - return jasmine.Spec.isPendingSpecException(e) || catchExceptions; + return j$.Spec.isPendingSpecException(e) || catchExceptions; }; var maximumSpecCallbackDepth = 100; @@ -454,7 +493,7 @@ jasmine.Spec.isPendingSpecException = function(e) { options.catchException = self.catchException; options.encourageGC = options.encourageGarbageCollection || encourageGarbageCollection; - new jasmine.QueueRunner(options).run(options.fns, 0); + new j$.QueueRunner(options).run(options.fns, 0); }; var totalSpecsDefined = 0; @@ -496,9 +535,9 @@ jasmine.Spec.isPendingSpecException = function(e) { self.reporter.suiteStarted(suite.result); }; - var suiteConstructor = jasmine.Suite; + var suiteConstructor = j$.Suite; - this.topSuite = new jasmine.Suite({ + this.topSuite = new j$.Suite({ env: this, id: this.nextSuiteId(), description: 'Jasmine__TopLevel__Suite', @@ -528,33 +567,33 @@ jasmine.Spec.isPendingSpecException = function(e) { }); this.topSuite.execute(this.reporter.jasmineDone); }; - }; + } //TODO: shim Spec addMatchers behavior into Env. Should be rewritten to remove globals, etc. - jasmine.Env.prototype.addMatchers = function(matchersPrototype) { + Env.prototype.addMatchers = function(matchersPrototype) { var parent = this.matchersClass; var newMatchersClass = function() { parent.apply(this, arguments); }; - jasmine.util.inherit(newMatchersClass, parent); - jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); + j$.util.inherit(newMatchersClass, parent); + j$.Matchers.wrapInto_(matchersPrototype, newMatchersClass); this.matchersClass = newMatchersClass; }; - jasmine.Env.prototype.version = function() { - return jasmine.version; + Env.prototype.version = function() { + return j$.version; }; - jasmine.Env.prototype.expect = function(actual) { + Env.prototype.expect = function(actual) { return this.currentSpec.expect(actual); }; - jasmine.Env.prototype.spyOn = function(obj, methodName) { - if (jasmine.util.isUndefined(obj)) { + Env.prototype.spyOn = function(obj, methodName) { + if (j$.util.isUndefined(obj)) { throw "spyOn could not find an object to spy upon for " + methodName + "()"; } - if (jasmine.util.isUndefined(obj[methodName])) { + if (j$.util.isUndefined(obj[methodName])) { throw methodName + '() method does not exist'; } @@ -563,7 +602,7 @@ jasmine.Spec.isPendingSpecException = function(e) { throw new Error(methodName + ' has already been spied upon'); } - var spyObj = jasmine.createSpy(methodName); + var spyObj = j$.createSpy(methodName); this.spies_.push(spyObj); spyObj.baseObj = obj; @@ -576,7 +615,7 @@ jasmine.Spec.isPendingSpecException = function(e) { }; // TODO: move this to closure - jasmine.Env.prototype.removeAllSpies = function() { + Env.prototype.removeAllSpies = function() { for (var i = 0; i < this.spies_.length; i++) { var spy = this.spies_[i]; spy.baseObj[spy.methodName] = spy.originalValue; @@ -585,28 +624,28 @@ jasmine.Spec.isPendingSpecException = function(e) { }; // TODO: move this to closure - jasmine.Env.prototype.versionString = function() { - console.log("DEPRECATED == use jasmine.version"); - return jasmine.version; + Env.prototype.versionString = function() { + console.log("DEPRECATED == use j$.version"); + return j$.version; }; // TODO: move this to closure - jasmine.Env.prototype.nextSpecId = function() { + Env.prototype.nextSpecId = function() { return this.nextSpecId_++; }; // TODO: move this to closure - jasmine.Env.prototype.nextSuiteId = function() { + Env.prototype.nextSuiteId = function() { return this.nextSuiteId_++; }; // TODO: move this to closure - jasmine.Env.prototype.addReporter = function(reporter) { + Env.prototype.addReporter = function(reporter) { this.reporter.addReporter(reporter); }; // TODO: move this to closure - jasmine.Env.prototype.describe = function(description, specDefinitions) { + Env.prototype.describe = function(description, specDefinitions) { var suite = this.suiteFactory(description, specDefinitions); var parentSuite = this.currentSuite; @@ -632,47 +671,47 @@ jasmine.Spec.isPendingSpecException = function(e) { }; // TODO: move this to closure - jasmine.Env.prototype.xdescribe = function(description, specDefinitions) { + Env.prototype.xdescribe = function(description, specDefinitions) { var suite = this.describe(description, specDefinitions); suite.disable(); return suite; }; // TODO: move this to closure - jasmine.Env.prototype.it = function(description, fn) { + Env.prototype.it = function(description, fn) { var spec = this.specFactory(description, fn, this.currentSuite); this.currentSuite.addSpec(spec); return spec; }; // TODO: move this to closure - jasmine.Env.prototype.xit = function(description, fn) { + Env.prototype.xit = function(description, fn) { var spec = this.it(description, fn); spec.pend(); return spec; }; // TODO: move this to closure - jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { + Env.prototype.beforeEach = function(beforeEachFunction) { this.currentSuite.beforeEach(beforeEachFunction); }; // TODO: move this to closure - jasmine.Env.prototype.afterEach = function(afterEachFunction) { + Env.prototype.afterEach = function(afterEachFunction) { this.currentSuite.afterEach(afterEachFunction); }; // TODO: move this to closure - jasmine.Env.prototype.pending = function() { - throw new Error(jasmine.Spec.pendingSpecExceptionMessage); + Env.prototype.pending = function() { + throw new Error(j$.Spec.pendingSpecExceptionMessage); }; // TODO: Still needed? - jasmine.Env.prototype.currentRunner = function() { + Env.prototype.currentRunner = function() { return this.topSuite; }; - jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { + 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 + "/"); @@ -691,7 +730,7 @@ jasmine.Spec.isPendingSpecException = function(e) { return (mismatchValues.length === 0); }; - jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { + Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { return true; } @@ -700,7 +739,7 @@ jasmine.Spec.isPendingSpecException = function(e) { b.__Jasmine_been_here_before__ = a; var hasKey = function(obj, keyName) { - return obj !== null && !jasmine.util.isUndefined(obj[keyName]); + return obj !== null && !j$.util.isUndefined(obj[keyName]); }; for (var property in b) { @@ -716,11 +755,11 @@ jasmine.Spec.isPendingSpecException = function(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."); + mismatchValues.push("'" + property + "' was '" + (b[property] ? j$.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? j$.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); } } - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { + if (j$.isArray_(a) && j$.isArray_(b) && a.length != b.length) { mismatchValues.push("arrays were not the same length"); } @@ -729,25 +768,25 @@ jasmine.Spec.isPendingSpecException = function(e) { return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; - jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { + 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 (!jasmine.util.isUndefined(result)) { + if (!j$.util.isUndefined(result)) { return result; } } if (a === b) return true; - if (jasmine.util.isUndefined(a) || a === null || jasmine.util.isUndefined(b) || b === null) { - return (jasmine.util.isUndefined(a) && jasmine.util.isUndefined(b)); + if (j$.util.isUndefined(a) || a === null || j$.util.isUndefined(b) || b === null) { + return (j$.util.isUndefined(a) && j$.util.isUndefined(b)); } - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { + if (j$.isDomNode(a) && j$.isDomNode(b)) { return a === b; } @@ -763,19 +802,19 @@ jasmine.Spec.isPendingSpecException = function(e) { return b.jasmineMatches(a); } - if (a instanceof jasmine.Matchers.ObjectContaining) { + if (a instanceof j$.Matchers.ObjectContaining) { return a.matches(b); } - if (b instanceof jasmine.Matchers.ObjectContaining) { + if (b instanceof j$.Matchers.ObjectContaining) { return b.matches(a); } - if (jasmine.isString_(a) && jasmine.isString_(b)) { + if (j$.isString_(a) && j$.isString_(b)) { return (a == b); } - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { + if (j$.isNumber_(a) && j$.isNumber_(b)) { return (a == b); } @@ -791,8 +830,8 @@ jasmine.Spec.isPendingSpecException = function(e) { return (a === b); }; - jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { + Env.prototype.contains_ = function(haystack, needle) { + if (j$.isArray_(haystack)) { for (var i = 0; i < haystack.length; i++) { if (this.equals_(haystack[i], needle)) return true; } @@ -801,930 +840,974 @@ jasmine.Spec.isPendingSpecException = function(e) { return haystack.indexOf(needle) >= 0; }; - jasmine.Env.prototype.addEqualityTester = function(equalityTester) { + Env.prototype.addEqualityTester = function(equalityTester) { this.equalityTesters_.push(equalityTester); }; -}()); -jasmine.JsApiReporter = function(jasmine) { - this.jasmine = jasmine || {}; - this.started = false; - this.finished = false; - - var status = 'loaded'; - - this.jasmineStarted = function() { - this.started = true; - status = 'started'; - }; - - this.jasmineDone = function() { - this.finished = true; - status = 'done'; - }; - - this.status = function() { - return status; - }; - - var suites = {}; - - this.suiteStarted = function(result) { - storeSuite(result); - }; - - this.suiteDone = function(result) { - storeSuite(result); - }; - - function storeSuite(result) { - suites[result.id] = result; - } - - this.suites = function() { - return suites; - }; - - var specs = []; - this.specStarted = function(result) { }; - - this.specDone = function(result) { - specs.push(result); - }; - - this.specResults = function(index, length) { - return specs.slice(index, index + length); - }; - - this.specs = function() { - return specs; - }; - -}; -jasmine.Clock = function(global, delayedFunctionScheduler) { - var self = this, - realTimingFunctions = { - setTimeout: global.setTimeout, - clearTimeout: global.clearTimeout, - setInterval: global.setInterval, - clearInterval: global.clearInterval - }, - fakeTimingFunctions = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setInterval: setInterval, - clearInterval: clearInterval - }, - timer = realTimingFunctions, - installed = false; - - self.install = function() { - installed = true; - timer = fakeTimingFunctions; - }; - - self.uninstall = function() { - delayedFunctionScheduler.reset(); - installed = false; - timer = realTimingFunctions; - }; - - self.setTimeout = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error("IE < 9 cannot support extra params to setTimeout without a polyfill"); - } - return timer.setTimeout(fn, delay); - } - return timer.setTimeout.apply(global, arguments); - }; - - self.setInterval = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error("IE < 9 cannot support extra params to setInterval without a polyfill"); - } - return timer.setInterval(fn, delay); - } - return timer.setInterval.apply(global, arguments); - }; - - self.clearTimeout = function(id) { - return timer.clearTimeout.call(global, id); - }; - - self.clearInterval = function(id) { - return timer.clearInterval.call(global, id); - }; - - self.tick = function(millis) { - if (installed) { - delayedFunctionScheduler.tick(millis); - } else { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); - } - }; - - return self; - - function legacyIE() { - //if these methods are polyfilled, apply will be present - //TODO: it may be difficult to load the polyfill before jasmine loads - //(env should be new-ed inside of onload) - return !(global.setTimeout || global.setInterval).apply; - } - - function setTimeout(fn, delay) { - return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); - } - - function clearTimeout(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function setInterval(fn, interval) { - return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); - } - - function clearInterval(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function argSlice(argsObj, n) { - return Array.prototype.slice.call(argsObj, 2); - } + return Env; }; -jasmine.DelayedFunctionScheduler = function() { - var self = this; - var scheduledFunctions = {}; - var currentTime = 0; - var delayedFnCount = 0; +getJasmineRequireObj().JsApiReporter = function() { + function JsApiReporter(jasmine) { // TODO: this doesn't appear to be used + this.jasmine = jasmine || {}; + this.started = false; + this.finished = false; - self.tick = function(millis) { - millis = millis || 0; - runFunctionsWithinRange(currentTime, currentTime + millis); - currentTime = currentTime + millis; - }; + var status = 'loaded'; - self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { - millis = millis || 0; - timeoutKey = timeoutKey || ++delayedFnCount; - runAtMillis = runAtMillis || (currentTime + millis); - scheduledFunctions[timeoutKey] = { - runAtMillis: runAtMillis, - funcToCall: funcToCall, - recurring: recurring, - params: params, - timeoutKey: timeoutKey, - millis: millis + this.jasmineStarted = function() { + this.started = true; + status = 'started'; }; - return timeoutKey; - }; - self.removeFunctionWithId = function(timeoutKey) { - delete scheduledFunctions[timeoutKey]; - }; + this.jasmineDone = function() { + this.finished = true; + status = 'done'; + }; - self.reset = function() { - currentTime = 0; - scheduledFunctions = {}; - delayedFnCount = 0; - }; + this.status = function() { + return status; + }; - return self; + var suites = {}; + this.suiteStarted = function(result) { + storeSuite(result); + }; - //finds/dupes functions within range and removes them. - function functionsWithinRange(startMillis, endMillis) { - var fnsToRun = []; - for (var timeoutKey in scheduledFunctions) { - var scheduledFunc = scheduledFunctions[timeoutKey]; - if (scheduledFunc && + this.suiteDone = function(result) { + storeSuite(result); + }; + + function storeSuite(result) { + suites[result.id] = result; + } + + this.suites = function() { + return suites; + }; + + var specs = []; + this.specStarted = function(result) { }; + + this.specDone = function(result) { + specs.push(result); + }; + + this.specResults = function(index, length) { + return specs.slice(index, index + length); + }; + + this.specs = function() { + return specs; + }; + + } + + return JsApiReporter; +}; + +getJasmineRequireObj().Clock = function() { + function Clock(global, delayedFunctionScheduler) { + var self = this, + realTimingFunctions = { + setTimeout: global.setTimeout, + clearTimeout: global.clearTimeout, + setInterval: global.setInterval, + clearInterval: global.clearInterval + }, + fakeTimingFunctions = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval + }, + timer = realTimingFunctions, + installed = false; + + self.install = function() { + installed = true; + timer = fakeTimingFunctions; + }; + + self.uninstall = function() { + delayedFunctionScheduler.reset(); + installed = false; + timer = realTimingFunctions; + }; + + self.setTimeout = function(fn, delay, params) { + if (legacyIE()) { + if (arguments.length > 2) { + throw new Error("IE < 9 cannot support extra params to setTimeout without a polyfill"); + } + return timer.setTimeout(fn, delay); + } + return timer.setTimeout.apply(global, arguments); + }; + + self.setInterval = function(fn, delay, params) { + if (legacyIE()) { + if (arguments.length > 2) { + throw new Error("IE < 9 cannot support extra params to setInterval without a polyfill"); + } + return timer.setInterval(fn, delay); + } + return timer.setInterval.apply(global, arguments); + }; + + self.clearTimeout = function(id) { + return timer.clearTimeout.call(global, id); + }; + + self.clearInterval = function(id) { + return timer.clearInterval.call(global, id); + }; + + self.tick = function(millis) { + if (installed) { + delayedFunctionScheduler.tick(millis); + } else { + throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); + } + }; + + return self; + + function legacyIE() { + //if these methods are polyfilled, apply will be present + //TODO: it may be difficult to load the polyfill before jasmine loads + //(env should be new-ed inside of onload) + return !(global.setTimeout || global.setInterval).apply; + } + + function setTimeout(fn, delay) { + return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); + } + + function clearTimeout(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function setInterval(fn, interval) { + return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); + } + + function clearInterval(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function argSlice(argsObj, n) { + return Array.prototype.slice.call(argsObj, 2); + } + } + + return Clock; +}; + +getJasmineRequireObj().DelayedFunctionScheduler = function() { + function DelayedFunctionScheduler() { + var self = this; + var scheduledFunctions = {}; + var currentTime = 0; + var delayedFnCount = 0; + + self.tick = function(millis) { + millis = millis || 0; + runFunctionsWithinRange(currentTime, currentTime + millis); + currentTime = currentTime + millis; + }; + + self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { + millis = millis || 0; + timeoutKey = timeoutKey || ++delayedFnCount; + runAtMillis = runAtMillis || (currentTime + millis); + scheduledFunctions[timeoutKey] = { + runAtMillis: runAtMillis, + funcToCall: funcToCall, + recurring: recurring, + params: params, + timeoutKey: timeoutKey, + millis: millis + }; + return timeoutKey; + }; + + self.removeFunctionWithId = function(timeoutKey) { + delete scheduledFunctions[timeoutKey]; + }; + + self.reset = function() { + currentTime = 0; + scheduledFunctions = {}; + delayedFnCount = 0; + }; + + return self; + + // finds/dupes functions within range and removes them. + function functionsWithinRange(startMillis, endMillis) { + var fnsToRun = []; + for (var timeoutKey in scheduledFunctions) { + var scheduledFunc = scheduledFunctions[timeoutKey]; + if (scheduledFunc && scheduledFunc.runAtMillis >= startMillis && - scheduledFunc.runAtMillis <= endMillis) { - //remove fn -- we'll reschedule later if it is recurring. - self.removeFunctionWithId(timeoutKey); - if (!scheduledFunc.recurring) { - fnsToRun.push(scheduledFunc); // schedules each function only once - } else { - fnsToRun.push(buildNthInstanceOf(scheduledFunc, 0)); - var additionalTimesFnRunsInRange = - Math.floor((endMillis - scheduledFunc.runAtMillis) / scheduledFunc.millis); - for (var i = 0; i < additionalTimesFnRunsInRange; i++) { - fnsToRun.push(buildNthInstanceOf(scheduledFunc, i + 1)); + scheduledFunc.runAtMillis <= endMillis) { + + // remove fn -- we'll reschedule later if it is recurring. + self.removeFunctionWithId(timeoutKey); + if (!scheduledFunc.recurring) { + fnsToRun.push(scheduledFunc); // schedules each function only once + } else { + fnsToRun.push(buildNthInstanceOf(scheduledFunc, 0)); + var additionalTimesFnRunsInRange = + Math.floor((endMillis - scheduledFunc.runAtMillis) / scheduledFunc.millis); + for (var i = 0; i < additionalTimesFnRunsInRange; i++) { + fnsToRun.push(buildNthInstanceOf(scheduledFunc, i + 1)); + } + reschedule(buildNthInstanceOf(scheduledFunc, additionalTimesFnRunsInRange)); } - reschedule(buildNthInstanceOf(scheduledFunc, additionalTimesFnRunsInRange)); } } + + return fnsToRun; } - return fnsToRun; + function buildNthInstanceOf(scheduledFunc, n) { + return { + runAtMillis: scheduledFunc.runAtMillis + (scheduledFunc.millis * n), + funcToCall: scheduledFunc.funcToCall, + params: scheduledFunc.params, + millis: scheduledFunc.millis, + recurring: scheduledFunc.recurring, + timeoutKey: scheduledFunc.timeoutKey + }; + } + + function reschedule(scheduledFn) { + self.scheduleFunction(scheduledFn.funcToCall, + scheduledFn.millis, + scheduledFn.params, + true, + scheduledFn.timeoutKey, + scheduledFn.runAtMillis + scheduledFn.millis); + } + + + function runFunctionsWithinRange(startMillis, endMillis) { + var funcsToRun = functionsWithinRange(startMillis, endMillis); + if (funcsToRun.length === 0) { + return; + } + + funcsToRun.sort(function(a, b) { + return a.runAtMillis - b.runAtMillis; + }); + + for (var i = 0; i < funcsToRun.length; ++i) { + var funcToRun = funcsToRun[i]; + funcToRun.funcToCall.apply(null, funcToRun.params); + } + } } - function buildNthInstanceOf(scheduledFunc, n) { - return { - runAtMillis: scheduledFunc.runAtMillis + (scheduledFunc.millis * n), - funcToCall: scheduledFunc.funcToCall, - params: scheduledFunc.params, - millis: scheduledFunc.millis, - recurring: scheduledFunc.recurring, - timeoutKey: scheduledFunc.timeoutKey + return DelayedFunctionScheduler; +}; + +getJasmineRequireObj().ExceptionFormatter = function() { + function ExceptionFormatter() { + this.message = function(error) { + var message = error.name + + ': ' + + error.message; + + if (error.fileName || error.sourceURL) { + message += " in " + (error.fileName || error.sourceURL); + } + + if (error.line || error.lineNumber) { + message += " (line " + (error.line || error.lineNumber) + ")"; + } + + return message; + }; + + this.stack = function(error) { + return error ? error.stack : null; }; } - function reschedule(scheduledFn) { - self.scheduleFunction(scheduledFn.funcToCall, - scheduledFn.millis, - scheduledFn.params, - true, - scheduledFn.timeoutKey, - scheduledFn.runAtMillis + scheduledFn.millis); - } - - - function runFunctionsWithinRange(startMillis, endMillis) { - var funcsToRun = functionsWithinRange(startMillis, endMillis); - if (funcsToRun.length === 0) { - return; - } - - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); - - for (var i = 0; i < funcsToRun.length; ++i) { - var funcToRun = funcsToRun[i]; - funcToRun.funcToCall.apply(null, funcToRun.params); - } - } + return ExceptionFormatter; }; -jasmine.ExceptionFormatter = function() { - this.message = function(error) { - var message = error.name + - ': ' + - error.message; - - if (error.fileName || error.sourceURL) { - message += " in " + (error.fileName || error.sourceURL); - } - - if (error.line || error.lineNumber) { - message += " (line " + (error.line || error.lineNumber) + ")"; - } - - return message; - }; - - this.stack = function(error) { - return error ? error.stack : null; - }; -}; //TODO: expectation result may make more sense as a presentation of an expectation. -jasmine.buildExpectationResult = function(options) { - var messageFormatter = options.messageFormatter || function() {}, - stackFormatter = options.stackFormatter || function() {}; +getJasmineRequireObj().buildExpectationResult = function() { + function buildExpectationResult(options) { + var messageFormatter = options.messageFormatter || function() {}, + stackFormatter = options.stackFormatter || function() {}; - return { - matcherName: options.matcherName, - expected: options.expected, - actual: options.actual, - message: message(), - stack: stack(), - passed: options.passed - }; + return { + matcherName: options.matcherName, + expected: options.expected, + actual: options.actual, + message: message(), + stack: stack(), + passed: options.passed + }; - function message() { - if (options.passed) { - return "Passed."; - } else if (options.message) { - return options.message; - } else if (options.error) { - return messageFormatter(options.error); - } - return ""; - } - - function stack() { - if (options.passed) { + function message() { + if (options.passed) { + return "Passed."; + } else if (options.message) { + return options.message; + } else if (options.error) { + return messageFormatter(options.error); + } return ""; } - var error = options.error; - if (!error) { - try { - throw new Error(message()); - } catch (e) { - error = e; + function stack() { + if (options.passed) { + return ""; } - } - return stackFormatter(error); - } -}; -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { - //TODO: true dependency: equals, contains - this.env = env; - this.actual = actual; - this.spec = spec; - this.isNot = opt_isNot || false; -}; - -// todo: @deprecated as of Jasmine 0.11, remove soon [xw] -jasmine.Matchers.pp = function(str) { - throw new Error("jasmine.Matchers.pp() is no longer supported, please use jasmine.pp() instead!"); -}; - - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { - for (var methodName in prototype) { - var orig = prototype[methodName]; - matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); - } -}; - -jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { - return function() { - var matcherArgs = jasmine.util.argsToArray(arguments); - var result = matcherFunction.apply(this, arguments); - - if (this.isNot) { - result = !result; - } - - var message; - if (!result) { - if (this.message) { - message = this.message.apply(this, arguments); - if (jasmine.isArray_(message)) { - message = message[this.isNot ? 1 : 0]; + var error = options.error; + if (!error) { + try { + throw new Error(message()); + } catch (e) { + error = e; } - } else { - var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; - if (matcherArgs.length > 0) { - for (var i = 0; i < matcherArgs.length; i++) { - if (i > 0) message += ","; - message += " " + jasmine.pp(matcherArgs[i]); + } + return stackFormatter(error); + } + } + + return buildExpectationResult; +}; + +getJasmineRequireObj().Matchers = function(j$) { + function Matchers(env, actual, spec, opt_isNot) { + //TODO: true dependency: equals, contains + this.env = env; + this.actual = actual; + this.spec = spec; + this.isNot = opt_isNot || false; + } + + Matchers.wrapInto_ = function(prototype, matchersClass) { + for (var methodName in prototype) { + var orig = prototype[methodName]; + matchersClass.prototype[methodName] = Matchers.matcherFn_(methodName, orig); + } + }; + + Matchers.matcherFn_ = function(matcherName, matcherFunction) { + return function() { + var matcherArgs = j$.util.argsToArray(arguments); + var result = matcherFunction.apply(this, arguments); + + if (this.isNot) { + result = !result; + } + + var message; + if (!result) { + if (this.message) { + message = this.message.apply(this, arguments); + if (j$.isArray_(message)) { + message = message[this.isNot ? 1 : 0]; } + } else { + var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); + message = "Expected " + j$.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; + if (matcherArgs.length > 0) { + for (var i = 0; i < matcherArgs.length; i++) { + if (i > 0) message += ","; + message += " " + j$.pp(matcherArgs[i]); + } + } + message += "."; } - message += "."; } + + this.spec.addExpectationResult(result, { + matcherName: matcherName, + passed: result, + expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], + actual: this.actual, + message: message + }); + return void 0; + }; + }; + + Matchers.prototype.toBe = function(expected) { + return this.actual === expected; + }; + + Matchers.prototype.toNotBe = function(expected) { + return this.actual !== expected; + }; + + Matchers.prototype.toEqual = function(expected) { + return this.env.equals_(this.actual, expected); + }; + + Matchers.prototype.toNotEqual = function(expected) { + return !this.env.equals_(this.actual, expected); + }; + + Matchers.prototype.toMatch = function(expected) { + return new RegExp(expected).test(this.actual); + }; + + Matchers.prototype.toNotMatch = function(expected) { + return !(new RegExp(expected).test(this.actual)); + }; + + Matchers.prototype.toBeDefined = function() { + return !j$.util.isUndefined(this.actual); + }; + + Matchers.prototype.toBeUndefined = function() { + return j$.util.isUndefined(this.actual); + }; + + Matchers.prototype.toBeNull = function() { + return (this.actual === null); + }; + + Matchers.prototype.toBeNaN = function() { + this.message = function() { + return [ "Expected " + j$.pp(this.actual) + " to be NaN." ]; + }; + + return (this.actual !== this.actual); + }; + + Matchers.prototype.toBeTruthy = function() { + return !!this.actual; + }; + + Matchers.prototype.toBeFalsy = function() { + return !this.actual; + }; + + Matchers.prototype.toHaveBeenCalled = function() { + if (arguments.length > 0) { + throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); } - this.spec.addExpectationResult(result, { - matcherName: matcherName, - passed: result, - expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], - actual: this.actual, - message: message - }); - return void 0; + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to have been called.", + "Expected spy " + this.actual.identity + " not to have been called." + ]; + }; + + return this.actual.wasCalled; }; -}; - -jasmine.Matchers.prototype.toBe = function(expected) { - return this.actual === expected; -}; - -jasmine.Matchers.prototype.toNotBe = function(expected) { - return this.actual !== expected; -}; - -jasmine.Matchers.prototype.toEqual = function(expected) { - return this.env.equals_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toNotEqual = function(expected) { - return !this.env.equals_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toMatch = function(expected) { - return new RegExp(expected).test(this.actual); -}; - -jasmine.Matchers.prototype.toNotMatch = function(expected) { - return !(new RegExp(expected).test(this.actual)); -}; - -jasmine.Matchers.prototype.toBeDefined = function() { - return !jasmine.util.isUndefined(this.actual); -}; - -jasmine.Matchers.prototype.toBeUndefined = function() { - return jasmine.util.isUndefined(this.actual); -}; - -jasmine.Matchers.prototype.toBeNull = function() { - return (this.actual === null); -}; - -jasmine.Matchers.prototype.toBeNaN = function() { - this.message = function() { - return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ]; - }; - - return (this.actual !== this.actual); -}; - -jasmine.Matchers.prototype.toBeTruthy = function() { - return !!this.actual; -}; - -jasmine.Matchers.prototype.toBeFalsy = function() { - return !this.actual; -}; - -jasmine.Matchers.prototype.toHaveBeenCalled = function() { - if (arguments.length > 0) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to have been called.", - "Expected spy " + this.actual.identity + " not to have been called." - ]; - }; - - return this.actual.wasCalled; -}; // TODO: kill this for 2.0 -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; + Matchers.prototype.wasCalled = Matchers.prototype.toHaveBeenCalled; -jasmine.Matchers.prototype.wasNotCalled = function() { - if (arguments.length > 0) { - throw new Error('wasNotCalled does not take arguments'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to not have been called.", - "Expected spy " + this.actual.identity + " to have been called." - ]; - }; - - return !this.actual.wasCalled; -}; - -jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - this.message = function() { - var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."; - var positiveMessage = ""; - if (this.actual.callCount === 0) { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called."; - } else { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, ''); + Matchers.prototype.wasNotCalled = function() { + if (arguments.length > 0) { + throw new Error('wasNotCalled does not take arguments'); } - return [positiveMessage, invertedMessage]; - }; - return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -// TODO: kill for 2.0 -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -// TODO: kill for 2.0 -jasmine.Matchers.prototype.wasNotCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", - "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" - ]; - }; - - return !this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -jasmine.Matchers.prototype.toContain = function(expected) { - return this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toNotContain = function(expected) { - return !this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toBeLessThan = function(expected) { - return this.actual < expected; -}; - -jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { - return this.actual > expected; -}; - -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { - if (precision !== 0) { - precision = precision || 2; - } - return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); -}; - -jasmine.Matchers.prototype.toThrow = function(expected) { - var result = false; - var exception, exceptionMessage; - if (typeof this.actual != 'function') { - throw new Error('Actual is not a function'); - } - try { - this.actual(); - } catch (e) { - exception = e; - } - - if (exception) { - exceptionMessage = exception.message || exception; - result = (jasmine.util.isUndefined(expected) || this.env.equals_(exceptionMessage, expected.message || expected) || (jasmine.isA_("RegExp", expected) && expected.test(exceptionMessage))); - } - - var not = this.isNot ? "not " : ""; - var regexMatch = jasmine.isA_("RegExp", expected) ? " an exception matching" : ""; - - this.message = function() { - if (exception) { - return ["Expected function " + not + "to throw" + regexMatch, expected ? expected.message || expected : "an exception", ", but it threw", exceptionMessage].join(' '); - } else { - return "Expected function to throw an exception."; + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to not have been called.", + "Expected spy " + this.actual.identity + " to have been called." + ]; + }; + + return !this.actual.wasCalled; }; - return result; -}; - -jasmine.Matchers.Any = function(expectedClass) { - this.expectedClass = expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { - if (this.expectedClass == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedClass == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedClass == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedClass == Object) { - return typeof other == 'object'; - } - - return other instanceof this.expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineToString = function() { - return ''; -}; - -jasmine.Matchers.ObjectContaining = function(sample) { - this.sample = sample; -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var env = jasmine.getEnv(); - - var hasKey = function(obj, keyName) { - return obj !== null && !jasmine.util.isUndefined(obj[keyName]); - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + Matchers.prototype.toHaveBeenCalledWith = function() { + var expectedArgs = j$.util.argsToArray(arguments); + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); } - else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function() { - return ""; -}; - -jasmine.PrettyPrinter = function() { - this.ppNestLevel_ = 0; -}; - -jasmine.PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (jasmine.util.isUndefined(value)) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === jasmine.getGlobal()) { - this.emitScalar(''); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (jasmine.isSpy(value)) { - this.emitScalar("spy on " + value.identity); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.__Jasmine_been_here_before__) { - this.emitScalar(''); - } else if (jasmine.isArray_(value) || typeof value == 'object') { - value.__Jasmine_been_here_before__ = true; - if (jasmine.isArray_(value)) { - this.emitArray(value); + this.message = function() { + var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + j$.pp(expectedArgs) + " but it was."; + var positiveMessage = ""; + if (this.actual.callCount === 0) { + positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + j$.pp(expectedArgs) + " but it was never called."; } else { - this.emitObject(value); + positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + j$.pp(expectedArgs) + " but actual calls were " + j$.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, ''); } - delete value.__Jasmine_been_here_before__; - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } -}; + return [positiveMessage, invertedMessage]; + }; -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!obj.hasOwnProperty(property)) continue; - if (property == '__Jasmine_been_here_before__') continue; - fn(property, obj.__lookupGetter__ ? (!jasmine.util.isUndefined(obj.__lookupGetter__(property)) && - obj.__lookupGetter__(property) !== null) : false); - } -}; + return this.env.contains_(this.actual.argsForCall, expectedArgs); + }; -jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; +// TODO: kill for 2.0 + Matchers.prototype.wasCalledWith = Matchers.prototype.toHaveBeenCalledWith; -jasmine.StringPrettyPrinter = function() { - jasmine.PrettyPrinter.call(this); - - this.string = ''; -}; -jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); - -jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); -}; - -jasmine.StringPrettyPrinter.prototype.emitString = function(value) { - this.append("'" + value + "'"); -}; - -jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Array"); - return; - } - - this.append('[ '); - for (var i = 0; i < array.length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - this.append(' ]'); -}; - -jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Object"); - return; - } - - var self = this; - this.append('{ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); +// TODO: kill for 2.0 + Matchers.prototype.wasNotCalledWith = function() { + var expectedArgs = j$.util.argsToArray(arguments); + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); } - self.append(property); - self.append(' : '); - if (isGetter) { - self.append(''); - } else { - self.format(obj[property]); + this.message = function() { + return [ + "Expected spy not to have been called with " + j$.pp(expectedArgs) + " but it was", + "Expected spy to have been called with " + j$.pp(expectedArgs) + " but it was" + ]; + }; + + return !this.env.contains_(this.actual.argsForCall, expectedArgs); + }; + + Matchers.prototype.toContain = function(expected) { + return this.env.contains_(this.actual, expected); + }; + + Matchers.prototype.toNotContain = function(expected) { + return !this.env.contains_(this.actual, expected); + }; + + Matchers.prototype.toBeLessThan = function(expected) { + return this.actual < expected; + }; + + Matchers.prototype.toBeGreaterThan = function(expected) { + return this.actual > expected; + }; + + Matchers.prototype.toBeCloseTo = function(expected, precision) { + if (precision !== 0) { + precision = precision || 2; } - }); + return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); + }; - this.append(' }'); -}; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { - this.string += value; -}; -jasmine.QueueRunner = function(attrs) { - this.fns = attrs.fns || []; - this.onComplete = attrs.onComplete || function() {}; - this.encourageGC = attrs.encourageGC || function(fn) {fn();}; - this.onException = attrs.onException || function() {}; - this.catchException = attrs.catchException || function() { return true; }; -}; - -jasmine.QueueRunner.prototype.execute = function() { - this.run(this.fns, 0); -}; - -jasmine.QueueRunner.prototype.run = function(fns, index) { - if (index >= fns.length) { - this.encourageGC(this.onComplete); - return; - } - - var fn = fns[index]; - var self = this; - if (fn.length > 0) { - attempt(function() { fn.call(self, function() { self.run(fns, index + 1); }); }); - } else { - attempt(function() { fn.call(self); }); - self.run(fns, index + 1); - } - - function attempt(fn) { + Matchers.prototype.toThrow = function(expected) { + var result = false; + var exception, exceptionMessage; + if (typeof this.actual != 'function') { + throw new Error('Actual is not a function'); + } try { - fn(); + this.actual(); } catch (e) { - self.onException(e); - if (!self.catchException(e)) { - //TODO: set a var when we catch an exception and - //use a finally block to close the loop in a nice way.. - throw e; + exception = e; + } + + if (exception) { + exceptionMessage = exception.message || exception; + result = (j$.util.isUndefined(expected) || this.env.equals_(exceptionMessage, expected.message || expected) || (j$.isA_("RegExp", expected) && expected.test(exceptionMessage))); + } + + var not = this.isNot ? "not " : ""; + var regexMatch = j$.isA_("RegExp", expected) ? " an exception matching" : ""; + + this.message = function() { + if (exception) { + return ["Expected function " + not + "to throw" + regexMatch, expected ? expected.message || expected : "an exception", ", but it threw", exceptionMessage].join(' '); + } else { + return "Expected function to throw an exception."; + } + }; + + return result; + }; + + Matchers.Any = function(expectedClass) { + this.expectedClass = expectedClass; + }; + + Matchers.Any.prototype.jasmineMatches = function(other) { + if (this.expectedClass == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedClass == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedClass == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedClass == Object) { + return typeof other == 'object'; + } + + return other instanceof this.expectedClass; + }; + + Matchers.Any.prototype.jasmineToString = function() { + return ''; + }; + + Matchers.ObjectContaining = function(sample) { + this.sample = sample; + }; + + Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + var env = j$.getEnv(); + + var hasKey = function(obj, keyName) { + return obj !== null && !j$.util.isUndefined(obj[keyName]); + }; + + for (var property in this.sample) { + if (!hasKey(other, property) && hasKey(this.sample, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (other[property] ? j$.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? j$.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); + } + } + + return (mismatchKeys.length === 0 && mismatchValues.length === 0); + }; + + Matchers.ObjectContaining.prototype.jasmineToString = function() { + return ""; + }; + + return Matchers; + +}; + +getJasmineRequireObj().StringPrettyPrinter = function(j$) { + + function PrettyPrinter() { + this.ppNestLevel_ = 0; + } + + PrettyPrinter.prototype.format = function(value) { + this.ppNestLevel_++; + try { + if (j$.util.isUndefined(value)) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === j$.getGlobal()) { + this.emitScalar(''); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString()); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (j$.isSpy(value)) { + this.emitScalar("spy on " + value.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (typeof value.nodeType === 'number') { + this.emitScalar('HTMLNode'); + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (value.__Jasmine_been_here_before__) { + this.emitScalar(''); + } else if (j$.isArray_(value) || typeof value == 'object') { + value.__Jasmine_been_here_before__ = true; + if (j$.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + delete value.__Jasmine_been_here_before__; + } else { + this.emitScalar(value.toString()); + } + } finally { + this.ppNestLevel_--; + } + }; + + PrettyPrinter.prototype.iterateObject = function(obj, fn) { + for (var property in obj) { + if (!obj.hasOwnProperty(property)) continue; + if (property == '__Jasmine_been_here_before__') continue; + fn(property, obj.__lookupGetter__ ? (!j$.util.isUndefined(obj.__lookupGetter__(property)) && + obj.__lookupGetter__(property) !== null) : false); + } + }; + + PrettyPrinter.prototype.emitArray = j$.unimplementedMethod_; + PrettyPrinter.prototype.emitObject = j$.unimplementedMethod_; + PrettyPrinter.prototype.emitScalar = j$.unimplementedMethod_; + PrettyPrinter.prototype.emitString = j$.unimplementedMethod_; + + function StringPrettyPrinter() { + PrettyPrinter.call(this); + + this.string = ''; + } + j$.util.inherit(StringPrettyPrinter, PrettyPrinter); + + StringPrettyPrinter.prototype.emitScalar = function(value) { + this.append(value); + }; + + StringPrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); + }; + + StringPrettyPrinter.prototype.emitArray = function(array) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append("Array"); + return; + } + + this.append('[ '); + for (var i = 0; i < array.length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); + } + this.append(' ]'); + }; + + StringPrettyPrinter.prototype.emitObject = function(obj) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append("Object"); + return; + } + + var self = this; + this.append('{ '); + var first = true; + + this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.append(property); + self.append(' : '); + if (isGetter) { + self.append(''); + } else { + self.format(obj[property]); + } + }); + + this.append(' }'); + }; + + StringPrettyPrinter.prototype.append = function(value) { + this.string += value; + }; + + return StringPrettyPrinter; +}; + +getJasmineRequireObj().QueueRunner = function() { + + function QueueRunner(attrs) { + this.fns = attrs.fns || []; + this.onComplete = attrs.onComplete || function() {}; + this.encourageGC = attrs.encourageGC || function(fn) {fn();}; + this.onException = attrs.onException || function() {}; + this.catchException = attrs.catchException || function() { return true; }; + } + + QueueRunner.prototype.execute = function() { + this.run(this.fns, 0); + }; + + QueueRunner.prototype.run = function(fns, index) { + if (index >= fns.length) { + this.encourageGC(this.onComplete); + return; + } + + var fn = fns[index]; + var self = this; + if (fn.length > 0) { + attempt(function() { fn.call(self, function() { self.run(fns, index + 1); }); }); + } else { + attempt(function() { fn.call(self); }); + self.run(fns, index + 1); + } + + function attempt(fn) { + try { + fn(); + } catch (e) { + self.onException(e); + if (!self.catchException(e)) { + //TODO: set a var when we catch an exception and + //use a finally block to close the loop in a nice way.. + throw e; + } + } + } + }; + + return QueueRunner; +}; + +getJasmineRequireObj().ReportDispatcher = function() { + function ReportDispatcher(methods) { + + var dispatchedMethods = methods || []; + + for (var i = 0; i < dispatchedMethods.length; i++) { + var method = dispatchedMethods[i]; + this[method] = function(m) { + return function() { + dispatch(m, arguments); + }; + }(method); + } + + var reporters = []; + + this.addReporter = function(reporter) { + reporters.push(reporter); + }; + + return this; + + function dispatch(method, args) { + for (var i = 0; i < reporters.length; i++) { + var reporter = reporters[i]; + if (reporter[method]) { + reporter[method].apply(reporter, args); + } } } } + + return ReportDispatcher; }; -jasmine.ReportDispatcher = function(methods) { - var dispatchedMethods = methods || []; +getJasmineRequireObj().Suite = function() { + function Suite(attrs) { + this.env = attrs.env; + this.id = attrs.id; + this.parentSuite = attrs.parentSuite; + this.description = attrs.description; + this.onStart = attrs.onStart || function() {}; + this.completeCallback = attrs.completeCallback || function() {}; + this.resultCallback = attrs.resultCallback || function() {}; + this.encourageGC = attrs.encourageGC || function(fn) {fn();}; - for (var i = 0; i < dispatchedMethods.length; i++) { - var method = dispatchedMethods[i]; - this[method] = function(m) { - return function() { - dispatch(m, arguments); - }; - }(method); - } + this.beforeFns = []; + this.afterFns = []; + this.queueRunner = attrs.queueRunner || function() {}; + this.disabled = false; - var reporters = []; + this.children_ = []; // TODO: rename + this.suites = []; // TODO: needed? + this.specs = []; // TODO: needed? - this.addReporter = function(reporter) { - reporters.push(reporter); - }; - - return this; - - function dispatch(method, args) { - for (var i = 0; i < reporters.length; i++) { - var reporter = reporters[i]; - if (reporter[method]) { - reporter[method].apply(reporter, args); - } - } - } -}; -jasmine.Suite = function(attrs) { - this.env = attrs.env; - this.id = attrs.id; - this.parentSuite = attrs.parentSuite; - this.description = attrs.description; - this.onStart = attrs.onStart || function() {}; - this.completeCallback = attrs.completeCallback || function() {}; - this.resultCallback = attrs.resultCallback || function() {}; - this.encourageGC = attrs.encourageGC || function(fn) {fn();}; - - this.beforeFns = []; - this.afterFns = []; - this.queueRunner = attrs.queueRunner || function() {}; - this.disabled = false; - - this.children_ = []; // TODO: rename - this.suites = []; // TODO: needed? - this.specs = []; // TODO: needed? - - this.result = { - id: this.id, - status: this.disabled ? 'disabled' : '', - description: this.description, - fullName: this.getFullName() - }; -}; - -jasmine.Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - if (parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - } - return fullName; -}; - -jasmine.Suite.prototype.disable = function() { - this.disabled = true; -}; - -jasmine.Suite.prototype.beforeEach = function(fn) { - this.beforeFns.unshift(fn); -}; - -jasmine.Suite.prototype.afterEach = function(fn) { - this.afterFns.unshift(fn); -}; - -jasmine.Suite.prototype.addSpec = function(spec) { - this.children_.push(spec); - this.specs.push(spec); // TODO: needed? -}; - -jasmine.Suite.prototype.addSuite = function(suite) { - suite.parentSuite = this; - this.children_.push(suite); - this.suites.push(suite); // TODO: needed? -}; - -jasmine.Suite.prototype.children = function() { - return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { - var self = this; - if (this.disabled) { - complete(); - return; - } - - var allFns = [], - children = this.children_; - - for (var i = 0; i < children.length; i++) { - allFns.push(wrapChild(children[i])); - } - - this.onStart(this); - - this.queueRunner({ - fns: allFns, - onComplete: complete - }); - - function complete() { - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); - } - } - - function wrapChild(child) { - return function (done) { - child.execute(done); + this.result = { + id: this.id, + status: this.disabled ? 'disabled' : '', + description: this.description, + fullName: this.getFullName() }; } + + Suite.prototype.getFullName = function() { + var fullName = this.description; + for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { + if (parentSuite.parentSuite) { + fullName = parentSuite.description + ' ' + fullName; + } + } + return fullName; + }; + + Suite.prototype.disable = function() { + this.disabled = true; + }; + + Suite.prototype.beforeEach = function(fn) { + this.beforeFns.unshift(fn); + }; + + Suite.prototype.afterEach = function(fn) { + this.afterFns.unshift(fn); + }; + + Suite.prototype.addSpec = function(spec) { + this.children_.push(spec); + this.specs.push(spec); // TODO: needed? + }; + + Suite.prototype.addSuite = function(suite) { + suite.parentSuite = this; + this.children_.push(suite); + this.suites.push(suite); // TODO: needed? + }; + + Suite.prototype.children = function() { + return this.children_; + }; + + Suite.prototype.execute = function(onComplete) { + var self = this; + if (this.disabled) { + complete(); + return; + } + + var allFns = [], + children = this.children_; + + for (var i = 0; i < children.length; i++) { + allFns.push(wrapChild(children[i])); + } + + this.onStart(this); + + this.queueRunner({ + fns: allFns, + onComplete: complete + }); + + function complete() { + self.resultCallback(self.result); + + if (onComplete) { + onComplete(); + } + } + + function wrapChild(child) { + return function(done) { + child.execute(done); + }; + } + }; + + return Suite; }; -jasmine.version = "2.0.0-alpha"; \ No newline at end of file +if (typeof window == void 0 && typeof exports == "object") { + exports.Suite = jasmineRequire.Suite; +} + +getJasmineRequireObj().version = function() { + return "2.0.0-alpha"; +}; \ No newline at end of file diff --git a/spec/console/ConsoleReporterSpec.js b/spec/console/ConsoleReporterSpec.js index 73241981..d3672f82 100644 --- a/spec/console/ConsoleReporterSpec.js +++ b/spec/console/ConsoleReporterSpec.js @@ -19,7 +19,7 @@ describe("ConsoleReporter", function() { }); it("reports that the suite has started to the console", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print }); @@ -29,7 +29,7 @@ describe("ConsoleReporter", function() { }); it("reports a passing spec as a dot", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print }); @@ -39,7 +39,7 @@ describe("ConsoleReporter", function() { }); it("does not report a disabled spec", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print }); @@ -49,7 +49,7 @@ describe("ConsoleReporter", function() { }); it("reports a failing spec as an 'F'", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print }); @@ -59,7 +59,7 @@ describe("ConsoleReporter", function() { }); it("reports a pending spec as a '*'", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print }); @@ -70,7 +70,7 @@ describe("ConsoleReporter", function() { it("reports a summary when done (singluar spec and time)", function() { var fakeNow = jasmine.createSpy('fake Date.now'), - reporter = new jasmine.ConsoleReporter({ + reporter = new j$.ConsoleReporter({ print: out.print, now: fakeNow }); @@ -91,7 +91,7 @@ describe("ConsoleReporter", function() { it("reports a summary when done (pluralized specs and seconds)", function() { var fakeNow = jasmine.createSpy('fake Date.now'), - reporter = new jasmine.ConsoleReporter({ + reporter = new j$.ConsoleReporter({ print: out.print, now: fakeNow }); @@ -125,7 +125,7 @@ describe("ConsoleReporter", function() { }); it("reports a summary when done that includes stack traces for a failing suite", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print }); @@ -155,7 +155,7 @@ describe("ConsoleReporter", function() { it("calls the onComplete callback when the suite is done", function() { var onComplete = jasmine.createSpy('onComplete'), - reporter = new jasmine.ConsoleReporter({ + reporter = new j$.ConsoleReporter({ print: out.print, onComplete: onComplete }); @@ -169,7 +169,7 @@ describe("ConsoleReporter", function() { describe("with color", function() { it("reports that the suite has started to the console", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print, showColors: true }); @@ -180,7 +180,7 @@ describe("ConsoleReporter", function() { }); it("reports a passing spec as a dot", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print, showColors: true }); @@ -191,7 +191,7 @@ describe("ConsoleReporter", function() { }); it("does not report a disabled spec", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print, showColors: true }); @@ -202,7 +202,7 @@ describe("ConsoleReporter", function() { }); it("reports a failing spec as an 'F'", function() { - var reporter = new jasmine.ConsoleReporter({ + var reporter = new j$.ConsoleReporter({ print: out.print, showColors: true }); diff --git a/spec/core/ClockSpec.js b/spec/core/ClockSpec.js index 618f5ad0..0481e2a1 100644 --- a/spec/core/ClockSpec.js +++ b/spec/core/ClockSpec.js @@ -5,7 +5,7 @@ describe("Clock", function() { delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction']), global = { setTimeout: setTimeout }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.setTimeout(delayedFn, 0); @@ -19,7 +19,7 @@ describe("Clock", function() { delayedFunctionScheduler = {scheduleFunction: scheduleFunction}, global = { setTimeout: setTimeout }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.install(); clock.setTimeout(delayedFn, 0, 'a', 'b'); @@ -35,7 +35,7 @@ describe("Clock", function() { delayedFunctionScheduler = {scheduleFunction: scheduleFunction}, global = { setTimeout: setTimeout }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler), + clock = new j$.Clock(global, delayedFunctionScheduler), timeoutId; clock.install(); @@ -48,7 +48,7 @@ describe("Clock", function() { var clearTimeout = jasmine.createSpy('clearTimeout'), delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearTimeout']), global = { clearTimeout: clearTimeout }, - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.clearTimeout(123); @@ -60,7 +60,7 @@ describe("Clock", function() { delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['removeFunctionWithId']), global = { setTimeout: clearTimeout }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.install(); clock.clearTimeout(123); @@ -74,7 +74,7 @@ describe("Clock", function() { delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction']), global = { setInterval: setInterval }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.setInterval(delayedFn, 0); @@ -88,7 +88,7 @@ describe("Clock", function() { delayedFunctionScheduler = {scheduleFunction: scheduleFunction}, global = { setInterval: setInterval }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.install(); clock.setInterval(delayedFn, 0, 'a', 'b'); @@ -104,7 +104,7 @@ describe("Clock", function() { delayedFunctionScheduler = {scheduleFunction: scheduleFunction}, global = { setInterval: setInterval }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler), + clock = new j$.Clock(global, delayedFunctionScheduler), intervalId; clock.install(); @@ -117,7 +117,7 @@ describe("Clock", function() { var clearInterval = jasmine.createSpy('clearInterval'), delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearInterval']), global = { clearInterval: clearInterval }, - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.clearInterval(123); @@ -129,7 +129,7 @@ describe("Clock", function() { delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['removeFunctionWithId']), global = { setInterval: clearInterval }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.install(); clock.clearInterval(123); @@ -139,7 +139,7 @@ describe("Clock", function() { }); it("gives you a friendly reminder if the Clock is not installed and you tick", function() { - var clock = new jasmine.Clock({}, jasmine.createSpyObj('delayedFunctionScheduler', ['tick'])); + var clock = new j$.Clock({}, jasmine.createSpyObj('delayedFunctionScheduler', ['tick'])); expect(function() { clock.tick(50); }).toThrow(); @@ -151,7 +151,7 @@ describe("Clock", function() { delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction', 'tick', 'reset']), global = { setTimeout: setTimeout, setInterval: setInterval }, delayedFn = jasmine.createSpy('delayedFn'), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); clock.install(); clock.setTimeout(delayedFn, 0); @@ -188,7 +188,7 @@ describe("Clock", function() { delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction']), fn = jasmine.createSpy('fn'), global = { setTimeout: setTimeout, setInterval: setInterval }, - clock = new jasmine.Clock(global, delayedFunctionScheduler); + clock = new j$.Clock(global, delayedFunctionScheduler); setTimeout.apply = null; setInterval.apply = null; @@ -216,8 +216,8 @@ describe("Clock (acceptance)", function() { delayedFn2 = jasmine.createSpy('delayedFn2'), delayedFn3 = jasmine.createSpy('delayedFn3'), recurring1 = jasmine.createSpy('recurring1'), - delayedFunctionScheduler = new jasmine.DelayedFunctionScheduler(), - clock = new jasmine.Clock({setTimeout: setTimeout}, delayedFunctionScheduler); + delayedFunctionScheduler = new j$.DelayedFunctionScheduler(), + clock = new j$.Clock({setTimeout: setTimeout}, delayedFunctionScheduler); clock.install(); @@ -262,8 +262,8 @@ describe("Clock (acceptance)", function() { it("can clear a previously set timeout", function() { var clearedFn = jasmine.createSpy('clearedFn'), - delayedFunctionScheduler = new jasmine.DelayedFunctionScheduler(), - clock = new jasmine.Clock({setTimeout: function() {}}, delayedFunctionScheduler), + delayedFunctionScheduler = new j$.DelayedFunctionScheduler(), + clock = new j$.Clock({setTimeout: function() {}}, delayedFunctionScheduler), timeoutId; clock.install(); @@ -279,8 +279,8 @@ describe("Clock (acceptance)", function() { it("correctly schedules functions after the Clock has advanced", function() { var delayedFn1 = jasmine.createSpy('delayedFn1'), - delayedFunctionScheduler = new jasmine.DelayedFunctionScheduler(), - clock = new jasmine.Clock({setTimeout: function(){}}, delayedFunctionScheduler); + delayedFunctionScheduler = new j$.DelayedFunctionScheduler(), + clock = new j$.Clock({setTimeout: function(){}}, delayedFunctionScheduler); clock.install(); @@ -294,8 +294,8 @@ describe("Clock (acceptance)", function() { it("calls the global clearTimeout correctly when not installed", function () { var delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearTimeout']), - global = originalJasmine.getGlobal(), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + global = jasmine.getGlobal(), + clock = new j$.Clock(global, delayedFunctionScheduler); expect(function() { clock.clearTimeout(123) @@ -304,8 +304,8 @@ describe("Clock (acceptance)", function() { it("calls the global clearTimeout correctly when not installed", function () { var delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearTimeout']), - global = originalJasmine.getGlobal(), - clock = new jasmine.Clock(global, delayedFunctionScheduler); + global = jasmine.getGlobal(), + clock = new j$.Clock(global, delayedFunctionScheduler); expect(function() { clock.clearInterval(123) diff --git a/spec/core/DelayedFunctionSchedulerSpec.js b/spec/core/DelayedFunctionSchedulerSpec.js index 23de4f3b..912a4b43 100644 --- a/spec/core/DelayedFunctionSchedulerSpec.js +++ b/spec/core/DelayedFunctionSchedulerSpec.js @@ -1,6 +1,6 @@ describe("DelayedFunctionScheduler", function() { it("schedules a function for later execution", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); scheduler.scheduleFunction(fn, 0); @@ -13,7 +13,7 @@ describe("DelayedFunctionScheduler", function() { }); it("#tick defaults to 0", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); scheduler.scheduleFunction(fn, 0); @@ -26,7 +26,7 @@ describe("DelayedFunctionScheduler", function() { }); it("defaults delay to 0", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); scheduler.scheduleFunction(fn); @@ -39,7 +39,7 @@ describe("DelayedFunctionScheduler", function() { }); it("optionally passes params to scheduled functions", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); scheduler.scheduleFunction(fn, 0, ['foo', 'bar']); @@ -52,7 +52,7 @@ describe("DelayedFunctionScheduler", function() { }); it("scheduled fns can optionally reoccur", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); scheduler.scheduleFunction(fn, 20, [], true); @@ -74,7 +74,7 @@ describe("DelayedFunctionScheduler", function() { }); it("increments scheduled fns ids unless one is passed", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(); + var scheduler = new j$.DelayedFunctionScheduler(); expect(scheduler.scheduleFunction(function() { }, 0)).toBe(1); @@ -87,7 +87,7 @@ describe("DelayedFunctionScheduler", function() { }); it("#removeFunctionWithId removes a previously scheduled function with a given id", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'), timeoutKey; @@ -103,7 +103,7 @@ describe("DelayedFunctionScheduler", function() { }); it("reset removes scheduled functions", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); scheduler.scheduleFunction(fn, 0); @@ -118,7 +118,7 @@ describe("DelayedFunctionScheduler", function() { }); it("reset resets the returned ids", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(); + var scheduler = new j$.DelayedFunctionScheduler(); expect(scheduler.scheduleFunction(function() { }, 0)).toBe(1); expect(scheduler.scheduleFunction(function() { }, 0, [], false, 123)).toBe(123); @@ -128,7 +128,7 @@ describe("DelayedFunctionScheduler", function() { }); it("reset resets the current tick time", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'); expect(fn).not.toHaveBeenCalled(); @@ -144,7 +144,7 @@ describe("DelayedFunctionScheduler", function() { }); it("executes recurring functions interleaved with regular functions in the correct order", function() { - var scheduler = new jasmine.DelayedFunctionScheduler(), + var scheduler = new j$.DelayedFunctionScheduler(), fn = jasmine.createSpy('fn'), recurringCallCount = 0, recurring = jasmine.createSpy('recurring').andCallFake(function() { diff --git a/spec/core/EnvSpec.js b/spec/core/EnvSpec.js index 6364fb78..c86e14ee 100644 --- a/spec/core/EnvSpec.js +++ b/spec/core/EnvSpec.js @@ -2,7 +2,7 @@ describe("Env", function() { var env; beforeEach(function() { - env = new jasmine.Env(); + env = new j$.Env(); env.updateInterval = 0; }); @@ -18,7 +18,7 @@ describe("Env", function() { var fakeReporter; beforeEach(function() { - fakeReporter = originalJasmine.createSpyObj("fakeReporter", ["jasmineStarted"]); + fakeReporter = jasmine.createSpyObj("fakeReporter", ["jasmineStarted"]); }); it("should allow reporters to be registered", function() { @@ -111,14 +111,14 @@ describe("Env", function() { it("returns true if the exception is a pending spec exception", function() { env.catchExceptions(false); - expect(env.catchException(new Error(jasmine.Spec.pendingSpecExceptionMessage))).toBe(true); + expect(env.catchException(new Error(j$.Spec.pendingSpecExceptionMessage))).toBe(true); }); it("returns false if the exception is not a pending spec exception and not catching exceptions", function() { env.catchExceptions(false); expect(env.catchException(new Error("external error"))).toBe(false); - expect(env.catchException(new Error(jasmine.Spec.pendingSpecExceptionMessage))).toBe(true); + expect(env.catchException(new Error(j$.Spec.pendingSpecExceptionMessage))).toBe(true); }); }); @@ -126,7 +126,7 @@ describe("Env", function() { it("throws the Pending Spec exception", function() { expect(function() { env.pending(); - }).toThrow(jasmine.Spec.pendingSpecExceptionMessage); + }).toThrow(j$.Spec.pendingSpecExceptionMessage); }); }); }); @@ -134,7 +134,7 @@ describe("Env", function() { describe("Env (integration)", function() { it("Suites execute as expected (no nesting)", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), calls = []; env.describe("A Suite", function() { @@ -155,7 +155,7 @@ describe("Env (integration)", function() { }); it("Nested Suites execute as expected", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), calls = []; env.describe("Outer suite", function() { @@ -183,7 +183,7 @@ describe("Env (integration)", function() { }); it("Multiple top-level Suites execute as expected", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), calls = []; env.describe("Outer suite", function() { @@ -220,7 +220,7 @@ describe("Env (integration)", function() { var globalSetTimeout = jasmine.createSpy('globalSetTimeout'), delayedFunctionForGlobalClock = jasmine.createSpy('delayedFunctionForGlobalClock'), delayedFunctionForMockClock = jasmine.createSpy('delayedFunctionForMockClock'), - env = new jasmine.Env({global: { setTimeout: globalSetTimeout }}); + env = new j$.Env({global: { setTimeout: globalSetTimeout }}); env.describe("tests", function() { env.it("test with mock clock", function() { @@ -242,8 +242,9 @@ describe("Env (integration)", function() { expect(globalSetTimeout).toHaveBeenCalledWith(delayedFunctionForGlobalClock, 100); }); + // TODO: something is wrong with this spec it("should report as expected", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), reporter = jasmine.createSpyObj('fakeReproter', [ "jasmineStarted", "jasmineDone", @@ -280,7 +281,7 @@ describe("Env (integration)", function() { }); it("should be possible to get full name from a spec", function() { - var env = new jasmine.Env({global: { setTimeout: setTimeout }}), + var env = new j$.Env({global: { setTimeout: setTimeout }}), topLevelSpec, nestedSpec, doublyNestedSpec; env.describe("my tests", function() { diff --git a/spec/core/ExceptionFormatterSpec.js b/spec/core/ExceptionFormatterSpec.js index 7ded6ac7..f718406b 100644 --- a/spec/core/ExceptionFormatterSpec.js +++ b/spec/core/ExceptionFormatterSpec.js @@ -7,7 +7,7 @@ describe("ExceptionFormatter", function() { message: 'you got your foo in my bar', name: 'A Classic Mistake' }, - exceptionFormatter = new jasmine.ExceptionFormatter(), + exceptionFormatter = new j$.ExceptionFormatter(), message = exceptionFormatter.message(sampleFirefoxException); expect(message).toEqual('A Classic Mistake: you got your foo in my bar in foo.js (line 1978)'); @@ -20,7 +20,7 @@ describe("ExceptionFormatter", function() { message: 'you got your foo in my bar', name: 'A Classic Mistake' }, - exceptionFormatter = new jasmine.ExceptionFormatter(), + exceptionFormatter = new j$.ExceptionFormatter(), message = exceptionFormatter.message(sampleWebkitException); expect(message).toEqual('A Classic Mistake: you got your foo in my bar in foo.js (line 1978)'); @@ -31,7 +31,7 @@ describe("ExceptionFormatter", function() { message: 'you got your foo in my bar', name: 'A Classic Mistake' }, - exceptionFormatter = new jasmine.ExceptionFormatter(), + exceptionFormatter = new j$.ExceptionFormatter(), message = exceptionFormatter.message(sampleV8); expect(message).toEqual('A Classic Mistake: you got your foo in my bar'); @@ -42,11 +42,11 @@ describe("ExceptionFormatter", function() { describe("#stack", function() { it("formats stack traces from Webkit, Firefox or node.js", function() { var error = new Error("an error"); - expect(new jasmine.ExceptionFormatter().stack(error)).toMatch(/ExceptionFormatterSpec\.js.*\d+/) + expect(new j$.ExceptionFormatter().stack(error)).toMatch(/ExceptionFormatterSpec\.js.*\d+/) }); it("returns null if no Error provided", function() { - expect(new jasmine.ExceptionFormatter().stack()).toBeNull(); + expect(new j$.ExceptionFormatter().stack()).toBeNull(); }); }); }); \ No newline at end of file diff --git a/spec/core/ExceptionsSpec.js b/spec/core/ExceptionsSpec.js index e06b1275..77bbae93 100644 --- a/spec/core/ExceptionsSpec.js +++ b/spec/core/ExceptionsSpec.js @@ -2,7 +2,7 @@ describe('Exceptions:', function() { var env; beforeEach(function() { - env = new jasmine.Env(); + env = new j$.Env(); env.updateInterval = 0; }); diff --git a/spec/core/ExpectationResultSpec.js b/spec/core/ExpectationResultSpec.js index 6586ab96..00117851 100644 --- a/spec/core/ExpectationResultSpec.js +++ b/spec/core/ExpectationResultSpec.js @@ -1,16 +1,16 @@ describe("buildExpectationResult", function() { it("defaults to passed", function() { - var result = jasmine.buildExpectationResult({passed: 'some-value'}); + var result = j$.buildExpectationResult({passed: 'some-value'}); expect(result.passed).toBe('some-value'); }); it("message defaults to Passed for passing specs", function() { - var result = jasmine.buildExpectationResult({passed: true, message: 'some-value'}); + var result = j$.buildExpectationResult({passed: true, message: 'some-value'}); expect(result.message).toBe('Passed.'); }); it("message returns the message for failing expecations", function() { - var result = jasmine.buildExpectationResult({passed: false, message: 'some-value'}); + var result = j$.buildExpectationResult({passed: false, message: 'some-value'}); expect(result.message).toBe('some-value'); }); @@ -18,7 +18,7 @@ describe("buildExpectationResult", function() { var fakeError = {message: 'foo'}, messageFormatter = jasmine.createSpy("exception message formatter").andReturn(fakeError.message); - var result = jasmine.buildExpectationResult( + var result = j$.buildExpectationResult( { passed: false, error: fakeError, @@ -33,7 +33,7 @@ describe("buildExpectationResult", function() { var fakeError = {stack: 'foo'}, stackFormatter = jasmine.createSpy("stack formatter").andReturn(fakeError.stack); - var result = jasmine.buildExpectationResult( + var result = j$.buildExpectationResult( { passed: false, error: fakeError, @@ -45,17 +45,17 @@ describe("buildExpectationResult", function() { }); it("matcherName returns passed matcherName", function() { - var result = jasmine.buildExpectationResult({matcherName: 'some-value'}); + var result = j$.buildExpectationResult({matcherName: 'some-value'}); expect(result.matcherName).toBe('some-value'); }); it("expected returns passed expected", function() { - var result = jasmine.buildExpectationResult({expected: 'some-value'}); + var result = j$.buildExpectationResult({expected: 'some-value'}); expect(result.expected).toBe('some-value'); }); it("actual returns passed actual", function() { - var result = jasmine.buildExpectationResult({actual: 'some-value'}); + var result = j$.buildExpectationResult({actual: 'some-value'}); expect(result.actual).toBe('some-value'); }); }); diff --git a/spec/core/JsApiReporterSpec.js b/spec/core/JsApiReporterSpec.js index f89e5bb0..24d2f963 100644 --- a/spec/core/JsApiReporterSpec.js +++ b/spec/core/JsApiReporterSpec.js @@ -5,7 +5,7 @@ xdescribe('JsApiReporter (integration specs)', function() { var suite, nestedSuite, nestedSpec; beforeEach(function() { - env = new jasmine.Env(); + env = new j$.Env(); env.updateInterval = 0; suite = env.describe("top-level suite", function() { @@ -26,7 +26,7 @@ xdescribe('JsApiReporter (integration specs)', function() { }); - reporter = new jasmine.JsApiReporter(jasmine); + reporter = new j$.JsApiReporter(jasmine); env.addReporter(reporter); env.execute(); @@ -83,7 +83,7 @@ xdescribe('JsApiReporter (integration specs)', function() { describe("JsApiReporter", function() { it("knows when a full environment is started", function() { - var reporter = new jasmine.JsApiReporter(); + var reporter = new j$.JsApiReporter(); expect(reporter.started).toBe(false); expect(reporter.finished).toBe(false); @@ -95,7 +95,7 @@ describe("JsApiReporter", function() { }); it("knows when a full environment is done", function() { - var reporter = new jasmine.JsApiReporter(); + var reporter = new j$.JsApiReporter(); expect(reporter.started).toBe(false); expect(reporter.finished).toBe(false); @@ -107,13 +107,13 @@ describe("JsApiReporter", function() { }); it("defaults to 'loaded' status", function() { - var reporter = new jasmine.JsApiReporter(); + var reporter = new j$.JsApiReporter(); expect(reporter.status()).toEqual('loaded'); }); it("reports 'started' when Jasmine has started", function() { - var reporter = new jasmine.JsApiReporter(); + var reporter = new j$.JsApiReporter(); reporter.jasmineStarted(); @@ -121,7 +121,7 @@ describe("JsApiReporter", function() { }); it("reports 'done' when Jasmine is done", function() { - var reporter = new jasmine.JsApiReporter(); + var reporter = new j$.JsApiReporter(); reporter.jasmineDone(); @@ -129,7 +129,7 @@ describe("JsApiReporter", function() { }); it("tracks a suite", function() { - var reporter = new jasmine.JsApiReporter(); + var reporter = new j$.JsApiReporter(); reporter.suiteStarted({ id: 123, @@ -152,7 +152,7 @@ describe("JsApiReporter", function() { describe("#specResults", function() { var reporter, specResult1, specResult2; beforeEach(function() { - reporter = new jasmine.JsApiReporter(); + reporter = new j$.JsApiReporter(); specResult1 = { id: 1, description: "A spec" diff --git a/spec/core/MatchersSpec.js b/spec/core/MatchersSpec.js index 1b23c6a5..fde4a9ca 100644 --- a/spec/core/MatchersSpec.js +++ b/spec/core/MatchersSpec.js @@ -2,7 +2,7 @@ describe("jasmine.Matchers", function() { var env, spec; beforeEach(function() { - env = new jasmine.Env(); + env = new j$.Env(); env.updateInterval = 0; var suite = env.describe("suite", function() { @@ -391,7 +391,7 @@ describe("jasmine.Matchers", function() { var matcher; beforeEach(function () { matcher = { - jasmineMatches: originalJasmine.createSpy("jasmineMatches") + jasmineMatches: jasmine.createSpy("jasmineMatches") }; }); @@ -699,7 +699,7 @@ describe("jasmine.Matchers", function() { TestClass = { normalFunction: function() { }, - spyFunction: originalJasmine.createSpy("My spy") + spyFunction: jasmine.createSpy("My spy") }; }); @@ -912,7 +912,7 @@ describe("jasmine.Matchers", function() { describe("with an empty object", function () { var containing; beforeEach(function () { - containing = new jasmine.Matchers.ObjectContaining({}); + containing = new j$.Matchers.ObjectContaining({}); }); it("matches everything", function () { expect(containing.jasmineMatches("foo", [], [])).toBe(true); @@ -928,7 +928,7 @@ describe("jasmine.Matchers", function() { beforeEach(function () { mismatchKeys = []; mismatchValues = []; - containing = new jasmine.Matchers.ObjectContaining({foo: "fooVal", bar: "barVal"}); + containing = new j$.Matchers.ObjectContaining({foo: "fooVal", bar: "barVal"}); }); it("doesn't match an empty object", function () { @@ -979,7 +979,7 @@ describe("jasmine.Matchers", function() { describe("in real life", function () { var method; beforeEach(function () { - method = originalJasmine.createSpy("method"); + method = jasmine.createSpy("method"); method({a:"b", c:"d"}); }); it("works correctly for positive matches", function () { diff --git a/spec/core/PrettyPrintSpec.js b/spec/core/PrettyPrintSpec.js index 14d0d3e0..4ad2ce17 100644 --- a/spec/core/PrettyPrintSpec.js +++ b/spec/core/PrettyPrintSpec.js @@ -1,34 +1,34 @@ -describe("jasmine.pp", function () { +describe("j$.pp", function () { it("should wrap strings in single quotes", function() { - expect(jasmine.pp("some string")).toEqual("'some string'"); - expect(jasmine.pp("som' string")).toEqual("'som' string'"); + expect(j$.pp("some string")).toEqual("'some string'"); + expect(j$.pp("som' string")).toEqual("'som' string'"); }); it("should stringify primitives properly", function() { - expect(jasmine.pp(true)).toEqual("true"); - expect(jasmine.pp(false)).toEqual("false"); - expect(jasmine.pp(null)).toEqual("null"); - expect(jasmine.pp(jasmine.undefined)).toEqual("undefined"); - expect(jasmine.pp(3)).toEqual("3"); - expect(jasmine.pp(-3.14)).toEqual("-3.14"); + expect(j$.pp(true)).toEqual("true"); + expect(j$.pp(false)).toEqual("false"); + expect(j$.pp(null)).toEqual("null"); + expect(j$.pp(jasmine.undefined)).toEqual("undefined"); + expect(j$.pp(3)).toEqual("3"); + expect(j$.pp(-3.14)).toEqual("-3.14"); }); it("should stringify arrays properly", function() { - expect(jasmine.pp([1, 2])).toEqual("[ 1, 2 ]"); - expect(jasmine.pp([1, 'foo', {}, jasmine.undefined, null])).toEqual("[ 1, 'foo', { }, undefined, null ]"); + expect(j$.pp([1, 2])).toEqual("[ 1, 2 ]"); + expect(j$.pp([1, 'foo', {}, jasmine.undefined, null])).toEqual("[ 1, 'foo', { }, undefined, null ]"); }); it("should indicate circular array references", function() { var array1 = [1, 2]; var array2 = [array1]; array1.push(array2); - expect(jasmine.pp(array1)).toEqual("[ 1, 2, [ ] ]"); + expect(j$.pp(array1)).toEqual("[ 1, 2, [ ] ]"); }); it("should stringify objects properly", function() { - expect(jasmine.pp({foo: 'bar'})).toEqual("{ foo : 'bar' }"); - expect(jasmine.pp({foo:'bar', baz:3, nullValue: null, undefinedValue: jasmine.undefined})).toEqual("{ foo : 'bar', baz : 3, nullValue : null, undefinedValue : undefined }"); - expect(jasmine.pp({foo: function () { + expect(j$.pp({foo: 'bar'})).toEqual("{ foo : 'bar' }"); + expect(j$.pp({foo:'bar', baz:3, nullValue: null, undefinedValue: jasmine.undefined})).toEqual("{ foo : 'bar', baz : 3, nullValue : null, undefinedValue : undefined }"); + expect(j$.pp({foo: function () { }, bar: [1, 2, 3]})).toEqual("{ foo : Function, bar : [ 1, 2, 3 ] }"); }); @@ -37,39 +37,39 @@ describe("jasmine.pp", function () { SomeClass.prototype.foo = "inherited foo"; var instance = new SomeClass(); instance.bar = "my own bar"; - expect(jasmine.pp(instance)).toEqual("{ bar : 'my own bar' }"); + expect(j$.pp(instance)).toEqual("{ bar : 'my own bar' }"); }); - it("should not recurse objects and arrays more deeply than jasmine.MAX_PRETTY_PRINT_DEPTH", function() { - var originalMaxDepth = jasmine.MAX_PRETTY_PRINT_DEPTH; + it("should not recurse objects and arrays more deeply than j$.MAX_PRETTY_PRINT_DEPTH", function() { + var originalMaxDepth = j$.MAX_PRETTY_PRINT_DEPTH; var nestedObject = { level1: { level2: { level3: { level4: "leaf" } } } }; var nestedArray = [1, [2, [3, [4, "leaf"]]]]; try { - jasmine.MAX_PRETTY_PRINT_DEPTH = 2; - expect(jasmine.pp(nestedObject)).toEqual("{ level1 : { level2 : Object } }"); - expect(jasmine.pp(nestedArray)).toEqual("[ 1, [ 2, Array ] ]"); + j$.MAX_PRETTY_PRINT_DEPTH = 2; + expect(j$.pp(nestedObject)).toEqual("{ level1 : { level2 : Object } }"); + expect(j$.pp(nestedArray)).toEqual("[ 1, [ 2, Array ] ]"); - jasmine.MAX_PRETTY_PRINT_DEPTH = 3; - expect(jasmine.pp(nestedObject)).toEqual("{ level1 : { level2 : { level3 : Object } } }"); - expect(jasmine.pp(nestedArray)).toEqual("[ 1, [ 2, [ 3, Array ] ] ]"); + j$.MAX_PRETTY_PRINT_DEPTH = 3; + expect(j$.pp(nestedObject)).toEqual("{ level1 : { level2 : { level3 : Object } } }"); + expect(j$.pp(nestedArray)).toEqual("[ 1, [ 2, [ 3, Array ] ] ]"); - jasmine.MAX_PRETTY_PRINT_DEPTH = 4; - expect(jasmine.pp(nestedObject)).toEqual("{ level1 : { level2 : { level3 : { level4 : 'leaf' } } } }"); - expect(jasmine.pp(nestedArray)).toEqual("[ 1, [ 2, [ 3, [ 4, 'leaf' ] ] ] ]"); + j$.MAX_PRETTY_PRINT_DEPTH = 4; + expect(j$.pp(nestedObject)).toEqual("{ level1 : { level2 : { level3 : { level4 : 'leaf' } } } }"); + expect(j$.pp(nestedArray)).toEqual("[ 1, [ 2, [ 3, [ 4, 'leaf' ] ] ] ]"); } finally { - jasmine.MAX_PRETTY_PRINT_DEPTH = originalMaxDepth; + j$.MAX_PRETTY_PRINT_DEPTH = originalMaxDepth; } }); it("should stringify RegExp objects properly", function() { - expect(jasmine.pp(/x|y|z/)).toEqual("/x|y|z/"); + expect(j$.pp(/x|y|z/)).toEqual("/x|y|z/"); }); it("should indicate circular object references", function() { var sampleValue = {foo: 'hello'}; sampleValue.nested = sampleValue; - expect(jasmine.pp(sampleValue)).toEqual("{ foo : 'hello', nested : }"); + expect(j$.pp(sampleValue)).toEqual("{ foo : 'hello', nested : }"); }); it("should indicate getters on objects as such", function() { @@ -81,25 +81,25 @@ describe("jasmine.pp", function () { }); } if (sampleValue.__defineGetter__) { - expect(jasmine.pp(sampleValue)).toEqual("{ id : 1, calculatedValue : }"); + expect(j$.pp(sampleValue)).toEqual("{ id : 1, calculatedValue : }"); } else { - expect(jasmine.pp(sampleValue)).toEqual("{ id : 1 }"); + expect(j$.pp(sampleValue)).toEqual("{ id : 1 }"); } }); it('should not do HTML escaping of strings', function() { - expect(jasmine.pp('some html string &', false)).toEqual('\'some html string &\''); + expect(j$.pp('some html string &', false)).toEqual('\'some html string &\''); }); it("should abbreviate the global (usually window) object", function() { - expect(jasmine.pp(jasmine.getGlobal())).toEqual(""); + expect(j$.pp(jasmine.getGlobal())).toEqual(""); }); it("should stringify Date objects properly", function() { var now = new Date(); - expect(jasmine.pp(now)).toEqual("Date(" + now.toString() + ")"); + expect(j$.pp(now)).toEqual("Date(" + now.toString() + ")"); }); it("should stringify spy objects properly", function() { @@ -108,9 +108,9 @@ describe("jasmine.pp", function () { } }; spyOn(TestObject, 'someFunction'); - expect(jasmine.pp(TestObject.someFunction)).toEqual("spy on someFunction"); + expect(j$.pp(TestObject.someFunction)).toEqual("spy on someFunction"); - expect(jasmine.pp(jasmine.createSpy("something"))).toEqual("spy on something"); + expect(j$.pp(jasmine.createSpy("something"))).toEqual("spy on something"); }); it("should stringify objects that implement jasmineToString", function () { @@ -118,7 +118,7 @@ describe("jasmine.pp", function () { jasmineToString: function () { return "strung"; } }; - expect(jasmine.pp(obj)).toEqual("strung"); + expect(j$.pp(obj)).toEqual("strung"); }); }); diff --git a/spec/core/QueueRunnerSpec.js b/spec/core/QueueRunnerSpec.js index 3461e185..666263e0 100644 --- a/spec/core/QueueRunnerSpec.js +++ b/spec/core/QueueRunnerSpec.js @@ -4,7 +4,7 @@ describe("QueueRunner", function() { var calls = [], fn1 = jasmine.createSpy('fn1'), fn2 = jasmine.createSpy('fn2'), - queueRunner = new jasmine.QueueRunner({ + queueRunner = new j$.QueueRunner({ fns: [fn1, fn2] }); fn1.andCallFake(function() { @@ -23,10 +23,10 @@ describe("QueueRunner", function() { //TODO: it would be nice if spy arity could match the fake, so we could do something like: //createSpy('asyncfn').andCallFake(function(done) {}); - var onComplete = originalJasmine.createSpy('onComplete'), - beforeCallback = originalJasmine.createSpy('beforeCallback'), - fnCallback = originalJasmine.createSpy('fnCallback'), - afterCallback = originalJasmine.createSpy('afterCallback'), + var onComplete = jasmine.createSpy('onComplete'), + beforeCallback = jasmine.createSpy('beforeCallback'), + fnCallback = jasmine.createSpy('fnCallback'), + afterCallback = jasmine.createSpy('afterCallback'), fn1 = function(done) { beforeCallback(); setTimeout(function() { @@ -45,7 +45,7 @@ describe("QueueRunner", function() { done() }, 100); }, - queueRunner = new jasmine.QueueRunner({ + queueRunner = new j$.QueueRunner({ fns: [fn1, fn2, fn3], onComplete: onComplete }); @@ -80,7 +80,7 @@ describe("QueueRunner", function() { throw new Error('fake error'); }, exceptionCallback = jasmine.createSpy('exception callback'), - queueRunner = new jasmine.QueueRunner({ + queueRunner = new j$.QueueRunner({ fns: [fn], onException: exceptionCallback }); @@ -94,7 +94,7 @@ describe("QueueRunner", function() { var fn = function() { throw new Error('fake error'); }, - queueRunner = new jasmine.QueueRunner({ + queueRunner = new j$.QueueRunner({ fns: [fn], catchException: function(e) { return false; } }); @@ -105,7 +105,7 @@ describe("QueueRunner", function() { it("calls a provided complete callback when done", function() { var fn = jasmine.createSpy('fn'), completeCallback = jasmine.createSpy('completeCallback'), - queueRunner = new jasmine.QueueRunner({ + queueRunner = new j$.QueueRunner({ fns: [fn], onComplete: completeCallback }); @@ -119,7 +119,7 @@ describe("QueueRunner", function() { var fn = jasmine.createSpy('fn'), completeCallback = jasmine.createSpy('completeCallback'), encourageGC = jasmine.createSpy('encourageGC'), - queueRunner = new jasmine.QueueRunner({ + queueRunner = new j$.QueueRunner({ fns: [fn], encourageGC: encourageGC, onComplete: completeCallback diff --git a/spec/core/ReportDispatcherSpec.js b/spec/core/ReportDispatcherSpec.js index 62b0d463..94dfa87b 100644 --- a/spec/core/ReportDispatcherSpec.js +++ b/spec/core/ReportDispatcherSpec.js @@ -1,7 +1,7 @@ describe("ReportDispatcher", function() { it("builds an interface of requested methods", function() { - var dispatcher = new jasmine.ReportDispatcher(['foo', 'bar', 'baz']); + var dispatcher = new j$.ReportDispatcher(['foo', 'bar', 'baz']); expect(dispatcher.foo).toBeDefined(); expect(dispatcher.bar).toBeDefined(); @@ -9,7 +9,7 @@ describe("ReportDispatcher", function() { }); it("dispatches requested methods to added reporters", function() { - var dispatcher = new jasmine.ReportDispatcher(['foo', 'bar']), + var dispatcher = new j$.ReportDispatcher(['foo', 'bar']), reporter = jasmine.createSpyObj('reporter', ['foo', 'bar']), anotherReporter = jasmine.createSpyObj('reporter', ['foo', 'bar']); @@ -28,7 +28,7 @@ describe("ReportDispatcher", function() { }); it("does not dispatch to a reporter if the reporter doesn't accept the method", function() { - var dispatcher = new jasmine.ReportDispatcher(['foo']), + var dispatcher = new j$.ReportDispatcher(['foo']), reporter = jasmine.createSpyObj('reporter', ['baz']); dispatcher.addReporter(reporter); diff --git a/spec/core/SpecRunningSpec.js b/spec/core/SpecRunningSpec.js index d19950e2..5916d3aa 100644 --- a/spec/core/SpecRunningSpec.js +++ b/spec/core/SpecRunningSpec.js @@ -4,7 +4,7 @@ describe("jasmine spec running", function () { var fakeTimer; beforeEach(function() { - env = new jasmine.Env(); + env = new j$.Env(); env.updateInterval = 0; }); @@ -221,7 +221,7 @@ describe("jasmine spec running", function () { }); it("shouldn't run disabled suites", function() { - var specInADisabledSuite = originalJasmine.createSpy("specInADisabledSuite"), + var specInADisabledSuite = jasmine.createSpy("specInADisabledSuite"), suite = env.describe('A Suite', function() { env.xdescribe('with a disabled suite', function(){ env.it('spec inside a disabled suite', specInADisabledSuite); @@ -248,7 +248,7 @@ describe("jasmine spec running", function () { // TODO: is this useful? It doesn't catch syntax errors xit("should recover gracefully when there are errors in describe functions", function() { var specs = []; - var superSimpleReporter = new jasmine.Reporter(); + var superSimpleReporter = new j$.Reporter(); superSimpleReporter.reportSpecResults = function(result) { specs.push("Spec: " + result.fullName); }; diff --git a/spec/core/SpecSpec.js b/spec/core/SpecSpec.js index 8f596224..8ba8a0d9 100644 --- a/spec/core/SpecSpec.js +++ b/spec/core/SpecSpec.js @@ -1,28 +1,28 @@ describe("Spec", function() { it("#isPendingSpecException returns true for a pending spec exception", function() { - var e = new Error(jasmine.Spec.pendingSpecExceptionMessage); + var e = new Error(j$.Spec.pendingSpecExceptionMessage); - expect(jasmine.Spec.isPendingSpecException(e)).toBe(true); + expect(j$.Spec.isPendingSpecException(e)).toBe(true); }); it("#isPendingSpecException returns true for a pending spec exception (even when FF bug is present)", function() { var fakeError = { - toString: function() { return "Error: " + jasmine.Spec.pendingSpecExceptionMessage; } + toString: function() { return "Error: " + j$.Spec.pendingSpecExceptionMessage; } }; - expect(jasmine.Spec.isPendingSpecException(fakeError)).toBe(true); + expect(j$.Spec.isPendingSpecException(fakeError)).toBe(true); }); it("#isPendingSpecException returns true for a pending spec exception", function() { var e = new Error("foo"); - expect(jasmine.Spec.isPendingSpecException(e)).toBe(false); + expect(j$.Spec.isPendingSpecException(e)).toBe(false); }); it("delegates execution to a QueueRunner", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - spec = new jasmine.Spec({ + spec = new j$.Spec({ description: 'my test', id: 'some-id', fn: function() {}, @@ -37,8 +37,8 @@ describe("Spec", function() { it("should call the start callback on execution", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), beforesWereCalled = false, - startCallback = originalJasmine.createSpy('startCallback'), - spec = new jasmine.Spec({ + startCallback = jasmine.createSpy('startCallback'), + spec = new j$.Spec({ id: 123, description: 'foo bar', fn: function() {}, @@ -54,10 +54,10 @@ describe("Spec", function() { it("should call the start callback on execution but before any befores are called", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), beforesWereCalled = false, - startCallback = originalJasmine.createSpy('start-callback').andCallFake(function() { + startCallback = jasmine.createSpy('start-callback').andCallFake(function() { expect(beforesWereCalled).toBe(false); }), - spec = new jasmine.Spec({ + spec = new j$.Spec({ fn: function() {}, beforeFns: function() { return [function() { @@ -75,13 +75,13 @@ describe("Spec", function() { it("provides all before fns and after fns to be run", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - before = originalJasmine.createSpy('before'), - after = originalJasmine.createSpy('after'), - fn = originalJasmine.createSpy('test body').andCallFake(function() { + before = jasmine.createSpy('before'), + after = jasmine.createSpy('after'), + fn = jasmine.createSpy('test body').andCallFake(function() { expect(before).toHaveBeenCalled(); expect(after).not.toHaveBeenCalled(); }), - spec = new jasmine.Spec({ + spec = new j$.Spec({ fn: fn, beforeFns: function() { return [before] @@ -101,9 +101,9 @@ describe("Spec", function() { it("is marked pending if created without a function body", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - startCallback = originalJasmine.createSpy('startCallback'), - resultCallback = originalJasmine.createSpy('resultCallback'), - spec = new jasmine.Spec({ + startCallback = jasmine.createSpy('startCallback'), + resultCallback = jasmine.createSpy('resultCallback'), + spec = new j$.Spec({ onStart: startCallback, fn: null, resultCallback: resultCallback, @@ -116,10 +116,10 @@ describe("Spec", function() { it("can be disabled, but still calls callbacks", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - startCallback = originalJasmine.createSpy('startCallback'), - specBody = originalJasmine.createSpy('specBody'), - resultCallback = originalJasmine.createSpy('resultCallback'), - spec = new jasmine.Spec({ + startCallback = jasmine.createSpy('startCallback'), + specBody = jasmine.createSpy('specBody'), + resultCallback = jasmine.createSpy('resultCallback'), + spec = new j$.Spec({ onStart:startCallback, fn: specBody, resultCallback: resultCallback, @@ -141,9 +141,9 @@ describe("Spec", function() { it("can be marked pending, but still calls callbacks when executed", function() { var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - startCallback = originalJasmine.createSpy('startCallback'), - resultCallback = originalJasmine.createSpy('resultCallback'), - spec = new jasmine.Spec({ + startCallback = jasmine.createSpy('startCallback'), + resultCallback = jasmine.createSpy('resultCallback'), + spec = new j$.Spec({ onStart: startCallback, resultCallback: resultCallback, description: "with a spec", @@ -172,8 +172,8 @@ describe("Spec", function() { }); it("should call the done callback on execution complete", function() { - var done = originalJasmine.createSpy('done callback'), - spec = new jasmine.Spec({ + var done = jasmine.createSpy('done callback'), + spec = new j$.Spec({ fn: function() {}, catchExceptions: function() { return false; }, resultCallback: function() {}, @@ -186,13 +186,13 @@ describe("Spec", function() { }); it("#status returns pending by default", function() { - var spec = new jasmine.Spec({fn: jasmine.createSpy("spec body")}); + var spec = new j$.Spec({fn: jasmine.createSpy("spec body")}); expect(spec.status()).toEqual('pending'); }); it("#status returns pending if no expectations were encountered", function() { var specBody = jasmine.createSpy("spec body"), - spec = new jasmine.Spec({fn: specBody}); + spec = new j$.Spec({fn: specBody}); spec.execute(); @@ -200,13 +200,13 @@ describe("Spec", function() { }); it("#status returns passed if all expectations in the spec have passed", function() { - var spec = new jasmine.Spec({fn: jasmine.createSpy("spec body")}); + var spec = new j$.Spec({fn: jasmine.createSpy("spec body")}); spec.addExpectationResult(true); expect(spec.status()).toBe('passed'); }); it("#status returns failed if any expectations in the spec have failed", function() { - var spec = new jasmine.Spec({ fn: jasmine.createSpy("spec body") }); + var spec = new j$.Spec({ fn: jasmine.createSpy("spec body") }); spec.addExpectationResult(true); spec.addExpectationResult(false); expect(spec.status()).toBe('failed'); @@ -214,7 +214,7 @@ describe("Spec", function() { it("can return its full name", function() { var spec; - spec = new jasmine.Spec({ + spec = new j$.Spec({ getSpecName: function(passedVal) { // expect(passedVal).toBe(spec); TODO: a exec time, spec is undefined WTF? return 'expected val'; @@ -227,9 +227,9 @@ describe("Spec", function() { describe("when a spec is marked pending during execution", function() { it("should mark the spec as pending", function() { var fakeQueueRunner = function(opts) { - opts.onException(new Error(jasmine.Spec.pendingSpecExceptionMessage)); + opts.onException(new Error(j$.Spec.pendingSpecExceptionMessage)); }, - spec = new jasmine.Spec({ + spec = new j$.Spec({ description: 'my test', id: 'some-id', fn: function() { }, diff --git a/spec/core/SpySpec.js b/spec/core/SpySpec.js index 8d477895..163553bf 100644 --- a/spec/core/SpySpec.js +++ b/spec/core/SpySpec.js @@ -1,7 +1,7 @@ describe('Spies', function () { var env; beforeEach(function() { - env = new jasmine.Env(); + env = new j$.Env(); }); it('should replace the specified function with a spy object', function() { @@ -133,7 +133,7 @@ describe('Spies', function () { it('is torn down when env.removeAllSpies is called', function() { var originalFunctionWasCalled = false, - env = new jasmine.Env(), + env = new j$.Env(), TestClass = { someFunction: function() { originalFunctionWasCalled = true; @@ -151,15 +151,15 @@ describe('Spies', function () { }); it('calls removeAllSpies during spec finish', function() { - var env = new jasmine.Env(), + var env = new j$.Env(), originalFoo = function() {}, testObj = { foo: originalFoo }, - firstSpec = originalJasmine.createSpy('firstSpec').andCallFake(function() { + firstSpec = jasmine.createSpy('firstSpec').andCallFake(function() { env.spyOn(testObj, 'foo'); }), - secondSpec = originalJasmine.createSpy('secondSpec').andCallFake(function() { + secondSpec = jasmine.createSpy('secondSpec').andCallFake(function() { expect(testObj.foo).toBe(originalFoo); }); env.describe('test suite', function() { @@ -215,7 +215,7 @@ describe('Spies', function () { describe("createSpyObj", function() { it("should create an object with a bunch of spy methods when you call jasmine.createSpyObj()", function() { var spyObj = jasmine.createSpyObj('BaseName', ['method1', 'method2']); - expect(spyObj).toEqual({ method1: originalJasmine.any(Function), method2: originalJasmine.any(Function)}); + expect(spyObj).toEqual({ method1: jasmine.any(Function), method2: jasmine.any(Function)}); expect(spyObj.method1.identity).toEqual('BaseName.method1'); expect(spyObj.method2.identity).toEqual('BaseName.method2'); }); diff --git a/spec/core/SuiteSpec.js b/spec/core/SuiteSpec.js index b09e4f62..fd21a7c3 100644 --- a/spec/core/SuiteSpec.js +++ b/spec/core/SuiteSpec.js @@ -1,8 +1,8 @@ describe("Suite", function() { it("keeps its id", function() { - var env = new jasmine.Env(), - suite = new jasmine.Suite({ + var env = new j$.Env(), + suite = new j$.Suite({ env: env, id: 456, description: "I am a suite" @@ -12,8 +12,8 @@ describe("Suite", function() { }); it("returns its full name", function() { - var env = new jasmine.Env(), - suite = new jasmine.Suite({ + var env = new j$.Env(), + suite = new j$.Suite({ env: env, description: "I am a suite" }); @@ -22,13 +22,13 @@ describe("Suite", function() { }); it("returns its full name when it has parent suites", function() { - var env = new jasmine.Env(), - parentSuite = new jasmine.Suite({ + var env = new j$.Env(), + parentSuite = new j$.Suite({ env: env, description: "I am a parent suite", parentSuite: jasmine.createSpy('pretend top level suite') }), - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "I am a suite", parentSuite: parentSuite @@ -38,8 +38,8 @@ describe("Suite", function() { }); it("adds before functions in order of needed execution", function() { - var env = new jasmine.Env(), - suite = new jasmine.Suite({ + var env = new j$.Env(), + suite = new j$.Suite({ env: env, description: "I am a suite" }), @@ -53,8 +53,8 @@ describe("Suite", function() { }); it("adds after functions in order of needed execution", function() { - var env = new jasmine.Env(), - suite = new jasmine.Suite({ + var env = new j$.Env(), + suite = new j$.Suite({ env: env, description: "I am a suite" }), @@ -68,11 +68,11 @@ describe("Suite", function() { }); it("adds specs", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), fakeQueue = { add: jasmine.createSpy() }, - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "I am a suite", queueFactory: function() { @@ -89,18 +89,18 @@ describe("Suite", function() { }); it("adds suites", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), fakeQueue = { add: jasmine.createSpy() }, - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "I am a suite", queueFactory: function() { return fakeQueue } }), - anotherSuite = new jasmine.Suite({ + anotherSuite = new j$.Suite({ env: env, description: "I am another suite", queueFactory: function() { @@ -116,9 +116,9 @@ describe("Suite", function() { }); it("can be disabled", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), fakeQueueRunner = jasmine.createSpy('fake queue runner'), - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "with a child suite", queueRunner: fakeQueueRunner @@ -134,16 +134,16 @@ describe("Suite", function() { }); it("delegates execution of its specs and suites", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), parentSuiteDone = jasmine.createSpy('parent suite done'), fakeQueueRunnerForParent = jasmine.createSpy('fake parent queue runner'), - parentSuite = new jasmine.Suite({ + parentSuite = new j$.Suite({ env: env, description: "I am a parent suite", queueRunner: fakeQueueRunnerForParent }), fakeQueueRunner = jasmine.createSpy('fake queue runner'), - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "with a child suite", queueRunner: fakeQueueRunner @@ -168,10 +168,10 @@ describe("Suite", function() { }); it("calls a provided onStart callback when starting", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), suiteStarted = jasmine.createSpy('suiteStarted'), fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "with a child suite", onStart: suiteStarted, @@ -187,10 +187,10 @@ describe("Suite", function() { }); it("calls a provided onComplete callback when done", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), suiteCompleted = jasmine.createSpy('parent suite done'), fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "with a child suite", queueRunner: fakeQueueRunner @@ -205,10 +205,10 @@ describe("Suite", function() { }); it("calls a provided result callback when done", function() { - var env = new jasmine.Env(), + var env = new j$.Env(), suiteResultsCallback = jasmine.createSpy('suite result callback'), fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new jasmine.Suite({ + suite = new j$.Suite({ env: env, description: "with a child suite", queueRunner: fakeQueueRunner, diff --git a/spec/core/UtilSpec.js b/spec/core/UtilSpec.js index e7441f3d..cddcc8d0 100644 --- a/spec/core/UtilSpec.js +++ b/spec/core/UtilSpec.js @@ -1,28 +1,28 @@ -describe("jasmine.util", function() { +describe("j$.util", function() { describe("isArray_", function() { it("should return true if the argument is an array", function() { - expect(jasmine.isArray_([])).toBe(true); - expect(jasmine.isArray_(['a'])).toBe(true); + expect(j$.isArray_([])).toBe(true); + expect(j$.isArray_(['a'])).toBe(true); }); it("should return false if the argument is not an array", function() { - expect(jasmine.isArray_(undefined)).toBe(false); - expect(jasmine.isArray_({})).toBe(false); - expect(jasmine.isArray_(function() {})).toBe(false); - expect(jasmine.isArray_('foo')).toBe(false); - expect(jasmine.isArray_(5)).toBe(false); - expect(jasmine.isArray_(null)).toBe(false); + expect(j$.isArray_(undefined)).toBe(false); + expect(j$.isArray_({})).toBe(false); + expect(j$.isArray_(function() {})).toBe(false); + expect(j$.isArray_('foo')).toBe(false); + expect(j$.isArray_(5)).toBe(false); + expect(j$.isArray_(null)).toBe(false); }); }); describe("isUndefined", function() { it("reports if a variable is defined", function() { var a; - expect(jasmine.util.isUndefined(a)).toBe(true); - expect(jasmine.util.isUndefined(undefined)).toBe(true); + expect(j$.util.isUndefined(a)).toBe(true); + expect(j$.util.isUndefined(undefined)).toBe(true); var undefined = "diz be undefined yo"; - expect(jasmine.util.isUndefined(undefined)).toBe(false); + expect(j$.util.isUndefined(undefined)).toBe(false); }); }); }); diff --git a/spec/html/HtmlReporterSpec.js b/spec/html/HtmlReporterSpec.js index 48dc58d4..1fb93186 100644 --- a/spec/html/HtmlReporterSpec.js +++ b/spec/html/HtmlReporterSpec.js @@ -1,7 +1,6 @@ describe("New HtmlReporter", function() { + // TODO: Figure out why this isn't rendering... it("builds the initial DOM elements, including the title banner", function() { - jasmine.version = originalJasmine.version; - var env = new jasmine.Env(), container = document.createElement("div"), getContainer = function() { return container; }, @@ -30,7 +29,7 @@ describe("New HtmlReporter", function() { expect(title.innerHTML).toMatch(/Jasmine/); var version = banner.getElementsByClassName("version")[0]; - expect(version.innerHTML).toEqual(originalJasmine.version); + expect(version.innerHTML).toEqual(jasmine.version); }); describe("when a spec is done", function() { diff --git a/spec/jasmine.yml b/spec/jasmine.yml index 3561922e..e1458cd7 100644 --- a/spec/jasmine.yml +++ b/spec/jasmine.yml @@ -17,7 +17,7 @@ src_files: stylesheets: boot_dir: 'spec/support' boot_files: - - 'boot.js' +# - 'boot.js' - 'dev_boot.js' helpers: - 'helpers/**/*.js' diff --git a/spec/node_performance_suite.js b/spec/node_performance_suite.js index 907b90bc..5fe10712 100644 --- a/spec/node_performance_suite.js +++ b/spec/node_performance_suite.js @@ -74,7 +74,7 @@ function noop() { } jasmine.executeSpecs = function(specs, done, isVerbose, showColors) { - global.originalJasmine = jasmine; + global.jasmine = jasmine; for (var i = 0, len = specs.length; i < len; ++i) { var filename = specs[i]; diff --git a/spec/node_suite.js b/spec/node_suite.js index df9e733e..802504d9 100644 --- a/spec/node_suite.js +++ b/spec/node_suite.js @@ -2,10 +2,14 @@ var fs = require('fs'); var util = require('util'); var path = require('path'); -var jasmineGlobals = require('../lib/jasmine-core/jasmine.js'); -for (var k in jasmineGlobals) { - global[k] = jasmineGlobals[k]; -} +// boot code for jasmine +var jasmineRequire = require('../lib/jasmine-core/jasmine.js'); +var jasmine = jasmineRequire.core(jasmineRequire); + +var consoleFns = require('../src/console/console.js'); +extend(jasmineRequire, consoleFns); +jasmineRequire.console(jasmineRequire, jasmine); + var env = jasmine.getEnv(); var jasmineInterface = { @@ -54,51 +58,35 @@ var jasmineInterface = { jsApiReporter: new jasmine.JsApiReporter(jasmine) }; -for (var k in jasmineInterface) { - global[k] = jasmineInterface[k]; +extend(global, jasmineInterface); + +function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; } -require('../src/console/ConsoleReporter.js'); +// Jasmine "runner" +function executeSpecs(specs, done, isVerbose, showColors) { + global.jasmine = jasmine; -/* - Pulling in code from jasmine-node. - - We can't just depend on jasmine-node because it has its own jasmine that it uses. - */ - -global.window = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setInterval: setInterval, - clearInterval: clearInterval -}; - -delete global.window; - -function noop() { -} - -jasmine.executeSpecs = function(specs, done, isVerbose, showColors) { - global.originalJasmine = jasmine; - - for (var i = 0, len = specs.length; i < len; ++i) { + for (var i = 0; i < specs.length; i++) { var filename = specs[i]; require(filename.replace(/\.\w+$/, "")); } - var jasmineEnv = jasmine.getEnv(); + var env = jasmine.getEnv(); var consoleReporter = new jasmine.ConsoleReporter({ print: util.print, onComplete: done, showColors: showColors }); - jasmineEnv.addReporter(consoleReporter); - jasmineEnv.execute(); -}; + env.addReporter(consoleReporter); + env.execute(); +} -jasmine.getAllSpecFiles = function(dir, matcher) { - var specs = []; +function getFiles(dir, matcher) { + specs = []; if (fs.statSync(dir).isFile() && dir.match(matcher)) { specs.push(dir); @@ -109,71 +97,76 @@ jasmine.getAllSpecFiles = function(dir, matcher) { if (fs.statSync(filename).isFile() && filename.match(matcher)) { specs.push(filename); } else if (fs.statSync(filename).isDirectory()) { - var subfiles = this.getAllSpecFiles(filename, matcher); + var subfiles = getSpecFiles(filename); subfiles.forEach(function(result) { specs.push(result); }); } } } - return specs; -}; - -function now() { - return new Date().getTime(); } -jasmine.asyncSpecWait = function() { - var wait = jasmine.asyncSpecWait; - wait.start = now(); - wait.done = false; - (function innerWait() { - waits(10); - runs(function() { - if (wait.start + wait.timeout < now()) { - expect('timeout waiting for spec').toBeNull(); - } else if (wait.done) { - wait.done = false; - } else { - innerWait(); - } - }); - })(); -}; -jasmine.asyncSpecWait.timeout = 4 * 1000; -jasmine.asyncSpecDone = function() { - jasmine.asyncSpecWait.done = true; -}; - -for (var key in jasmine) { - exports[key] = jasmine[key]; +function getSpecFiles(dir) { + return getFiles(dir, new RegExp("Spec.js$")); } -/* - End jasmine-node runner - */ +var j$require = (function() { + var exported = {}, + j$req; + global.getJasmineRequireObj = getJasmineRequireObj; + + j$req = require(__dirname + "/../src/core/requireCore.js"); + extend(j$req, require(__dirname + "/../src/console/requireConsole.js")); + + var srcFiles = getFiles(__dirname + "/../src/core"); + srcFiles.push(__dirname + "/../src/version.js"); + srcFiles.push(__dirname + "/../src/console/ConsoleReporter.js"); + + for (var i=0; i < srcFiles.length; i++) { + require(srcFiles[i]); + } + extend(j$req, exported); + + delete global.getJasmineRequireObj; + + return j$req; + + function getJasmineRequireObj() { + return exported; + } +}()); + +var j$ = j$require.core(j$require); +j$require.console(j$require, j$); + +//var specs = getSpecFiles(__dirname + '/smoke', new RegExp("test.js$")); +var consoleSpecs = getSpecFiles(__dirname + "/console"), + coreSpecs = getSpecFiles(__dirname + "/core"), + specs = []; + +specs = specs.concat(consoleSpecs); +specs = specs.concat(coreSpecs); + +// options from command line var isVerbose = false; var showColors = true; process.argv.forEach(function(arg) { switch (arg) { - case '--color': showColors = true; break; - case '--noColor': showColors = false; break; - case '--verbose': isVerbose = true; break; + case '--color': + showColors = true; + break; + case '--noColor': + showColors = false; + break; + case '--verbose': + isVerbose = true; + break; } }); -// var specs = jasmine.getAllSpecFiles(__dirname + '/smoke', new RegExp("test.js$")); -var specs = jasmine.getAllSpecFiles(__dirname, new RegExp("Spec.js$")); -var domIndependentSpecs = []; -for (var i = 0; i < specs.length; i++) { - if (!specs[i].match('html')) { - domIndependentSpecs.push(specs[i]); - } -} - -jasmine.executeSpecs(domIndependentSpecs, function(passed) { +executeSpecs(specs, function(passed) { if (passed) { process.exit(0); } else { diff --git a/spec/support/dev_boot.js b/spec/support/dev_boot.js index acbfb235..d1528c22 100644 --- a/spec/support/dev_boot.js +++ b/spec/support/dev_boot.js @@ -1,2 +1,115 @@ -var originalJasmine = jasmine; -jasmine = null; +// Jasmine boot.js for browser runners - exposes external/global interface, builds the Jasmine environment and executes it. +(function() { + + window.jasmine = jasmineRequire.core(jasmineRequire); + jasmineRequire.html(jasmine); + + var env = jasmine.getEnv(); + + var jasmineInterface = { + describe: function(description, specDefinitions) { + return env.describe(description, specDefinitions); + }, + + xdescribe: function(description, specDefinitions) { + return env.xdescribe(description, specDefinitions); + }, + + it: function(desc, func) { + return env.it(desc, func); + }, + + xit: function(desc, func) { + return env.xit(desc, func); + }, + + beforeEach: function(beforeEachFunction) { + return env.beforeEach(beforeEachFunction); + }, + + afterEach: function(afterEachFunction) { + return env.afterEach(afterEachFunction); + }, + + expect: function(actual) { + return env.expect(actual); + }, + + pending: function() { + return env.pending(); + }, + + addMatchers: function(matchers) { + return env.addMatchers(matchers); + }, + + spyOn: function(obj, methodName) { + return env.spyOn(obj, methodName); + }, + + clock: env.clock, + setTimeout: env.clock.setTimeout, + clearTimeout: env.clock.clearTimeout, + setInterval: env.clock.setInterval, + clearInterval: env.clock.clearInterval, + + jsApiReporter: new jasmine.JsApiReporter(jasmine) + }; + + if (typeof window == "undefined" && typeof exports == "object") { + extend(exports, jasmineInterface); + } else { + extend(window, jasmineInterface); + } + + var queryString = new jasmine.QueryString({ + getWindowLocation: function() { return window.location; } + }); + + // TODO: move all of catching to raise so we don't break our brains + var catchingExceptions = queryString.getParam("catch"); + env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); + + var htmlReporter = new jasmine.HtmlReporter({ + env: env, + queryString: queryString, + onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); }, + getContainer: function() { return document.body; }, + createElement: function() { return document.createElement.apply(document, arguments); }, + createTextNode: function() { return document.createTextNode.apply(document, arguments); } + }); + + env.addReporter(jasmineInterface.jsApiReporter); + env.addReporter(htmlReporter); + + var specFilter = new jasmine.HtmlSpecFilter({ + filterString: function() { return queryString.getParam("spec"); } + }); + + env.specFilter = function(spec) { + return specFilter.matches(spec.getFullName()); + }; + + var currentWindowOnload = window.onload; + + window.onload = function() { + if (currentWindowOnload) { + currentWindowOnload(); + } + htmlReporter.initialize(); + + // By the time onload is called, jasmineRequire will be redefined to point + // to the Jasmine source files (and not jasmine.js). So re-require + window.j$ = jasmineRequire.core(jasmineRequire); + jasmineRequire.html(j$); + jasmineRequire.console(jasmineRequire, j$); + + env.execute(); + }; + + function extend(destination, source) { + for (var property in source) destination[property] = source[property]; + return destination; + } + +}()); diff --git a/src/console/ConsoleReporter.js b/src/console/ConsoleReporter.js index 52303cb1..a18ce372 100644 --- a/src/console/ConsoleReporter.js +++ b/src/console/ConsoleReporter.js @@ -1,118 +1,122 @@ -jasmine.ConsoleReporter = function(options) { - var print = options.print, - showColors = options.showColors || false, - onComplete = options.onComplete || function() {}, - now = options.now || function() { return new Date().getTime();}, - startTime = 0, - specCount, - failureCount, - failedSpecs = [], - pendingCount, - ansi = { - green: '\033[32m', - red: '\033[31m', - yellow: '\033[33m', - none: '\033[0m' +getJasmineRequireObj().ConsoleReporter = function() { + function ConsoleReporter(options) { + var print = options.print, + showColors = options.showColors || false, + onComplete = options.onComplete || function() {}, + now = options.now || function() { return new Date().getTime();}, + startTime = 0, + specCount, + failureCount, + failedSpecs = [], + pendingCount, + ansi = { + green: '\033[32m', + red: '\033[31m', + yellow: '\033[33m', + none: '\033[0m' + }; + + this.jasmineStarted = function() { + startTime = now(); + specCount = 0; + failureCount = 0; + pendingCount = 0; + print("Started"); + printNewline(); }; - this.jasmineStarted = function() { - startTime = now(); - specCount = 0; - failureCount = 0; - pendingCount = 0; - print("Started"); - printNewline(); - }; + this.jasmineDone = function() { + var elapsed = now() - startTime; - this.jasmineDone = function() { - var elapsed = now() - startTime; - - printNewline(); - for (var i = 0; i < failedSpecs.length; i++) { - specFailureDetails(failedSpecs[i]); - } - - printNewline(); - var specCounts = specCount + " " + plural("spec", specCount) + ", " + - failureCount + " " + plural("failure", failureCount); - - if (pendingCount) { - specCounts += ", " + pendingCount + " pending " + plural("spec", pendingCount); - } - - print(specCounts); - - printNewline(); - var seconds = elapsed / 1000; - print("Finished in " + seconds + " " + plural("second", seconds)); - - printNewline(); - - onComplete(); - }; - - this.specDone = function(result) { - specCount++; - - if(result.status == "pending") { - pendingCount++; - print(colored("yellow", "*")); - return; - } - - if (result.status == "passed") { - print(colored("green", '.')); - return; - } - - if (result.status == "failed") { - failureCount++; - failedSpecs.push(result); - print(colored("red", 'F')); - } - }; - - return this; - - function printNewline() { - print("\n"); - } - - function colored(color, str) { - return showColors ? (ansi[color] + str + ansi.none) : str; - } - - function plural(str, count) { - return count == 1 ? str : str + "s"; - } - - function repeat(thing, times) { - var arr = []; - for (var i = 0; i < times; i++) { - arr.push(thing); - } - return arr; - } - - function indent(str, spaces) { - var lines = (str || '').split("\n"); - var newArr = []; - for (var i = 0; i < lines.length; i++) { - newArr.push(repeat(" ", spaces).join("") + lines[i]); - } - return newArr.join("\n"); - } - - function specFailureDetails(result) { - printNewline(); - print(result.fullName); - - for (var i = 0; i < result.failedExpectations.length; i++) { - var failedExpectation = result.failedExpectations[i]; printNewline(); - print(indent(failedExpectation.stack, 2)); + for (var i = 0; i < failedSpecs.length; i++) { + specFailureDetails(failedSpecs[i]); + } + + printNewline(); + var specCounts = specCount + " " + plural("spec", specCount) + ", " + + failureCount + " " + plural("failure", failureCount); + + if (pendingCount) { + specCounts += ", " + pendingCount + " pending " + plural("spec", pendingCount); + } + + print(specCounts); + + printNewline(); + var seconds = elapsed / 1000; + print("Finished in " + seconds + " " + plural("second", seconds)); + + printNewline(); + + onComplete(); + }; + + this.specDone = function(result) { + specCount++; + + if (result.status == "pending") { + pendingCount++; + print(colored("yellow", "*")); + return; + } + + if (result.status == "passed") { + print(colored("green", '.')); + return; + } + + if (result.status == "failed") { + failureCount++; + failedSpecs.push(result); + print(colored("red", 'F')); + } + }; + + return this; + + function printNewline() { + print("\n"); } - printNewline(); + function colored(color, str) { + return showColors ? (ansi[color] + str + ansi.none) : str; + } + + function plural(str, count) { + return count == 1 ? str : str + "s"; + } + + function repeat(thing, times) { + var arr = []; + for (var i = 0; i < times; i++) { + arr.push(thing); + } + return arr; + } + + function indent(str, spaces) { + var lines = (str || '').split("\n"); + var newArr = []; + for (var i = 0; i < lines.length; i++) { + newArr.push(repeat(" ", spaces).join("") + lines[i]); + } + return newArr.join("\n"); + } + + function specFailureDetails(result) { + printNewline(); + print(result.fullName); + + for (var i = 0; i < result.failedExpectations.length; i++) { + var failedExpectation = result.failedExpectations[i]; + printNewline(); + print(indent(failedExpectation.stack, 2)); + } + + printNewline(); + } } + + return ConsoleReporter; }; diff --git a/src/console/console.js b/src/console/console.js new file mode 100644 index 00000000..0fe81ccb --- /dev/null +++ b/src/console/console.js @@ -0,0 +1,157 @@ +/* +Copyright (c) 2008-2013 Pivotal Labs + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +function getJasmineRequireObj() { + if (typeof module !== "undefined" && module.exports) { + return exports; + } else { + window.jasmineRequire = window.jasmineRequire || {}; + return window.jasmineRequire; + } +} + +getJasmineRequireObj().console = function(jRequire, j$) { + j$.ConsoleReporter = jRequire.ConsoleReporter(); +}; + +getJasmineRequireObj().ConsoleReporter = function() { + function ConsoleReporter(options) { + var print = options.print, + showColors = options.showColors || false, + onComplete = options.onComplete || function() {}, + now = options.now || function() { return new Date().getTime();}, + startTime = 0, + specCount, + failureCount, + failedSpecs = [], + pendingCount, + ansi = { + green: '\033[32m', + red: '\033[31m', + yellow: '\033[33m', + none: '\033[0m' + }; + + this.jasmineStarted = function() { + startTime = now(); + specCount = 0; + failureCount = 0; + pendingCount = 0; + print("Started"); + printNewline(); + }; + + this.jasmineDone = function() { + var elapsed = now() - startTime; + + printNewline(); + for (var i = 0; i < failedSpecs.length; i++) { + specFailureDetails(failedSpecs[i]); + } + + printNewline(); + var specCounts = specCount + " " + plural("spec", specCount) + ", " + + failureCount + " " + plural("failure", failureCount); + + if (pendingCount) { + specCounts += ", " + pendingCount + " pending " + plural("spec", pendingCount); + } + + print(specCounts); + + printNewline(); + var seconds = elapsed / 1000; + print("Finished in " + seconds + " " + plural("second", seconds)); + + printNewline(); + + onComplete(); + }; + + this.specDone = function(result) { + specCount++; + + if (result.status == "pending") { + pendingCount++; + print(colored("yellow", "*")); + return; + } + + if (result.status == "passed") { + print(colored("green", '.')); + return; + } + + if (result.status == "failed") { + failureCount++; + failedSpecs.push(result); + print(colored("red", 'F')); + } + }; + + return this; + + function printNewline() { + print("\n"); + } + + function colored(color, str) { + return showColors ? (ansi[color] + str + ansi.none) : str; + } + + function plural(str, count) { + return count == 1 ? str : str + "s"; + } + + function repeat(thing, times) { + var arr = []; + for (var i = 0; i < times; i++) { + arr.push(thing); + } + return arr; + } + + function indent(str, spaces) { + var lines = (str || '').split("\n"); + var newArr = []; + for (var i = 0; i < lines.length; i++) { + newArr.push(repeat(" ", spaces).join("") + lines[i]); + } + return newArr.join("\n"); + } + + function specFailureDetails(result) { + printNewline(); + print(result.fullName); + + for (var i = 0; i < result.failedExpectations.length; i++) { + var failedExpectation = result.failedExpectations[i]; + printNewline(); + print(indent(failedExpectation.stack, 2)); + } + + printNewline(); + } + } + + return ConsoleReporter; +}; diff --git a/src/console/requireConsole.js b/src/console/requireConsole.js new file mode 100644 index 00000000..e4a5fc0c --- /dev/null +++ b/src/console/requireConsole.js @@ -0,0 +1,12 @@ +function getJasmineRequireObj() { + if (typeof module !== "undefined" && module.exports) { + return exports; + } else { + window.jasmineRequire = window.jasmineRequire || {}; + return window.jasmineRequire; + } +} + +getJasmineRequireObj().console = function(jRequire, j$) { + j$.ConsoleReporter = jRequire.ConsoleReporter(); +}; diff --git a/src/core/Clock.js b/src/core/Clock.js index 0cbf76ce..8b8eddd6 100644 --- a/src/core/Clock.js +++ b/src/core/Clock.js @@ -1,93 +1,97 @@ -jasmine.Clock = function(global, delayedFunctionScheduler) { - var self = this, - realTimingFunctions = { - setTimeout: global.setTimeout, - clearTimeout: global.clearTimeout, - setInterval: global.setInterval, - clearInterval: global.clearInterval - }, - fakeTimingFunctions = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setInterval: setInterval, - clearInterval: clearInterval - }, - timer = realTimingFunctions, - installed = false; +getJasmineRequireObj().Clock = function() { + function Clock(global, delayedFunctionScheduler) { + var self = this, + realTimingFunctions = { + setTimeout: global.setTimeout, + clearTimeout: global.clearTimeout, + setInterval: global.setInterval, + clearInterval: global.clearInterval + }, + fakeTimingFunctions = { + setTimeout: setTimeout, + clearTimeout: clearTimeout, + setInterval: setInterval, + clearInterval: clearInterval + }, + timer = realTimingFunctions, + installed = false; - self.install = function() { - installed = true; - timer = fakeTimingFunctions; - }; + self.install = function() { + installed = true; + timer = fakeTimingFunctions; + }; - self.uninstall = function() { - delayedFunctionScheduler.reset(); - installed = false; - timer = realTimingFunctions; - }; + self.uninstall = function() { + delayedFunctionScheduler.reset(); + installed = false; + timer = realTimingFunctions; + }; - self.setTimeout = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error("IE < 9 cannot support extra params to setTimeout without a polyfill"); + self.setTimeout = function(fn, delay, params) { + if (legacyIE()) { + if (arguments.length > 2) { + throw new Error("IE < 9 cannot support extra params to setTimeout without a polyfill"); + } + return timer.setTimeout(fn, delay); } - return timer.setTimeout(fn, delay); - } - return timer.setTimeout.apply(global, arguments); - }; + return timer.setTimeout.apply(global, arguments); + }; - self.setInterval = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error("IE < 9 cannot support extra params to setInterval without a polyfill"); + self.setInterval = function(fn, delay, params) { + if (legacyIE()) { + if (arguments.length > 2) { + throw new Error("IE < 9 cannot support extra params to setInterval without a polyfill"); + } + return timer.setInterval(fn, delay); } - return timer.setInterval(fn, delay); + return timer.setInterval.apply(global, arguments); + }; + + self.clearTimeout = function(id) { + return timer.clearTimeout.call(global, id); + }; + + self.clearInterval = function(id) { + return timer.clearInterval.call(global, id); + }; + + self.tick = function(millis) { + if (installed) { + delayedFunctionScheduler.tick(millis); + } else { + throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); + } + }; + + return self; + + function legacyIE() { + //if these methods are polyfilled, apply will be present + //TODO: it may be difficult to load the polyfill before jasmine loads + //(env should be new-ed inside of onload) + return !(global.setTimeout || global.setInterval).apply; } - return timer.setInterval.apply(global, arguments); - }; - self.clearTimeout = function(id) { - return timer.clearTimeout.call(global, id); - }; - - self.clearInterval = function(id) { - return timer.clearInterval.call(global, id); - }; - - self.tick = function(millis) { - if (installed) { - delayedFunctionScheduler.tick(millis); - } else { - throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); + function setTimeout(fn, delay) { + return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); } - }; - return self; + function clearTimeout(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } - function legacyIE() { - //if these methods are polyfilled, apply will be present - //TODO: it may be difficult to load the polyfill before jasmine loads - //(env should be new-ed inside of onload) - return !(global.setTimeout || global.setInterval).apply; + function setInterval(fn, interval) { + return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); + } + + function clearInterval(id) { + return delayedFunctionScheduler.removeFunctionWithId(id); + } + + function argSlice(argsObj, n) { + return Array.prototype.slice.call(argsObj, 2); + } } - function setTimeout(fn, delay) { - return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); - } - - function clearTimeout(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function setInterval(fn, interval) { - return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); - } - - function clearInterval(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function argSlice(argsObj, n) { - return Array.prototype.slice.call(argsObj, 2); - } + return Clock; }; diff --git a/src/core/DelayedFunctionScheduler.js b/src/core/DelayedFunctionScheduler.js index 0f9cb399..74fa9f3d 100644 --- a/src/core/DelayedFunctionScheduler.js +++ b/src/core/DelayedFunctionScheduler.js @@ -1,104 +1,108 @@ -jasmine.DelayedFunctionScheduler = function() { - var self = this; - var scheduledFunctions = {}; - var currentTime = 0; - var delayedFnCount = 0; +getJasmineRequireObj().DelayedFunctionScheduler = function() { + function DelayedFunctionScheduler() { + var self = this; + var scheduledFunctions = {}; + var currentTime = 0; + var delayedFnCount = 0; - self.tick = function(millis) { - millis = millis || 0; - runFunctionsWithinRange(currentTime, currentTime + millis); - currentTime = currentTime + millis; - }; - - self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { - millis = millis || 0; - timeoutKey = timeoutKey || ++delayedFnCount; - runAtMillis = runAtMillis || (currentTime + millis); - scheduledFunctions[timeoutKey] = { - runAtMillis: runAtMillis, - funcToCall: funcToCall, - recurring: recurring, - params: params, - timeoutKey: timeoutKey, - millis: millis + self.tick = function(millis) { + millis = millis || 0; + runFunctionsWithinRange(currentTime, currentTime + millis); + currentTime = currentTime + millis; }; - return timeoutKey; - }; - self.removeFunctionWithId = function(timeoutKey) { - delete scheduledFunctions[timeoutKey]; - }; + self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { + millis = millis || 0; + timeoutKey = timeoutKey || ++delayedFnCount; + runAtMillis = runAtMillis || (currentTime + millis); + scheduledFunctions[timeoutKey] = { + runAtMillis: runAtMillis, + funcToCall: funcToCall, + recurring: recurring, + params: params, + timeoutKey: timeoutKey, + millis: millis + }; + return timeoutKey; + }; - self.reset = function() { - currentTime = 0; - scheduledFunctions = {}; - delayedFnCount = 0; - }; + self.removeFunctionWithId = function(timeoutKey) { + delete scheduledFunctions[timeoutKey]; + }; - return self; + self.reset = function() { + currentTime = 0; + scheduledFunctions = {}; + delayedFnCount = 0; + }; + return self; - //finds/dupes functions within range and removes them. - function functionsWithinRange(startMillis, endMillis) { - var fnsToRun = []; - for (var timeoutKey in scheduledFunctions) { - var scheduledFunc = scheduledFunctions[timeoutKey]; - if (scheduledFunc && + // finds/dupes functions within range and removes them. + function functionsWithinRange(startMillis, endMillis) { + var fnsToRun = []; + for (var timeoutKey in scheduledFunctions) { + var scheduledFunc = scheduledFunctions[timeoutKey]; + if (scheduledFunc && scheduledFunc.runAtMillis >= startMillis && - scheduledFunc.runAtMillis <= endMillis) { - //remove fn -- we'll reschedule later if it is recurring. - self.removeFunctionWithId(timeoutKey); - if (!scheduledFunc.recurring) { - fnsToRun.push(scheduledFunc); // schedules each function only once - } else { - fnsToRun.push(buildNthInstanceOf(scheduledFunc, 0)); - var additionalTimesFnRunsInRange = - Math.floor((endMillis - scheduledFunc.runAtMillis) / scheduledFunc.millis); - for (var i = 0; i < additionalTimesFnRunsInRange; i++) { - fnsToRun.push(buildNthInstanceOf(scheduledFunc, i + 1)); + scheduledFunc.runAtMillis <= endMillis) { + + // remove fn -- we'll reschedule later if it is recurring. + self.removeFunctionWithId(timeoutKey); + if (!scheduledFunc.recurring) { + fnsToRun.push(scheduledFunc); // schedules each function only once + } else { + fnsToRun.push(buildNthInstanceOf(scheduledFunc, 0)); + var additionalTimesFnRunsInRange = + Math.floor((endMillis - scheduledFunc.runAtMillis) / scheduledFunc.millis); + for (var i = 0; i < additionalTimesFnRunsInRange; i++) { + fnsToRun.push(buildNthInstanceOf(scheduledFunc, i + 1)); + } + reschedule(buildNthInstanceOf(scheduledFunc, additionalTimesFnRunsInRange)); } - reschedule(buildNthInstanceOf(scheduledFunc, additionalTimesFnRunsInRange)); } } + + return fnsToRun; } - return fnsToRun; - } - - function buildNthInstanceOf(scheduledFunc, n) { - return { - runAtMillis: scheduledFunc.runAtMillis + (scheduledFunc.millis * n), - funcToCall: scheduledFunc.funcToCall, - params: scheduledFunc.params, - millis: scheduledFunc.millis, - recurring: scheduledFunc.recurring, - timeoutKey: scheduledFunc.timeoutKey - }; - } - - function reschedule(scheduledFn) { - self.scheduleFunction(scheduledFn.funcToCall, - scheduledFn.millis, - scheduledFn.params, - true, - scheduledFn.timeoutKey, - scheduledFn.runAtMillis + scheduledFn.millis); - } - - - function runFunctionsWithinRange(startMillis, endMillis) { - var funcsToRun = functionsWithinRange(startMillis, endMillis); - if (funcsToRun.length === 0) { - return; + function buildNthInstanceOf(scheduledFunc, n) { + return { + runAtMillis: scheduledFunc.runAtMillis + (scheduledFunc.millis * n), + funcToCall: scheduledFunc.funcToCall, + params: scheduledFunc.params, + millis: scheduledFunc.millis, + recurring: scheduledFunc.recurring, + timeoutKey: scheduledFunc.timeoutKey + }; } - funcsToRun.sort(function(a, b) { - return a.runAtMillis - b.runAtMillis; - }); + function reschedule(scheduledFn) { + self.scheduleFunction(scheduledFn.funcToCall, + scheduledFn.millis, + scheduledFn.params, + true, + scheduledFn.timeoutKey, + scheduledFn.runAtMillis + scheduledFn.millis); + } - for (var i = 0; i < funcsToRun.length; ++i) { - var funcToRun = funcsToRun[i]; - funcToRun.funcToCall.apply(null, funcToRun.params); + + function runFunctionsWithinRange(startMillis, endMillis) { + var funcsToRun = functionsWithinRange(startMillis, endMillis); + if (funcsToRun.length === 0) { + return; + } + + funcsToRun.sort(function(a, b) { + return a.runAtMillis - b.runAtMillis; + }); + + for (var i = 0; i < funcsToRun.length; ++i) { + var funcToRun = funcsToRun[i]; + funcToRun.funcToCall.apply(null, funcToRun.params); + } } } + + return DelayedFunctionScheduler; }; diff --git a/src/core/Env.js b/src/core/Env.js index 6ed75daa..22200fb9 100644 --- a/src/core/Env.js +++ b/src/core/Env.js @@ -1,18 +1,17 @@ -(function() { - jasmine.Env = function(options) { +getJasmineRequireObj().Env = function(j$) { + function Env(options) { options = options || {}; var self = this; - var global = options.global || jasmine.getGlobal(); + var global = options.global || j$.getGlobal(); var catchExceptions = true; - this.clock = new jasmine.Clock(global, new jasmine.DelayedFunctionScheduler()); + this.clock = new j$.Clock(global, new j$.DelayedFunctionScheduler()); - this.jasmine = jasmine; this.spies_ = []; this.currentSpec = null; - this.reporter = new jasmine.ReportDispatcher([ + this.reporter = new j$.ReportDispatcher([ "jasmineStarted", "jasmineDone", "suiteStarted", @@ -32,11 +31,11 @@ // wrap matchers this.matchersClass = function() { - jasmine.Matchers.apply(this, arguments); + j$.Matchers.apply(this, arguments); }; - jasmine.util.inherit(this.matchersClass, jasmine.Matchers); + j$.util.inherit(this.matchersClass, j$.Matchers); - jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); + j$.Matchers.wrapInto_(j$.Matchers.prototype, this.matchersClass); var expectationFactory = function(actual, spec) { var expect = new (self.matchersClass)(self, actual, spec); @@ -69,15 +68,15 @@ }; }; - var specConstructor = jasmine.Spec; + var specConstructor = j$.Spec; var getSpecName = function(spec, currentSuite) { return currentSuite.getFullName() + ' ' + spec.description + '.'; }; // TODO: we may just be able to pass in the fn instead of wrapping here - var buildExpectationResult = jasmine.buildExpectationResult, - exceptionFormatter = new jasmine.ExceptionFormatter(), + var buildExpectationResult = j$.buildExpectationResult, + exceptionFormatter = new j$.ExceptionFormatter(), expectationResultFactory = function(attrs) { attrs.messageFormatter = exceptionFormatter.message; attrs.stackFormatter = exceptionFormatter.stack; @@ -96,7 +95,7 @@ }; this.catchException = function(e){ - return jasmine.Spec.isPendingSpecException(e) || catchExceptions; + return j$.Spec.isPendingSpecException(e) || catchExceptions; }; var maximumSpecCallbackDepth = 100; @@ -116,7 +115,7 @@ options.catchException = self.catchException; options.encourageGC = options.encourageGarbageCollection || encourageGarbageCollection; - new jasmine.QueueRunner(options).run(options.fns, 0); + new j$.QueueRunner(options).run(options.fns, 0); }; var totalSpecsDefined = 0; @@ -158,9 +157,9 @@ self.reporter.suiteStarted(suite.result); }; - var suiteConstructor = jasmine.Suite; + var suiteConstructor = j$.Suite; - this.topSuite = new jasmine.Suite({ + this.topSuite = new j$.Suite({ env: this, id: this.nextSuiteId(), description: 'Jasmine__TopLevel__Suite', @@ -190,33 +189,33 @@ }); this.topSuite.execute(this.reporter.jasmineDone); }; - }; + } //TODO: shim Spec addMatchers behavior into Env. Should be rewritten to remove globals, etc. - jasmine.Env.prototype.addMatchers = function(matchersPrototype) { + Env.prototype.addMatchers = function(matchersPrototype) { var parent = this.matchersClass; var newMatchersClass = function() { parent.apply(this, arguments); }; - jasmine.util.inherit(newMatchersClass, parent); - jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); + j$.util.inherit(newMatchersClass, parent); + j$.Matchers.wrapInto_(matchersPrototype, newMatchersClass); this.matchersClass = newMatchersClass; }; - jasmine.Env.prototype.version = function() { - return jasmine.version; + Env.prototype.version = function() { + return j$.version; }; - jasmine.Env.prototype.expect = function(actual) { + Env.prototype.expect = function(actual) { return this.currentSpec.expect(actual); }; - jasmine.Env.prototype.spyOn = function(obj, methodName) { - if (jasmine.util.isUndefined(obj)) { + Env.prototype.spyOn = function(obj, methodName) { + if (j$.util.isUndefined(obj)) { throw "spyOn could not find an object to spy upon for " + methodName + "()"; } - if (jasmine.util.isUndefined(obj[methodName])) { + if (j$.util.isUndefined(obj[methodName])) { throw methodName + '() method does not exist'; } @@ -225,7 +224,7 @@ throw new Error(methodName + ' has already been spied upon'); } - var spyObj = jasmine.createSpy(methodName); + var spyObj = j$.createSpy(methodName); this.spies_.push(spyObj); spyObj.baseObj = obj; @@ -238,7 +237,7 @@ }; // TODO: move this to closure - jasmine.Env.prototype.removeAllSpies = function() { + Env.prototype.removeAllSpies = function() { for (var i = 0; i < this.spies_.length; i++) { var spy = this.spies_[i]; spy.baseObj[spy.methodName] = spy.originalValue; @@ -247,28 +246,28 @@ }; // TODO: move this to closure - jasmine.Env.prototype.versionString = function() { - console.log("DEPRECATED == use jasmine.version"); - return jasmine.version; + Env.prototype.versionString = function() { + console.log("DEPRECATED == use j$.version"); + return j$.version; }; // TODO: move this to closure - jasmine.Env.prototype.nextSpecId = function() { + Env.prototype.nextSpecId = function() { return this.nextSpecId_++; }; // TODO: move this to closure - jasmine.Env.prototype.nextSuiteId = function() { + Env.prototype.nextSuiteId = function() { return this.nextSuiteId_++; }; // TODO: move this to closure - jasmine.Env.prototype.addReporter = function(reporter) { + Env.prototype.addReporter = function(reporter) { this.reporter.addReporter(reporter); }; // TODO: move this to closure - jasmine.Env.prototype.describe = function(description, specDefinitions) { + Env.prototype.describe = function(description, specDefinitions) { var suite = this.suiteFactory(description, specDefinitions); var parentSuite = this.currentSuite; @@ -294,47 +293,47 @@ }; // TODO: move this to closure - jasmine.Env.prototype.xdescribe = function(description, specDefinitions) { + Env.prototype.xdescribe = function(description, specDefinitions) { var suite = this.describe(description, specDefinitions); suite.disable(); return suite; }; // TODO: move this to closure - jasmine.Env.prototype.it = function(description, fn) { + Env.prototype.it = function(description, fn) { var spec = this.specFactory(description, fn, this.currentSuite); this.currentSuite.addSpec(spec); return spec; }; // TODO: move this to closure - jasmine.Env.prototype.xit = function(description, fn) { + Env.prototype.xit = function(description, fn) { var spec = this.it(description, fn); spec.pend(); return spec; }; // TODO: move this to closure - jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { + Env.prototype.beforeEach = function(beforeEachFunction) { this.currentSuite.beforeEach(beforeEachFunction); }; // TODO: move this to closure - jasmine.Env.prototype.afterEach = function(afterEachFunction) { + Env.prototype.afterEach = function(afterEachFunction) { this.currentSuite.afterEach(afterEachFunction); }; // TODO: move this to closure - jasmine.Env.prototype.pending = function() { - throw new Error(jasmine.Spec.pendingSpecExceptionMessage); + Env.prototype.pending = function() { + throw new Error(j$.Spec.pendingSpecExceptionMessage); }; // TODO: Still needed? - jasmine.Env.prototype.currentRunner = function() { + Env.prototype.currentRunner = function() { return this.topSuite; }; - jasmine.Env.prototype.compareRegExps_ = function(a, b, mismatchKeys, mismatchValues) { + 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 + "/"); @@ -353,7 +352,7 @@ return (mismatchValues.length === 0); }; - jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { + Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { return true; } @@ -362,7 +361,7 @@ b.__Jasmine_been_here_before__ = a; var hasKey = function(obj, keyName) { - return obj !== null && !jasmine.util.isUndefined(obj[keyName]); + return obj !== null && !j$.util.isUndefined(obj[keyName]); }; for (var property in b) { @@ -378,11 +377,11 @@ 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."); + mismatchValues.push("'" + property + "' was '" + (b[property] ? j$.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? j$.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); } } - if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { + if (j$.isArray_(a) && j$.isArray_(b) && a.length != b.length) { mismatchValues.push("arrays were not the same length"); } @@ -391,25 +390,25 @@ return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; - jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { + 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 (!jasmine.util.isUndefined(result)) { + if (!j$.util.isUndefined(result)) { return result; } } if (a === b) return true; - if (jasmine.util.isUndefined(a) || a === null || jasmine.util.isUndefined(b) || b === null) { - return (jasmine.util.isUndefined(a) && jasmine.util.isUndefined(b)); + if (j$.util.isUndefined(a) || a === null || j$.util.isUndefined(b) || b === null) { + return (j$.util.isUndefined(a) && j$.util.isUndefined(b)); } - if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { + if (j$.isDomNode(a) && j$.isDomNode(b)) { return a === b; } @@ -425,19 +424,19 @@ return b.jasmineMatches(a); } - if (a instanceof jasmine.Matchers.ObjectContaining) { + if (a instanceof j$.Matchers.ObjectContaining) { return a.matches(b); } - if (b instanceof jasmine.Matchers.ObjectContaining) { + if (b instanceof j$.Matchers.ObjectContaining) { return b.matches(a); } - if (jasmine.isString_(a) && jasmine.isString_(b)) { + if (j$.isString_(a) && j$.isString_(b)) { return (a == b); } - if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { + if (j$.isNumber_(a) && j$.isNumber_(b)) { return (a == b); } @@ -453,8 +452,8 @@ return (a === b); }; - jasmine.Env.prototype.contains_ = function(haystack, needle) { - if (jasmine.isArray_(haystack)) { + Env.prototype.contains_ = function(haystack, needle) { + if (j$.isArray_(haystack)) { for (var i = 0; i < haystack.length; i++) { if (this.equals_(haystack[i], needle)) return true; } @@ -463,7 +462,9 @@ return haystack.indexOf(needle) >= 0; }; - jasmine.Env.prototype.addEqualityTester = function(equalityTester) { + Env.prototype.addEqualityTester = function(equalityTester) { this.equalityTesters_.push(equalityTester); }; -}()); + + return Env; +}; diff --git a/src/core/ExceptionFormatter.js b/src/core/ExceptionFormatter.js index d3ea7123..29e17d46 100644 --- a/src/core/ExceptionFormatter.js +++ b/src/core/ExceptionFormatter.js @@ -1,21 +1,25 @@ -jasmine.ExceptionFormatter = function() { - this.message = function(error) { - var message = error.name + - ': ' + - error.message; +getJasmineRequireObj().ExceptionFormatter = function() { + function ExceptionFormatter() { + this.message = function(error) { + var message = error.name + + ': ' + + error.message; - if (error.fileName || error.sourceURL) { - message += " in " + (error.fileName || error.sourceURL); - } + if (error.fileName || error.sourceURL) { + message += " in " + (error.fileName || error.sourceURL); + } - if (error.line || error.lineNumber) { - message += " (line " + (error.line || error.lineNumber) + ")"; - } + if (error.line || error.lineNumber) { + message += " (line " + (error.line || error.lineNumber) + ")"; + } - return message; - }; + return message; + }; - this.stack = function(error) { - return error ? error.stack : null; - }; -}; \ No newline at end of file + this.stack = function(error) { + return error ? error.stack : null; + }; + } + + return ExceptionFormatter; +}; diff --git a/src/core/ExpectationResult.js b/src/core/ExpectationResult.js index c2bd968b..98f9eb10 100644 --- a/src/core/ExpectationResult.js +++ b/src/core/ExpectationResult.js @@ -1,41 +1,45 @@ //TODO: expectation result may make more sense as a presentation of an expectation. -jasmine.buildExpectationResult = function(options) { - var messageFormatter = options.messageFormatter || function() {}, - stackFormatter = options.stackFormatter || function() {}; +getJasmineRequireObj().buildExpectationResult = function() { + function buildExpectationResult(options) { + var messageFormatter = options.messageFormatter || function() {}, + stackFormatter = options.stackFormatter || function() {}; - return { - matcherName: options.matcherName, - expected: options.expected, - actual: options.actual, - message: message(), - stack: stack(), - passed: options.passed - }; + return { + matcherName: options.matcherName, + expected: options.expected, + actual: options.actual, + message: message(), + stack: stack(), + passed: options.passed + }; - function message() { - if (options.passed) { - return "Passed."; - } else if (options.message) { - return options.message; - } else if (options.error) { - return messageFormatter(options.error); - } - return ""; - } - - function stack() { - if (options.passed) { + function message() { + if (options.passed) { + return "Passed."; + } else if (options.message) { + return options.message; + } else if (options.error) { + return messageFormatter(options.error); + } return ""; } - var error = options.error; - if (!error) { - try { - throw new Error(message()); - } catch (e) { - error = e; + function stack() { + if (options.passed) { + return ""; } + + var error = options.error; + if (!error) { + try { + throw new Error(message()); + } catch (e) { + error = e; + } + } + return stackFormatter(error); } - return stackFormatter(error); } + + return buildExpectationResult; }; diff --git a/src/core/JsApiReporter.js b/src/core/JsApiReporter.js index 6819f178..e482c068 100644 --- a/src/core/JsApiReporter.js +++ b/src/core/JsApiReporter.js @@ -1,55 +1,59 @@ -jasmine.JsApiReporter = function(jasmine) { - this.jasmine = jasmine || {}; - this.started = false; - this.finished = false; +getJasmineRequireObj().JsApiReporter = function() { + function JsApiReporter(jasmine) { // TODO: this doesn't appear to be used + this.jasmine = jasmine || {}; + this.started = false; + this.finished = false; - var status = 'loaded'; + var status = 'loaded'; - this.jasmineStarted = function() { - this.started = true; - status = 'started'; - }; + this.jasmineStarted = function() { + this.started = true; + status = 'started'; + }; - this.jasmineDone = function() { - this.finished = true; - status = 'done'; - }; + this.jasmineDone = function() { + this.finished = true; + status = 'done'; + }; - this.status = function() { - return status; - }; + this.status = function() { + return status; + }; - var suites = {}; + var suites = {}; - this.suiteStarted = function(result) { - storeSuite(result); - }; + this.suiteStarted = function(result) { + storeSuite(result); + }; - this.suiteDone = function(result) { - storeSuite(result); - }; + this.suiteDone = function(result) { + storeSuite(result); + }; + + function storeSuite(result) { + suites[result.id] = result; + } + + this.suites = function() { + return suites; + }; + + var specs = []; + this.specStarted = function(result) { }; + + this.specDone = function(result) { + specs.push(result); + }; + + this.specResults = function(index, length) { + return specs.slice(index, index + length); + }; + + this.specs = function() { + return specs; + }; - function storeSuite(result) { - suites[result.id] = result; } - this.suites = function() { - return suites; - }; - - var specs = []; - this.specStarted = function(result) { }; - - this.specDone = function(result) { - specs.push(result); - }; - - this.specResults = function(index, length) { - return specs.slice(index, index + length); - }; - - this.specs = function() { - return specs; - }; - -}; \ No newline at end of file + return JsApiReporter; +}; diff --git a/src/core/Matchers.js b/src/core/Matchers.js index 725fb426..c9643735 100644 --- a/src/core/Matchers.js +++ b/src/core/Matchers.js @@ -1,304 +1,303 @@ -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { - //TODO: true dependency: equals, contains - this.env = env; - this.actual = actual; - this.spec = spec; - this.isNot = opt_isNot || false; -}; - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { - for (var methodName in prototype) { - var orig = prototype[methodName]; - matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); +getJasmineRequireObj().Matchers = function(j$) { + function Matchers(env, actual, spec, opt_isNot) { + //TODO: true dependency: equals, contains + this.env = env; + this.actual = actual; + this.spec = spec; + this.isNot = opt_isNot || false; } -}; -jasmine.Matchers.matcherFn_ = function(matcherName, matcherFunction) { - return function() { - var matcherArgs = jasmine.util.argsToArray(arguments); - var result = matcherFunction.apply(this, arguments); + Matchers.wrapInto_ = function(prototype, matchersClass) { + for (var methodName in prototype) { + var orig = prototype[methodName]; + matchersClass.prototype[methodName] = Matchers.matcherFn_(methodName, orig); + } + }; - if (this.isNot) { - result = !result; + Matchers.matcherFn_ = function(matcherName, matcherFunction) { + return function() { + var matcherArgs = j$.util.argsToArray(arguments); + var result = matcherFunction.apply(this, arguments); + + if (this.isNot) { + result = !result; + } + + var message; + if (!result) { + if (this.message) { + message = this.message.apply(this, arguments); + if (j$.isArray_(message)) { + message = message[this.isNot ? 1 : 0]; + } + } else { + var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); + message = "Expected " + j$.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; + if (matcherArgs.length > 0) { + for (var i = 0; i < matcherArgs.length; i++) { + if (i > 0) message += ","; + message += " " + j$.pp(matcherArgs[i]); + } + } + message += "."; + } + } + + this.spec.addExpectationResult(result, { + matcherName: matcherName, + passed: result, + expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], + actual: this.actual, + message: message + }); + return void 0; + }; + }; + + Matchers.prototype.toBe = function(expected) { + return this.actual === expected; + }; + + Matchers.prototype.toNotBe = function(expected) { + return this.actual !== expected; + }; + + Matchers.prototype.toEqual = function(expected) { + return this.env.equals_(this.actual, expected); + }; + + Matchers.prototype.toNotEqual = function(expected) { + return !this.env.equals_(this.actual, expected); + }; + + Matchers.prototype.toMatch = function(expected) { + return new RegExp(expected).test(this.actual); + }; + + Matchers.prototype.toNotMatch = function(expected) { + return !(new RegExp(expected).test(this.actual)); + }; + + Matchers.prototype.toBeDefined = function() { + return !j$.util.isUndefined(this.actual); + }; + + Matchers.prototype.toBeUndefined = function() { + return j$.util.isUndefined(this.actual); + }; + + Matchers.prototype.toBeNull = function() { + return (this.actual === null); + }; + + Matchers.prototype.toBeNaN = function() { + this.message = function() { + return [ "Expected " + j$.pp(this.actual) + " to be NaN." ]; + }; + + return (this.actual !== this.actual); + }; + + Matchers.prototype.toBeTruthy = function() { + return !!this.actual; + }; + + Matchers.prototype.toBeFalsy = function() { + return !this.actual; + }; + + Matchers.prototype.toHaveBeenCalled = function() { + if (arguments.length > 0) { + throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); } - var message; - if (!result) { - if (this.message) { - message = this.message.apply(this, arguments); - if (jasmine.isArray_(message)) { - message = message[this.isNot ? 1 : 0]; - } + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to have been called.", + "Expected spy " + this.actual.identity + " not to have been called." + ]; + }; + + return this.actual.wasCalled; + }; + +// TODO: kill this for 2.0 + Matchers.prototype.wasCalled = Matchers.prototype.toHaveBeenCalled; + + Matchers.prototype.wasNotCalled = function() { + if (arguments.length > 0) { + throw new Error('wasNotCalled does not take arguments'); + } + + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy " + this.actual.identity + " to not have been called.", + "Expected spy " + this.actual.identity + " to have been called." + ]; + }; + + return !this.actual.wasCalled; + }; + + Matchers.prototype.toHaveBeenCalledWith = function() { + var expectedArgs = j$.util.argsToArray(arguments); + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); + } + this.message = function() { + var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + j$.pp(expectedArgs) + " but it was."; + var positiveMessage = ""; + if (this.actual.callCount === 0) { + positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + j$.pp(expectedArgs) + " but it was never called."; } else { - var englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - message = "Expected " + jasmine.pp(this.actual) + (this.isNot ? " not " : " ") + englishyPredicate; - if (matcherArgs.length > 0) { - for (var i = 0; i < matcherArgs.length; i++) { - if (i > 0) message += ","; - message += " " + jasmine.pp(matcherArgs[i]); - } - } - message += "."; + positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + j$.pp(expectedArgs) + " but actual calls were " + j$.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, ''); + } + return [positiveMessage, invertedMessage]; + }; + + return this.env.contains_(this.actual.argsForCall, expectedArgs); + }; + +// TODO: kill for 2.0 + Matchers.prototype.wasCalledWith = Matchers.prototype.toHaveBeenCalledWith; + +// TODO: kill for 2.0 + Matchers.prototype.wasNotCalledWith = function() { + var expectedArgs = j$.util.argsToArray(arguments); + if (!j$.isSpy(this.actual)) { + throw new Error('Expected a spy, but got ' + j$.pp(this.actual) + '.'); + } + + this.message = function() { + return [ + "Expected spy not to have been called with " + j$.pp(expectedArgs) + " but it was", + "Expected spy to have been called with " + j$.pp(expectedArgs) + " but it was" + ]; + }; + + return !this.env.contains_(this.actual.argsForCall, expectedArgs); + }; + + Matchers.prototype.toContain = function(expected) { + return this.env.contains_(this.actual, expected); + }; + + Matchers.prototype.toNotContain = function(expected) { + return !this.env.contains_(this.actual, expected); + }; + + Matchers.prototype.toBeLessThan = function(expected) { + return this.actual < expected; + }; + + Matchers.prototype.toBeGreaterThan = function(expected) { + return this.actual > expected; + }; + + Matchers.prototype.toBeCloseTo = function(expected, precision) { + if (precision !== 0) { + precision = precision || 2; + } + return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); + }; + + Matchers.prototype.toThrow = function(expected) { + var result = false; + var exception, exceptionMessage; + if (typeof this.actual != 'function') { + throw new Error('Actual is not a function'); + } + try { + this.actual(); + } catch (e) { + exception = e; + } + + if (exception) { + exceptionMessage = exception.message || exception; + result = (j$.util.isUndefined(expected) || this.env.equals_(exceptionMessage, expected.message || expected) || (j$.isA_("RegExp", expected) && expected.test(exceptionMessage))); + } + + var not = this.isNot ? "not " : ""; + var regexMatch = j$.isA_("RegExp", expected) ? " an exception matching" : ""; + + this.message = function() { + if (exception) { + return ["Expected function " + not + "to throw" + regexMatch, expected ? expected.message || expected : "an exception", ", but it threw", exceptionMessage].join(' '); + } else { + return "Expected function to throw an exception."; + } + }; + + return result; + }; + + Matchers.Any = function(expectedClass) { + this.expectedClass = expectedClass; + }; + + Matchers.Any.prototype.jasmineMatches = function(other) { + if (this.expectedClass == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedClass == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedClass == Function) { + return typeof other == 'function' || other instanceof Function; + } + + if (this.expectedClass == Object) { + return typeof other == 'object'; + } + + return other instanceof this.expectedClass; + }; + + Matchers.Any.prototype.jasmineToString = function() { + return ''; + }; + + Matchers.ObjectContaining = function(sample) { + this.sample = sample; + }; + + Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { + mismatchKeys = mismatchKeys || []; + mismatchValues = mismatchValues || []; + + var env = j$.getEnv(); + + var hasKey = function(obj, keyName) { + return obj !== null && !j$.util.isUndefined(obj[keyName]); + }; + + for (var property in this.sample) { + if (!hasKey(other, property) && hasKey(this.sample, property)) { + mismatchKeys.push("expected has key '" + property + "', but missing from actual."); + } + else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { + mismatchValues.push("'" + property + "' was '" + (other[property] ? j$.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? j$.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); } } - this.spec.addExpectationResult(result, { - matcherName: matcherName, - passed: result, - expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], - actual: this.actual, - message: message - }); - return void 0; - }; -}; - -jasmine.Matchers.prototype.toBe = function(expected) { - return this.actual === expected; -}; - -jasmine.Matchers.prototype.toNotBe = function(expected) { - return this.actual !== expected; -}; - -jasmine.Matchers.prototype.toEqual = function(expected) { - return this.env.equals_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toNotEqual = function(expected) { - return !this.env.equals_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toMatch = function(expected) { - return new RegExp(expected).test(this.actual); -}; - -jasmine.Matchers.prototype.toNotMatch = function(expected) { - return !(new RegExp(expected).test(this.actual)); -}; - -jasmine.Matchers.prototype.toBeDefined = function() { - return !jasmine.util.isUndefined(this.actual); -}; - -jasmine.Matchers.prototype.toBeUndefined = function() { - return jasmine.util.isUndefined(this.actual); -}; - -jasmine.Matchers.prototype.toBeNull = function() { - return (this.actual === null); -}; - -jasmine.Matchers.prototype.toBeNaN = function() { - this.message = function() { - return [ "Expected " + jasmine.pp(this.actual) + " to be NaN." ]; + return (mismatchKeys.length === 0 && mismatchValues.length === 0); }; - return (this.actual !== this.actual); -}; - -jasmine.Matchers.prototype.toBeTruthy = function() { - return !!this.actual; -}; - -jasmine.Matchers.prototype.toBeFalsy = function() { - return !this.actual; -}; - -jasmine.Matchers.prototype.toHaveBeenCalled = function() { - if (arguments.length > 0) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to have been called.", - "Expected spy " + this.actual.identity + " not to have been called." - ]; + Matchers.ObjectContaining.prototype.jasmineToString = function() { + return ""; }; - return this.actual.wasCalled; -}; - -// TODO: kill this for 2.0 -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; - -jasmine.Matchers.prototype.wasNotCalled = function() { - if (arguments.length > 0) { - throw new Error('wasNotCalled does not take arguments'); - } - - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy " + this.actual.identity + " to not have been called.", - "Expected spy " + this.actual.identity + " to have been called." - ]; - }; - - return !this.actual.wasCalled; -}; - -jasmine.Matchers.prototype.toHaveBeenCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - this.message = function() { - var invertedMessage = "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was."; - var positiveMessage = ""; - if (this.actual.callCount === 0) { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called."; - } else { - positiveMessage = "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but actual calls were " + jasmine.pp(this.actual.argsForCall).replace(/^\[ | \]$/g, ''); - } - return [positiveMessage, invertedMessage]; - }; - - return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -// TODO: kill for 2.0 -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -// TODO: kill for 2.0 -jasmine.Matchers.prototype.wasNotCalledWith = function() { - var expectedArgs = jasmine.util.argsToArray(arguments); - if (!jasmine.isSpy(this.actual)) { - throw new Error('Expected a spy, but got ' + jasmine.pp(this.actual) + '.'); - } - - this.message = function() { - return [ - "Expected spy not to have been called with " + jasmine.pp(expectedArgs) + " but it was", - "Expected spy to have been called with " + jasmine.pp(expectedArgs) + " but it was" - ]; - }; - - return !this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -jasmine.Matchers.prototype.toContain = function(expected) { - return this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toNotContain = function(expected) { - return !this.env.contains_(this.actual, expected); -}; - -jasmine.Matchers.prototype.toBeLessThan = function(expected) { - return this.actual < expected; -}; - -jasmine.Matchers.prototype.toBeGreaterThan = function(expected) { - return this.actual > expected; -}; - -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { - if (precision !== 0) { - precision = precision || 2; - } - return Math.abs(expected - this.actual) < (Math.pow(10, -precision) / 2); -}; - -jasmine.Matchers.prototype.toThrow = function(expected) { - var result = false; - var exception, exceptionMessage; - if (typeof this.actual != 'function') { - throw new Error('Actual is not a function'); - } - try { - this.actual(); - } catch (e) { - exception = e; - } - - if (exception) { - exceptionMessage = exception.message || exception; - result = (jasmine.util.isUndefined(expected) || this.env.equals_(exceptionMessage, expected.message || expected) || (jasmine.isA_("RegExp", expected) && expected.test(exceptionMessage))); - } - - var not = this.isNot ? "not " : ""; - var regexMatch = jasmine.isA_("RegExp", expected) ? " an exception matching" : ""; - - this.message = function() { - if (exception) { - return ["Expected function " + not + "to throw" + regexMatch, expected ? expected.message || expected : "an exception", ", but it threw", exceptionMessage].join(' '); - } else { - return "Expected function to throw an exception."; - } - }; - - return result; -}; - -jasmine.Matchers.Any = function(expectedClass) { - this.expectedClass = expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineMatches = function(other) { - if (this.expectedClass == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedClass == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedClass == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedClass == Object) { - return typeof other == 'object'; - } - - return other instanceof this.expectedClass; -}; - -jasmine.Matchers.Any.prototype.jasmineToString = function() { - return ''; -}; - -jasmine.Matchers.ObjectContaining = function(sample) { - this.sample = sample; -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var env = jasmine.getEnv(); - - var hasKey = function(obj, keyName) { - return obj !== null && !jasmine.util.isUndefined(obj[keyName]); - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push("expected has key '" + property + "', but missing from actual."); - } - else if (!env.equals_(this.sample[property], other[property], mismatchKeys, mismatchValues)) { - mismatchValues.push("'" + property + "' was '" + (other[property] ? jasmine.util.htmlEscape(other[property].toString()) : other[property]) + "' in expected, but was '" + (this.sample[property] ? jasmine.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + "' in actual."); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Matchers.ObjectContaining.prototype.jasmineToString = function() { - return ""; + return Matchers; + }; diff --git a/src/core/PrettyPrinter.js b/src/core/PrettyPrinter.js index 9878e2e5..0465ca0a 100644 --- a/src/core/PrettyPrinter.js +++ b/src/core/PrettyPrinter.js @@ -1,122 +1,127 @@ -jasmine.PrettyPrinter = function() { - this.ppNestLevel_ = 0; -}; +getJasmineRequireObj().StringPrettyPrinter = function(j$) { -jasmine.PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (jasmine.util.isUndefined(value)) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === jasmine.getGlobal()) { - this.emitScalar(''); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (jasmine.isSpy(value)) { - this.emitScalar("spy on " + value.identity); - } else if (value instanceof RegExp) { - this.emitScalar(value.toString()); - } else if (typeof value === 'function') { - this.emitScalar('Function'); - } else if (typeof value.nodeType === 'number') { - this.emitScalar('HTMLNode'); - } else if (value instanceof Date) { - this.emitScalar('Date(' + value + ')'); - } else if (value.__Jasmine_been_here_before__) { - this.emitScalar(''); - } else if (jasmine.isArray_(value) || typeof value == 'object') { - value.__Jasmine_been_here_before__ = true; - if (jasmine.isArray_(value)) { - this.emitArray(value); + function PrettyPrinter() { + this.ppNestLevel_ = 0; + } + + PrettyPrinter.prototype.format = function(value) { + this.ppNestLevel_++; + try { + if (j$.util.isUndefined(value)) { + this.emitScalar('undefined'); + } else if (value === null) { + this.emitScalar('null'); + } else if (value === j$.getGlobal()) { + this.emitScalar(''); + } else if (value.jasmineToString) { + this.emitScalar(value.jasmineToString()); + } else if (typeof value === 'string') { + this.emitString(value); + } else if (j$.isSpy(value)) { + this.emitScalar("spy on " + value.identity); + } else if (value instanceof RegExp) { + this.emitScalar(value.toString()); + } else if (typeof value === 'function') { + this.emitScalar('Function'); + } else if (typeof value.nodeType === 'number') { + this.emitScalar('HTMLNode'); + } else if (value instanceof Date) { + this.emitScalar('Date(' + value + ')'); + } else if (value.__Jasmine_been_here_before__) { + this.emitScalar(''); + } else if (j$.isArray_(value) || typeof value == 'object') { + value.__Jasmine_been_here_before__ = true; + if (j$.isArray_(value)) { + this.emitArray(value); + } else { + this.emitObject(value); + } + delete value.__Jasmine_been_here_before__; } else { - this.emitObject(value); + this.emitScalar(value.toString()); } - delete value.__Jasmine_been_here_before__; - } else { - this.emitScalar(value.toString()); + } finally { + this.ppNestLevel_--; } - } finally { - this.ppNestLevel_--; - } -}; + }; -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!obj.hasOwnProperty(property)) continue; - if (property == '__Jasmine_been_here_before__') continue; - fn(property, obj.__lookupGetter__ ? (!jasmine.util.isUndefined(obj.__lookupGetter__(property)) && - obj.__lookupGetter__(property) !== null) : false); - } -}; - -jasmine.PrettyPrinter.prototype.emitArray = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitObject = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitScalar = jasmine.unimplementedMethod_; -jasmine.PrettyPrinter.prototype.emitString = jasmine.unimplementedMethod_; - -jasmine.StringPrettyPrinter = function() { - jasmine.PrettyPrinter.call(this); - - this.string = ''; -}; -jasmine.util.inherit(jasmine.StringPrettyPrinter, jasmine.PrettyPrinter); - -jasmine.StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); -}; - -jasmine.StringPrettyPrinter.prototype.emitString = function(value) { - this.append("'" + value + "'"); -}; - -jasmine.StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Array"); - return; - } - - this.append('[ '); - for (var i = 0; i < array.length; i++) { - if (i > 0) { - this.append(', '); + PrettyPrinter.prototype.iterateObject = function(obj, fn) { + for (var property in obj) { + if (!obj.hasOwnProperty(property)) continue; + if (property == '__Jasmine_been_here_before__') continue; + fn(property, obj.__lookupGetter__ ? (!j$.util.isUndefined(obj.__lookupGetter__(property)) && + obj.__lookupGetter__(property) !== null) : false); } - this.format(array[i]); + }; + + PrettyPrinter.prototype.emitArray = j$.unimplementedMethod_; + PrettyPrinter.prototype.emitObject = j$.unimplementedMethod_; + PrettyPrinter.prototype.emitScalar = j$.unimplementedMethod_; + PrettyPrinter.prototype.emitString = j$.unimplementedMethod_; + + function StringPrettyPrinter() { + PrettyPrinter.call(this); + + this.string = ''; } - this.append(' ]'); -}; + j$.util.inherit(StringPrettyPrinter, PrettyPrinter); -jasmine.StringPrettyPrinter.prototype.emitObject = function(obj) { - if (this.ppNestLevel_ > jasmine.MAX_PRETTY_PRINT_DEPTH) { - this.append("Object"); - return; - } + StringPrettyPrinter.prototype.emitScalar = function(value) { + this.append(value); + }; - var self = this; - this.append('{ '); - var first = true; + StringPrettyPrinter.prototype.emitString = function(value) { + this.append("'" + value + "'"); + }; - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); + StringPrettyPrinter.prototype.emitArray = function(array) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append("Array"); + return; } - self.append(property); - self.append(' : '); - if (isGetter) { - self.append(''); - } else { - self.format(obj[property]); + this.append('[ '); + for (var i = 0; i < array.length; i++) { + if (i > 0) { + this.append(', '); + } + this.format(array[i]); } - }); + this.append(' ]'); + }; - this.append(' }'); + StringPrettyPrinter.prototype.emitObject = function(obj) { + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { + this.append("Object"); + return; + } + + var self = this; + this.append('{ '); + var first = true; + + this.iterateObject(obj, function(property, isGetter) { + if (first) { + first = false; + } else { + self.append(', '); + } + + self.append(property); + self.append(' : '); + if (isGetter) { + self.append(''); + } else { + self.format(obj[property]); + } + }); + + this.append(' }'); + }; + + StringPrettyPrinter.prototype.append = function(value) { + this.string += value; + }; + + return StringPrettyPrinter; }; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { - this.string += value; -}; \ No newline at end of file diff --git a/src/core/QueueRunner.js b/src/core/QueueRunner.js index c4a5ae4f..da9cae34 100644 --- a/src/core/QueueRunner.js +++ b/src/core/QueueRunner.js @@ -1,40 +1,45 @@ -jasmine.QueueRunner = function(attrs) { - this.fns = attrs.fns || []; - this.onComplete = attrs.onComplete || function() {}; - this.encourageGC = attrs.encourageGC || function(fn) {fn();}; - this.onException = attrs.onException || function() {}; - this.catchException = attrs.catchException || function() { return true; }; -}; +getJasmineRequireObj().QueueRunner = function() { -jasmine.QueueRunner.prototype.execute = function() { - this.run(this.fns, 0); -}; - -jasmine.QueueRunner.prototype.run = function(fns, index) { - if (index >= fns.length) { - this.encourageGC(this.onComplete); - return; + function QueueRunner(attrs) { + this.fns = attrs.fns || []; + this.onComplete = attrs.onComplete || function() {}; + this.encourageGC = attrs.encourageGC || function(fn) {fn();}; + this.onException = attrs.onException || function() {}; + this.catchException = attrs.catchException || function() { return true; }; } - var fn = fns[index]; - var self = this; - if (fn.length > 0) { - attempt(function() { fn.call(self, function() { self.run(fns, index + 1); }); }); - } else { - attempt(function() { fn.call(self); }); - self.run(fns, index + 1); - } + QueueRunner.prototype.execute = function() { + this.run(this.fns, 0); + }; - function attempt(fn) { - try { - fn(); - } catch (e) { - self.onException(e); - if (!self.catchException(e)) { - //TODO: set a var when we catch an exception and - //use a finally block to close the loop in a nice way.. - throw e; + QueueRunner.prototype.run = function(fns, index) { + if (index >= fns.length) { + this.encourageGC(this.onComplete); + return; + } + + var fn = fns[index]; + var self = this; + if (fn.length > 0) { + attempt(function() { fn.call(self, function() { self.run(fns, index + 1); }); }); + } else { + attempt(function() { fn.call(self); }); + self.run(fns, index + 1); + } + + function attempt(fn) { + try { + fn(); + } catch (e) { + self.onException(e); + if (!self.catchException(e)) { + //TODO: set a var when we catch an exception and + //use a finally block to close the loop in a nice way.. + throw e; + } } } - } + }; + + return QueueRunner; }; diff --git a/src/core/ReportDispatcher.js b/src/core/ReportDispatcher.js index af904838..be4e3db2 100644 --- a/src/core/ReportDispatcher.js +++ b/src/core/ReportDispatcher.js @@ -1,30 +1,35 @@ -jasmine.ReportDispatcher = function(methods) { +getJasmineRequireObj().ReportDispatcher = function() { + function ReportDispatcher(methods) { - var dispatchedMethods = methods || []; + var dispatchedMethods = methods || []; - for (var i = 0; i < dispatchedMethods.length; i++) { - var method = dispatchedMethods[i]; - this[method] = function(m) { - return function() { - dispatch(m, arguments); - }; - }(method); - } + for (var i = 0; i < dispatchedMethods.length; i++) { + var method = dispatchedMethods[i]; + this[method] = function(m) { + return function() { + dispatch(m, arguments); + }; + }(method); + } - var reporters = []; + var reporters = []; - this.addReporter = function(reporter) { - reporters.push(reporter); - }; + this.addReporter = function(reporter) { + reporters.push(reporter); + }; - return this; + return this; - function dispatch(method, args) { - for (var i = 0; i < reporters.length; i++) { - var reporter = reporters[i]; - if (reporter[method]) { - reporter[method].apply(reporter, args); + function dispatch(method, args) { + for (var i = 0; i < reporters.length; i++) { + var reporter = reporters[i]; + if (reporter[method]) { + reporter[method].apply(reporter, args); + } } } } -}; \ No newline at end of file + + return ReportDispatcher; +}; + diff --git a/src/core/Spec.js b/src/core/Spec.js index e90f72fa..6f051a68 100644 --- a/src/core/Spec.js +++ b/src/core/Spec.js @@ -1,118 +1,126 @@ -jasmine.Spec = function(attrs) { - this.encounteredExpectations = false; - this.expectationFactory = attrs.expectationFactory; - this.resultCallback = attrs.resultCallback || function() {}; - this.id = attrs.id; - this.description = attrs.description || ''; - this.fn = attrs.fn; - this.beforeFns = attrs.beforeFns || function() {}; - this.afterFns = attrs.afterFns || function() {}; - this.catchingExceptions = attrs.catchingExceptions; - this.onStart = attrs.onStart || function() {}; - this.exceptionFormatter = attrs.exceptionFormatter || function() {}; - this.getSpecName = attrs.getSpecName || function() { return ''; }; - this.expectationResultFactory = attrs.expectationResultFactory || function() { }; - this.queueRunner = attrs.queueRunner || function() {}; - this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; +getJasmineRequireObj().Spec = function() { + function Spec(attrs) { + this.encounteredExpectations = false; + this.expectationFactory = attrs.expectationFactory; + this.resultCallback = attrs.resultCallback || function() {}; + this.id = attrs.id; + this.description = attrs.description || ''; + this.fn = attrs.fn; + this.beforeFns = attrs.beforeFns || function() {}; + this.afterFns = attrs.afterFns || function() {}; + this.catchingExceptions = attrs.catchingExceptions; + this.onStart = attrs.onStart || function() {}; + this.exceptionFormatter = attrs.exceptionFormatter || function() {}; + this.getSpecName = attrs.getSpecName || function() { return ''; }; + this.expectationResultFactory = attrs.expectationResultFactory || function() { }; + this.queueRunner = attrs.queueRunner || function() {}; + this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; - if (!this.fn) { - this.pend(); - } - - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - status: this.status(), - failedExpectations: [] - }; -}; - -jasmine.Spec.prototype.addExpectationResult = function(passed, data) { - this.encounteredExpectations = true; - if (passed) { - return; - } - this.result.failedExpectations.push(this.expectationResultFactory(data)); -}; - -jasmine.Spec.prototype.expect = function(actual) { - return this.expectationFactory(actual, this); -}; - -jasmine.Spec.prototype.execute = function(onComplete) { - var self = this; - - this.onStart(this); - - if (this.markedPending || this.disabled) { - complete(); - return; - } - - var befores = this.beforeFns() || [], - afters = this.afterFns() || []; - var allFns = befores.concat(this.fn).concat(afters); - - this.queueRunner({ - fns: allFns, - onException: function(e) { - if (jasmine.Spec.isPendingSpecException(e)) { - self.pend(); - return; - } - - self.addExpectationResult(false, { - matcherName: "", - passed: false, - expected: "", - actual: "", - error: e - }); - }, - onComplete: complete - }); - - function complete() { - self.result.status = self.status(); - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); + if (!this.fn) { + this.pend(); } - } -}; -jasmine.Spec.prototype.disable = function() { - this.disabled = true; -}; - -jasmine.Spec.prototype.pend = function() { - this.markedPending = true; -}; - -jasmine.Spec.prototype.status = function() { - if (this.disabled) { - return 'disabled'; + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + status: this.status(), + failedExpectations: [] + }; } - if (this.markedPending || !this.encounteredExpectations) { - return 'pending'; - } + Spec.prototype.addExpectationResult = function(passed, data) { + this.encounteredExpectations = true; + if (passed) { + return; + } + this.result.failedExpectations.push(this.expectationResultFactory(data)); + }; - if (this.result.failedExpectations.length > 0) { - return 'failed'; - } else { - return 'passed'; - } + Spec.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Spec.prototype.execute = function(onComplete) { + var self = this; + + this.onStart(this); + + if (this.markedPending || this.disabled) { + complete(); + return; + } + + var befores = this.beforeFns() || [], + afters = this.afterFns() || []; + var allFns = befores.concat(this.fn).concat(afters); + + this.queueRunner({ + fns: allFns, + onException: function(e) { + if (Spec.isPendingSpecException(e)) { + self.pend(); + return; + } + + self.addExpectationResult(false, { + matcherName: "", + passed: false, + expected: "", + actual: "", + error: e + }); + }, + onComplete: complete + }); + + function complete() { + self.result.status = self.status(); + self.resultCallback(self.result); + + if (onComplete) { + onComplete(); + } + } + }; + + Spec.prototype.disable = function() { + this.disabled = true; + }; + + Spec.prototype.pend = function() { + this.markedPending = true; + }; + + Spec.prototype.status = function() { + if (this.disabled) { + return 'disabled'; + } + + if (this.markedPending || !this.encounteredExpectations) { + return 'pending'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'passed'; + } + }; + + Spec.prototype.getFullName = function() { + return this.getSpecName(this); + }; + + Spec.pendingSpecExceptionMessage = "=> marked Pending"; + + Spec.isPendingSpecException = function(e) { + return e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1; + }; + + return Spec; }; -jasmine.Spec.prototype.getFullName = function() { - return this.getSpecName(this); -}; - -jasmine.Spec.pendingSpecExceptionMessage = "=> marked Pending"; - -jasmine.Spec.isPendingSpecException = function(e) { - return e.toString().indexOf(jasmine.Spec.pendingSpecExceptionMessage) !== -1; -}; \ No newline at end of file +if (typeof window == void 0 && typeof exports == "object") { + exports.Spec = jasmineRequire.Spec; +} diff --git a/src/core/Suite.js b/src/core/Suite.js index 1438b647..23d00703 100644 --- a/src/core/Suite.js +++ b/src/core/Suite.js @@ -1,99 +1,107 @@ -jasmine.Suite = function(attrs) { - this.env = attrs.env; - this.id = attrs.id; - this.parentSuite = attrs.parentSuite; - this.description = attrs.description; - this.onStart = attrs.onStart || function() {}; - this.completeCallback = attrs.completeCallback || function() {}; - this.resultCallback = attrs.resultCallback || function() {}; - this.encourageGC = attrs.encourageGC || function(fn) {fn();}; +getJasmineRequireObj().Suite = function() { + function Suite(attrs) { + this.env = attrs.env; + this.id = attrs.id; + this.parentSuite = attrs.parentSuite; + this.description = attrs.description; + this.onStart = attrs.onStart || function() {}; + this.completeCallback = attrs.completeCallback || function() {}; + this.resultCallback = attrs.resultCallback || function() {}; + this.encourageGC = attrs.encourageGC || function(fn) {fn();}; - this.beforeFns = []; - this.afterFns = []; - this.queueRunner = attrs.queueRunner || function() {}; - this.disabled = false; + this.beforeFns = []; + this.afterFns = []; + this.queueRunner = attrs.queueRunner || function() {}; + this.disabled = false; - this.children_ = []; // TODO: rename - this.suites = []; // TODO: needed? - this.specs = []; // TODO: needed? + this.children_ = []; // TODO: rename + this.suites = []; // TODO: needed? + this.specs = []; // TODO: needed? - this.result = { - id: this.id, - status: this.disabled ? 'disabled' : '', - description: this.description, - fullName: this.getFullName() - }; -}; - -jasmine.Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - if (parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - } - return fullName; -}; - -jasmine.Suite.prototype.disable = function() { - this.disabled = true; -}; - -jasmine.Suite.prototype.beforeEach = function(fn) { - this.beforeFns.unshift(fn); -}; - -jasmine.Suite.prototype.afterEach = function(fn) { - this.afterFns.unshift(fn); -}; - -jasmine.Suite.prototype.addSpec = function(spec) { - this.children_.push(spec); - this.specs.push(spec); // TODO: needed? -}; - -jasmine.Suite.prototype.addSuite = function(suite) { - suite.parentSuite = this; - this.children_.push(suite); - this.suites.push(suite); // TODO: needed? -}; - -jasmine.Suite.prototype.children = function() { - return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { - var self = this; - if (this.disabled) { - complete(); - return; - } - - var allFns = [], - children = this.children_; - - for (var i = 0; i < children.length; i++) { - allFns.push(wrapChild(children[i])); - } - - this.onStart(this); - - this.queueRunner({ - fns: allFns, - onComplete: complete - }); - - function complete() { - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); - } - } - - function wrapChild(child) { - return function (done) { - child.execute(done); + this.result = { + id: this.id, + status: this.disabled ? 'disabled' : '', + description: this.description, + fullName: this.getFullName() }; } + + Suite.prototype.getFullName = function() { + var fullName = this.description; + for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { + if (parentSuite.parentSuite) { + fullName = parentSuite.description + ' ' + fullName; + } + } + return fullName; + }; + + Suite.prototype.disable = function() { + this.disabled = true; + }; + + Suite.prototype.beforeEach = function(fn) { + this.beforeFns.unshift(fn); + }; + + Suite.prototype.afterEach = function(fn) { + this.afterFns.unshift(fn); + }; + + Suite.prototype.addSpec = function(spec) { + this.children_.push(spec); + this.specs.push(spec); // TODO: needed? + }; + + Suite.prototype.addSuite = function(suite) { + suite.parentSuite = this; + this.children_.push(suite); + this.suites.push(suite); // TODO: needed? + }; + + Suite.prototype.children = function() { + return this.children_; + }; + + Suite.prototype.execute = function(onComplete) { + var self = this; + if (this.disabled) { + complete(); + return; + } + + var allFns = [], + children = this.children_; + + for (var i = 0; i < children.length; i++) { + allFns.push(wrapChild(children[i])); + } + + this.onStart(this); + + this.queueRunner({ + fns: allFns, + onComplete: complete + }); + + function complete() { + self.resultCallback(self.result); + + if (onComplete) { + onComplete(); + } + } + + function wrapChild(child) { + return function(done) { + child.execute(done); + }; + } + }; + + return Suite; }; + +if (typeof window == void 0 && typeof exports == "object") { + exports.Suite = jasmineRequire.Suite; +} diff --git a/src/core/base.js b/src/core/base.js index 66bf49ea..b907d43e 100644 --- a/src/core/base.js +++ b/src/core/base.js @@ -1,144 +1,139 @@ -var jasmine = {}; +getJasmineRequireObj().base = function(j$) { + j$.unimplementedMethod_ = function() { + throw new Error("unimplemented method"); + }; -// TODO: do we need this now that we have boot.js? -if (typeof window == "undefined" && typeof exports == "object") { - exports.jasmine = jasmine; -} + j$.DEFAULT_UPDATE_INTERVAL = 250; + j$.MAX_PRETTY_PRINT_DEPTH = 40; + j$.DEFAULT_TIMEOUT_INTERVAL = 5000; -jasmine.unimplementedMethod_ = function() { - throw new Error("unimplemented method"); -}; + j$.getGlobal = function() { + function getGlobal() { + return this; + } -jasmine.DEFAULT_UPDATE_INTERVAL = 250; -jasmine.MAX_PRETTY_PRINT_DEPTH = 40; -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; + return getGlobal(); + }; -jasmine.getGlobal = function() { - function getGlobal() { + j$.getEnv = function(options) { + var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); + //jasmine. singletons in here (setTimeout blah blah). + return env; + }; + + j$.isArray_ = function(value) { + return j$.isA_("Array", value); + }; + + j$.isString_ = function(value) { + return j$.isA_("String", value); + }; + + j$.isNumber_ = function(value) { + return j$.isA_("Number", value); + }; + + j$.isA_ = function(typeName, value) { + return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; + }; + + j$.pp = function(value) { + var stringPrettyPrinter = new j$.StringPrettyPrinter(); + stringPrettyPrinter.format(value); + return stringPrettyPrinter.string; + }; + + j$.isDomNode = function(obj) { + return obj.nodeType > 0; + }; + + j$.any = function(clazz) { + return new j$.Matchers.Any(clazz); + }; + + j$.objectContaining = function(sample) { + return new j$.Matchers.ObjectContaining(sample); + }; + + j$.Spy = function(name) { + this.identity = name || 'unknown'; + this.isSpy = true; + this.plan = function() { + }; + this.mostRecentCall = {}; + + this.argsForCall = []; + this.calls = []; + }; + + j$.Spy.prototype.andCallThrough = function() { + this.plan = this.originalValue; return this; - } - - return getGlobal(); -}; - -jasmine.getEnv = function(options) { - var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(options); - //jasmine. singletons in here (setTimeout blah blah). - return env; -}; - -jasmine.isArray_ = function(value) { - return jasmine.isA_("Array", value); -}; - -jasmine.isString_ = function(value) { - return jasmine.isA_("String", value); -}; - -jasmine.isNumber_ = function(value) { - return jasmine.isA_("Number", value); -}; - -jasmine.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -jasmine.pp = function(value) { - var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; -}; - -jasmine.isDomNode = function(obj) { - return obj.nodeType > 0; -}; - -jasmine.any = function(clazz) { - return new jasmine.Matchers.Any(clazz); -}; - -jasmine.objectContaining = function (sample) { - return new jasmine.Matchers.ObjectContaining(sample); -}; - -jasmine.Spy = function(name) { - this.identity = name || 'unknown'; - this.isSpy = true; - this.plan = function() { - }; - this.mostRecentCall = {}; - - this.argsForCall = []; - this.calls = []; -}; - -jasmine.Spy.prototype.andCallThrough = function() { - this.plan = this.originalValue; - return this; -}; - -jasmine.Spy.prototype.andReturn = function(value) { - this.plan = function() { - return value; - }; - return this; -}; - -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { - this.plan = function() { - throw exceptionMsg; - }; - return this; -}; - -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { - this.plan = fakeFunc; - return this; -}; - -jasmine.Spy.prototype.reset = function() { - this.wasCalled = false; - this.callCount = 0; - this.argsForCall = []; - this.calls = []; - this.mostRecentCall = {}; -}; - -jasmine.createSpy = function(name) { - - var spyObj = function() { - spyObj.wasCalled = true; - spyObj.callCount++; - var args = jasmine.util.argsToArray(arguments); - spyObj.mostRecentCall.object = this; - spyObj.mostRecentCall.args = args; - spyObj.argsForCall.push(args); - spyObj.calls.push({object: this, args: args}); - return spyObj.plan.apply(this, arguments); }; - var spy = new jasmine.Spy(name); + j$.Spy.prototype.andReturn = function(value) { + this.plan = function() { + return value; + }; + return this; + }; - for (var prop in spy) { - spyObj[prop] = spy[prop]; - } + j$.Spy.prototype.andThrow = function(exceptionMsg) { + this.plan = function() { + throw exceptionMsg; + }; + return this; + }; - spyObj.reset(); + j$.Spy.prototype.andCallFake = function(fakeFunc) { + this.plan = fakeFunc; + return this; + }; - return spyObj; -}; - -jasmine.isSpy = function(putativeSpy) { - return putativeSpy && putativeSpy.isSpy; -}; - -jasmine.createSpyObj = function(baseName, methodNames) { - if (!jasmine.isArray_(methodNames) || methodNames.length === 0) { - throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = jasmine.createSpy(baseName + '.' + methodNames[i]); - } - return obj; + j$.Spy.prototype.reset = function() { + this.wasCalled = false; + this.callCount = 0; + this.argsForCall = []; + this.calls = []; + this.mostRecentCall = {}; + }; + + j$.createSpy = function(name) { + + var spyObj = function() { + spyObj.wasCalled = true; + spyObj.callCount++; + var args = j$.util.argsToArray(arguments); + spyObj.mostRecentCall.object = this; + spyObj.mostRecentCall.args = args; + spyObj.argsForCall.push(args); + spyObj.calls.push({object: this, args: args}); + return spyObj.plan.apply(this, arguments); + }; + + var spy = new j$.Spy(name); + + for (var prop in spy) { + spyObj[prop] = spy[prop]; + } + + spyObj.reset(); + + return spyObj; + }; + + j$.isSpy = function(putativeSpy) { + return putativeSpy && putativeSpy.isSpy; + }; + + j$.createSpyObj = function(baseName, methodNames) { + if (!j$.isArray_(methodNames) || methodNames.length === 0) { + throw new Error('createSpyObj requires a non-empty array of method names to create spies for'); + } + var obj = {}; + for (var i = 0; i < methodNames.length; i++) { + obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]); + } + return obj; + }; }; diff --git a/src/core/requireCore.js b/src/core/requireCore.js new file mode 100644 index 00000000..f9f2c8f9 --- /dev/null +++ b/src/core/requireCore.js @@ -0,0 +1,30 @@ +function getJasmineRequireObj() { + if (typeof module !== "undefined" && module.exports) { + return exports; + } else { + window.jasmineRequire = window.jasmineRequire || {}; + return window.jasmineRequire; + } +} + +getJasmineRequireObj().core = function(jRequire) { + j$ = {}; + + jRequire.base(j$); + j$.util = jRequire.util(); + j$.Clock = jRequire.Clock(); + j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); + j$.Env = jRequire.Env(j$); + j$.ExceptionFormatter = jRequire.ExceptionFormatter(); + j$.buildExpectationResult = jRequire.buildExpectationResult(); + j$.JsApiReporter = jRequire.JsApiReporter(); + j$.Matchers = jRequire.Matchers(j$); + j$.StringPrettyPrinter = jRequire.StringPrettyPrinter(j$); + j$.QueueRunner = jRequire.QueueRunner(); + j$.ReportDispatcher = jRequire.ReportDispatcher(); + j$.Spec = jRequire.Spec(); + j$.Suite = jRequire.Suite(); + j$.version = jRequire.version(); + + return j$; +}; diff --git a/src/core/util.js b/src/core/util.js index b3a30e84..f4cf30ea 100644 --- a/src/core/util.js +++ b/src/core/util.js @@ -1,52 +1,57 @@ -jasmine.util = {}; +getJasmineRequireObj().util = function() { -jasmine.util.inherit = function(childClass, parentClass) { - var subclass = function() { + var util = {}; + + util.inherit = function(childClass, parentClass) { + var subclass = function() { + }; + subclass.prototype = parentClass.prototype; + childClass.prototype = new subclass(); }; - subclass.prototype = parentClass.prototype; - childClass.prototype = new subclass(); -}; - -jasmine.util.formatException = function(e) { - var lineNumber; - if (e.line) { - lineNumber = e.line; - } - else if (e.lineNumber) { - lineNumber = e.lineNumber; - } - - var file; - - if (e.sourceURL) { - file = e.sourceURL; - } - else if (e.fileName) { - file = e.fileName; - } - - var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); - - if (file && lineNumber) { - message += ' in ' + file + ' (line ' + lineNumber + ')'; - } - - return message; -}; - -jasmine.util.htmlEscape = function(str) { - if (!str) return str; - return str.replace(/&/g, '&') - .replace(//g, '>'); -}; - -jasmine.util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); - return arrayOfArgs; -}; - -jasmine.util.isUndefined = function(obj) { - return obj === void 0; + + util.formatException = function(e) { + var lineNumber; + if (e.line) { + lineNumber = e.line; + } + else if (e.lineNumber) { + lineNumber = e.lineNumber; + } + + var file; + + if (e.sourceURL) { + file = e.sourceURL; + } + else if (e.fileName) { + file = e.fileName; + } + + var message = (e.name && e.message) ? (e.name + ': ' + e.message) : e.toString(); + + if (file && lineNumber) { + message += ' in ' + file + ' (line ' + lineNumber + ')'; + } + + return message; + }; + + util.htmlEscape = function(str) { + if (!str) return str; + return str.replace(/&/g, '&') + .replace(//g, '>'); + }; + + util.argsToArray = function(args) { + var arrayOfArgs = []; + for (var i = 0; i < args.length; i++) arrayOfArgs.push(args[i]); + return arrayOfArgs; + }; + + util.isUndefined = function(obj) { + return obj === void 0; + }; + + return util; }; diff --git a/src/html/HtmlReporter.js b/src/html/HtmlReporter.js index 1f9c32be..e97230e5 100644 --- a/src/html/HtmlReporter.js +++ b/src/html/HtmlReporter.js @@ -1,243 +1,247 @@ -jasmine.HtmlReporter = function(options) { - var env = options.env || {}, - getContainer = options.getContainer, - now = options.now || function() { return new Date().getTime();}, - createElement = options.createElement, - createTextNode = options.createTextNode, - results = [], - startTime, - specsExecuted = 0, - failureCount = 0, - pendingSpecCount = 0, - htmlReporterMain, - symbols; +jasmineRequire.HtmlReporter = function() { + function HtmlReporter(options) { + var env = options.env || {}, + getContainer = options.getContainer, + now = options.now || function() { return new Date().getTime();}, + createElement = options.createElement, + createTextNode = options.createTextNode, + results = [], + startTime, + specsExecuted = 0, + failureCount = 0, + pendingSpecCount = 0, + htmlReporterMain, + symbols; - this.initialize = function() { - htmlReporterMain = createDom("div", {className: "html-reporter"}, - createDom("div", {className: "banner"}, - createDom("span", {className: "title"}, "Jasmine"), - createDom("span", {className: "version"}, jasmine.version) - ), - createDom("ul", {className: "symbol-summary"}), - createDom("div", {className: "alert"}), - createDom("div", {className: "results"}, - createDom("div", {className: "failures"}) - ) - ); - getContainer().appendChild(htmlReporterMain); - - symbols = find(".symbol-summary")[0]; - }; - - var totalSpecsDefined; - this.jasmineStarted = function(options) { - totalSpecsDefined = options.totalSpecsDefined || 0; - startTime = now(); - }; - - var summary = createDom("div", {className: "summary"}); - - var topResults = new jasmine.ResultsNode({}, "", null), - currentParent = topResults; - - this.suiteStarted = function(result) { - currentParent.addChild(result, "suite"); - currentParent = currentParent.last(); - }; - - this.suiteDone = function(result) { - if (currentParent == topResults) { - return; - } - - currentParent = currentParent.parent; - }; - - this.specStarted = function(result) { - currentParent.addChild(result, "spec"); - }; - - var failures = []; - this.specDone = function(result) { - if (result.status != "disabled") { - specsExecuted++; - } - - symbols.appendChild(createDom("li", { - className: result.status, - id: "spec_" + result.id, - title: result.fullName} - )); - - if (result.status == "failed") { - failureCount++; - - var failure = - createDom("div", {className: "spec-detail failed"}, - createDom("a", {className: "description", title: result.fullName, href: specHref(result)}, result.fullName), - createDom("div", {className: "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: "result-message"}, expectation.message)); - messages.appendChild(createDom("div", {className: "stack-trace"}, expectation.stack)); - } - - failures.push(failure); - } - - if(result.status == "pending") { - pendingSpecCount++; - } - }; - - this.jasmineDone = function() { - var elapsed = now() - startTime; - - var banner = find(".banner")[0]; - banner.appendChild(createDom("span", {className: "duration"}, "finished in " + elapsed / 1000 + "s")); - - var alert = find(".alert")[0]; - - alert.appendChild(createDom("span", { className: "exceptions" }, - createDom("label", { className: "label", 'for': "raise-exceptions" }, "raise exceptions"), - createDom("input", { - className: "raise", - id: "raise-exceptions", - type: "checkbox" - }) - )); - var checkbox = find("input")[0]; - - checkbox.checked = !env.catchingExceptions(); - checkbox.onclick = options.onRaiseExceptionsClick; - - if (specsExecuted < totalSpecsDefined) { - var skippedMessage = "Ran " + specsExecuted + " of " + totalSpecsDefined + " specs - run all"; - alert.appendChild( - createDom("span", {className: "bar skipped"}, - createDom("a", {href: "?", title: "Run all specs"}, skippedMessage) + this.initialize = function() { + htmlReporterMain = createDom("div", {className: "html-reporter"}, + createDom("div", {className: "banner"}, + createDom("span", {className: "title"}, "Jasmine"), + createDom("span", {className: "version"}, jasmine.version) + ), + createDom("ul", {className: "symbol-summary"}), + createDom("div", {className: "alert"}), + createDom("div", {className: "results"}, + createDom("div", {className: "failures"}) ) ); - } - var statusBarMessage = "" + pluralize("spec", specsExecuted) + ", " + pluralize("failure", failureCount); - if(pendingSpecCount) { statusBarMessage += ", " + pluralize("pending spec", pendingSpecCount); } + getContainer().appendChild(htmlReporterMain); - var statusBarClassName = "bar " + ((failureCount > 0) ? "failed" : "passed"); - alert.appendChild(createDom("span", {className: statusBarClassName}, statusBarMessage)); + symbols = find(".symbol-summary")[0]; + }; - var results = find(".results")[0]; - results.appendChild(summary); + var totalSpecsDefined; + this.jasmineStarted = function(options) { + totalSpecsDefined = options.totalSpecsDefined || 0; + startTime = now(); + }; - summaryList(topResults, summary); + var summary = createDom("div", {className: "summary"}); - function summaryList(resultsTree, domParent) { - var specListNode; - for (var i = 0; i < resultsTree.children.length; i++) { - var resultNode = resultsTree.children[i]; - if (resultNode.type == "suite") { - var suiteListNode = createDom("ul", {className: "suite", id: "suite-" + resultNode.result.id}, - createDom("li", {className: "suite-detail"}, - createDom("a", {href: specHref(resultNode.result)}, resultNode.result.description) - ) + var topResults = new jasmine.ResultsNode({}, "", null), + currentParent = topResults; + + this.suiteStarted = function(result) { + currentParent.addChild(result, "suite"); + currentParent = currentParent.last(); + }; + + this.suiteDone = function(result) { + if (currentParent == topResults) { + return; + } + + currentParent = currentParent.parent; + }; + + this.specStarted = function(result) { + currentParent.addChild(result, "spec"); + }; + + var failures = []; + this.specDone = function(result) { + if (result.status != "disabled") { + specsExecuted++; + } + + symbols.appendChild(createDom("li", { + className: result.status, + id: "spec_" + result.id, + title: result.fullName} + )); + + if (result.status == "failed") { + failureCount++; + + var failure = + createDom("div", {className: "spec-detail failed"}, + createDom("a", {className: "description", title: result.fullName, href: specHref(result)}, result.fullName), + createDom("div", {className: "messages"}) ); + var messages = failure.childNodes[1]; - summaryList(resultNode, suiteListNode); - domParent.appendChild(suiteListNode); + for (var i = 0; i < result.failedExpectations.length; i++) { + var expectation = result.failedExpectations[i]; + messages.appendChild(createDom("div", {className: "result-message"}, expectation.message)); + messages.appendChild(createDom("div", {className: "stack-trace"}, expectation.stack)); } - if (resultNode.type == "spec") { - if (domParent.getAttribute("class") != "specs") { - specListNode = createDom("ul", {className: "specs"}); - domParent.appendChild(specListNode); + + failures.push(failure); + } + + if (result.status == "pending") { + pendingSpecCount++; + } + }; + + this.jasmineDone = function() { + var elapsed = now() - startTime; + + var banner = find(".banner")[0]; + banner.appendChild(createDom("span", {className: "duration"}, "finished in " + elapsed / 1000 + "s")); + + var alert = find(".alert")[0]; + + alert.appendChild(createDom("span", { className: "exceptions" }, + createDom("label", { className: "label", 'for': "raise-exceptions" }, "raise exceptions"), + createDom("input", { + className: "raise", + id: "raise-exceptions", + type: "checkbox" + }) + )); + var checkbox = find("input")[0]; + + checkbox.checked = !env.catchingExceptions(); + checkbox.onclick = options.onRaiseExceptionsClick; + + if (specsExecuted < totalSpecsDefined) { + var skippedMessage = "Ran " + specsExecuted + " of " + totalSpecsDefined + " specs - run all"; + alert.appendChild( + createDom("span", {className: "bar skipped"}, + createDom("a", {href: "?", title: "Run all specs"}, skippedMessage) + ) + ); + } + var statusBarMessage = "" + pluralize("spec", specsExecuted) + ", " + pluralize("failure", failureCount); + if (pendingSpecCount) { statusBarMessage += ", " + pluralize("pending spec", pendingSpecCount); } + + var statusBarClassName = "bar " + ((failureCount > 0) ? "failed" : "passed"); + alert.appendChild(createDom("span", {className: statusBarClassName}, statusBarMessage)); + + var results = find(".results")[0]; + results.appendChild(summary); + + summaryList(topResults, summary); + + function summaryList(resultsTree, domParent) { + var specListNode; + for (var i = 0; i < resultsTree.children.length; i++) { + var resultNode = resultsTree.children[i]; + if (resultNode.type == "suite") { + var suiteListNode = createDom("ul", {className: "suite", id: "suite-" + resultNode.result.id}, + createDom("li", {className: "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") != "specs") { + specListNode = createDom("ul", {className: "specs"}); + domParent.appendChild(specListNode); + } + specListNode.appendChild( + createDom("li", { + className: resultNode.result.status, + id: "spec-" + resultNode.result.id + }, + createDom("a", {href: specHref(resultNode.result)}, resultNode.result.description) + ) + ); } - specListNode.appendChild( - createDom("li", { - className: resultNode.result.status, - id: "spec-" + resultNode.result.id - }, - createDom("a", {href: specHref(resultNode.result)}, resultNode.result.description) - ) - ); } } - } - if (failures.length) { - alert.appendChild( - createDom('span', {className: "menu bar spec-list"}, - createDom("span", {}, "Spec List | "), - createDom('a', {className: "failures-menu", href: "#"}, "Failures"))); - alert.appendChild( - createDom('span', {className: "menu bar failure-list"}, - createDom('a', {className: "spec-list-menu", href: "#"}, "Spec List"), - createDom("span", {}, " | Failures "))); + if (failures.length) { + alert.appendChild( + createDom('span', {className: "menu bar spec-list"}, + createDom("span", {}, "Spec List | "), + createDom('a', {className: "failures-menu", href: "#"}, "Failures"))); + alert.appendChild( + createDom('span', {className: "menu bar failure-list"}, + createDom('a', {className: "spec-list-menu", href: "#"}, "Spec List"), + createDom("span", {}, " | Failures "))); + + find(".failures-menu")[0].onclick = function() { + setMenuModeTo('failure-list'); + }; + find(".spec-list-menu")[0].onclick = function() { + setMenuModeTo('spec-list'); + }; - find(".failures-menu")[0].onclick = function() { setMenuModeTo('failure-list'); - }; - find(".spec-list-menu")[0].onclick = function() { - setMenuModeTo('spec-list'); - }; - setMenuModeTo('failure-list'); - - var failureNode = find(".failures")[0]; - for (var i = 0; i < failures.length; i++) { - failureNode.appendChild(failures[i]); - } - } - }; - - return this; - - function find(selector) { - if (selector.match(/^\./)) { - var className = selector.substring(1); - return getContainer().getElementsByClassName(className); - } else { - return getContainer().getElementsByTagName(selector); - } - } - - function createDom(type, attrs, childrenVarArgs) { - var el = createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(createTextNode(child)); - } else { - if (child) { - el.appendChild(child); + var failureNode = find(".failures")[0]; + for (var i = 0; i < failures.length; i++) { + failureNode.appendChild(failures[i]); } } - } + }; - for (var attr in attrs) { - if (attr == "className") { - el[attr] = attrs[attr]; + return this; + + function find(selector) { + if (selector.match(/^\./)) { + var className = selector.substring(1); + return getContainer().getElementsByClassName(className); } else { - el.setAttribute(attr, attrs[attr]); + return getContainer().getElementsByTagName(selector); } } - return el; + function createDom(type, attrs, childrenVarArgs) { + var el = createElement(type); + + for (var i = 2; i < arguments.length; i++) { + var child = arguments[i]; + + if (typeof child === 'string') { + el.appendChild(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; + } + + function pluralize(singular, count) { + var word = (count == 1 ? singular : singular + "s"); + + return "" + count + " " + word; + } + + function specHref(result) { + return "?spec=" + encodeURIComponent(result.fullName); + } + + function setMenuModeTo(mode) { + htmlReporterMain.setAttribute("class", "html-reporter " + mode); + } } - function pluralize(singular, count) { - var word = (count == 1 ? singular : singular + "s"); - - return "" + count + " " + word; - } - - function specHref(result) { - return "?spec=" + encodeURIComponent(result.fullName); - } - - function setMenuModeTo(mode) { - htmlReporterMain.setAttribute("class", "html-reporter " + mode); - } -}; \ No newline at end of file + return HtmlReporter; +}; diff --git a/src/html/HtmlSpecFilter.js b/src/html/HtmlSpecFilter.js index ae91dd3b..bd65f63a 100644 --- a/src/html/HtmlSpecFilter.js +++ b/src/html/HtmlSpecFilter.js @@ -1,7 +1,11 @@ -jasmine.HtmlSpecFilter = function(options) { - var filterPattern = new RegExp(options && options.filterString()); +jasmineRequire.HtmlSpecFilter = function() { + function HtmlSpecFilter(options) { + var filterPattern = new RegExp(options && options.filterString()); - this.matches = function(specName) { - return filterPattern.test(specName); - }; + this.matches = function(specName) { + return filterPattern.test(specName); + }; + } + + return HtmlSpecFilter; }; \ No newline at end of file diff --git a/src/html/QueryString.js b/src/html/QueryString.js index 53accf05..19dd1f58 100644 --- a/src/html/QueryString.js +++ b/src/html/QueryString.js @@ -1,43 +1,47 @@ -jasmine.QueryString = function(options) { +jasmineRequire.QueryString = function() { + function QueryString(options) { - this.setParam = function(key, value) { - var paramMap = queryStringToParamMap(); - paramMap[key] = value; - options.getWindowLocation().search = toQueryString(paramMap); - }; + this.setParam = function(key, value) { + var paramMap = queryStringToParamMap(); + paramMap[key] = value; + options.getWindowLocation().search = toQueryString(paramMap); + }; - this.getParam = function(key) { - return queryStringToParamMap()[key]; - }; + this.getParam = function(key) { + return queryStringToParamMap()[key]; + }; - return this; + return this; - function toQueryString(paramMap) { - var qStrPairs = []; - for (var prop in paramMap) { - qStrPairs.push(encodeURIComponent(prop) + "=" + encodeURIComponent(paramMap[prop])); - } - return "?" + qStrPairs.join('&'); - } - - function queryStringToParamMap() { - var paramStr = options.getWindowLocation().search.substring(1), - params = [], - paramMap = {}; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - var value = decodeURIComponent(p[1]); - if (value === "true" || value === "false") { - value = JSON.parse(value); - } - paramMap[decodeURIComponent(p[0])] = value; + function toQueryString(paramMap) { + var qStrPairs = []; + for (var prop in paramMap) { + qStrPairs.push(encodeURIComponent(prop) + "=" + encodeURIComponent(paramMap[prop])); } + return "?" + qStrPairs.join('&'); + } + + function queryStringToParamMap() { + var paramStr = options.getWindowLocation().search.substring(1), + params = [], + paramMap = {}; + + if (paramStr.length > 0) { + params = paramStr.split('&'); + for (var i = 0; i < params.length; i++) { + var p = params[i].split('='); + var value = decodeURIComponent(p[1]); + if (value === "true" || value === "false") { + value = JSON.parse(value); + } + paramMap[decodeURIComponent(p[0])] = value; + } + } + + return paramMap; } - return paramMap; } + return QueryString; }; \ No newline at end of file diff --git a/src/html/ResultsNode.js b/src/html/ResultsNode.js index ed57a37e..c591ec88 100644 --- a/src/html/ResultsNode.js +++ b/src/html/ResultsNode.js @@ -1,15 +1,19 @@ -jasmine.ResultsNode = function(result, type, parent) { - this.result = result; - this.type = type; - this.parent = parent; +jasmineRequire.ResultsNode = function() { + function ResultsNode(result, type, parent) { + this.result = result; + this.type = type; + this.parent = parent; - this.children = []; + this.children = []; - this.addChild = function(result, type) { - this.children.push(new jasmine.ResultsNode(result, type, this)); - }; + this.addChild = function(result, type) { + this.children.push(new ResultsNode(result, type, this)); + }; - this.last = function() { - return this.children[this.children.length-1]; - }; + this.last = function() { + return this.children[this.children.length - 1]; + }; + } + + return ResultsNode; }; \ No newline at end of file diff --git a/src/html/requireHtml.js b/src/html/requireHtml.js new file mode 100644 index 00000000..6b7b679e --- /dev/null +++ b/src/html/requireHtml.js @@ -0,0 +1,6 @@ +jasmineRequire.html = function(j$) { + j$.ResultsNode = jasmineRequire.ResultsNode(); + j$.HtmlReporter = jasmineRequire.HtmlReporter(); + j$.QueryString = jasmineRequire.QueryString(); + j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); +}; \ No newline at end of file diff --git a/src/version.js b/src/version.js index d130dc5e..6e052aa6 100644 --- a/src/version.js +++ b/src/version.js @@ -1 +1,3 @@ -jasmine.version = "<%= version %>"; \ No newline at end of file +getJasmineRequireObj().version = function() { + return "<%= version %>"; +}; \ No newline at end of file