diff options
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/helper.js | 4 | ||||
| -rw-r--r-- | spec/lib/jasmine-sinon.js | 43 | ||||
| -rw-r--r-- | spec/lib/jasmine/MIT.LICENSE | 20 | ||||
| -rw-r--r-- | spec/lib/jasmine/jasmine-html.js | 616 | ||||
| -rw-r--r-- | spec/lib/jasmine/jasmine.css | 81 | ||||
| -rw-r--r-- | spec/lib/jasmine/jasmine.js | 2529 | ||||
| -rw-r--r-- | spec/lib/jasmine/jasmine_favicon.png | bin | 905 -> 0 bytes | |||
| -rw-r--r-- | spec/lib/sinon/sinon-1.3.4.js | 3555 | ||||
| -rw-r--r-- | spec/login_spec.js | 16 | ||||
| -rw-r--r-- | spec/runner.html | 79 | ||||
| -rw-r--r-- | spec/signup_spec.js | 2 | 
11 files changed, 14 insertions, 6931 deletions
| diff --git a/spec/helper.js b/spec/helper.js index 8bae2c6..d1c699b 100644 --- a/spec/helper.js +++ b/spec/helper.js @@ -42,3 +42,7 @@ var specHelper = (function() {    }  })(); + +beforeEach(function () { +  setFixtures("<form action='.' onsubmit='return register()'> <table> <tr><td>Username:</td><td><input type='text' id='srp_username' value='testuser' /></td></tr> <tr><td>Password:</td><td><input type='password' id='srp_password' value='password'/></td></tr> </table> <input type='submit'/> </form> "); +}); diff --git a/spec/lib/jasmine-sinon.js b/spec/lib/jasmine-sinon.js deleted file mode 100644 index 2b7a9e0..0000000 --- a/spec/lib/jasmine-sinon.js +++ /dev/null @@ -1,43 +0,0 @@ -(function(global) { - -  var spyMatchers = "called calledOnce calledTwice calledThrice calledBefore calledAfter calledOn alwaysCalledOn calledWith alwaysCalledWith calledWithExactly alwaysCalledWithExactly".split(" "), -    i = spyMatchers.length, -    spyMatcherHash = {}, -    unusualMatchers = { -      "returned": "toHaveReturned", -      "alwaysReturned": "toHaveAlwaysReturned", -      "threw": "toHaveThrown", -      "alwaysThrew": "toHaveAlwaysThrown" -    }, - -  getMatcherFunction = function(sinonName) { -    return function() { -      var sinonProperty = this.actual[sinonName]; -      return (typeof sinonProperty === 'function') ? sinonProperty.apply(this.actual, arguments) : sinonProperty; -    }; -  }; - -  while(i--) { -    var sinonName = spyMatchers[i], -      matcherName = "toHaveBeen" + sinonName.charAt(0).toUpperCase() + sinonName.slice(1); - -    spyMatcherHash[matcherName] = getMatcherFunction(sinonName); -  }; - -  for (var j in unusualMatchers) { -    spyMatcherHash[unusualMatchers[j]] = getMatcherFunction(j); -  } - -  global.sinonJasmine = { -    getMatchers: function() { -      return spyMatcherHash; -    } -  }; - -})(window); - -beforeEach(function() { - -  this.addMatchers(sinonJasmine.getMatchers()); - -}); diff --git a/spec/lib/jasmine/MIT.LICENSE b/spec/lib/jasmine/MIT.LICENSE deleted file mode 100644 index 7c435ba..0000000 --- a/spec/lib/jasmine/MIT.LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-2011 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. diff --git a/spec/lib/jasmine/jasmine-html.js b/spec/lib/jasmine/jasmine-html.js deleted file mode 100644 index a0b0639..0000000 --- a/spec/lib/jasmine/jasmine-html.js +++ /dev/null @@ -1,616 +0,0 @@ -jasmine.HtmlReporterHelpers = {}; - -jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) { -  var el = document.createElement(type); - -  for (var i = 2; i < arguments.length; i++) { -    var child = arguments[i]; - -    if (typeof child === 'string') { -      el.appendChild(document.createTextNode(child)); -    } else { -      if (child) { -        el.appendChild(child); -      } -    } -  } - -  for (var attr in attrs) { -    if (attr == "className") { -      el[attr] = attrs[attr]; -    } else { -      el.setAttribute(attr, attrs[attr]); -    } -  } - -  return el; -}; - -jasmine.HtmlReporterHelpers.getSpecStatus = function(child) { -  var results = child.results(); -  var status = results.passed() ? 'passed' : 'failed'; -  if (results.skipped) { -    status = 'skipped'; -  } - -  return status; -}; - -jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) { -  var parentDiv = this.dom.summary; -  var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite'; -  var parent = child[parentSuite]; - -  if (parent) { -    if (typeof this.views.suites[parent.id] == 'undefined') { -      this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views); -    } -    parentDiv = this.views.suites[parent.id].element; -  } - -  parentDiv.appendChild(childElement); -}; - - -jasmine.HtmlReporterHelpers.addHelpers = function(ctor) { -  for(var fn in jasmine.HtmlReporterHelpers) { -    ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn]; -  } -}; - -jasmine.HtmlReporter = function(_doc) { -  var self = this; -  var doc = _doc || window.document; - -  var reporterView; - -  var dom = {}; - -  // Jasmine Reporter Public Interface -  self.logRunningSpecs = false; - -  self.reportRunnerStarting = function(runner) { -    var specs = runner.specs() || []; - -    if (specs.length == 0) { -      return; -    } - -    createReporterDom(runner.env.versionString()); -    doc.body.appendChild(dom.reporter); - -    reporterView = new jasmine.HtmlReporter.ReporterView(dom); -    reporterView.addSpecs(specs, self.specFilter); -  }; - -  self.reportRunnerResults = function(runner) { -    reporterView && reporterView.complete(); -  }; - -  self.reportSuiteResults = function(suite) { -    reporterView.suiteComplete(suite); -  }; - -  self.reportSpecStarting = function(spec) { -    if (self.logRunningSpecs) { -      self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); -    } -  }; - -  self.reportSpecResults = function(spec) { -    reporterView.specComplete(spec); -  }; - -  self.log = function() { -    var console = jasmine.getGlobal().console; -    if (console && console.log) { -      if (console.log.apply) { -        console.log.apply(console, arguments); -      } else { -        console.log(arguments); // ie fix: console.log.apply doesn't exist on ie -      } -    } -  }; - -  self.specFilter = function(spec) { -    if (!focusedSpecName()) { -      return true; -    } - -    return spec.getFullName().indexOf(focusedSpecName()) === 0; -  }; - -  return self; - -  function focusedSpecName() { -    var specName; - -    (function memoizeFocusedSpec() { -      if (specName) { -        return; -      } - -      var paramMap = []; -      var params = doc.location.search.substring(1).split('&'); - -      for (var i = 0; i < params.length; i++) { -        var p = params[i].split('='); -        paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); -      } - -      specName = paramMap.spec; -    })(); - -    return specName; -  } - -  function createReporterDom(version) { -    dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' }, -      dom.banner = self.createDom('div', { className: 'banner' }, -        self.createDom('span', { className: 'title' }, "Jasmine "), -        self.createDom('span', { className: 'version' }, version)), - -      dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}), -      dom.alert = self.createDom('div', {className: 'alert'}), -      dom.results = self.createDom('div', {className: 'results'}, -        dom.summary = self.createDom('div', { className: 'summary' }), -        dom.details = self.createDom('div', { id: 'details' })) -    ); -  } -}; -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporter.ReporterView = function(dom) { -  this.startedAt = new Date(); -  this.runningSpecCount = 0; -  this.completeSpecCount = 0; -  this.passedCount = 0; -  this.failedCount = 0; -  this.skippedCount = 0; - -  this.createResultsMenu = function() { -    this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'}, -      this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'), -      ' | ', -      this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing')); - -    this.summaryMenuItem.onclick = function() { -      dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, ''); -    }; - -    this.detailsMenuItem.onclick = function() { -      showDetails(); -    }; -  }; - -  this.addSpecs = function(specs, specFilter) { -    this.totalSpecCount = specs.length; - -    this.views = { -      specs: {}, -      suites: {} -    }; - -    for (var i = 0; i < specs.length; i++) { -      var spec = specs[i]; -      this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views); -      if (specFilter(spec)) { -        this.runningSpecCount++; -      } -    } -  }; - -  this.specComplete = function(spec) { -    this.completeSpecCount++; - -    if (isUndefined(this.views.specs[spec.id])) { -      this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom); -    } - -    var specView = this.views.specs[spec.id]; - -    switch (specView.status()) { -      case 'passed': -        this.passedCount++; -        break; - -      case 'failed': -        this.failedCount++; -        break; - -      case 'skipped': -        this.skippedCount++; -        break; -    } - -    specView.refresh(); -    this.refresh(); -  }; - -  this.suiteComplete = function(suite) { -    var suiteView = this.views.suites[suite.id]; -    if (isUndefined(suiteView)) { -      return; -    } -    suiteView.refresh(); -  }; - -  this.refresh = function() { - -    if (isUndefined(this.resultsMenu)) { -      this.createResultsMenu(); -    } - -    // currently running UI -    if (isUndefined(this.runningAlert)) { -      this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"}); -      dom.alert.appendChild(this.runningAlert); -    } -    this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount); - -    // skipped specs UI -    if (isUndefined(this.skippedAlert)) { -      this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"}); -    } - -    this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - -    if (this.skippedCount === 1 && isDefined(dom.alert)) { -      dom.alert.appendChild(this.skippedAlert); -    } - -    // passing specs UI -    if (isUndefined(this.passedAlert)) { -      this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"}); -    } -    this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount); - -    // failing specs UI -    if (isUndefined(this.failedAlert)) { -      this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"}); -    } -    this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount); - -    if (this.failedCount === 1 && isDefined(dom.alert)) { -      dom.alert.appendChild(this.failedAlert); -      dom.alert.appendChild(this.resultsMenu); -    } - -    // summary info -    this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount); -    this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing"; -  }; - -  this.complete = function() { -    dom.alert.removeChild(this.runningAlert); - -    this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all"; - -    if (this.failedCount === 0) { -      dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount))); -    } else { -      showDetails(); -    } - -    dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s")); -  }; - -  return this; - -  function showDetails() { -    if (dom.reporter.className.search(/showDetails/) === -1) { -      dom.reporter.className += " showDetails"; -    } -  } - -  function isUndefined(obj) { -    return typeof obj === 'undefined'; -  } - -  function isDefined(obj) { -    return !isUndefined(obj); -  } - -  function specPluralizedFor(count) { -    var str = count + " spec"; -    if (count > 1) { -      str += "s" -    } -    return str; -  } - -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView); - - -jasmine.HtmlReporter.SpecView = function(spec, dom, views) { -  this.spec = spec; -  this.dom = dom; -  this.views = views; - -  this.symbol = this.createDom('li', { className: 'pending' }); -  this.dom.symbolSummary.appendChild(this.symbol); - -  this.summary = this.createDom('div', { className: 'specSummary' }, -      this.createDom('a', { -        className: 'description', -        href: '?spec=' + encodeURIComponent(this.spec.getFullName()), -        title: this.spec.getFullName() -      }, this.spec.description) -  ); - -  this.detail = this.createDom('div', { className: 'specDetail' }, -      this.createDom('a', { -        className: 'description', -        href: '?spec=' + encodeURIComponent(this.spec.getFullName()), -        title: this.spec.getFullName() -      }, this.spec.getFullName()) -  ); -}; - -jasmine.HtmlReporter.SpecView.prototype.status = function() { -  return this.getSpecStatus(this.spec); -}; - -jasmine.HtmlReporter.SpecView.prototype.refresh = function() { -  this.symbol.className = this.status(); - -  switch (this.status()) { -    case 'skipped': -      break; - -    case 'passed': -      this.appendSummaryToSuiteDiv(); -      break; - -    case 'failed': -      this.appendSummaryToSuiteDiv(); -      this.appendFailureDetail(); -      break; -  } -}; - -jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() { -  this.summary.className += ' ' + this.status(); -  this.appendToSummary(this.spec, this.summary); -}; - -jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() { -  this.detail.className += ' ' + this.status(); - -  var resultItems = this.spec.results().getItems(); -  var messagesDiv = this.createDom('div', { className: 'messages' }); - -  for (var i = 0; i < resultItems.length; i++) { -    var result = resultItems[i]; - -    if (result.type == 'log') { -      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); -    } else if (result.type == 'expect' && result.passed && !result.passed()) { -      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - -      if (result.trace.stack) { -        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); -      } -    } -  } - -  if (messagesDiv.childNodes.length > 0) { -    this.detail.appendChild(messagesDiv); -    this.dom.details.appendChild(this.detail); -  } -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) { -  this.suite = suite; -  this.dom = dom; -  this.views = views; - -  this.element = this.createDom('div', { className: 'suite' }, -      this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description) -  ); - -  this.appendToSummary(this.suite, this.element); -}; - -jasmine.HtmlReporter.SuiteView.prototype.status = function() { -  return this.getSpecStatus(this.suite); -}; - -jasmine.HtmlReporter.SuiteView.prototype.refresh = function() { -  this.element.className += " " + this.status(); -}; - -jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView); - -/* @deprecated Use jasmine.HtmlReporter instead - */ -jasmine.TrivialReporter = function(doc) { -  this.document = doc || document; -  this.suiteDivs = {}; -  this.logRunningSpecs = false; -}; - -jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) { -  var el = document.createElement(type); - -  for (var i = 2; i < arguments.length; i++) { -    var child = arguments[i]; - -    if (typeof child === 'string') { -      el.appendChild(document.createTextNode(child)); -    } else { -      if (child) { el.appendChild(child); } -    } -  } - -  for (var attr in attrs) { -    if (attr == "className") { -      el[attr] = attrs[attr]; -    } else { -      el.setAttribute(attr, attrs[attr]); -    } -  } - -  return el; -}; - -jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) { -  var showPassed, showSkipped; - -  this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' }, -      this.createDom('div', { className: 'banner' }, -        this.createDom('div', { className: 'logo' }, -            this.createDom('span', { className: 'title' }, "Jasmine"), -            this.createDom('span', { className: 'version' }, runner.env.versionString())), -        this.createDom('div', { className: 'options' }, -            "Show ", -            showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }), -            this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "), -            showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }), -            this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped") -            ) -          ), - -      this.runnerDiv = this.createDom('div', { className: 'runner running' }, -          this.createDom('a', { className: 'run_spec', href: '?' }, "run all"), -          this.runnerMessageSpan = this.createDom('span', {}, "Running..."), -          this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, "")) -      ); - -  this.document.body.appendChild(this.outerDiv); - -  var suites = runner.suites(); -  for (var i = 0; i < suites.length; i++) { -    var suite = suites[i]; -    var suiteDiv = this.createDom('div', { className: 'suite' }, -        this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"), -        this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description)); -    this.suiteDivs[suite.id] = suiteDiv; -    var parentDiv = this.outerDiv; -    if (suite.parentSuite) { -      parentDiv = this.suiteDivs[suite.parentSuite.id]; -    } -    parentDiv.appendChild(suiteDiv); -  } - -  this.startedAt = new Date(); - -  var self = this; -  showPassed.onclick = function(evt) { -    if (showPassed.checked) { -      self.outerDiv.className += ' show-passed'; -    } else { -      self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, ''); -    } -  }; - -  showSkipped.onclick = function(evt) { -    if (showSkipped.checked) { -      self.outerDiv.className += ' show-skipped'; -    } else { -      self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, ''); -    } -  }; -}; - -jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) { -  var results = runner.results(); -  var className = (results.failedCount > 0) ? "runner failed" : "runner passed"; -  this.runnerDiv.setAttribute("class", className); -  //do it twice for IE -  this.runnerDiv.setAttribute("className", className); -  var specs = runner.specs(); -  var specCount = 0; -  for (var i = 0; i < specs.length; i++) { -    if (this.specFilter(specs[i])) { -      specCount++; -    } -  } -  var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s"); -  message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"; -  this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild); - -  this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString())); -}; - -jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) { -  var results = suite.results(); -  var status = results.passed() ? 'passed' : 'failed'; -  if (results.totalCount === 0) { // todo: change this to check results.skipped -    status = 'skipped'; -  } -  this.suiteDivs[suite.id].className += " " + status; -}; - -jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) { -  if (this.logRunningSpecs) { -    this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...'); -  } -}; - -jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) { -  var results = spec.results(); -  var status = results.passed() ? 'passed' : 'failed'; -  if (results.skipped) { -    status = 'skipped'; -  } -  var specDiv = this.createDom('div', { className: 'spec '  + status }, -      this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"), -      this.createDom('a', { -        className: 'description', -        href: '?spec=' + encodeURIComponent(spec.getFullName()), -        title: spec.getFullName() -      }, spec.description)); - - -  var resultItems = results.getItems(); -  var messagesDiv = this.createDom('div', { className: 'messages' }); -  for (var i = 0; i < resultItems.length; i++) { -    var result = resultItems[i]; - -    if (result.type == 'log') { -      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString())); -    } else if (result.type == 'expect' && result.passed && !result.passed()) { -      messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message)); - -      if (result.trace.stack) { -        messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack)); -      } -    } -  } - -  if (messagesDiv.childNodes.length > 0) { -    specDiv.appendChild(messagesDiv); -  } - -  this.suiteDivs[spec.suite.id].appendChild(specDiv); -}; - -jasmine.TrivialReporter.prototype.log = function() { -  var console = jasmine.getGlobal().console; -  if (console && console.log) { -    if (console.log.apply) { -      console.log.apply(console, arguments); -    } else { -      console.log(arguments); // ie fix: console.log.apply doesn't exist on ie -    } -  } -}; - -jasmine.TrivialReporter.prototype.getLocation = function() { -  return this.document.location; -}; - -jasmine.TrivialReporter.prototype.specFilter = function(spec) { -  var paramMap = {}; -  var params = this.getLocation().search.substring(1).split('&'); -  for (var i = 0; i < params.length; i++) { -    var p = params[i].split('='); -    paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]); -  } - -  if (!paramMap.spec) { -    return true; -  } -  return spec.getFullName().indexOf(paramMap.spec) === 0; -}; diff --git a/spec/lib/jasmine/jasmine.css b/spec/lib/jasmine/jasmine.css deleted file mode 100644 index 826e575..0000000 --- a/spec/lib/jasmine/jasmine.css +++ /dev/null @@ -1,81 +0,0 @@ -body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; } - -#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } -#HTMLReporter a { text-decoration: none; } -#HTMLReporter a:hover { text-decoration: underline; } -#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; } -#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; } -#HTMLReporter #jasmine_content { position: fixed; right: 100%; } -#HTMLReporter .version { color: #aaaaaa; } -#HTMLReporter .banner { margin-top: 14px; } -#HTMLReporter .duration { color: #aaaaaa; float: right; } -#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; } -#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; } -#HTMLReporter .symbolSummary li.passed { font-size: 14px; } -#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; } -#HTMLReporter .symbolSummary li.failed { line-height: 9px; } -#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; } -#HTMLReporter .symbolSummary li.skipped { font-size: 14px; } -#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; } -#HTMLReporter .symbolSummary li.pending { line-height: 11px; } -#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; } -#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } -#HTMLReporter .runningAlert { background-color: #666666; } -#HTMLReporter .skippedAlert { background-color: #aaaaaa; } -#HTMLReporter .skippedAlert:first-child { background-color: #333333; } -#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; } -#HTMLReporter .passingAlert { background-color: #a6b779; } -#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; } -#HTMLReporter .failingAlert { background-color: #cf867e; } -#HTMLReporter .failingAlert:first-child { background-color: #b03911; } -#HTMLReporter .results { margin-top: 14px; } -#HTMLReporter #details { display: none; } -#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; } -#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } -#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } -#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter.showDetails .summary { display: none; } -#HTMLReporter.showDetails #details { display: block; } -#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } -#HTMLReporter .summary { margin-top: 14px; } -#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; } -#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; } -#HTMLReporter .summary .specSummary.failed a { color: #b03911; } -#HTMLReporter .description + .suite { margin-top: 0; } -#HTMLReporter .suite { margin-top: 14px; } -#HTMLReporter .suite a { color: #333333; } -#HTMLReporter #details .specDetail { margin-bottom: 28px; } -#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; } -#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; } -#HTMLReporter .resultMessage span.result { display: block; } -#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } - -#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ } -#TrivialReporter a:visited, #TrivialReporter a { color: #303; } -#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; } -#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; } -#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; } -#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; } -#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; } -#TrivialReporter .runner.running { background-color: yellow; } -#TrivialReporter .options { text-align: right; font-size: .8em; } -#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; } -#TrivialReporter .suite .suite { margin: 5px; } -#TrivialReporter .suite.passed { background-color: #dfd; } -#TrivialReporter .suite.failed { background-color: #fdd; } -#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; } -#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; } -#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; } -#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; } -#TrivialReporter .spec.skipped { background-color: #bbb; } -#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; } -#TrivialReporter .passed { background-color: #cfc; display: none; } -#TrivialReporter .failed { background-color: #fbb; } -#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; } -#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; } -#TrivialReporter .resultMessage .mismatch { color: black; } -#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; } -#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; } -#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; } -#TrivialReporter #jasmine_content { position: fixed; right: 100%; } -#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; } diff --git a/spec/lib/jasmine/jasmine.js b/spec/lib/jasmine/jasmine.js deleted file mode 100644 index 03bf89a..0000000 --- a/spec/lib/jasmine/jasmine.js +++ /dev/null @@ -1,2529 +0,0 @@ -var isCommonJS = typeof window == "undefined"; - -/** - * Top level namespace for Jasmine, a lightweight JavaScript BDD/spec/testing framework. - * - * @namespace - */ -var jasmine = {}; -if (isCommonJS) exports.jasmine = jasmine; -/** - * @private - */ -jasmine.unimplementedMethod_ = function() { -  throw new Error("unimplemented method"); -}; - -/** - * Use <code>jasmine.undefined</code> instead of <code>undefined</code>, since <code>undefined</code> is just - * a plain old variable and may be redefined by somebody else. - * - * @private - */ -jasmine.undefined = jasmine.___undefined___; - -/** - * Show diagnostic messages in the console if set to true - * - */ -jasmine.VERBOSE = false; - -/** - * Default interval in milliseconds for event loop yields (e.g. to allow network activity or to refresh the screen with the HTML-based runner). Small values here may result in slow test running. Zero means no updates until all tests have completed. - * - */ -jasmine.DEFAULT_UPDATE_INTERVAL = 250; - -/** - * Default timeout interval in milliseconds for waitsFor() blocks. - */ -jasmine.DEFAULT_TIMEOUT_INTERVAL = 5000; - -jasmine.getGlobal = function() { -  function getGlobal() { -    return this; -  } - -  return getGlobal(); -}; - -/** - * Allows for bound functions to be compared.  Internal use only. - * - * @ignore - * @private - * @param base {Object} bound 'this' for the function - * @param name {Function} function to find - */ -jasmine.bindOriginal_ = function(base, name) { -  var original = base[name]; -  if (original.apply) { -    return function() { -      return original.apply(base, arguments); -    }; -  } else { -    // IE support -    return jasmine.getGlobal()[name]; -  } -}; - -jasmine.setTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'setTimeout'); -jasmine.clearTimeout = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearTimeout'); -jasmine.setInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'setInterval'); -jasmine.clearInterval = jasmine.bindOriginal_(jasmine.getGlobal(), 'clearInterval'); - -jasmine.MessageResult = function(values) { -  this.type = 'log'; -  this.values = values; -  this.trace = new Error(); // todo: test better -}; - -jasmine.MessageResult.prototype.toString = function() { -  var text = ""; -  for (var i = 0; i < this.values.length; i++) { -    if (i > 0) text += " "; -    if (jasmine.isString_(this.values[i])) { -      text += this.values[i]; -    } else { -      text += jasmine.pp(this.values[i]); -    } -  } -  return text; -}; - -jasmine.ExpectationResult = function(params) { -  this.type = 'expect'; -  this.matcherName = params.matcherName; -  this.passed_ = params.passed; -  this.expected = params.expected; -  this.actual = params.actual; -  this.message = this.passed_ ? 'Passed.' : params.message; - -  var trace = (params.trace || new Error(this.message)); -  this.trace = this.passed_ ? '' : trace; -}; - -jasmine.ExpectationResult.prototype.toString = function () { -  return this.message; -}; - -jasmine.ExpectationResult.prototype.passed = function () { -  return this.passed_; -}; - -/** - * Getter for the Jasmine environment. Ensures one gets created - */ -jasmine.getEnv = function() { -  var env = jasmine.currentEnv_ = jasmine.currentEnv_ || new jasmine.Env(); -  return env; -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isArray_ = function(value) { -  return jasmine.isA_("Array", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isString_ = function(value) { -  return jasmine.isA_("String", value); -}; - -/** - * @ignore - * @private - * @param value - * @returns {Boolean} - */ -jasmine.isNumber_ = function(value) { -  return jasmine.isA_("Number", value); -}; - -/** - * @ignore - * @private - * @param {String} typeName - * @param value - * @returns {Boolean} - */ -jasmine.isA_ = function(typeName, value) { -  return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; -}; - -/** - * Pretty printer for expecations.  Takes any object and turns it into a human-readable string. - * - * @param value {Object} an object to be outputted - * @returns {String} - */ -jasmine.pp = function(value) { -  var stringPrettyPrinter = new jasmine.StringPrettyPrinter(); -  stringPrettyPrinter.format(value); -  return stringPrettyPrinter.string; -}; - -/** - * Returns true if the object is a DOM Node. - * - * @param {Object} obj object to check - * @returns {Boolean} - */ -jasmine.isDomNode = function(obj) { -  return obj.nodeType > 0; -}; - -/** - * Returns a matchable 'generic' object of the class type.  For use in expecations of type when values don't matter. - * - * @example - * // don't care about which function is passed in, as long as it's a function - * expect(mySpy).toHaveBeenCalledWith(jasmine.any(Function)); - * - * @param {Class} clazz - * @returns matchable object of the type clazz - */ -jasmine.any = function(clazz) { -  return new jasmine.Matchers.Any(clazz); -}; - -/** - * Returns a matchable subset of a JSON object. For use in expectations when you don't care about all of the - * attributes on the object. - * - * @example - * // don't care about any other attributes than foo. - * expect(mySpy).toHaveBeenCalledWith(jasmine.objectContaining({foo: "bar"}); - * - * @param sample {Object} sample - * @returns matchable object for the sample - */ -jasmine.objectContaining = function (sample) { -    return new jasmine.Matchers.ObjectContaining(sample); -}; - -/** - * Jasmine Spies are test doubles that can act as stubs, spies, fakes or when used in an expecation, mocks. - * - * Spies should be created in test setup, before expectations.  They can then be checked, using the standard Jasmine - * expectation syntax. Spies can be checked if they were called or not and what the calling params were. - * - * A Spy has the following fields: wasCalled, callCount, mostRecentCall, and argsForCall (see docs). - * - * Spies are torn down at the end of every spec. - * - * Note: Do <b>not</b> call new jasmine.Spy() directly - a spy must be created using spyOn, jasmine.createSpy or jasmine.createSpyObj. - * - * @example - * // a stub - * var myStub = jasmine.createSpy('myStub');  // can be used anywhere - * - * // spy example - * var foo = { - *   not: function(bool) { return !bool; } - * } - * - * // actual foo.not will not be called, execution stops - * spyOn(foo, 'not'); - - // foo.not spied upon, execution will continue to implementation - * spyOn(foo, 'not').andCallThrough(); - * - * // fake example - * var foo = { - *   not: function(bool) { return !bool; } - * } - * - * // foo.not(val) will return val - * spyOn(foo, 'not').andCallFake(function(value) {return value;}); - * - * // mock example - * foo.not(7 == 7); - * expect(foo.not).toHaveBeenCalled(); - * expect(foo.not).toHaveBeenCalledWith(true); - * - * @constructor - * @see spyOn, jasmine.createSpy, jasmine.createSpyObj - * @param {String} name - */ -jasmine.Spy = function(name) { -  /** -   * The name of the spy, if provided. -   */ -  this.identity = name || 'unknown'; -  /** -   *  Is this Object a spy? -   */ -  this.isSpy = true; -  /** -   * The actual function this spy stubs. -   */ -  this.plan = function() { -  }; -  /** -   * Tracking of the most recent call to the spy. -   * @example -   * var mySpy = jasmine.createSpy('foo'); -   * mySpy(1, 2); -   * mySpy.mostRecentCall.args = [1, 2]; -   */ -  this.mostRecentCall = {}; - -  /** -   * Holds arguments for each call to the spy, indexed by call count -   * @example -   * var mySpy = jasmine.createSpy('foo'); -   * mySpy(1, 2); -   * mySpy(7, 8); -   * mySpy.mostRecentCall.args = [7, 8]; -   * mySpy.argsForCall[0] = [1, 2]; -   * mySpy.argsForCall[1] = [7, 8]; -   */ -  this.argsForCall = []; -  this.calls = []; -}; - -/** - * Tells a spy to call through to the actual implemenatation. - * - * @example - * var foo = { - *   bar: function() { // do some stuff } - * } - * - * // defining a spy on an existing property: foo.bar - * spyOn(foo, 'bar').andCallThrough(); - */ -jasmine.Spy.prototype.andCallThrough = function() { -  this.plan = this.originalValue; -  return this; -}; - -/** - * For setting the return value of a spy. - * - * @example - * // defining a spy from scratch: foo() returns 'baz' - * var foo = jasmine.createSpy('spy on foo').andReturn('baz'); - * - * // defining a spy on an existing property: foo.bar() returns 'baz' - * spyOn(foo, 'bar').andReturn('baz'); - * - * @param {Object} value - */ -jasmine.Spy.prototype.andReturn = function(value) { -  this.plan = function() { -    return value; -  }; -  return this; -}; - -/** - * For throwing an exception when a spy is called. - * - * @example - * // defining a spy from scratch: foo() throws an exception w/ message 'ouch' - * var foo = jasmine.createSpy('spy on foo').andThrow('baz'); - * - * // defining a spy on an existing property: foo.bar() throws an exception w/ message 'ouch' - * spyOn(foo, 'bar').andThrow('baz'); - * - * @param {String} exceptionMsg - */ -jasmine.Spy.prototype.andThrow = function(exceptionMsg) { -  this.plan = function() { -    throw exceptionMsg; -  }; -  return this; -}; - -/** - * Calls an alternate implementation when a spy is called. - * - * @example - * var baz = function() { - *   // do some stuff, return something - * } - * // defining a spy from scratch: foo() calls the function baz - * var foo = jasmine.createSpy('spy on foo').andCall(baz); - * - * // defining a spy on an existing property: foo.bar() calls an anonymnous function - * spyOn(foo, 'bar').andCall(function() { return 'baz';} ); - * - * @param {Function} fakeFunc - */ -jasmine.Spy.prototype.andCallFake = function(fakeFunc) { -  this.plan = fakeFunc; -  return this; -}; - -/** - * Resets all of a spy's the tracking variables so that it can be used again. - * - * @example - * spyOn(foo, 'bar'); - * - * foo.bar(); - * - * expect(foo.bar.callCount).toEqual(1); - * - * foo.bar.reset(); - * - * expect(foo.bar.callCount).toEqual(0); - */ -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); - -  for (var prop in spy) { -    spyObj[prop] = spy[prop]; -  } - -  spyObj.reset(); - -  return spyObj; -}; - -/** - * Determines whether an object is a spy. - * - * @param {jasmine.Spy|Object} putativeSpy - * @returns {Boolean} - */ -jasmine.isSpy = function(putativeSpy) { -  return putativeSpy && putativeSpy.isSpy; -}; - -/** - * Creates a more complicated spy: an Object that has every property a function that is a spy.  Used for stubbing something - * large in one call. - * - * @param {String} baseName name of spy class - * @param {Array} methodNames array of names of methods to make spies - */ -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; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the current spec's output. - * - * Be careful not to leave calls to <code>jasmine.log</code> in production code. - */ -jasmine.log = function() { -  var spec = jasmine.getEnv().currentSpec; -  spec.log.apply(spec, arguments); -}; - -/** - * Function that installs a spy on an existing object's method name.  Used within a Spec to create a spy. - * - * @example - * // spy example - * var foo = { - *   not: function(bool) { return !bool; } - * } - * spyOn(foo, 'not'); // actual foo.not will not be called, execution stops - * - * @see jasmine.createSpy - * @param obj - * @param methodName - * @returns a Jasmine spy that can be chained with all spy methods - */ -var spyOn = function(obj, methodName) { -  return jasmine.getEnv().currentSpec.spyOn(obj, methodName); -}; -if (isCommonJS) exports.spyOn = spyOn; - -/** - * Creates a Jasmine spec that will be added to the current suite. - * - * // TODO: pending tests - * - * @example - * it('should be true', function() { - *   expect(true).toEqual(true); - * }); - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var it = function(desc, func) { -  return jasmine.getEnv().it(desc, func); -}; -if (isCommonJS) exports.it = it; - -/** - * Creates a <em>disabled</em> Jasmine spec. - * - * A convenience method that allows existing specs to be disabled temporarily during development. - * - * @param {String} desc description of this specification - * @param {Function} func defines the preconditions and expectations of the spec - */ -var xit = function(desc, func) { -  return jasmine.getEnv().xit(desc, func); -}; -if (isCommonJS) exports.xit = xit; - -/** - * Starts a chain for a Jasmine expectation. - * - * It is passed an Object that is the actual value and should chain to one of the many - * jasmine.Matchers functions. - * - * @param {Object} actual Actual value to test against and expected value - */ -var expect = function(actual) { -  return jasmine.getEnv().currentSpec.expect(actual); -}; -if (isCommonJS) exports.expect = expect; - -/** - * Defines part of a jasmine spec.  Used in cominbination with waits or waitsFor in asynchrnous specs. - * - * @param {Function} func Function that defines part of a jasmine spec. - */ -var runs = function(func) { -  jasmine.getEnv().currentSpec.runs(func); -}; -if (isCommonJS) exports.runs = runs; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -var waits = function(timeout) { -  jasmine.getEnv().currentSpec.waits(timeout); -}; -if (isCommonJS) exports.waits = waits; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -var waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { -  jasmine.getEnv().currentSpec.waitsFor.apply(jasmine.getEnv().currentSpec, arguments); -}; -if (isCommonJS) exports.waitsFor = waitsFor; - -/** - * A function that is called before each spec in a suite. - * - * Used for spec setup, including validating assumptions. - * - * @param {Function} beforeEachFunction - */ -var beforeEach = function(beforeEachFunction) { -  jasmine.getEnv().beforeEach(beforeEachFunction); -}; -if (isCommonJS) exports.beforeEach = beforeEach; - -/** - * A function that is called after each spec in a suite. - * - * Used for restoring any state that is hijacked during spec execution. - * - * @param {Function} afterEachFunction - */ -var afterEach = function(afterEachFunction) { -  jasmine.getEnv().afterEach(afterEachFunction); -}; -if (isCommonJS) exports.afterEach = afterEach; - -/** - * Defines a suite of specifications. - * - * Stores the description and all defined specs in the Jasmine environment as one suite of specs. Variables declared - * are accessible by calls to beforeEach, it, and afterEach. Describe blocks can be nested, allowing for specialization - * of setup in some tests. - * - * @example - * // TODO: a simple suite - * - * // TODO: a simple suite with a nested describe block - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var describe = function(description, specDefinitions) { -  return jasmine.getEnv().describe(description, specDefinitions); -}; -if (isCommonJS) exports.describe = describe; - -/** - * Disables a suite of specifications.  Used to disable some suites in a file, or files, temporarily during development. - * - * @param {String} description A string, usually the class under test. - * @param {Function} specDefinitions function that defines several specs. - */ -var xdescribe = function(description, specDefinitions) { -  return jasmine.getEnv().xdescribe(description, specDefinitions); -}; -if (isCommonJS) exports.xdescribe = xdescribe; - - -// Provide the XMLHttpRequest class for IE 5.x-6.x: -jasmine.XmlHttpRequest = (typeof XMLHttpRequest == "undefined") ? function() { -  function tryIt(f) { -    try { -      return f(); -    } catch(e) { -    } -    return null; -  } - -  var xhr = tryIt(function() { -    return new ActiveXObject("Msxml2.XMLHTTP.6.0"); -  }) || -    tryIt(function() { -      return new ActiveXObject("Msxml2.XMLHTTP.3.0"); -    }) || -    tryIt(function() { -      return new ActiveXObject("Msxml2.XMLHTTP"); -    }) || -    tryIt(function() { -      return new ActiveXObject("Microsoft.XMLHTTP"); -    }); - -  if (!xhr) throw new Error("This browser does not support XMLHttpRequest."); - -  return xhr; -} : XMLHttpRequest; -/** - * @namespace - */ -jasmine.util = {}; - -/** - * Declare that a child class inherit it's prototype from the parent class. - * - * @private - * @param {Function} childClass - * @param {Function} parentClass - */ -jasmine.util.inherit = function(childClass, parentClass) { -  /** -   * @private -   */ -  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, '<') -    .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.extend = function(destination, source) { -  for (var property in source) destination[property] = source[property]; -  return destination; -}; - -/** - * Environment for Jasmine - * - * @constructor - */ -jasmine.Env = function() { -  this.currentSpec = null; -  this.currentSuite = null; -  this.currentRunner_ = new jasmine.Runner(this); - -  this.reporter = new jasmine.MultiReporter(); - -  this.updateInterval = jasmine.DEFAULT_UPDATE_INTERVAL; -  this.defaultTimeoutInterval = jasmine.DEFAULT_TIMEOUT_INTERVAL; -  this.lastUpdate = 0; -  this.specFilter = function() { -    return true; -  }; - -  this.nextSpecId_ = 0; -  this.nextSuiteId_ = 0; -  this.equalityTesters_ = []; - -  // wrap matchers -  this.matchersClass = function() { -    jasmine.Matchers.apply(this, arguments); -  }; -  jasmine.util.inherit(this.matchersClass, jasmine.Matchers); - -  jasmine.Matchers.wrapInto_(jasmine.Matchers.prototype, this.matchersClass); -}; - - -jasmine.Env.prototype.setTimeout = jasmine.setTimeout; -jasmine.Env.prototype.clearTimeout = jasmine.clearTimeout; -jasmine.Env.prototype.setInterval = jasmine.setInterval; -jasmine.Env.prototype.clearInterval = jasmine.clearInterval; - -/** - * @returns an object containing jasmine version build info, if set. - */ -jasmine.Env.prototype.version = function () { -  if (jasmine.version_) { -    return jasmine.version_; -  } else { -    throw new Error('Version not set'); -  } -}; - -/** - * @returns string containing jasmine version build info, if set. - */ -jasmine.Env.prototype.versionString = function() { -  if (!jasmine.version_) { -    return "version unknown"; -  } - -  var version = this.version(); -  var versionString = version.major + "." + version.minor + "." + version.build; -  if (version.release_candidate) { -    versionString += ".rc" + version.release_candidate; -  } -  versionString += " revision " + version.revision; -  return versionString; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSpecId = function () { -  return this.nextSpecId_++; -}; - -/** - * @returns a sequential integer starting at 0 - */ -jasmine.Env.prototype.nextSuiteId = function () { -  return this.nextSuiteId_++; -}; - -/** - * Register a reporter to receive status updates from Jasmine. - * @param {jasmine.Reporter} reporter An object which will receive status updates. - */ -jasmine.Env.prototype.addReporter = function(reporter) { -  this.reporter.addReporter(reporter); -}; - -jasmine.Env.prototype.execute = function() { -  this.currentRunner_.execute(); -}; - -jasmine.Env.prototype.describe = function(description, specDefinitions) { -  var suite = new jasmine.Suite(this, description, specDefinitions, this.currentSuite); - -  var parentSuite = this.currentSuite; -  if (parentSuite) { -    parentSuite.add(suite); -  } else { -    this.currentRunner_.add(suite); -  } - -  this.currentSuite = suite; - -  var declarationError = null; -  try { -    specDefinitions.call(suite); -  } catch(e) { -    declarationError = e; -  } - -  if (declarationError) { -    this.it("encountered a declaration exception", function() { -      throw declarationError; -    }); -  } - -  this.currentSuite = parentSuite; - -  return suite; -}; - -jasmine.Env.prototype.beforeEach = function(beforeEachFunction) { -  if (this.currentSuite) { -    this.currentSuite.beforeEach(beforeEachFunction); -  } else { -    this.currentRunner_.beforeEach(beforeEachFunction); -  } -}; - -jasmine.Env.prototype.currentRunner = function () { -  return this.currentRunner_; -}; - -jasmine.Env.prototype.afterEach = function(afterEachFunction) { -  if (this.currentSuite) { -    this.currentSuite.afterEach(afterEachFunction); -  } else { -    this.currentRunner_.afterEach(afterEachFunction); -  } - -}; - -jasmine.Env.prototype.xdescribe = function(desc, specDefinitions) { -  return { -    execute: function() { -    } -  }; -}; - -jasmine.Env.prototype.it = function(description, func) { -  var spec = new jasmine.Spec(this, this.currentSuite, description); -  this.currentSuite.add(spec); -  this.currentSpec = spec; - -  if (func) { -    spec.runs(func); -  } - -  return spec; -}; - -jasmine.Env.prototype.xit = function(desc, func) { -  return { -    id: this.nextSpecId(), -    runs: function() { -    } -  }; -}; - -jasmine.Env.prototype.compareObjects_ = function(a, b, mismatchKeys, mismatchValues) { -  if (a.__Jasmine_been_here_before__ === b && b.__Jasmine_been_here_before__ === a) { -    return true; -  } - -  a.__Jasmine_been_here_before__ = b; -  b.__Jasmine_been_here_before__ = a; - -  var hasKey = function(obj, keyName) { -    return obj !== null && obj[keyName] !== jasmine.undefined; -  }; - -  for (var property in b) { -    if (!hasKey(a, property) && hasKey(b, property)) { -      mismatchKeys.push("expected has key '" + property + "', but missing from actual."); -    } -  } -  for (property in a) { -    if (!hasKey(b, property) && hasKey(a, property)) { -      mismatchKeys.push("expected missing key '" + property + "', but present in actual."); -    } -  } -  for (property in b) { -    if (property == '__Jasmine_been_here_before__') continue; -    if (!this.equals_(a[property], b[property], mismatchKeys, mismatchValues)) { -      mismatchValues.push("'" + property + "' was '" + (b[property] ? jasmine.util.htmlEscape(b[property].toString()) : b[property]) + "' in expected, but was '" + (a[property] ? jasmine.util.htmlEscape(a[property].toString()) : a[property]) + "' in actual."); -    } -  } - -  if (jasmine.isArray_(a) && jasmine.isArray_(b) && a.length != b.length) { -    mismatchValues.push("arrays were not the same length"); -  } - -  delete a.__Jasmine_been_here_before__; -  delete b.__Jasmine_been_here_before__; -  return (mismatchKeys.length === 0 && mismatchValues.length === 0); -}; - -jasmine.Env.prototype.equals_ = function(a, b, mismatchKeys, mismatchValues) { -  mismatchKeys = mismatchKeys || []; -  mismatchValues = mismatchValues || []; - -  for (var i = 0; i < this.equalityTesters_.length; i++) { -    var equalityTester = this.equalityTesters_[i]; -    var result = equalityTester(a, b, this, mismatchKeys, mismatchValues); -    if (result !== jasmine.undefined) return result; -  } - -  if (a === b) return true; - -  if (a === jasmine.undefined || a === null || b === jasmine.undefined || b === null) { -    return (a == jasmine.undefined && b == jasmine.undefined); -  } - -  if (jasmine.isDomNode(a) && jasmine.isDomNode(b)) { -    return a === b; -  } - -  if (a instanceof Date && b instanceof Date) { -    return a.getTime() == b.getTime(); -  } - -  if (a.jasmineMatches) { -    return a.jasmineMatches(b); -  } - -  if (b.jasmineMatches) { -    return b.jasmineMatches(a); -  } - -  if (a instanceof jasmine.Matchers.ObjectContaining) { -    return a.matches(b); -  } - -  if (b instanceof jasmine.Matchers.ObjectContaining) { -    return b.matches(a); -  } - -  if (jasmine.isString_(a) && jasmine.isString_(b)) { -    return (a == b); -  } - -  if (jasmine.isNumber_(a) && jasmine.isNumber_(b)) { -    return (a == b); -  } - -  if (typeof a === "object" && typeof b === "object") { -    return this.compareObjects_(a, b, mismatchKeys, mismatchValues); -  } - -  //Straight check -  return (a === b); -}; - -jasmine.Env.prototype.contains_ = function(haystack, needle) { -  if (jasmine.isArray_(haystack)) { -    for (var i = 0; i < haystack.length; i++) { -      if (this.equals_(haystack[i], needle)) return true; -    } -    return false; -  } -  return haystack.indexOf(needle) >= 0; -}; - -jasmine.Env.prototype.addEqualityTester = function(equalityTester) { -  this.equalityTesters_.push(equalityTester); -}; -/** No-op base class for Jasmine reporters. - * - * @constructor - */ -jasmine.Reporter = function() { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerStarting = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportRunnerResults = function(runner) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecStarting = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.reportSpecResults = function(spec) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.Reporter.prototype.log = function(str) { -}; - -/** - * Blocks are functions with executable code that make up a spec. - * - * @constructor - * @param {jasmine.Env} env - * @param {Function} func - * @param {jasmine.Spec} spec - */ -jasmine.Block = function(env, func, spec) { -  this.env = env; -  this.func = func; -  this.spec = spec; -}; - -jasmine.Block.prototype.execute = function(onComplete) {   -  try { -    this.func.apply(this.spec); -  } catch (e) { -    this.spec.fail(e); -  } -  onComplete(); -}; -/** JavaScript API reporter. - * - * @constructor - */ -jasmine.JsApiReporter = function() { -  this.started = false; -  this.finished = false; -  this.suites_ = []; -  this.results_ = {}; -}; - -jasmine.JsApiReporter.prototype.reportRunnerStarting = function(runner) { -  this.started = true; -  var suites = runner.topLevelSuites(); -  for (var i = 0; i < suites.length; i++) { -    var suite = suites[i]; -    this.suites_.push(this.summarize_(suite)); -  } -}; - -jasmine.JsApiReporter.prototype.suites = function() { -  return this.suites_; -}; - -jasmine.JsApiReporter.prototype.summarize_ = function(suiteOrSpec) { -  var isSuite = suiteOrSpec instanceof jasmine.Suite; -  var summary = { -    id: suiteOrSpec.id, -    name: suiteOrSpec.description, -    type: isSuite ? 'suite' : 'spec', -    children: [] -  }; -   -  if (isSuite) { -    var children = suiteOrSpec.children(); -    for (var i = 0; i < children.length; i++) { -      summary.children.push(this.summarize_(children[i])); -    } -  } -  return summary; -}; - -jasmine.JsApiReporter.prototype.results = function() { -  return this.results_; -}; - -jasmine.JsApiReporter.prototype.resultsForSpec = function(specId) { -  return this.results_[specId]; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportRunnerResults = function(runner) { -  this.finished = true; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSuiteResults = function(suite) { -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.reportSpecResults = function(spec) { -  this.results_[spec.id] = { -    messages: spec.results().getItems(), -    result: spec.results().failedCount > 0 ? "failed" : "passed" -  }; -}; - -//noinspection JSUnusedLocalSymbols -jasmine.JsApiReporter.prototype.log = function(str) { -}; - -jasmine.JsApiReporter.prototype.resultsForSpecs = function(specIds){ -  var results = {}; -  for (var i = 0; i < specIds.length; i++) { -    var specId = specIds[i]; -    results[specId] = this.summarizeResult_(this.results_[specId]); -  } -  return results; -}; - -jasmine.JsApiReporter.prototype.summarizeResult_ = function(result){ -  var summaryMessages = []; -  var messagesLength = result.messages.length; -  for (var messageIndex = 0; messageIndex < messagesLength; messageIndex++) { -    var resultMessage = result.messages[messageIndex]; -    summaryMessages.push({ -      text: resultMessage.type == 'log' ? resultMessage.toString() : jasmine.undefined, -      passed: resultMessage.passed ? resultMessage.passed() : true, -      type: resultMessage.type, -      message: resultMessage.message, -      trace: { -        stack: resultMessage.passed && !resultMessage.passed() ? resultMessage.trace.stack : jasmine.undefined -      } -    }); -  } - -  return { -    result : result.result, -    messages : summaryMessages -  }; -}; - -/** - * @constructor - * @param {jasmine.Env} env - * @param actual - * @param {jasmine.Spec} spec - */ -jasmine.Matchers = function(env, actual, spec, opt_isNot) { -  this.env = env; -  this.actual = actual; -  this.spec = spec; -  this.isNot = opt_isNot || false; -  this.reportWasCalled_ = 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!"); -}; - -// todo: @deprecated Deprecated as of Jasmine 0.10. Rewrite your custom matchers to return true or false. [xw] -jasmine.Matchers.prototype.report = function(result, failing_message, details) { -  throw new Error("As of jasmine 0.11, custom matchers must be implemented differently -- please see jasmine docs"); -}; - -jasmine.Matchers.wrapInto_ = function(prototype, matchersClass) { -  for (var methodName in prototype) { -    if (methodName == 'report') continue; -    var orig = prototype[methodName]; -    matchersClass.prototype[methodName] = jasmine.Matchers.matcherFn_(methodName, orig); -  } -}; - -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; -    } - -    if (this.reportWasCalled_) return result; - -    var message; -    if (!result) { -      if (this.message) { -        message = this.message.apply(this, arguments); -        if (jasmine.isArray_(message)) { -          message = message[this.isNot ? 1 : 0]; -        } -      } 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 += "."; -      } -    } -    var expectationResult = new jasmine.ExpectationResult({ -      matcherName: matcherName, -      passed: result, -      expected: matcherArgs.length > 1 ? matcherArgs : matcherArgs[0], -      actual: this.actual, -      message: message -    }); -    this.spec.addMatcherResult(expectationResult); -    return jasmine.undefined; -  }; -}; - - - - -/** - * toBe: compares the actual to the expected using === - * @param expected - */ -jasmine.Matchers.prototype.toBe = function(expected) { -  return this.actual === expected; -}; - -/** - * toNotBe: compares the actual to the expected using !== - * @param expected - * @deprecated as of 1.0. Use not.toBe() instead. - */ -jasmine.Matchers.prototype.toNotBe = function(expected) { -  return this.actual !== expected; -}; - -/** - * toEqual: compares the actual to the expected using common sense equality. Handles Objects, Arrays, etc. - * - * @param expected - */ -jasmine.Matchers.prototype.toEqual = function(expected) { -  return this.env.equals_(this.actual, expected); -}; - -/** - * toNotEqual: compares the actual to the expected using the ! of jasmine.Matchers.toEqual - * @param expected - * @deprecated as of 1.0. Use not.toEqual() instead. - */ -jasmine.Matchers.prototype.toNotEqual = function(expected) { -  return !this.env.equals_(this.actual, expected); -}; - -/** - * Matcher that compares the actual to the expected using a regular expression.  Constructs a RegExp, so takes - * a pattern or a String. - * - * @param expected - */ -jasmine.Matchers.prototype.toMatch = function(expected) { -  return new RegExp(expected).test(this.actual); -}; - -/** - * Matcher that compares the actual to the expected using the boolean inverse of jasmine.Matchers.toMatch - * @param expected - * @deprecated as of 1.0. Use not.toMatch() instead. - */ -jasmine.Matchers.prototype.toNotMatch = function(expected) { -  return !(new RegExp(expected).test(this.actual)); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeDefined = function() { -  return (this.actual !== jasmine.undefined); -}; - -/** - * Matcher that compares the actual to jasmine.undefined. - */ -jasmine.Matchers.prototype.toBeUndefined = function() { -  return (this.actual === jasmine.undefined); -}; - -/** - * Matcher that compares the actual to null. - */ -jasmine.Matchers.prototype.toBeNull = function() { -  return (this.actual === null); -}; - -/** - * Matcher that boolean not-nots the actual. - */ -jasmine.Matchers.prototype.toBeTruthy = function() { -  return !!this.actual; -}; - - -/** - * Matcher that boolean nots the actual. - */ -jasmine.Matchers.prototype.toBeFalsy = function() { -  return !this.actual; -}; - - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called. - */ -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; -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalled() instead */ -jasmine.Matchers.prototype.wasCalled = jasmine.Matchers.prototype.toHaveBeenCalled; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was not called. - * - * @deprecated Use expect(xxx).not.toHaveBeenCalled() instead - */ -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; -}; - -/** - * Matcher that checks to see if the actual, a Jasmine spy, was called with a set of parameters. - * - * @example - * - */ -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() { -    if (this.actual.callCount === 0) { -      // todo: what should the failure message for .not.toHaveBeenCalledWith() be? is this right? test better. [xw] -      return [ -        "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but it was never called.", -        "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but it was." -      ]; -    } else { -      return [ -        "Expected spy " + this.actual.identity + " to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall), -        "Expected spy " + this.actual.identity + " not to have been called with " + jasmine.pp(expectedArgs) + " but was called with " + jasmine.pp(this.actual.argsForCall) -      ]; -    } -  }; - -  return this.env.contains_(this.actual.argsForCall, expectedArgs); -}; - -/** @deprecated Use expect(xxx).toHaveBeenCalledWith() instead */ -jasmine.Matchers.prototype.wasCalledWith = jasmine.Matchers.prototype.toHaveBeenCalledWith; - -/** @deprecated Use expect(xxx).not.toHaveBeenCalledWith() instead */ -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); -}; - -/** - * Matcher that checks that the expected item is an element in the actual Array. - * - * @param {Object} expected - */ -jasmine.Matchers.prototype.toContain = function(expected) { -  return this.env.contains_(this.actual, expected); -}; - -/** - * Matcher that checks that the expected item is NOT an element in the actual Array. - * - * @param {Object} expected - * @deprecated as of 1.0. Use not.toContain() instead. - */ -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; -}; - -/** - * Matcher that checks that the expected item is equal to the actual item - * up to a given level of decimal precision (default 2). - * - * @param {Number} expected - * @param {Number} precision - */ -jasmine.Matchers.prototype.toBeCloseTo = function(expected, precision) { -  if (!(precision === 0)) { -    precision = precision || 2; -  } -  var multiplier = Math.pow(10, precision); -  var actual = Math.round(this.actual * multiplier); -  expected = Math.round(expected * multiplier); -  return expected == actual; -}; - -/** - * Matcher that checks that the expected exception was thrown by the actual. - * - * @param {String} expected - */ -jasmine.Matchers.prototype.toThrow = function(expected) { -  var result = false; -  var exception; -  if (typeof this.actual != 'function') { -    throw new Error('Actual is not a function'); -  } -  try { -    this.actual(); -  } catch (e) { -    exception = e; -  } -  if (exception) { -    result = (expected === jasmine.undefined || this.env.equals_(exception.message || exception, expected.message || expected)); -  } - -  var not = this.isNot ? "not " : ""; - -  this.message = function() { -    if (exception && (expected === jasmine.undefined || !this.env.equals_(exception.message || exception, expected.message || expected))) { -      return ["Expected function " + not + "to throw", expected ? expected.message || expected : "an exception", ", but it threw", exception.message || exception].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.any(' + this.expectedClass + ')>'; -}; - -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 && obj[keyName] !== jasmine.undefined; -  }; - -  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 "<jasmine.objectContaining(" + jasmine.pp(this.sample) + ")>"; -}; -// Mock setTimeout, clearTimeout -// Contributed by Pivotal Computer Systems, www.pivotalsf.com - -jasmine.FakeTimer = function() { -  this.reset(); - -  var self = this; -  self.setTimeout = function(funcToCall, millis) { -    self.timeoutsMade++; -    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, false); -    return self.timeoutsMade; -  }; - -  self.setInterval = function(funcToCall, millis) { -    self.timeoutsMade++; -    self.scheduleFunction(self.timeoutsMade, funcToCall, millis, true); -    return self.timeoutsMade; -  }; - -  self.clearTimeout = function(timeoutKey) { -    self.scheduledFunctions[timeoutKey] = jasmine.undefined; -  }; - -  self.clearInterval = function(timeoutKey) { -    self.scheduledFunctions[timeoutKey] = jasmine.undefined; -  }; - -}; - -jasmine.FakeTimer.prototype.reset = function() { -  this.timeoutsMade = 0; -  this.scheduledFunctions = {}; -  this.nowMillis = 0; -}; - -jasmine.FakeTimer.prototype.tick = function(millis) { -  var oldMillis = this.nowMillis; -  var newMillis = oldMillis + millis; -  this.runFunctionsWithinRange(oldMillis, newMillis); -  this.nowMillis = newMillis; -}; - -jasmine.FakeTimer.prototype.runFunctionsWithinRange = function(oldMillis, nowMillis) { -  var scheduledFunc; -  var funcsToRun = []; -  for (var timeoutKey in this.scheduledFunctions) { -    scheduledFunc = this.scheduledFunctions[timeoutKey]; -    if (scheduledFunc != jasmine.undefined && -        scheduledFunc.runAtMillis >= oldMillis && -        scheduledFunc.runAtMillis <= nowMillis) { -      funcsToRun.push(scheduledFunc); -      this.scheduledFunctions[timeoutKey] = jasmine.undefined; -    } -  } - -  if (funcsToRun.length > 0) { -    funcsToRun.sort(function(a, b) { -      return a.runAtMillis - b.runAtMillis; -    }); -    for (var i = 0; i < funcsToRun.length; ++i) { -      try { -        var funcToRun = funcsToRun[i]; -        this.nowMillis = funcToRun.runAtMillis; -        funcToRun.funcToCall(); -        if (funcToRun.recurring) { -          this.scheduleFunction(funcToRun.timeoutKey, -              funcToRun.funcToCall, -              funcToRun.millis, -              true); -        } -      } catch(e) { -      } -    } -    this.runFunctionsWithinRange(oldMillis, nowMillis); -  } -}; - -jasmine.FakeTimer.prototype.scheduleFunction = function(timeoutKey, funcToCall, millis, recurring) { -  this.scheduledFunctions[timeoutKey] = { -    runAtMillis: this.nowMillis + millis, -    funcToCall: funcToCall, -    recurring: recurring, -    timeoutKey: timeoutKey, -    millis: millis -  }; -}; - -/** - * @namespace - */ -jasmine.Clock = { -  defaultFakeTimer: new jasmine.FakeTimer(), - -  reset: function() { -    jasmine.Clock.assertInstalled(); -    jasmine.Clock.defaultFakeTimer.reset(); -  }, - -  tick: function(millis) { -    jasmine.Clock.assertInstalled(); -    jasmine.Clock.defaultFakeTimer.tick(millis); -  }, - -  runFunctionsWithinRange: function(oldMillis, nowMillis) { -    jasmine.Clock.defaultFakeTimer.runFunctionsWithinRange(oldMillis, nowMillis); -  }, - -  scheduleFunction: function(timeoutKey, funcToCall, millis, recurring) { -    jasmine.Clock.defaultFakeTimer.scheduleFunction(timeoutKey, funcToCall, millis, recurring); -  }, - -  useMock: function() { -    if (!jasmine.Clock.isInstalled()) { -      var spec = jasmine.getEnv().currentSpec; -      spec.after(jasmine.Clock.uninstallMock); - -      jasmine.Clock.installMock(); -    } -  }, - -  installMock: function() { -    jasmine.Clock.installed = jasmine.Clock.defaultFakeTimer; -  }, - -  uninstallMock: function() { -    jasmine.Clock.assertInstalled(); -    jasmine.Clock.installed = jasmine.Clock.real; -  }, - -  real: { -    setTimeout: jasmine.getGlobal().setTimeout, -    clearTimeout: jasmine.getGlobal().clearTimeout, -    setInterval: jasmine.getGlobal().setInterval, -    clearInterval: jasmine.getGlobal().clearInterval -  }, - -  assertInstalled: function() { -    if (!jasmine.Clock.isInstalled()) { -      throw new Error("Mock clock is not installed, use jasmine.Clock.useMock()"); -    } -  }, - -  isInstalled: function() { -    return jasmine.Clock.installed == jasmine.Clock.defaultFakeTimer; -  }, - -  installed: null -}; -jasmine.Clock.installed = jasmine.Clock.real; - -//else for IE support -jasmine.getGlobal().setTimeout = function(funcToCall, millis) { -  if (jasmine.Clock.installed.setTimeout.apply) { -    return jasmine.Clock.installed.setTimeout.apply(this, arguments); -  } else { -    return jasmine.Clock.installed.setTimeout(funcToCall, millis); -  } -}; - -jasmine.getGlobal().setInterval = function(funcToCall, millis) { -  if (jasmine.Clock.installed.setInterval.apply) { -    return jasmine.Clock.installed.setInterval.apply(this, arguments); -  } else { -    return jasmine.Clock.installed.setInterval(funcToCall, millis); -  } -}; - -jasmine.getGlobal().clearTimeout = function(timeoutKey) { -  if (jasmine.Clock.installed.clearTimeout.apply) { -    return jasmine.Clock.installed.clearTimeout.apply(this, arguments); -  } else { -    return jasmine.Clock.installed.clearTimeout(timeoutKey); -  } -}; - -jasmine.getGlobal().clearInterval = function(timeoutKey) { -  if (jasmine.Clock.installed.clearTimeout.apply) { -    return jasmine.Clock.installed.clearInterval.apply(this, arguments); -  } else { -    return jasmine.Clock.installed.clearInterval(timeoutKey); -  } -}; - -/** - * @constructor - */ -jasmine.MultiReporter = function() { -  this.subReporters_ = []; -}; -jasmine.util.inherit(jasmine.MultiReporter, jasmine.Reporter); - -jasmine.MultiReporter.prototype.addReporter = function(reporter) { -  this.subReporters_.push(reporter); -}; - -(function() { -  var functionNames = [ -    "reportRunnerStarting", -    "reportRunnerResults", -    "reportSuiteResults", -    "reportSpecStarting", -    "reportSpecResults", -    "log" -  ]; -  for (var i = 0; i < functionNames.length; i++) { -    var functionName = functionNames[i]; -    jasmine.MultiReporter.prototype[functionName] = (function(functionName) { -      return function() { -        for (var j = 0; j < this.subReporters_.length; j++) { -          var subReporter = this.subReporters_[j]; -          if (subReporter[functionName]) { -            subReporter[functionName].apply(subReporter, arguments); -          } -        } -      }; -    })(functionName); -  } -})(); -/** - * Holds results for a set of Jasmine spec. Allows for the results array to hold another jasmine.NestedResults - * - * @constructor - */ -jasmine.NestedResults = function() { -  /** -   * The total count of results -   */ -  this.totalCount = 0; -  /** -   * Number of passed results -   */ -  this.passedCount = 0; -  /** -   * Number of failed results -   */ -  this.failedCount = 0; -  /** -   * Was this suite/spec skipped? -   */ -  this.skipped = false; -  /** -   * @ignore -   */ -  this.items_ = []; -}; - -/** - * Roll up the result counts. - * - * @param result - */ -jasmine.NestedResults.prototype.rollupCounts = function(result) { -  this.totalCount += result.totalCount; -  this.passedCount += result.passedCount; -  this.failedCount += result.failedCount; -}; - -/** - * Adds a log message. - * @param values Array of message parts which will be concatenated later. - */ -jasmine.NestedResults.prototype.log = function(values) { -  this.items_.push(new jasmine.MessageResult(values)); -}; - -/** - * Getter for the results: message & results. - */ -jasmine.NestedResults.prototype.getItems = function() { -  return this.items_; -}; - -/** - * Adds a result, tracking counts (total, passed, & failed) - * @param {jasmine.ExpectationResult|jasmine.NestedResults} result - */ -jasmine.NestedResults.prototype.addResult = function(result) { -  if (result.type != 'log') { -    if (result.items_) { -      this.rollupCounts(result); -    } else { -      this.totalCount++; -      if (result.passed()) { -        this.passedCount++; -      } else { -        this.failedCount++; -      } -    } -  } -  this.items_.push(result); -}; - -/** - * @returns {Boolean} True if <b>everything</b> below passed - */ -jasmine.NestedResults.prototype.passed = function() { -  return this.passedCount === this.totalCount; -}; -/** - * Base class for pretty printing for expectation results. - */ -jasmine.PrettyPrinter = function() { -  this.ppNestLevel_ = 0; -}; - -/** - * Formats a value in a nice, human-readable string. - * - * @param value - */ -jasmine.PrettyPrinter.prototype.format = function(value) { -  if (this.ppNestLevel_ > 40) { -    throw new Error('jasmine.PrettyPrinter: format() nested too deeply!'); -  } - -  this.ppNestLevel_++; -  try { -    if (value === jasmine.undefined) { -      this.emitScalar('undefined'); -    } else if (value === null) { -      this.emitScalar('null'); -    } else if (value === jasmine.getGlobal()) { -      this.emitScalar('<global>'); -    } 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('<circular reference: ' + (jasmine.isArray_(value) ? 'Array' : 'Object') + '>'); -    } else if (jasmine.isArray_(value) || typeof value == 'object') { -      value.__Jasmine_been_here_before__ = true; -      if (jasmine.isArray_(value)) { -        this.emitArray(value); -      } else { -        this.emitObject(value); -      } -      delete value.__Jasmine_been_here_before__; -    } else { -      this.emitScalar(value.toString()); -    } -  } finally { -    this.ppNestLevel_--; -  } -}; - -jasmine.PrettyPrinter.prototype.iterateObject = function(obj, fn) { -  for (var property in obj) { -    if (property == '__Jasmine_been_here_before__') continue; -    fn(property, obj.__lookupGetter__ ? (obj.__lookupGetter__(property) !== jasmine.undefined &&  -                                         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) { -  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) { -  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('<getter>'); -    } else { -      self.format(obj[property]); -    } -  }); - -  this.append(' }'); -}; - -jasmine.StringPrettyPrinter.prototype.append = function(value) { -  this.string += value; -}; -jasmine.Queue = function(env) { -  this.env = env; -  this.blocks = []; -  this.running = false; -  this.index = 0; -  this.offset = 0; -  this.abort = false; -}; - -jasmine.Queue.prototype.addBefore = function(block) { -  this.blocks.unshift(block); -}; - -jasmine.Queue.prototype.add = function(block) { -  this.blocks.push(block); -}; - -jasmine.Queue.prototype.insertNext = function(block) { -  this.blocks.splice((this.index + this.offset + 1), 0, block); -  this.offset++; -}; - -jasmine.Queue.prototype.start = function(onComplete) { -  this.running = true; -  this.onComplete = onComplete; -  this.next_(); -}; - -jasmine.Queue.prototype.isRunning = function() { -  return this.running; -}; - -jasmine.Queue.LOOP_DONT_RECURSE = true; - -jasmine.Queue.prototype.next_ = function() { -  var self = this; -  var goAgain = true; - -  while (goAgain) { -    goAgain = false; -     -    if (self.index < self.blocks.length && !this.abort) { -      var calledSynchronously = true; -      var completedSynchronously = false; - -      var onComplete = function () { -        if (jasmine.Queue.LOOP_DONT_RECURSE && calledSynchronously) { -          completedSynchronously = true; -          return; -        } - -        if (self.blocks[self.index].abort) { -          self.abort = true; -        } - -        self.offset = 0; -        self.index++; - -        var now = new Date().getTime(); -        if (self.env.updateInterval && now - self.env.lastUpdate > self.env.updateInterval) { -          self.env.lastUpdate = now; -          self.env.setTimeout(function() { -            self.next_(); -          }, 0); -        } else { -          if (jasmine.Queue.LOOP_DONT_RECURSE && completedSynchronously) { -            goAgain = true; -          } else { -            self.next_(); -          } -        } -      }; -      self.blocks[self.index].execute(onComplete); - -      calledSynchronously = false; -      if (completedSynchronously) { -        onComplete(); -      } -       -    } else { -      self.running = false; -      if (self.onComplete) { -        self.onComplete(); -      } -    } -  } -}; - -jasmine.Queue.prototype.results = function() { -  var results = new jasmine.NestedResults(); -  for (var i = 0; i < this.blocks.length; i++) { -    if (this.blocks[i].results) { -      results.addResult(this.blocks[i].results()); -    } -  } -  return results; -}; - - -/** - * Runner - * - * @constructor - * @param {jasmine.Env} env - */ -jasmine.Runner = function(env) { -  var self = this; -  self.env = env; -  self.queue = new jasmine.Queue(env); -  self.before_ = []; -  self.after_ = []; -  self.suites_ = []; -}; - -jasmine.Runner.prototype.execute = function() { -  var self = this; -  if (self.env.reporter.reportRunnerStarting) { -    self.env.reporter.reportRunnerStarting(this); -  } -  self.queue.start(function () { -    self.finishCallback(); -  }); -}; - -jasmine.Runner.prototype.beforeEach = function(beforeEachFunction) { -  beforeEachFunction.typeName = 'beforeEach'; -  this.before_.splice(0,0,beforeEachFunction); -}; - -jasmine.Runner.prototype.afterEach = function(afterEachFunction) { -  afterEachFunction.typeName = 'afterEach'; -  this.after_.splice(0,0,afterEachFunction); -}; - - -jasmine.Runner.prototype.finishCallback = function() { -  this.env.reporter.reportRunnerResults(this); -}; - -jasmine.Runner.prototype.addSuite = function(suite) { -  this.suites_.push(suite); -}; - -jasmine.Runner.prototype.add = function(block) { -  if (block instanceof jasmine.Suite) { -    this.addSuite(block); -  } -  this.queue.add(block); -}; - -jasmine.Runner.prototype.specs = function () { -  var suites = this.suites(); -  var specs = []; -  for (var i = 0; i < suites.length; i++) { -    specs = specs.concat(suites[i].specs()); -  } -  return specs; -}; - -jasmine.Runner.prototype.suites = function() { -  return this.suites_; -}; - -jasmine.Runner.prototype.topLevelSuites = function() { -  var topLevelSuites = []; -  for (var i = 0; i < this.suites_.length; i++) { -    if (!this.suites_[i].parentSuite) { -      topLevelSuites.push(this.suites_[i]); -    } -  } -  return topLevelSuites; -}; - -jasmine.Runner.prototype.results = function() { -  return this.queue.results(); -}; -/** - * Internal representation of a Jasmine specification, or test. - * - * @constructor - * @param {jasmine.Env} env - * @param {jasmine.Suite} suite - * @param {String} description - */ -jasmine.Spec = function(env, suite, description) { -  if (!env) { -    throw new Error('jasmine.Env() required'); -  } -  if (!suite) { -    throw new Error('jasmine.Suite() required'); -  } -  var spec = this; -  spec.id = env.nextSpecId ? env.nextSpecId() : null; -  spec.env = env; -  spec.suite = suite; -  spec.description = description; -  spec.queue = new jasmine.Queue(env); - -  spec.afterCallbacks = []; -  spec.spies_ = []; - -  spec.results_ = new jasmine.NestedResults(); -  spec.results_.description = description; -  spec.matchersClass = null; -}; - -jasmine.Spec.prototype.getFullName = function() { -  return this.suite.getFullName() + ' ' + this.description + '.'; -}; - - -jasmine.Spec.prototype.results = function() { -  return this.results_; -}; - -/** - * All parameters are pretty-printed and concatenated together, then written to the spec's output. - * - * Be careful not to leave calls to <code>jasmine.log</code> in production code. - */ -jasmine.Spec.prototype.log = function() { -  return this.results_.log(arguments); -}; - -jasmine.Spec.prototype.runs = function (func) { -  var block = new jasmine.Block(this.env, func, this); -  this.addToQueue(block); -  return this; -}; - -jasmine.Spec.prototype.addToQueue = function (block) { -  if (this.queue.isRunning()) { -    this.queue.insertNext(block); -  } else { -    this.queue.add(block); -  } -}; - -/** - * @param {jasmine.ExpectationResult} result - */ -jasmine.Spec.prototype.addMatcherResult = function(result) { -  this.results_.addResult(result); -}; - -jasmine.Spec.prototype.expect = function(actual) { -  var positive = new (this.getMatchersClass_())(this.env, actual, this); -  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true); -  return positive; -}; - -/** - * Waits a fixed time period before moving to the next block. - * - * @deprecated Use waitsFor() instead - * @param {Number} timeout milliseconds to wait - */ -jasmine.Spec.prototype.waits = function(timeout) { -  var waitsFunc = new jasmine.WaitsBlock(this.env, timeout, this); -  this.addToQueue(waitsFunc); -  return this; -}; - -/** - * Waits for the latchFunction to return true before proceeding to the next block. - * - * @param {Function} latchFunction - * @param {String} optional_timeoutMessage - * @param {Number} optional_timeout - */ -jasmine.Spec.prototype.waitsFor = function(latchFunction, optional_timeoutMessage, optional_timeout) { -  var latchFunction_ = null; -  var optional_timeoutMessage_ = null; -  var optional_timeout_ = null; - -  for (var i = 0; i < arguments.length; i++) { -    var arg = arguments[i]; -    switch (typeof arg) { -      case 'function': -        latchFunction_ = arg; -        break; -      case 'string': -        optional_timeoutMessage_ = arg; -        break; -      case 'number': -        optional_timeout_ = arg; -        break; -    } -  } - -  var waitsForFunc = new jasmine.WaitsForBlock(this.env, optional_timeout_, latchFunction_, optional_timeoutMessage_, this); -  this.addToQueue(waitsForFunc); -  return this; -}; - -jasmine.Spec.prototype.fail = function (e) { -  var expectationResult = new jasmine.ExpectationResult({ -    passed: false, -    message: e ? jasmine.util.formatException(e) : 'Exception', -    trace: { stack: e.stack } -  }); -  this.results_.addResult(expectationResult); -}; - -jasmine.Spec.prototype.getMatchersClass_ = function() { -  return this.matchersClass || this.env.matchersClass; -}; - -jasmine.Spec.prototype.addMatchers = function(matchersPrototype) { -  var parent = this.getMatchersClass_(); -  var newMatchersClass = function() { -    parent.apply(this, arguments); -  }; -  jasmine.util.inherit(newMatchersClass, parent); -  jasmine.Matchers.wrapInto_(matchersPrototype, newMatchersClass); -  this.matchersClass = newMatchersClass; -}; - -jasmine.Spec.prototype.finishCallback = function() { -  this.env.reporter.reportSpecResults(this); -}; - -jasmine.Spec.prototype.finish = function(onComplete) { -  this.removeAllSpies(); -  this.finishCallback(); -  if (onComplete) { -    onComplete(); -  } -}; - -jasmine.Spec.prototype.after = function(doAfter) { -  if (this.queue.isRunning()) { -    this.queue.add(new jasmine.Block(this.env, doAfter, this)); -  } else { -    this.afterCallbacks.unshift(doAfter); -  } -}; - -jasmine.Spec.prototype.execute = function(onComplete) { -  var spec = this; -  if (!spec.env.specFilter(spec)) { -    spec.results_.skipped = true; -    spec.finish(onComplete); -    return; -  } - -  this.env.reporter.reportSpecStarting(this); - -  spec.env.currentSpec = spec; - -  spec.addBeforesAndAftersToQueue(); - -  spec.queue.start(function () { -    spec.finish(onComplete); -  }); -}; - -jasmine.Spec.prototype.addBeforesAndAftersToQueue = function() { -  var runner = this.env.currentRunner(); -  var i; - -  for (var suite = this.suite; suite; suite = suite.parentSuite) { -    for (i = 0; i < suite.before_.length; i++) { -      this.queue.addBefore(new jasmine.Block(this.env, suite.before_[i], this)); -    } -  } -  for (i = 0; i < runner.before_.length; i++) { -    this.queue.addBefore(new jasmine.Block(this.env, runner.before_[i], this)); -  } -  for (i = 0; i < this.afterCallbacks.length; i++) { -    this.queue.add(new jasmine.Block(this.env, this.afterCallbacks[i], this)); -  } -  for (suite = this.suite; suite; suite = suite.parentSuite) { -    for (i = 0; i < suite.after_.length; i++) { -      this.queue.add(new jasmine.Block(this.env, suite.after_[i], this)); -    } -  } -  for (i = 0; i < runner.after_.length; i++) { -    this.queue.add(new jasmine.Block(this.env, runner.after_[i], this)); -  } -}; - -jasmine.Spec.prototype.explodes = function() { -  throw 'explodes function should not have been called'; -}; - -jasmine.Spec.prototype.spyOn = function(obj, methodName, ignoreMethodDoesntExist) { -  if (obj == jasmine.undefined) { -    throw "spyOn could not find an object to spy upon for " + methodName + "()"; -  } - -  if (!ignoreMethodDoesntExist && obj[methodName] === jasmine.undefined) { -    throw methodName + '() method does not exist'; -  } - -  if (!ignoreMethodDoesntExist && obj[methodName] && obj[methodName].isSpy) { -    throw new Error(methodName + ' has already been spied upon'); -  } - -  var spyObj = jasmine.createSpy(methodName); - -  this.spies_.push(spyObj); -  spyObj.baseObj = obj; -  spyObj.methodName = methodName; -  spyObj.originalValue = obj[methodName]; - -  obj[methodName] = spyObj; - -  return spyObj; -}; - -jasmine.Spec.prototype.removeAllSpies = function() { -  for (var i = 0; i < this.spies_.length; i++) { -    var spy = this.spies_[i]; -    spy.baseObj[spy.methodName] = spy.originalValue; -  } -  this.spies_ = []; -}; - -/** - * Internal representation of a Jasmine suite. - * - * @constructor - * @param {jasmine.Env} env - * @param {String} description - * @param {Function} specDefinitions - * @param {jasmine.Suite} parentSuite - */ -jasmine.Suite = function(env, description, specDefinitions, parentSuite) { -  var self = this; -  self.id = env.nextSuiteId ? env.nextSuiteId() : null; -  self.description = description; -  self.queue = new jasmine.Queue(env); -  self.parentSuite = parentSuite; -  self.env = env; -  self.before_ = []; -  self.after_ = []; -  self.children_ = []; -  self.suites_ = []; -  self.specs_ = []; -}; - -jasmine.Suite.prototype.getFullName = function() { -  var fullName = this.description; -  for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { -    fullName = parentSuite.description + ' ' + fullName; -  } -  return fullName; -}; - -jasmine.Suite.prototype.finish = function(onComplete) { -  this.env.reporter.reportSuiteResults(this); -  this.finished = true; -  if (typeof(onComplete) == 'function') { -    onComplete(); -  } -}; - -jasmine.Suite.prototype.beforeEach = function(beforeEachFunction) { -  beforeEachFunction.typeName = 'beforeEach'; -  this.before_.unshift(beforeEachFunction); -}; - -jasmine.Suite.prototype.afterEach = function(afterEachFunction) { -  afterEachFunction.typeName = 'afterEach'; -  this.after_.unshift(afterEachFunction); -}; - -jasmine.Suite.prototype.results = function() { -  return this.queue.results(); -}; - -jasmine.Suite.prototype.add = function(suiteOrSpec) { -  this.children_.push(suiteOrSpec); -  if (suiteOrSpec instanceof jasmine.Suite) { -    this.suites_.push(suiteOrSpec); -    this.env.currentRunner().addSuite(suiteOrSpec); -  } else { -    this.specs_.push(suiteOrSpec); -  } -  this.queue.add(suiteOrSpec); -}; - -jasmine.Suite.prototype.specs = function() { -  return this.specs_; -}; - -jasmine.Suite.prototype.suites = function() { -  return this.suites_; -}; - -jasmine.Suite.prototype.children = function() { -  return this.children_; -}; - -jasmine.Suite.prototype.execute = function(onComplete) { -  var self = this; -  this.queue.start(function () { -    self.finish(onComplete); -  }); -}; -jasmine.WaitsBlock = function(env, timeout, spec) { -  this.timeout = timeout; -  jasmine.Block.call(this, env, null, spec); -}; - -jasmine.util.inherit(jasmine.WaitsBlock, jasmine.Block); - -jasmine.WaitsBlock.prototype.execute = function (onComplete) { -  if (jasmine.VERBOSE) { -    this.env.reporter.log('>> Jasmine waiting for ' + this.timeout + ' ms...'); -  } -  this.env.setTimeout(function () { -    onComplete(); -  }, this.timeout); -}; -/** - * A block which waits for some condition to become true, with timeout. - * - * @constructor - * @extends jasmine.Block - * @param {jasmine.Env} env The Jasmine environment. - * @param {Number} timeout The maximum time in milliseconds to wait for the condition to become true. - * @param {Function} latchFunction A function which returns true when the desired condition has been met. - * @param {String} message The message to display if the desired condition hasn't been met within the given time period. - * @param {jasmine.Spec} spec The Jasmine spec. - */ -jasmine.WaitsForBlock = function(env, timeout, latchFunction, message, spec) { -  this.timeout = timeout || env.defaultTimeoutInterval; -  this.latchFunction = latchFunction; -  this.message = message; -  this.totalTimeSpentWaitingForLatch = 0; -  jasmine.Block.call(this, env, null, spec); -}; -jasmine.util.inherit(jasmine.WaitsForBlock, jasmine.Block); - -jasmine.WaitsForBlock.TIMEOUT_INCREMENT = 10; - -jasmine.WaitsForBlock.prototype.execute = function(onComplete) { -  if (jasmine.VERBOSE) { -    this.env.reporter.log('>> Jasmine waiting for ' + (this.message || 'something to happen')); -  } -  var latchFunctionResult; -  try { -    latchFunctionResult = this.latchFunction.apply(this.spec); -  } catch (e) { -    this.spec.fail(e); -    onComplete(); -    return; -  } - -  if (latchFunctionResult) { -    onComplete(); -  } else if (this.totalTimeSpentWaitingForLatch >= this.timeout) { -    var message = 'timed out after ' + this.timeout + ' msec waiting for ' + (this.message || 'something to happen'); -    this.spec.fail({ -      name: 'timeout', -      message: message -    }); - -    this.abort = true; -    onComplete(); -  } else { -    this.totalTimeSpentWaitingForLatch += jasmine.WaitsForBlock.TIMEOUT_INCREMENT; -    var self = this; -    this.env.setTimeout(function() { -      self.execute(onComplete); -    }, jasmine.WaitsForBlock.TIMEOUT_INCREMENT); -  } -}; - -jasmine.version_= { -  "major": 1, -  "minor": 2, -  "build": 0, -  "revision": 1337005947 -}; diff --git a/spec/lib/jasmine/jasmine_favicon.png b/spec/lib/jasmine/jasmine_favicon.pngBinary files differ deleted file mode 100644 index 218f3b4..0000000 --- a/spec/lib/jasmine/jasmine_favicon.png +++ /dev/null diff --git a/spec/lib/sinon/sinon-1.3.4.js b/spec/lib/sinon/sinon-1.3.4.js deleted file mode 100644 index 365781b..0000000 --- a/spec/lib/sinon/sinon-1.3.4.js +++ /dev/null @@ -1,3555 +0,0 @@ -/** - * Sinon.JS 1.3.4, 2012/04/16 - * - * @author Christian Johansen (christian@cjohansen.no) - * - * (The BSD License) - *  - * Copyright (c) 2010-2011, Christian Johansen, christian@cjohansen.no - * All rights reserved. - *  - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - *  - *     * Redistributions of source code must retain the above copyright notice, - *       this list of conditions and the following disclaimer. - *     * Redistributions in binary form must reproduce the above copyright notice, - *       this list of conditions and the following disclaimer in the documentation - *       and/or other materials provided with the distribution. - *     * Neither the name of Christian Johansen nor the names of his contributors - *       may be used to endorse or promote products derived from this software - *       without specific prior written permission. - *  - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -"use strict"; -var sinon = (function () { -var buster = (function (buster, setTimeout) { -    function extend(target) { -        if (!target) { -            return; -        } - -        for (var i = 1, l = arguments.length, prop; i < l; ++i) { -            for (prop in arguments[i]) { -                target[prop] = arguments[i][prop]; -            } -        } - -        return target; -    } - -    var div = typeof document != "undefined" && document.createElement("div"); - -    return extend(buster, { -        bind: function (obj, methOrProp) { -            var method = typeof methOrProp == "string" ? obj[methOrProp] : methOrProp; -            var args = Array.prototype.slice.call(arguments, 2); - -            return function () { -                var allArgs = args.concat(Array.prototype.slice.call(arguments)); -                return method.apply(obj, allArgs); -            }; -        }, - -        create: (function () { -            function F() {} - -            return function create(object) { -                F.prototype = object; -                return new F(); -            } -        }()), - -        extend: extend, - -        nextTick: function (callback) { -            if (typeof process != "undefined" && process.nextTick) { -                return process.nextTick(callback); -            } - -            setTimeout(callback, 0); -        }, - -        functionName: function (func) { -            if (!func) return ""; -            if (func.displayName) return func.displayName; -            if (func.name) return func.name; - -            var matches = func.toString().match(/function\s+([^\(]+)/m); -            return matches && matches[1] || ""; -        }, - -        isNode: function (obj) { -            if (!div) return false; - -            try { -                obj.appendChild(div); -                obj.removeChild(div); -            } catch (e) { -                return false; -            } - -            return true; -        }, - -        isElement: function (obj) { -            return obj && buster.isNode(obj) && obj.nodeType === 1; -        } -    }); -}(buster || {}, setTimeout)); - -if (typeof module == "object" && typeof require == "function") { -    module.exports = buster; -    buster.eventEmitter = require("./buster-event-emitter"); - -    Object.defineProperty(buster, "defineVersionGetter", { -        get: function () { -            return require("./define-version-getter"); -        } -    }); -} -if (typeof buster === "undefined") { -    var buster = {}; -} - -if (typeof module === "object" && typeof require === "function") { -    buster = require("buster-core"); -} - -buster.format = buster.format || {}; -buster.format.excludeConstructors = ["Object", /^.$/]; -buster.format.quoteStrings = true; - -buster.format.ascii = (function () { -     -    function keys(object) { -        var k = Object.keys && Object.keys(object) || []; - -        if (k.length == 0) { -            for (var prop in object) { -                if (object.hasOwnProperty(prop)) { -                    k.push(prop); -                } -            } -        } - -        return k.sort(); -    } - -    function isCircular(object, objects) { -        if (typeof object != "object") { -            return false; -        } - -        for (var i = 0, l = objects.length; i < l; ++i) { -            if (objects[i] === object) { -                return true; -            } -        } - -        return false; -    } - -    function ascii(object, processed, indent) { -        if (typeof object == "string") { -            var quote = typeof this.quoteStrings != "boolean" || this.quoteStrings; -            return processed || quote ? '"' + object + '"' : object; -        } - -        if (typeof object == "function" && !(object instanceof RegExp)) { -            return ascii.func(object); -        } - -        processed = processed || []; - -        if (isCircular(object, processed)) { -            return "[Circular]"; -        } - -        if (Object.prototype.toString.call(object) == "[object Array]") { -            return ascii.array.call(this, object); -        } - -        if (!object) { -            return "" + object; -        } - -        if (buster.isElement(object)) { -            return ascii.element(object); -        } - -        if (typeof object.toString == "function" && -            object.toString !== Object.prototype.toString) { -            return object.toString(); -        } - -        return ascii.object.call(this, object, processed, indent); -    } - -    ascii.func = function (func) { -        return "function " + buster.functionName(func) + "() {}"; -    }; - -    ascii.array = function (array, processed) { -        processed = processed || []; -        processed.push(array); -        var pieces = []; - -        for (var i = 0, l = array.length; i < l; ++i) { -            pieces.push(ascii.call(this, array[i], processed)); -        } - -        return "[" + pieces.join(", ") + "]"; -    }; - -    ascii.object = function (object, processed, indent) { -        processed = processed || []; -        processed.push(object); -        indent = indent || 0; -        var pieces = [], properties = keys(object), prop, str, obj; -        var is = ""; -        var length = 3; - -        for (var i = 0, l = indent; i < l; ++i) { -            is += " "; -        } - -        for (i = 0, l = properties.length; i < l; ++i) { -            prop = properties[i]; -            obj = object[prop]; - -            if (isCircular(obj, processed)) { -                str = "[Circular]"; -            } else { -                str = ascii.call(this, obj, processed, indent + 2); -            } - -            str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str; -            length += str.length; -            pieces.push(str); -        } - -        var cons = ascii.constructorName.call(this, object); -        var prefix = cons ? "[" + cons + "] " : "" - -        return (length + indent) > 80 ? -            prefix + "{\n  " + is + pieces.join(",\n  " + is) + "\n" + is + "}" : -            prefix + "{ " + pieces.join(", ") + " }"; -    }; - -    ascii.element = function (element) { -        var tagName = element.tagName.toLowerCase(); -        var attrs = element.attributes, attribute, pairs = [], attrName; - -        for (var i = 0, l = attrs.length; i < l; ++i) { -            attribute = attrs.item(i); -            attrName = attribute.nodeName.toLowerCase().replace("html:", ""); - -            if (attrName == "contenteditable" && attribute.nodeValue == "inherit") { -                continue; -            } - -            if (!!attribute.nodeValue) { -                pairs.push(attrName + "=\"" + attribute.nodeValue + "\""); -            } -        } - -        var formatted = "<" + tagName + (pairs.length > 0 ? " " : ""); -        var content = element.innerHTML; - -        if (content.length > 20) { -            content = content.substr(0, 20) + "[...]"; -        } - -        var res = formatted + pairs.join(" ") + ">" + content + "</" + tagName + ">"; - -        return res.replace(/ contentEditable="inherit"/, ""); -    }; - -    ascii.constructorName = function (object) { -        var name = buster.functionName(object && object.constructor); -        var excludes = this.excludeConstructors || buster.format.excludeConstructors || []; - -        for (var i = 0, l = excludes.length; i < l; ++i) { -            if (typeof excludes[i] == "string" && excludes[i] == name) { -                return ""; -            } else if (excludes[i].test && excludes[i].test(name)) { -                return ""; -            } -        } - -        return name; -    }; - -    return ascii; -}()); - -if (typeof module != "undefined") { -    module.exports = buster.format; -} -/*jslint eqeqeq: false, onevar: false, forin: true, nomen: false, regexp: false, plusplus: false*/ -/*global module, require, __dirname, document*/ -/** - * Sinon core utilities. For internal use only. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -var sinon = (function (buster) { -    var div = typeof document != "undefined" && document.createElement("div"); -    var hasOwn = Object.prototype.hasOwnProperty; - -    function isDOMNode(obj) { -        var success = false; - -        try { -            obj.appendChild(div); -            success = div.parentNode == obj; -        } catch (e) { -            return false; -        } finally { -            try { -                obj.removeChild(div); -            } catch (e) { -                // Remove failed, not much we can do about that -            } -        } - -        return success; -    } - -    function isElement(obj) { -        return div && obj && obj.nodeType === 1 && isDOMNode(obj); -    } - -    function isFunction(obj) { -        return !!(obj && obj.constructor && obj.call && obj.apply); -    } - -    function mirrorProperties(target, source) { -        for (var prop in source) { -            if (!hasOwn.call(target, prop)) { -                target[prop] = source[prop]; -            } -        } -    } - -    var sinon = { -        wrapMethod: function wrapMethod(object, property, method) { -            if (!object) { -                throw new TypeError("Should wrap property of object"); -            } - -            if (typeof method != "function") { -                throw new TypeError("Method wrapper should be function"); -            } - -            var wrappedMethod = object[property]; - -            if (!isFunction(wrappedMethod)) { -                throw new TypeError("Attempted to wrap " + (typeof wrappedMethod) + " property " + -                                    property + " as function"); -            } - -            if (wrappedMethod.restore && wrappedMethod.restore.sinon) { -                throw new TypeError("Attempted to wrap " + property + " which is already wrapped"); -            } - -            if (wrappedMethod.calledBefore) { -                var verb = !!wrappedMethod.returns ? "stubbed" : "spied on"; -                throw new TypeError("Attempted to wrap " + property + " which is already " + verb); -            } - -            // IE 8 does not support hasOwnProperty on the window object. -            var owned = hasOwn.call(object, property); -            object[property] = method; -            method.displayName = property; - -            method.restore = function () { -                if(owned) { -                    object[property] = wrappedMethod; -                } else { -                    delete object[property]; -                } -            }; - -            method.restore.sinon = true; -            mirrorProperties(method, wrappedMethod); - -            return method; -        }, - -        extend: function extend(target) { -            for (var i = 1, l = arguments.length; i < l; i += 1) { -                for (var prop in arguments[i]) { -                    if (arguments[i].hasOwnProperty(prop)) { -                        target[prop] = arguments[i][prop]; -                    } - -                    // DONT ENUM bug, only care about toString -                    if (arguments[i].hasOwnProperty("toString") && -                        arguments[i].toString != target.toString) { -                        target.toString = arguments[i].toString; -                    } -                } -            } - -            return target; -        }, - -        create: function create(proto) { -            var F = function () {}; -            F.prototype = proto; -            return new F(); -        }, - -        deepEqual: function deepEqual(a, b) { -            if (typeof a != "object" || typeof b != "object") { -                return a === b; -            } - -            if (isElement(a) || isElement(b)) { -                return a === b; -            } - -            if (a === b) { -                return true; -            } - -            var aString = Object.prototype.toString.call(a); -            if (aString != Object.prototype.toString.call(b)) { -                return false; -            } - -            if (aString == "[object Array]") { -                if (a.length !== b.length) { -                    return false; -                } - -                for (var i = 0, l = a.length; i < l; i += 1) { -                    if (!deepEqual(a[i], b[i])) { -                        return false; -                    } -                } - -                return true; -            } - -            var prop, aLength = 0, bLength = 0; - -            for (prop in a) { -                aLength += 1; - -                if (!deepEqual(a[prop], b[prop])) { -                    return false; -                } -            } - -            for (prop in b) { -                bLength += 1; -            } - -            if (aLength != bLength) { -                return false; -            } - -            return true; -        }, - -        functionName: function functionName(func) { -            var name = func.displayName || func.name; - -            // Use function decomposition as a last resort to get function -            // name. Does not rely on function decomposition to work - if it -            // doesn't debugging will be slightly less informative -            // (i.e. toString will say 'spy' rather than 'myFunc'). -            if (!name) { -                var matches = func.toString().match(/function ([^\s\(]+)/); -                name = matches && matches[1]; -            } - -            return name; -        }, - -        functionToString: function toString() { -            if (this.getCall && this.callCount) { -                var thisValue, prop, i = this.callCount; - -                while (i--) { -                    thisValue = this.getCall(i).thisValue; - -                    for (prop in thisValue) { -                        if (thisValue[prop] === this) { -                            return prop; -                        } -                    } -                } -            } - -            return this.displayName || "sinon fake"; -        }, - -        getConfig: function (custom) { -            var config = {}; -            custom = custom || {}; -            var defaults = sinon.defaultConfig; - -            for (var prop in defaults) { -                if (defaults.hasOwnProperty(prop)) { -                    config[prop] = custom.hasOwnProperty(prop) ? custom[prop] : defaults[prop]; -                } -            } - -            return config; -        }, - -        format: function (val) { -            return "" + val; -        }, - -        defaultConfig: { -            injectIntoThis: true, -            injectInto: null, -            properties: ["spy", "stub", "mock", "clock", "server", "requests"], -            useFakeTimers: true, -            useFakeServer: true -        }, - -        timesInWords: function timesInWords(count) { -            return count == 1 && "once" || -                count == 2 && "twice" || -                count == 3 && "thrice" || -                (count || 0) + " times"; -        }, - -        calledInOrder: function (spies) { -            for (var i = 1, l = spies.length; i < l; i++) { -                if (!spies[i - 1].calledBefore(spies[i])) { -                    return false; -                } -            } - -            return true; -        }, - -        orderByFirstCall: function (spies) { -            return spies.sort(function (a, b) { -                // uuid, won't ever be equal -                var aCall = a.getCall(0); -                var bCall = b.getCall(0); -                var aId = aCall && aCall.callId || -1; -                var bId = bCall && bCall.callId || -1; - -                return aId < bId ? -1 : 1; -            }); -        }, - -        log: function () {}, - -        logError: function (label, err) { -            var msg = label + " threw exception: " -            sinon.log(msg + "[" + err.name + "] " + err.message); -            if (err.stack) { sinon.log(err.stack); } - -            setTimeout(function () { -                err.message = msg + err.message; -                throw err; -            }, 0); -        } -    }; - -    var isNode = typeof module == "object" && typeof require == "function"; - -    if (isNode) { -        try { -            buster = { format: require("buster-format") }; -        } catch (e) {} -        module.exports = sinon; -        module.exports.spy = require("./sinon/spy"); -        module.exports.stub = require("./sinon/stub"); -        module.exports.mock = require("./sinon/mock"); -        module.exports.collection = require("./sinon/collection"); -        module.exports.assert = require("./sinon/assert"); -        module.exports.sandbox = require("./sinon/sandbox"); -        module.exports.test = require("./sinon/test"); -        module.exports.testCase = require("./sinon/test_case"); -        module.exports.assert = require("./sinon/assert"); -    } - -    if (buster) { -        var formatter = sinon.create(buster.format); -        formatter.quoteStrings = false; -        sinon.format = function () { -            return formatter.ascii.apply(formatter, arguments); -        }; -    } else if (isNode) { -        try { -            var util = require("util"); -            sinon.format = function (value) { -                return typeof value == "object" ? util.inspect(value) : value; -            }; -        } catch (e) { -            /* Node, but no util module - would be very old, but better safe than -             sorry */ -        } -    } - -    return sinon; -}(typeof buster == "object" && buster)); - -/* @depend ../sinon.js */ -/*jslint eqeqeq: false, onevar: false, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Spy functions - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; -    var spyCall; -    var callId = 0; -    var push = [].push; -    var slice = Array.prototype.slice; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon) { -        return; -    } - -    function spy(object, property) { -        if (!property && typeof object == "function") { -            return spy.create(object); -        } - -        if (!object || !property) { -            return spy.create(function () {}); -        } - -        var method = object[property]; -        return sinon.wrapMethod(object, property, spy.create(method)); -    } - -    sinon.extend(spy, (function () { - -        function delegateToCalls(api, method, matchAny, actual, notCalled) { -            api[method] = function () { -                if (!this.called) { -                    if (notCalled) { -                        return notCalled.apply(this, arguments); -                    } -                    return false; -                } - -                var currentCall; -                var matches = 0; - -                for (var i = 0, l = this.callCount; i < l; i += 1) { -                    currentCall = this.getCall(i); - -                    if (currentCall[actual || method].apply(currentCall, arguments)) { -                        matches += 1; - -                        if (matchAny) { -                            return true; -                        } -                    } -                } - -                return matches === this.callCount; -            }; -        } - -        function matchingFake(fakes, args, strict) { -            if (!fakes) { -                return; -            } - -            var alen = args.length; - -            for (var i = 0, l = fakes.length; i < l; i++) { -                if (fakes[i].matches(args, strict)) { -                    return fakes[i]; -                } -            } -        } - -        function incrementCallCount() { -            this.called = true; -            this.callCount += 1; -            this.calledOnce = this.callCount == 1; -            this.calledTwice = this.callCount == 2; -            this.calledThrice = this.callCount == 3; -        } - -        function createCallProperties() { -            this.firstCall = this.getCall(0); -            this.secondCall = this.getCall(1); -            this.thirdCall = this.getCall(2); -            this.lastCall = this.getCall(this.callCount - 1); -        } - -        var uuid = 0; - -        // Public API -        var spyApi = { -            reset: function () { -                this.called = false; -                this.calledOnce = false; -                this.calledTwice = false; -                this.calledThrice = false; -                this.callCount = 0; -                this.firstCall = null; -                this.secondCall = null; -                this.thirdCall = null; -                this.lastCall = null; -                this.args = []; -                this.returnValues = []; -                this.thisValues = []; -                this.exceptions = []; -                this.callIds = []; -            }, - -            create: function create(func) { -                var name; - -                if (typeof func != "function") { -                    func = function () {}; -                } else { -                    name = sinon.functionName(func); -                } - -                function proxy() { -                    return proxy.invoke(func, this, slice.call(arguments)); -                } - -                sinon.extend(proxy, spy); -                delete proxy.create; -                sinon.extend(proxy, func); - -                proxy.reset(); -                proxy.prototype = func.prototype; -                proxy.displayName = name || "spy"; -                proxy.toString = sinon.functionToString; -                proxy._create = sinon.spy.create; -                proxy.id = "spy#" + uuid++; - -                return proxy; -            }, - -            invoke: function invoke(func, thisValue, args) { -                var matching = matchingFake(this.fakes, args); -                var exception, returnValue; - -                incrementCallCount.call(this); -                push.call(this.thisValues, thisValue); -                push.call(this.args, args); -                push.call(this.callIds, callId++); - -                try { -                    if (matching) { -                        returnValue = matching.invoke(func, thisValue, args); -                    } else { -                        returnValue = (this.func || func).apply(thisValue, args); -                    } -                } catch (e) { -                    push.call(this.returnValues, undefined); -                    exception = e; -                    throw e; -                } finally { -                    push.call(this.exceptions, exception); -                } - -                push.call(this.returnValues, returnValue); - -                createCallProperties.call(this); - -                return returnValue; -            }, - -            getCall: function getCall(i) { -                if (i < 0 || i >= this.callCount) { -                    return null; -                } - -                return spyCall.create(this, this.thisValues[i], this.args[i], -                                      this.returnValues[i], this.exceptions[i], -                                      this.callIds[i]); -            }, - -            calledBefore: function calledBefore(spyFn) { -                if (!this.called) { -                    return false; -                } - -                if (!spyFn.called) { -                    return true; -                } - -                return this.callIds[0] < spyFn.callIds[spyFn.callIds.length - 1]; -            }, - -            calledAfter: function calledAfter(spyFn) { -                if (!this.called || !spyFn.called) { -                    return false; -                } - -                return this.callIds[this.callCount - 1] > spyFn.callIds[spyFn.callCount - 1]; -            }, - -            withArgs: function () { -                var args = slice.call(arguments); - -                if (this.fakes) { -                    var match = matchingFake(this.fakes, args, true); - -                    if (match) { -                        return match; -                    } -                } else { -                    this.fakes = []; -                } - -                var original = this; -                var fake = this._create(); -                fake.matchingAguments = args; -                push.call(this.fakes, fake); - -                fake.withArgs = function () { -                    return original.withArgs.apply(original, arguments); -                }; - -                for (var i = 0; i < this.args.length; i++) { -                    if (fake.matches(this.args[i])) { -                        incrementCallCount.call(fake); -                        push.call(fake.thisValues, this.thisValues[i]); -                        push.call(fake.args, this.args[i]); -                        push.call(fake.returnValues, this.returnValues[i]); -                        push.call(fake.exceptions, this.exceptions[i]); -                        push.call(fake.callIds, this.callIds[i]); -                    } -                } -                createCallProperties.call(fake); - -                return fake; -            }, - -            matches: function (args, strict) { -                var margs = this.matchingAguments; - -                if (margs.length <= args.length && -                    sinon.deepEqual(margs, args.slice(0, margs.length))) { -                    return !strict || margs.length == args.length; -                } -            }, - -            printf: function (format) { -                var spy = this; -                var args = slice.call(arguments, 1); -                var formatter; - -                return (format || "").replace(/%(.)/g, function (match, specifyer) { -                    formatter = spyApi.formatters[specifyer]; - -                    if (typeof formatter == "function") { -                        return formatter.call(null, spy, args); -                    } else if (!isNaN(parseInt(specifyer), 10)) { -                        return sinon.format(args[specifyer - 1]); -                    } - -                    return "%" + specifyer; -                }); -            } -        }; - -        delegateToCalls(spyApi, "calledOn", true); -        delegateToCalls(spyApi, "alwaysCalledOn", false, "calledOn"); -        delegateToCalls(spyApi, "calledWith", true); -        delegateToCalls(spyApi, "alwaysCalledWith", false, "calledWith"); -        delegateToCalls(spyApi, "calledWithExactly", true); -        delegateToCalls(spyApi, "alwaysCalledWithExactly", false, "calledWithExactly"); -        delegateToCalls(spyApi, "neverCalledWith", false, "notCalledWith", -            function () { return true; }); -        delegateToCalls(spyApi, "threw", true); -        delegateToCalls(spyApi, "alwaysThrew", false, "threw"); -        delegateToCalls(spyApi, "returned", true); -        delegateToCalls(spyApi, "alwaysReturned", false, "returned"); -        delegateToCalls(spyApi, "calledWithNew", true); -        delegateToCalls(spyApi, "alwaysCalledWithNew", false, "calledWithNew"); -        delegateToCalls(spyApi, "callArg", false, "callArgWith", function () { -            throw new Error(this.toString() + " cannot call arg since it was not yet invoked."); -        }); -        spyApi.callArgWith = spyApi.callArg; -        delegateToCalls(spyApi, "yield", false, "yield", function () { -            throw new Error(this.toString() + " cannot yield since it was not yet invoked."); -        }); -        // "invokeCallback" is an alias for "yield" since "yield" is invalid in strict mode. -        spyApi.invokeCallback = spyApi.yield; -        delegateToCalls(spyApi, "yieldTo", false, "yieldTo", function (property) { -            throw new Error(this.toString() + " cannot yield to '" + property + -                "' since it was not yet invoked."); -        }); - -        spyApi.formatters = { -            "c": function (spy) { -                return sinon.timesInWords(spy.callCount); -            }, - -            "n": function (spy) { -                return spy.toString(); -            }, - -            "C": function (spy) { -                var calls = []; - -                for (var i = 0, l = spy.callCount; i < l; ++i) { -                    push.call(calls, "    " + spy.getCall(i).toString()); -                } - -                return calls.length > 0 ? "\n" + calls.join("\n") : ""; -            }, - -            "t": function (spy) { -                var objects = []; - -                for (var i = 0, l = spy.callCount; i < l; ++i) { -                    push.call(objects, sinon.format(spy.thisValues[i])); -                } - -                return objects.join(", "); -            }, - -            "*": function (spy, args) { -                return args.join(", "); -            } -        }; - -        return spyApi; -    }())); - -    spyCall = (function () { - -        function throwYieldError(proxy, text, args) { -            var msg = sinon.functionName(proxy) + text; -            if (args.length) { -                msg += " Received [" + slice.call(args).join(", ") + "]"; -            } -            throw new Error(msg); -        } - -        return { -            create: function create(spy, thisValue, args, returnValue, exception, id) { -                var proxyCall = sinon.create(spyCall); -                delete proxyCall.create; -                proxyCall.proxy = spy; -                proxyCall.thisValue = thisValue; -                proxyCall.args = args; -                proxyCall.returnValue = returnValue; -                proxyCall.exception = exception; -                proxyCall.callId = typeof id == "number" && id || callId++; - -                return proxyCall; -            }, - -            calledOn: function calledOn(thisValue) { -                return this.thisValue === thisValue; -            }, - -            calledWith: function calledWith() { -                for (var i = 0, l = arguments.length; i < l; i += 1) { -                    if (!sinon.deepEqual(arguments[i], this.args[i])) { -                        return false; -                    } -                } - -                return true; -            }, - -            calledWithExactly: function calledWithExactly() { -                return arguments.length == this.args.length && -                    this.calledWith.apply(this, arguments); -            }, - -            notCalledWith: function notCalledWith() { -                for (var i = 0, l = arguments.length; i < l; i += 1) { -                    if (!sinon.deepEqual(arguments[i], this.args[i])) { -                        return true; -                    } -                } -                return false; -            }, - -            returned: function returned(value) { -                return this.returnValue === value; -            }, - -            threw: function threw(error) { -                if (typeof error == "undefined" || !this.exception) { -                    return !!this.exception; -                } - -                if (typeof error == "string") { -                    return this.exception.name == error; -                } - -                return this.exception === error; -            }, - -            calledWithNew: function calledWithNew(thisValue) { -                return this.thisValue instanceof this.proxy; -            }, - -            calledBefore: function (other) { -                return this.callId < other.callId; -            }, - -            calledAfter: function (other) { -                return this.callId > other.callId; -            }, - -            callArg: function (pos) { -                this.args[pos](); -            }, - -            callArgWith: function (pos) { -                var args = slice.call(arguments, 1); -                this.args[pos].apply(null, args); -            }, - -            "yield": function () { -                var args = this.args; -                for (var i = 0, l = args.length; i < l; ++i) { -                    if (typeof args[i] === "function") { -                        args[i].apply(null, slice.call(arguments)); -                        return; -                    } -                } -                throwYieldError(this.proxy, " cannot yield since no callback was passed.", args); -            }, - -            yieldTo: function (prop) { -                var args = this.args; -                for (var i = 0, l = args.length; i < l; ++i) { -                    if (args[i] && typeof args[i][prop] === "function") { -                        args[i][prop].apply(null, slice.call(arguments, 1)); -                        return; -                    } -                } -                throwYieldError(this.proxy, " cannot yield to '" + prop + -                    "' since no callback was passed.", args); -            }, - -            toString: function () { -                var callStr = this.proxy.toString() + "("; -                var args = []; - -                for (var i = 0, l = this.args.length; i < l; ++i) { -                    push.call(args, sinon.format(this.args[i])); -                } - -                callStr = callStr + args.join(", ") + ")"; - -                if (typeof this.returnValue != "undefined") { -                    callStr += " => " + sinon.format(this.returnValue); -                } - -                if (this.exception) { -                    callStr += " !" + this.exception.name; - -                    if (this.exception.message) { -                        callStr += "(" + this.exception.message + ")"; -                    } -                } - -                return callStr; -            } -        }; -    }()); - -    spy.spyCall = spyCall; - -    // This steps outside the module sandbox and will be removed -    sinon.spyCall = spyCall; - -    if (commonJSModule) { -        module.exports = spy; -    } else { -        sinon.spy = spy; -    } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend spy.js - */ -/*jslint eqeqeq: false, onevar: false*/ -/*global module, require, sinon*/ -/** - * Stub functions - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon) { -        return; -    } - -    function stub(object, property, func) { -        if (!!func && typeof func != "function") { -            throw new TypeError("Custom stub should be function"); -        } - -        var wrapper; - -        if (func) { -            wrapper = sinon.spy && sinon.spy.create ? sinon.spy.create(func) : func; -        } else { -            wrapper = stub.create(); -        } - -        if (!object && !property) { -            return sinon.stub.create(); -        } - -        if (!property && !!object && typeof object == "object") { -            for (var prop in object) { -                if (typeof object[prop] === "function") { -                    stub(object, prop); -                } -            } - -            return object; -        } - -        return sinon.wrapMethod(object, property, wrapper); -    } - -    function getCallback(stub, args) { -        if (stub.callArgAt < 0) { -            for (var i = 0, l = args.length; i < l; ++i) { -                if (!stub.callArgProp && typeof args[i] == "function") { -                    return args[i]; -                } - -                if (stub.callArgProp && args[i] && -                    typeof args[i][stub.callArgProp] == "function") { -                    return args[i][stub.callArgProp]; -                } -            } - -            return null; -        } - -        return args[stub.callArgAt]; -    } - -    var join = Array.prototype.join; - -    function getCallbackError(stub, func, args) { -        if (stub.callArgAt < 0) { -            var msg; - -            if (stub.callArgProp) { -                msg = sinon.functionName(stub) + -                    " expected to yield to '" + stub.callArgProp + -                    "', but no object with such a property was passed." -            } else { -                msg = sinon.functionName(stub) + -                            " expected to yield, but no callback was passed." -            } - -            if (args.length > 0) { -                msg += " Received [" + join.call(args, ", ") + "]"; -            } - -            return msg; -        } - -        return "argument at index " + stub.callArgAt + " is not a function: " + func; -    } - -    function callCallback(stub, args) { -        if (typeof stub.callArgAt == "number") { -            var func = getCallback(stub, args); - -            if (typeof func != "function") { -                throw new TypeError(getCallbackError(stub, func, args)); -            } - -            func.apply(stub.callbackContext, stub.callbackArguments); -        } -    } - -    var uuid = 0; - -    sinon.extend(stub, (function () { -        var slice = Array.prototype.slice; - -        function throwsException(error, message) { -            if (typeof error == "string") { -                this.exception = new Error(message || ""); -                this.exception.name = error; -            } else if (!error) { -                this.exception = new Error("Error"); -            } else { -                this.exception = error; -            } -             -            return this; -        } - -        return { -            create: function create() { -                var functionStub = function () { -                    if (functionStub.exception) { -                        throw functionStub.exception; -                    } else if (typeof functionStub.returnArgAt == 'number') { -                        return arguments[functionStub.returnArgAt]; -                    } - -                    callCallback(functionStub, arguments); - -                    return functionStub.returnValue; -                }; - -                functionStub.id = "stub#" + uuid++; -                var orig = functionStub; -                functionStub = sinon.spy.create(functionStub); -                functionStub.func = orig; - -                sinon.extend(functionStub, stub); -                functionStub._create = sinon.stub.create; -                functionStub.displayName = "stub"; -                functionStub.toString = sinon.functionToString; - -                return functionStub; -            }, - -            returns: function returns(value) { -                this.returnValue = value; - -                return this; -            }, - -            returnsArg: function returnsArg(pos) { -                if (typeof pos != "number") { -                    throw new TypeError("argument index is not number"); -                } -                 -                this.returnArgAt = pos; - -                return this; -            }, - -            "throws": throwsException, -            throwsException: throwsException, - -            callsArg: function callsArg(pos) { -                if (typeof pos != "number") { -                    throw new TypeError("argument index is not number"); -                } - -                this.callArgAt = pos; -                this.callbackArguments = []; - -                return this; -            }, - -            callsArgOn: function callsArgOn(pos, context) { -                if (typeof pos != "number") { -                    throw new TypeError("argument index is not number"); -                } -                if (typeof context != "object") { -                    throw new TypeError("argument context is not an object"); -                } - -                this.callArgAt = pos; -                this.callbackArguments = []; -                this.callbackContext = context; - -                return this; -            }, - -            callsArgWith: function callsArgWith(pos) { -                if (typeof pos != "number") { -                    throw new TypeError("argument index is not number"); -                } - -                this.callArgAt = pos; -                this.callbackArguments = slice.call(arguments, 1); - -                return this; -            }, - -            callsArgOnWith: function callsArgWith(pos, context) { -                if (typeof pos != "number") { -                    throw new TypeError("argument index is not number"); -                } -                if (typeof context != "object") { -                    throw new TypeError("argument context is not an object"); -                } - -                this.callArgAt = pos; -                this.callbackArguments = slice.call(arguments, 2); -                this.callbackContext = context; - -                return this; -            }, - -            yields: function () { -                this.callArgAt = -1; -                this.callbackArguments = slice.call(arguments, 0); - -                return this; -            }, - -            yieldsOn: function (context) { -                if (typeof context != "object") { -                    throw new TypeError("argument context is not an object"); -                } - -                this.callArgAt = -1; -                this.callbackArguments = slice.call(arguments, 1); -                this.callbackContext = context; - -                return this; -            }, - -            yieldsTo: function (prop) { -                this.callArgAt = -1; -                this.callArgProp = prop; -                this.callbackArguments = slice.call(arguments, 1); - -                return this; -            }, - -            yieldsToOn: function (prop, context) { -                if (typeof context != "object") { -                    throw new TypeError("argument context is not an object"); -                } - -                this.callArgAt = -1; -                this.callArgProp = prop; -                this.callbackArguments = slice.call(arguments, 2); -                this.callbackContext = context; - -                return this; -            } -        }; -    }())); - -    if (commonJSModule) { -        module.exports = stub; -    } else { -        sinon.stub = stub; -    } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend stub.js - */ -/*jslint eqeqeq: false, onevar: false, nomen: false*/ -/*global module, require, sinon*/ -/** - * Mock functions. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; -    var push = [].push; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon) { -        return; -    } - -    function mock(object) { -        if (!object) { -            return sinon.expectation.create("Anonymous mock"); -        } - -        return mock.create(object); -    } - -    sinon.mock = mock; - -    sinon.extend(mock, (function () { -        function each(collection, callback) { -            if (!collection) { -                return; -            } - -            for (var i = 0, l = collection.length; i < l; i += 1) { -                callback(collection[i]); -            } -        } - -        return { -            create: function create(object) { -                if (!object) { -                    throw new TypeError("object is null"); -                } - -                var mockObject = sinon.extend({}, mock); -                mockObject.object = object; -                delete mockObject.create; - -                return mockObject; -            }, - -            expects: function expects(method) { -                if (!method) { -                    throw new TypeError("method is falsy"); -                } - -                if (!this.expectations) { -                    this.expectations = {}; -                    this.proxies = []; -                } - -                if (!this.expectations[method]) { -                    this.expectations[method] = []; -                    var mockObject = this; - -                    sinon.wrapMethod(this.object, method, function () { -                        return mockObject.invokeMethod(method, this, arguments); -                    }); - -                    push.call(this.proxies, method); -                } - -                var expectation = sinon.expectation.create(method); -                push.call(this.expectations[method], expectation); - -                return expectation; -            }, - -            restore: function restore() { -                var object = this.object; - -                each(this.proxies, function (proxy) { -                    if (typeof object[proxy].restore == "function") { -                        object[proxy].restore(); -                    } -                }); -            }, - -            verify: function verify() { -                var expectations = this.expectations || {}; -                var messages = [], met = []; - -                each(this.proxies, function (proxy) { -                    each(expectations[proxy], function (expectation) { -                        if (!expectation.met()) { -                            push.call(messages, expectation.toString()); -                        } else { -                            push.call(met, expectation.toString()); -                        } -                    }); -                }); - -                this.restore(); - -                if (messages.length > 0) { -                    sinon.expectation.fail(messages.concat(met).join("\n")); -                } - -                return true; -            }, - -            invokeMethod: function invokeMethod(method, thisValue, args) { -                var expectations = this.expectations && this.expectations[method]; -                var length = expectations && expectations.length || 0; - -                for (var i = 0; i < length; i += 1) { -                    if (!expectations[i].met() && -                        expectations[i].allowsCall(thisValue, args)) { -                        return expectations[i].apply(thisValue, args); -                    } -                } - -                var messages = []; - -                for (i = 0; i < length; i += 1) { -                    push.call(messages, "    " + expectations[i].toString()); -                } - -                messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({ -                    proxy: method, -                    args: args -                })); - -                sinon.expectation.fail(messages.join("\n")); -            } -        }; -    }())); - -    var times = sinon.timesInWords; - -    sinon.expectation = (function () { -        var slice = Array.prototype.slice; -        var _invoke = sinon.spy.invoke; - -        function callCountInWords(callCount) { -            if (callCount == 0) { -                return "never called"; -            } else { -                return "called " + times(callCount); -            } -        } - -        function expectedCallCountInWords(expectation) { -            var min = expectation.minCalls; -            var max = expectation.maxCalls; - -            if (typeof min == "number" && typeof max == "number") { -                var str = times(min); - -                if (min != max) { -                    str = "at least " + str + " and at most " + times(max); -                } - -                return str; -            } - -            if (typeof min == "number") { -                return "at least " + times(min); -            } - -            return "at most " + times(max); -        } - -        function receivedMinCalls(expectation) { -            var hasMinLimit = typeof expectation.minCalls == "number"; -            return !hasMinLimit || expectation.callCount >= expectation.minCalls; -        } - -        function receivedMaxCalls(expectation) { -            if (typeof expectation.maxCalls != "number") { -                return false; -            } - -            return expectation.callCount == expectation.maxCalls; -        } - -        return { -            minCalls: 1, -            maxCalls: 1, - -            create: function create(methodName) { -                var expectation = sinon.extend(sinon.stub.create(), sinon.expectation); -                delete expectation.create; -                expectation.method = methodName; - -                return expectation; -            }, - -            invoke: function invoke(func, thisValue, args) { -                this.verifyCallAllowed(thisValue, args); - -                return _invoke.apply(this, arguments); -            }, - -            atLeast: function atLeast(num) { -                if (typeof num != "number") { -                    throw new TypeError("'" + num + "' is not number"); -                } - -                if (!this.limitsSet) { -                    this.maxCalls = null; -                    this.limitsSet = true; -                } - -                this.minCalls = num; - -                return this; -            }, - -            atMost: function atMost(num) { -                if (typeof num != "number") { -                    throw new TypeError("'" + num + "' is not number"); -                } - -                if (!this.limitsSet) { -                    this.minCalls = null; -                    this.limitsSet = true; -                } - -                this.maxCalls = num; - -                return this; -            }, - -            never: function never() { -                return this.exactly(0); -            }, - -            once: function once() { -                return this.exactly(1); -            }, - -            twice: function twice() { -                return this.exactly(2); -            }, - -            thrice: function thrice() { -                return this.exactly(3); -            }, - -            exactly: function exactly(num) { -                if (typeof num != "number") { -                    throw new TypeError("'" + num + "' is not a number"); -                } - -                this.atLeast(num); -                return this.atMost(num); -            }, - -            met: function met() { -                return !this.failed && receivedMinCalls(this); -            }, - -            verifyCallAllowed: function verifyCallAllowed(thisValue, args) { -                if (receivedMaxCalls(this)) { -                    this.failed = true; -                    sinon.expectation.fail(this.method + " already called " + times(this.maxCalls)); -                } - -                if ("expectedThis" in this && this.expectedThis !== thisValue) { -                    sinon.expectation.fail(this.method + " called with " + thisValue + " as thisValue, expected " + -                        this.expectedThis); -                } - -                if (!("expectedArguments" in this)) { -                    return; -                } - -                if (!args || args.length === 0) { -                    sinon.expectation.fail(this.method + " received no arguments, expected " + -                        this.expectedArguments.join()); -                } - -                if (args.length < this.expectedArguments.length) { -                    sinon.expectation.fail(this.method + " received too few arguments (" + args.join() + -                        "), expected " + this.expectedArguments.join()); -                } - -                if (this.expectsExactArgCount && -                    args.length != this.expectedArguments.length) { -                    sinon.expectation.fail(this.method + " received too many arguments (" + args.join() + -                        "), expected " + this.expectedArguments.join()); -                } - -                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) { -                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) { -                        sinon.expectation.fail(this.method + " received wrong arguments (" + args.join() + -                            "), expected " + this.expectedArguments.join()); -                    } -                } -            }, - -            allowsCall: function allowsCall(thisValue, args) { -                if (this.met()) { -                    return false; -                } - -                if ("expectedThis" in this && this.expectedThis !== thisValue) { -                    return false; -                } - -                if (!("expectedArguments" in this)) { -                    return true; -                } - -                args = args || []; - -                if (args.length < this.expectedArguments.length) { -                    return false; -                } - -                if (this.expectsExactArgCount && -                    args.length != this.expectedArguments.length) { -                    return false; -                } - -                for (var i = 0, l = this.expectedArguments.length; i < l; i += 1) { -                    if (!sinon.deepEqual(this.expectedArguments[i], args[i])) { -                        return false; -                    } -                } - -                return true; -            }, - -            withArgs: function withArgs() { -                this.expectedArguments = slice.call(arguments); -                return this; -            }, - -            withExactArgs: function withExactArgs() { -                this.withArgs.apply(this, arguments); -                this.expectsExactArgCount = true; -                return this; -            }, - -            on: function on(thisValue) { -                this.expectedThis = thisValue; -                return this; -            }, - -            toString: function () { -                var args = (this.expectedArguments || []).slice(); - -                if (!this.expectsExactArgCount) { -                    push.call(args, "[...]"); -                } - -                var callStr = sinon.spyCall.toString.call({ -                    proxy: this.method, args: args -                }); - -                var message = callStr.replace(", [...", "[, ...") + " " + -                    expectedCallCountInWords(this); - -                if (this.met()) { -                    return "Expectation met: " + message; -                } - -                return "Expected " + message + " (" + -                    callCountInWords(this.callCount) + ")"; -            }, - -            verify: function verify() { -                if (!this.met()) { -                    sinon.expectation.fail(this.toString()); -                } - -                return true; -            }, - -            fail: function (message) { -                var exception = new Error(message); -                exception.name = "ExpectationError"; - -                throw exception; -            } -        }; -    }()); - -    if (commonJSModule) { -        module.exports = mock; -    } else { -        sinon.mock = mock; -    } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend stub.js - * @depend mock.js - */ -/*jslint eqeqeq: false, onevar: false, forin: true*/ -/*global module, require, sinon*/ -/** - * Collections of stubs, spies and mocks. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; -    var push = [].push; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon) { -        return; -    } - -    function getFakes(fakeCollection) { -        if (!fakeCollection.fakes) { -            fakeCollection.fakes = []; -        } - -        return fakeCollection.fakes; -    } - -    function each(fakeCollection, method) { -        var fakes = getFakes(fakeCollection); - -        for (var i = 0, l = fakes.length; i < l; i += 1) { -            if (typeof fakes[i][method] == "function") { -                fakes[i][method](); -            } -        } -    } - -    function compact(fakeCollection) { -        var fakes = getFakes(fakeCollection); -        var i = 0; -        while (i < fakes.length) { -          fakes.splice(i, 1); -        } -    } - -    var collection = { -        verify: function resolve() { -            each(this, "verify"); -        }, - -        restore: function restore() { -            each(this, "restore"); -            compact(this); -        }, - -        verifyAndRestore: function verifyAndRestore() { -            var exception; - -            try { -                this.verify(); -            } catch (e) { -                exception = e; -            } - -            this.restore(); - -            if (exception) { -                throw exception; -            } -        }, - -        add: function add(fake) { -            push.call(getFakes(this), fake); -            return fake; -        }, - -        spy: function spy() { -            return this.add(sinon.spy.apply(sinon, arguments)); -        }, - -        stub: function stub(object, property, value) { -            if (property) { -                var original = object[property]; - -                if (typeof original != "function") { -                    if (!object.hasOwnProperty(property)) { -                        throw new TypeError("Cannot stub non-existent own property " + property); -                    } - -                    object[property] = value; - -                    return this.add({ -                        restore: function () { -                            object[property] = original; -                        } -                    }); -                } -            } - -            return this.add(sinon.stub.apply(sinon, arguments)); -        }, - -        mock: function mock() { -            return this.add(sinon.mock.apply(sinon, arguments)); -        }, - -        inject: function inject(obj) { -            var col = this; - -            obj.spy = function () { -                return col.spy.apply(col, arguments); -            }; - -            obj.stub = function () { -                return col.stub.apply(col, arguments); -            }; - -            obj.mock = function () { -                return col.mock.apply(col, arguments); -            }; - -            return obj; -        } -    }; - -    if (commonJSModule) { -        module.exports = collection; -    } else { -        sinon.collection = collection; -    } -}(typeof sinon == "object" && sinon || null)); - -/*jslint eqeqeq: false, plusplus: false, evil: true, onevar: false, browser: true, forin: false*/ -/*global module, require, window*/ -/** - * Fake timer API - * setTimeout - * setInterval - * clearTimeout - * clearInterval - * tick - * reset - * Date - * - * Inspired by jsUnitMockTimeOut from JsUnit - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -if (typeof sinon == "undefined") { -    var sinon = {}; -} - -(function (global) { -    var id = 1; - -    function addTimer(args, recurring) { -        if (args.length === 0) { -            throw new Error("Function requires at least 1 parameter"); -        } - -        var toId = id++; -        var delay = args[1] || 0; - -        if (!this.timeouts) { -            this.timeouts = {}; -        } - -        this.timeouts[toId] = { -            id: toId, -            func: args[0], -            callAt: this.now + delay -        }; - -        if (recurring === true) { -            this.timeouts[toId].interval = delay; -        } - -        return toId; -    } - -    function parseTime(str) { -        if (!str) { -            return 0; -        } - -        var strings = str.split(":"); -        var l = strings.length, i = l; -        var ms = 0, parsed; - -        if (l > 3 || !/^(\d\d:){0,2}\d\d?$/.test(str)) { -            throw new Error("tick only understands numbers and 'h:m:s'"); -        } - -        while (i--) { -            parsed = parseInt(strings[i], 10); - -            if (parsed >= 60) { -                throw new Error("Invalid time " + str); -            } - -            ms += parsed * Math.pow(60, (l - i - 1)); -        } - -        return ms * 1000; -    } - -    function createObject(object) { -        var newObject; - -        if (Object.create) { -            newObject = Object.create(object); -        } else { -            var F = function () {}; -            F.prototype = object; -            newObject = new F(); -        } - -        newObject.Date.clock = newObject; -        return newObject; -    } - -    sinon.clock = { -        now: 0, - -        create: function create(now) { -            var clock = createObject(this); - -            if (typeof now == "number") { -                clock.now = now; -            } - -            if (!!now && typeof now == "object") { -                throw new TypeError("now should be milliseconds since UNIX epoch"); -            } - -            return clock; -        }, - -        setTimeout: function setTimeout(callback, timeout) { -            return addTimer.call(this, arguments, false); -        }, - -        clearTimeout: function clearTimeout(timerId) { -            if (!this.timeouts) { -                this.timeouts = []; -            } - -            if (timerId in this.timeouts) { -                delete this.timeouts[timerId]; -            } -        }, - -        setInterval: function setInterval(callback, timeout) { -            return addTimer.call(this, arguments, true); -        }, - -        clearInterval: function clearInterval(timerId) { -            this.clearTimeout(timerId); -        }, - -        tick: function tick(ms) { -            ms = typeof ms == "number" ? ms : parseTime(ms); -            var tickFrom = this.now, tickTo = this.now + ms, previous = this.now; -            var timer = this.firstTimerInRange(tickFrom, tickTo); - -            var firstException; -            while (timer && tickFrom <= tickTo) { -                if (this.timeouts[timer.id]) { -                    tickFrom = this.now = timer.callAt; -                    try { -                      this.callTimer(timer); -                    } catch (e) { -                      firstException = firstException || e; -                    } -                } - -                timer = this.firstTimerInRange(previous, tickTo); -                previous = tickFrom; -            } - -            this.now = tickTo; - -            if (firstException) { -              throw firstException; -            } -        }, - -        firstTimerInRange: function (from, to) { -            var timer, smallest, originalTimer; - -            for (var id in this.timeouts) { -                if (this.timeouts.hasOwnProperty(id)) { -                    if (this.timeouts[id].callAt < from || this.timeouts[id].callAt > to) { -                        continue; -                    } - -                    if (!smallest || this.timeouts[id].callAt < smallest) { -                        originalTimer = this.timeouts[id]; -                        smallest = this.timeouts[id].callAt; - -                        timer = { -                            func: this.timeouts[id].func, -                            callAt: this.timeouts[id].callAt, -                            interval: this.timeouts[id].interval, -                            id: this.timeouts[id].id -                        }; -                    } -                } -            } - -            return timer || null; -        }, - -        callTimer: function (timer) { -            try { -                if (typeof timer.func == "function") { -                    timer.func.call(null); -                } else { -                    eval(timer.func); -                } -            } catch (e) { -              var exception = e; -            } - -            if (!this.timeouts[timer.id]) { -                if (exception) { -                  throw exception; -                } -                return; -            } - -            if (typeof timer.interval == "number") { -                this.timeouts[timer.id].callAt += timer.interval; -            } else { -                delete this.timeouts[timer.id]; -            } - -            if (exception) { -              throw exception; -            } -        }, - -        reset: function reset() { -            this.timeouts = {}; -        }, - -        Date: (function () { -            var NativeDate = Date; - -            function ClockDate(year, month, date, hour, minute, second, ms) { -                // Defensive and verbose to avoid potential harm in passing -                // explicit undefined when user does not pass argument -                switch (arguments.length) { -                case 0: -                    return new NativeDate(ClockDate.clock.now); -                case 1: -                    return new NativeDate(year); -                case 2: -                    return new NativeDate(year, month); -                case 3: -                    return new NativeDate(year, month, date); -                case 4: -                    return new NativeDate(year, month, date, hour); -                case 5: -                    return new NativeDate(year, month, date, hour, minute); -                case 6: -                    return new NativeDate(year, month, date, hour, minute, second); -                default: -                    return new NativeDate(year, month, date, hour, minute, second, ms); -                } -            } - -            return mirrorDateProperties(ClockDate, NativeDate); -        }()) -    }; - -    function mirrorDateProperties(target, source) { -        if (source.now) { -            target.now = function now() { -                return target.clock.now; -            }; -        } else { -            delete target.now; -        } - -        if (source.toSource) { -            target.toSource = function toSource() { -                return source.toSource(); -            }; -        } else { -            delete target.toSource; -        } - -        target.toString = function toString() { -            return source.toString(); -        }; - -        target.prototype = source.prototype; -        target.parse = source.parse; -        target.UTC = source.UTC; -        target.prototype.toUTCString = source.prototype.toUTCString; -        return target; -    } - -    var methods = ["Date", "setTimeout", "setInterval", -                   "clearTimeout", "clearInterval"]; - -    function restore() { -        var method; - -        for (var i = 0, l = this.methods.length; i < l; i++) { -            method = this.methods[i]; -            global[method] = this["_" + method]; -        } -    } - -    function stubGlobal(method, clock) { -        clock["_" + method] = global[method]; - -        if (method == "Date") { -            var date = mirrorDateProperties(clock[method], global[method]); -            global[method] = date; -        } else { -            global[method] = function () { -                return clock[method].apply(clock, arguments); -            }; - -            for (var prop in clock[method]) { -                if (clock[method].hasOwnProperty(prop)) { -                    global[method][prop] = clock[method][prop]; -                } -            } -        } - -        global[method].clock = clock; -    } - -    sinon.useFakeTimers = function useFakeTimers(now) { -        var clock = sinon.clock.create(now); -        clock.restore = restore; -        clock.methods = Array.prototype.slice.call(arguments, -                                                   typeof now == "number" ? 1 : 0); - -        if (clock.methods.length === 0) { -            clock.methods = methods; -        } - -        for (var i = 0, l = clock.methods.length; i < l; i++) { -            stubGlobal(clock.methods[i], clock); -        } - -        return clock; -    }; -}(typeof global != "undefined" && typeof global !== "function" ? global : this)); - -sinon.timers = { -    setTimeout: setTimeout, -    clearTimeout: clearTimeout, -    setInterval: setInterval, -    clearInterval: clearInterval, -    Date: Date -}; - -if (typeof module == "object" && typeof require == "function") { -    module.exports = sinon; -} - -/*jslint eqeqeq: false, onevar: false*/ -/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/ -/** - * Minimal Event interface implementation - * - * Original implementation by Sven Fuchs: https://gist.github.com/995028 - * Modifications and tests by Christian Johansen. - * - * @author Sven Fuchs (svenfuchs@artweb-design.de) - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2011 Sven Fuchs, Christian Johansen - */ - -if (typeof sinon == "undefined") { -    this.sinon = {}; -} - -(function () { -    var push = [].push; - -    sinon.Event = function Event(type, bubbles, cancelable) { -        this.initEvent(type, bubbles, cancelable); -    }; - -    sinon.Event.prototype = { -        initEvent: function(type, bubbles, cancelable) { -            this.type = type; -            this.bubbles = bubbles; -            this.cancelable = cancelable; -        }, - -        stopPropagation: function () {}, - -        preventDefault: function () { -            this.defaultPrevented = true; -        } -    }; - -    sinon.EventTarget = { -        addEventListener: function addEventListener(event, listener, useCapture) { -            this.eventListeners = this.eventListeners || {}; -            this.eventListeners[event] = this.eventListeners[event] || []; -            push.call(this.eventListeners[event], listener); -        }, - -        removeEventListener: function removeEventListener(event, listener, useCapture) { -            var listeners = this.eventListeners && this.eventListeners[event] || []; - -            for (var i = 0, l = listeners.length; i < l; ++i) { -                if (listeners[i] == listener) { -                    return listeners.splice(i, 1); -                } -            } -        }, - -        dispatchEvent: function dispatchEvent(event) { -            var type = event.type; -            var listeners = this.eventListeners && this.eventListeners[type] || []; - -            for (var i = 0; i < listeners.length; i++) { -                if (typeof listeners[i] == "function") { -                    listeners[i].call(this, event); -                } else { -                    listeners[i].handleEvent(event); -                } -            } - -            return !!event.defaultPrevented; -        } -    }; -}()); - -/** - * @depend event.js - */ -/*jslint eqeqeq: false, onevar: false*/ -/*global sinon, module, require, ActiveXObject, XMLHttpRequest, DOMParser*/ -/** - * Fake XMLHttpRequest object - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -if (typeof sinon == "undefined") { -    this.sinon = {}; -} -sinon.xhr = { XMLHttpRequest: this.XMLHttpRequest }; - -// wrapper for global -(function(global) { -    var xhr = sinon.xhr; -    xhr.GlobalXMLHttpRequest = global.XMLHttpRequest; -    xhr.GlobalActiveXObject = global.ActiveXObject; -    xhr.supportsActiveX = typeof xhr.GlobalActiveXObject != "undefined"; -    xhr.supportsXHR = typeof xhr.GlobalXMLHttpRequest != "undefined"; -    xhr.workingXHR = xhr.supportsXHR ? xhr.GlobalXMLHttpRequest : xhr.supportsActiveX -                                     ? function() { return new xhr.GlobalActiveXObject("MSXML2.XMLHTTP.3.0") } : false; - -    /*jsl:ignore*/ -    var unsafeHeaders = { -        "Accept-Charset": true, -        "Accept-Encoding": true, -        "Connection": true, -        "Content-Length": true, -        "Cookie": true, -        "Cookie2": true, -        "Content-Transfer-Encoding": true, -        "Date": true, -        "Expect": true, -        "Host": true, -        "Keep-Alive": true, -        "Referer": true, -        "TE": true, -        "Trailer": true, -        "Transfer-Encoding": true, -        "Upgrade": true, -        "User-Agent": true, -        "Via": true -    }; -    /*jsl:end*/ - -    function FakeXMLHttpRequest() { -        this.readyState = FakeXMLHttpRequest.UNSENT; -        this.requestHeaders = {}; -        this.requestBody = null; -        this.status = 0; -        this.statusText = ""; - -        if (typeof FakeXMLHttpRequest.onCreate == "function") { -            FakeXMLHttpRequest.onCreate(this); -        } -    } - -    function verifyState(xhr) { -        if (xhr.readyState !== FakeXMLHttpRequest.OPENED) { -            throw new Error("INVALID_STATE_ERR"); -        } - -        if (xhr.sendFlag) { -            throw new Error("INVALID_STATE_ERR"); -        } -    } - -    // filtering to enable a white-list version of Sinon FakeXhr, -    // where whitelisted requests are passed through to real XHR -    function each(collection, callback) { -        if (!collection) return; -        for (var i = 0, l = collection.length; i < l; i += 1) { -            callback(collection[i]); -        } -    } -    function some(collection, callback) { -        for (var index = 0; index < collection.length; index++) { -            if(callback(collection[index]) === true) return true; -        }; -        return false; -    } -    // largest arity in XHR is 5 - XHR#open -    var apply = function(obj,method,args) { -        switch(args.length) { -        case 0: return obj[method](); -        case 1: return obj[method](args[0]); -        case 2: return obj[method](args[0],args[1]); -        case 3: return obj[method](args[0],args[1],args[2]); -        case 4: return obj[method](args[0],args[1],args[2],args[3]); -        case 5: return obj[method](args[0],args[1],args[2],args[3],args[4]); -        }; -    }; - -    FakeXMLHttpRequest.filters = []; -    FakeXMLHttpRequest.addFilter = function(fn) { -        this.filters.push(fn) -    }; -    var IE6Re = /MSIE 6/; -    FakeXMLHttpRequest.defake = function(fakeXhr,xhrArgs) { -        var xhr = new sinon.xhr.workingXHR(); -        each(["open","setRequestHeader","send","abort","getResponseHeader", -              "getAllResponseHeaders","addEventListener","overrideMimeType","removeEventListener"], -             function(method) { -                 fakeXhr[method] = function() { -                   return apply(xhr,method,arguments); -                 }; -             }); - -        var copyAttrs = function(args) { -            each(args, function(attr) { -              try { -                fakeXhr[attr] = xhr[attr] -              } catch(e) { -                if(!IE6Re.test(navigator.userAgent)) throw e; -              } -            }); -        }; - -        var stateChange = function() { -            fakeXhr.readyState = xhr.readyState; -            if(xhr.readyState >= FakeXMLHttpRequest.HEADERS_RECEIVED) { -                copyAttrs(["status","statusText"]); -            } -            if(xhr.readyState >= FakeXMLHttpRequest.LOADING) { -                copyAttrs(["responseText"]); -            } -            if(xhr.readyState === FakeXMLHttpRequest.DONE) { -                copyAttrs(["responseXML"]); -            } -            if(fakeXhr.onreadystatechange) fakeXhr.onreadystatechange.call(fakeXhr); -        }; -        if(xhr.addEventListener) { -          for(var event in fakeXhr.eventListeners) { -              if(fakeXhr.eventListeners.hasOwnProperty(event)) { -                  each(fakeXhr.eventListeners[event],function(handler) { -                      xhr.addEventListener(event, handler); -                  }); -              } -          } -          xhr.addEventListener("readystatechange",stateChange); -        } else { -          xhr.onreadystatechange = stateChange; -        } -        apply(xhr,"open",xhrArgs); -    }; -    FakeXMLHttpRequest.useFilters = false; - -    function verifyRequestSent(xhr) { -        if (xhr.readyState == FakeXMLHttpRequest.DONE) { -            throw new Error("Request done"); -        } -    } - -    function verifyHeadersReceived(xhr) { -        if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) { -            throw new Error("No headers received"); -        } -    } - -    function verifyResponseBodyType(body) { -        if (typeof body != "string") { -            var error = new Error("Attempted to respond to fake XMLHttpRequest with " + -                                 body + ", which is not a string."); -            error.name = "InvalidBodyException"; -            throw error; -        } -    } - -    sinon.extend(FakeXMLHttpRequest.prototype, sinon.EventTarget, { -        async: true, - -        open: function open(method, url, async, username, password) { -            this.method = method; -            this.url = url; -            this.async = typeof async == "boolean" ? async : true; -            this.username = username; -            this.password = password; -            this.responseText = null; -            this.responseXML = null; -            this.requestHeaders = {}; -            this.sendFlag = false; -            if(sinon.FakeXMLHttpRequest.useFilters === true) { -                var xhrArgs = arguments; -                var defake = some(FakeXMLHttpRequest.filters,function(filter) { -                    return filter.apply(this,xhrArgs) -                }); -                if (defake) { -                  return sinon.FakeXMLHttpRequest.defake(this,arguments); -                } -            } -            this.readyStateChange(FakeXMLHttpRequest.OPENED); -        }, - -        readyStateChange: function readyStateChange(state) { -            this.readyState = state; - -            if (typeof this.onreadystatechange == "function") { -                try { -                    this.onreadystatechange(); -                } catch (e) { -                    sinon.logError("Fake XHR onreadystatechange handler", e); -                } -            } - -            this.dispatchEvent(new sinon.Event("readystatechange")); -        }, - -        setRequestHeader: function setRequestHeader(header, value) { -            verifyState(this); - -            if (unsafeHeaders[header] || /^(Sec-|Proxy-)/.test(header)) { -                throw new Error("Refused to set unsafe header \"" + header + "\""); -            } - -            if (this.requestHeaders[header]) { -                this.requestHeaders[header] += "," + value; -            } else { -                this.requestHeaders[header] = value; -            } -        }, - -        // Helps testing -        setResponseHeaders: function setResponseHeaders(headers) { -            this.responseHeaders = {}; - -            for (var header in headers) { -                if (headers.hasOwnProperty(header)) { -                    this.responseHeaders[header] = headers[header]; -                } -            } - -            if (this.async) { -                this.readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED); -            } -        }, - -        // Currently treats ALL data as a DOMString (i.e. no Document) -        send: function send(data) { -            verifyState(this); - -            if (!/^(get|head)$/i.test(this.method)) { -                if (this.requestHeaders["Content-Type"]) { -                    var value = this.requestHeaders["Content-Type"].split(";"); -                    this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8"; -                } else { -                    this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8"; -                } - -                this.requestBody = data; -            } - -            this.errorFlag = false; -            this.sendFlag = this.async; -            this.readyStateChange(FakeXMLHttpRequest.OPENED); - -            if (typeof this.onSend == "function") { -                this.onSend(this); -            } -        }, - -        abort: function abort() { -            this.aborted = true; -            this.responseText = null; -            this.errorFlag = true; -            this.requestHeaders = {}; - -            if (this.readyState > sinon.FakeXMLHttpRequest.UNSENT && this.sendFlag) { -                this.readyStateChange(sinon.FakeXMLHttpRequest.DONE); -                this.sendFlag = false; -            } - -            this.readyState = sinon.FakeXMLHttpRequest.UNSENT; -        }, - -        getResponseHeader: function getResponseHeader(header) { -            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { -                return null; -            } - -            if (/^Set-Cookie2?$/i.test(header)) { -                return null; -            } - -            header = header.toLowerCase(); - -            for (var h in this.responseHeaders) { -                if (h.toLowerCase() == header) { -                    return this.responseHeaders[h]; -                } -            } - -            return null; -        }, - -        getAllResponseHeaders: function getAllResponseHeaders() { -            if (this.readyState < FakeXMLHttpRequest.HEADERS_RECEIVED) { -                return ""; -            } - -            var headers = ""; - -            for (var header in this.responseHeaders) { -                if (this.responseHeaders.hasOwnProperty(header) && -                    !/^Set-Cookie2?$/i.test(header)) { -                    headers += header + ": " + this.responseHeaders[header] + "\r\n"; -                } -            } - -            return headers; -        }, - -        setResponseBody: function setResponseBody(body) { -            verifyRequestSent(this); -            verifyHeadersReceived(this); -            verifyResponseBodyType(body); - -            var chunkSize = this.chunkSize || 10; -            var index = 0; -            this.responseText = ""; - -            do { -                if (this.async) { -                    this.readyStateChange(FakeXMLHttpRequest.LOADING); -                } - -                this.responseText += body.substring(index, index + chunkSize); -                index += chunkSize; -            } while (index < body.length); - -            var type = this.getResponseHeader("Content-Type"); - -            if (this.responseText && -                (!type || /(text\/xml)|(application\/xml)|(\+xml)/.test(type))) { -                try { -                    this.responseXML = FakeXMLHttpRequest.parseXML(this.responseText); -                } catch (e) { -                    // Unable to parse XML - no biggie -                } -            } - -            if (this.async) { -                this.readyStateChange(FakeXMLHttpRequest.DONE); -            } else { -                this.readyState = FakeXMLHttpRequest.DONE; -            } -        }, - -        respond: function respond(status, headers, body) { -            this.setResponseHeaders(headers || {}); -            this.status = typeof status == "number" ? status : 200; -            this.statusText = FakeXMLHttpRequest.statusCodes[this.status]; -            this.setResponseBody(body || ""); -        } -    }); - -    sinon.extend(FakeXMLHttpRequest, { -        UNSENT: 0, -        OPENED: 1, -        HEADERS_RECEIVED: 2, -        LOADING: 3, -        DONE: 4 -    }); - -    // Borrowed from JSpec -    FakeXMLHttpRequest.parseXML = function parseXML(text) { -        var xmlDoc; - -        if (typeof DOMParser != "undefined") { -            var parser = new DOMParser(); -            xmlDoc = parser.parseFromString(text, "text/xml"); -        } else { -            xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); -            xmlDoc.async = "false"; -            xmlDoc.loadXML(text); -        } - -        return xmlDoc; -    }; - -    FakeXMLHttpRequest.statusCodes = { -        100: "Continue", -        101: "Switching Protocols", -        200: "OK", -        201: "Created", -        202: "Accepted", -        203: "Non-Authoritative Information", -        204: "No Content", -        205: "Reset Content", -        206: "Partial Content", -        300: "Multiple Choice", -        301: "Moved Permanently", -        302: "Found", -        303: "See Other", -        304: "Not Modified", -        305: "Use Proxy", -        307: "Temporary Redirect", -        400: "Bad Request", -        401: "Unauthorized", -        402: "Payment Required", -        403: "Forbidden", -        404: "Not Found", -        405: "Method Not Allowed", -        406: "Not Acceptable", -        407: "Proxy Authentication Required", -        408: "Request Timeout", -        409: "Conflict", -        410: "Gone", -        411: "Length Required", -        412: "Precondition Failed", -        413: "Request Entity Too Large", -        414: "Request-URI Too Long", -        415: "Unsupported Media Type", -        416: "Requested Range Not Satisfiable", -        417: "Expectation Failed", -        422: "Unprocessable Entity", -        500: "Internal Server Error", -        501: "Not Implemented", -        502: "Bad Gateway", -        503: "Service Unavailable", -        504: "Gateway Timeout", -        505: "HTTP Version Not Supported" -    }; - -    sinon.useFakeXMLHttpRequest = function () { -        sinon.FakeXMLHttpRequest.restore = function restore(keepOnCreate) { -            if (xhr.supportsXHR) { -                global.XMLHttpRequest = xhr.GlobalXMLHttpRequest; -            } - -            if (xhr.supportsActiveX) { -                global.ActiveXObject = xhr.GlobalActiveXObject; -            } - -            delete sinon.FakeXMLHttpRequest.restore; - -            if (keepOnCreate !== true) { -                delete sinon.FakeXMLHttpRequest.onCreate; -            } -        }; -        if (xhr.supportsXHR) { -            global.XMLHttpRequest = sinon.FakeXMLHttpRequest; -        } - -        if (xhr.supportsActiveX) { -            global.ActiveXObject = function ActiveXObject(objId) { -                if (objId == "Microsoft.XMLHTTP" || /^Msxml2\.XMLHTTP/i.test(objId)) { - -                    return new sinon.FakeXMLHttpRequest(); -                } - -                return new xhr.GlobalActiveXObject(objId); -            }; -        } - -        return sinon.FakeXMLHttpRequest; -    }; - -    sinon.FakeXMLHttpRequest = FakeXMLHttpRequest; -})(this); - -if (typeof module == "object" && typeof require == "function") { -    module.exports = sinon; -} - -/** - * @depend fake_xml_http_request.js - */ -/*jslint eqeqeq: false, onevar: false, regexp: false, plusplus: false*/ -/*global module, require, window*/ -/** - * The Sinon "server" mimics a web server that receives requests from - * sinon.FakeXMLHttpRequest and provides an API to respond to those requests, - * both synchronously and asynchronously. To respond synchronuously, canned - * answers have to be provided upfront. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -if (typeof sinon == "undefined") { -    var sinon = {}; -} - -sinon.fakeServer = (function () { -    var push = [].push; -    function F() {} - -    function create(proto) { -        F.prototype = proto; -        return new F(); -    } - -    function responseArray(handler) { -        var response = handler; - -        if (Object.prototype.toString.call(handler) != "[object Array]") { -            response = [200, {}, handler]; -        } - -        if (typeof response[2] != "string") { -            throw new TypeError("Fake server response body should be string, but was " + -                                typeof response[2]); -        } - -        return response; -    } - -    var wloc = window.location; -    var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host); - -    function matchOne(response, reqMethod, reqUrl) { -        var rmeth = response.method; -        var matchMethod = !rmeth || rmeth.toLowerCase() == reqMethod.toLowerCase(); -        var url = response.url; -        var matchUrl = !url || url == reqUrl || (typeof url.test == "function" && url.test(reqUrl)); - -        return matchMethod && matchUrl; -    } - -    function match(response, request) { -        var requestMethod = this.getHTTPMethod(request); -        var requestUrl = request.url; - -        if (!/^https?:\/\//.test(requestUrl) || rCurrLoc.test(requestUrl)) { -            requestUrl = requestUrl.replace(rCurrLoc, ""); -        } - -        if (matchOne(response, this.getHTTPMethod(request), requestUrl)) { -            if (typeof response.response == "function") { -                var ru = response.url; -                var args = [request].concat(!ru ? [] : requestUrl.match(ru).slice(1)); -                return response.response.apply(response, args); -            } - -            return true; -        } - -        return false; -    } - -    return { -        create: function () { -            var server = create(this); -            this.xhr = sinon.useFakeXMLHttpRequest(); -            server.requests = []; - -            this.xhr.onCreate = function (xhrObj) { -                server.addRequest(xhrObj); -            }; - -            return server; -        }, - -        addRequest: function addRequest(xhrObj) { -            var server = this; -            push.call(this.requests, xhrObj); - -            xhrObj.onSend = function () { -                server.handleRequest(this); -            }; - -            if (this.autoRespond && !this.responding) { -                setTimeout(function () { -                    server.responding = false; -                    server.respond(); -                }, this.autoRespondAfter || 10); - -                this.responding = true; -            } -        }, - -        getHTTPMethod: function getHTTPMethod(request) { -            if (this.fakeHTTPMethods && /post/i.test(request.method)) { -                var matches = (request.requestBody || "").match(/_method=([^\b;]+)/); -                return !!matches ? matches[1] : request.method; -            } - -            return request.method; -        }, - -        handleRequest: function handleRequest(xhr) { -            if (xhr.async) { -                if (!this.queue) { -                    this.queue = []; -                } - -                push.call(this.queue, xhr); -            } else { -                this.processRequest(xhr); -            } -        }, - -        respondWith: function respondWith(method, url, body) { -            if (arguments.length == 1 && typeof method != "function") { -                this.response = responseArray(method); -                return; -            } - -            if (!this.responses) { this.responses = []; } - -            if (arguments.length == 1) { -                body = method; -                url = method = null; -            } - -            if (arguments.length == 2) { -                body = url; -                url = method; -                method = null; -            } - -            push.call(this.responses, { -                method: method, -                url: url, -                response: typeof body == "function" ? body : responseArray(body) -            }); -        }, - -        respond: function respond() { -            if (arguments.length > 0) this.respondWith.apply(this, arguments); -            var queue = this.queue || []; -            var request; - -            while(request = queue.shift()) { -                this.processRequest(request); -            } -        }, - -        processRequest: function processRequest(request) { -            try { -                if (request.aborted) { -                    return; -                } - -                var response = this.response || [404, {}, ""]; - -                if (this.responses) { -                    for (var i = 0, l = this.responses.length; i < l; i++) { -                        if (match.call(this, this.responses[i], request)) { -                            response = this.responses[i].response; -                            break; -                        } -                    } -                } - -                if (request.readyState != 4) { -                    request.respond(response[0], response[1], response[2]); -                } -            } catch (e) { -                sinon.logError("Fake server request processing", e); -            } -        }, - -        restore: function restore() { -            return this.xhr.restore && this.xhr.restore.apply(this.xhr, arguments); -        } -    }; -}()); - -if (typeof module == "object" && typeof require == "function") { -    module.exports = sinon; -} - -/** - * @depend fake_server.js - * @depend fake_timers.js - */ -/*jslint browser: true, eqeqeq: false, onevar: false*/ -/*global sinon*/ -/** - * Add-on for sinon.fakeServer that automatically handles a fake timer along with - * the FakeXMLHttpRequest. The direct inspiration for this add-on is jQuery - * 1.3.x, which does not use xhr object's onreadystatehandler at all - instead, - * it polls the object for completion with setInterval. Dispite the direct - * motivation, there is nothing jQuery-specific in this file, so it can be used - * in any environment where the ajax implementation depends on setInterval or - * setTimeout. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function () { -    function Server() {} -    Server.prototype = sinon.fakeServer; - -    sinon.fakeServerWithClock = new Server(); - -    sinon.fakeServerWithClock.addRequest = function addRequest(xhr) { -        if (xhr.async) { -            if (typeof setTimeout.clock == "object") { -                this.clock = setTimeout.clock; -            } else { -                this.clock = sinon.useFakeTimers(); -                this.resetClock = true; -            } - -            if (!this.longestTimeout) { -                var clockSetTimeout = this.clock.setTimeout; -                var clockSetInterval = this.clock.setInterval; -                var server = this; - -                this.clock.setTimeout = function (fn, timeout) { -                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); - -                    return clockSetTimeout.apply(this, arguments); -                }; - -                this.clock.setInterval = function (fn, timeout) { -                    server.longestTimeout = Math.max(timeout, server.longestTimeout || 0); - -                    return clockSetInterval.apply(this, arguments); -                }; -            } -        } - -        return sinon.fakeServer.addRequest.call(this, xhr); -    }; - -    sinon.fakeServerWithClock.respond = function respond() { -        var returnVal = sinon.fakeServer.respond.apply(this, arguments); - -        if (this.clock) { -            this.clock.tick(this.longestTimeout || 0); -            this.longestTimeout = 0; - -            if (this.resetClock) { -                this.clock.restore(); -                this.resetClock = false; -            } -        } - -        return returnVal; -    }; - -    sinon.fakeServerWithClock.restore = function restore() { -        if (this.clock) { -            this.clock.restore(); -        } - -        return sinon.fakeServer.restore.apply(this, arguments); -    }; -}()); - -/** - * @depend ../sinon.js - * @depend collection.js - * @depend util/fake_timers.js - * @depend util/fake_server_with_clock.js - */ -/*jslint eqeqeq: false, onevar: false, plusplus: false*/ -/*global require, module*/ -/** - * Manages fake collections as well as fake utilities such as Sinon's - * timers and fake XHR implementation in one convenient object. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -if (typeof module == "object" && typeof require == "function") { -    var sinon = require("../sinon"); -    sinon.extend(sinon, require("./util/fake_timers")); -} - -(function () { -    var push = [].push; - -    function exposeValue(sandbox, config, key, value) { -        if (!value) { -            return; -        } - -        if (config.injectInto) { -            config.injectInto[key] = value; -        } else { -            push.call(sandbox.args, value); -        } -    } - -    function prepareSandboxFromConfig(config) { -        var sandbox = sinon.create(sinon.sandbox); - -        if (config.useFakeServer) { -            if (typeof config.useFakeServer == "object") { -                sandbox.serverPrototype = config.useFakeServer; -            } - -            sandbox.useFakeServer(); -        } - -        if (config.useFakeTimers) { -            if (typeof config.useFakeTimers == "object") { -                sandbox.useFakeTimers.apply(sandbox, config.useFakeTimers); -            } else { -                sandbox.useFakeTimers(); -            } -        } - -        return sandbox; -    } - -    sinon.sandbox = sinon.extend(sinon.create(sinon.collection), { -        useFakeTimers: function useFakeTimers() { -            this.clock = sinon.useFakeTimers.apply(sinon, arguments); - -            return this.add(this.clock); -        }, - -        serverPrototype: sinon.fakeServer, - -        useFakeServer: function useFakeServer() { -            var proto = this.serverPrototype || sinon.fakeServer; - -            if (!proto || !proto.create) { -                return null; -            } - -            this.server = proto.create(); -            return this.add(this.server); -        }, - -        inject: function (obj) { -            sinon.collection.inject.call(this, obj); - -            if (this.clock) { -                obj.clock = this.clock; -            } - -            if (this.server) { -                obj.server = this.server; -                obj.requests = this.server.requests; -            } - -            return obj; -        }, - -        create: function (config) { -            if (!config) { -                return sinon.create(sinon.sandbox); -            } - -            var sandbox = prepareSandboxFromConfig(config); -            sandbox.args = sandbox.args || []; -            var prop, value, exposed = sandbox.inject({}); - -            if (config.properties) { -                for (var i = 0, l = config.properties.length; i < l; i++) { -                    prop = config.properties[i]; -                    value = exposed[prop] || prop == "sandbox" && sandbox; -                    exposeValue(sandbox, config, prop, value); -                } -            } else { -                exposeValue(sandbox, config, "sandbox", value); -            } - -            return sandbox; -        } -    }); - -    sinon.sandbox.useFakeXMLHttpRequest = sinon.sandbox.useFakeServer; - -    if (typeof module == "object" && typeof require == "function") { -        module.exports = sinon.sandbox; -    } -}()); - -/** - * @depend ../sinon.js - * @depend stub.js - * @depend mock.js - * @depend sandbox.js - */ -/*jslint eqeqeq: false, onevar: false, forin: true, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Test function, sandboxes fakes - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon) { -        return; -    } - -    function test(callback) { -        var type = typeof callback; - -        if (type != "function") { -            throw new TypeError("sinon.test needs to wrap a test function, got " + type); -        } - -        return function () { -            var config = sinon.getConfig(sinon.config); -            config.injectInto = config.injectIntoThis && this || config.injectInto; -            var sandbox = sinon.sandbox.create(config); -            var exception, result; -            var args = Array.prototype.slice.call(arguments).concat(sandbox.args); - -            try { -                result = callback.apply(this, args); -            } finally { -                sandbox.verifyAndRestore(); -            } - -            return result; -        }; -    } - -    test.config = { -        injectIntoThis: true, -        injectInto: null, -        properties: ["spy", "stub", "mock", "clock", "server", "requests"], -        useFakeTimers: true, -        useFakeServer: true -    }; - -    if (commonJSModule) { -        module.exports = test; -    } else { -        sinon.test = test; -    } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend test.js - */ -/*jslint eqeqeq: false, onevar: false, eqeqeq: false*/ -/*global module, require, sinon*/ -/** - * Test case, sandboxes all test functions - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon || !Object.prototype.hasOwnProperty) { -        return; -    } - -    function createTest(property, setUp, tearDown) { -        return function () { -            if (setUp) { -                setUp.apply(this, arguments); -            } - -            var exception, result; - -            try { -                result = property.apply(this, arguments); -            } catch (e) { -                exception = e; -            } - -            if (tearDown) { -                tearDown.apply(this, arguments); -            } - -            if (exception) { -                throw exception; -            } - -            return result; -        }; -    } - -    function testCase(tests, prefix) { -        /*jsl:ignore*/ -        if (!tests || typeof tests != "object") { -            throw new TypeError("sinon.testCase needs an object with test functions"); -        } -        /*jsl:end*/ - -        prefix = prefix || "test"; -        var rPrefix = new RegExp("^" + prefix); -        var methods = {}, testName, property, method; -        var setUp = tests.setUp; -        var tearDown = tests.tearDown; - -        for (testName in tests) { -            if (tests.hasOwnProperty(testName)) { -                property = tests[testName]; - -                if (/^(setUp|tearDown)$/.test(testName)) { -                    continue; -                } - -                if (typeof property == "function" && rPrefix.test(testName)) { -                    method = property; - -                    if (setUp || tearDown) { -                        method = createTest(property, setUp, tearDown); -                    } - -                    methods[testName] = sinon.test(method); -                } else { -                    methods[testName] = tests[testName]; -                } -            } -        } - -        return methods; -    } - -    if (commonJSModule) { -        module.exports = testCase; -    } else { -        sinon.testCase = testCase; -    } -}(typeof sinon == "object" && sinon || null)); - -/** - * @depend ../sinon.js - * @depend stub.js - */ -/*jslint eqeqeq: false, onevar: false, nomen: false, plusplus: false*/ -/*global module, require, sinon*/ -/** - * Assertions matching the test spy retrieval interface. - * - * @author Christian Johansen (christian@cjohansen.no) - * @license BSD - * - * Copyright (c) 2010-2011 Christian Johansen - */ - -(function (sinon, global) { -    var commonJSModule = typeof module == "object" && typeof require == "function"; -    var slice = Array.prototype.slice; -    var assert; - -    if (!sinon && commonJSModule) { -        sinon = require("../sinon"); -    } - -    if (!sinon) { -        return; -    } - -    function verifyIsStub() { -        var method; - -        for (var i = 0, l = arguments.length; i < l; ++i) { -            method = arguments[i]; - -            if (!method) { -                assert.fail("fake is not a spy"); -            } - -            if (typeof method != "function") { -                assert.fail(method + " is not a function"); -            } - -            if (typeof method.getCall != "function") { -                assert.fail(method + " is not stubbed"); -            } -        } -    } - -    function failAssertion(object, msg) { -        object = object || global; -        var failMethod = object.fail || assert.fail; -        failMethod.call(object, msg); -    } - -    function mirrorPropAsAssertion(name, method, message) { -        if (arguments.length == 2) { -            message = method; -            method = name; -        } - -        assert[name] = function (fake) { -            verifyIsStub(fake); - -            var args = slice.call(arguments, 1); -            var failed = false; - -            if (typeof method == "function") { -                failed = !method(fake); -            } else { -                failed = typeof fake[method] == "function" ? -                    !fake[method].apply(fake, args) : !fake[method]; -            } - -            if (failed) { -                failAssertion(this, fake.printf.apply(fake, [message].concat(args))); -            } else { -                assert.pass(name); -            } -        }; -    } - -    function exposedName(prefix, prop) { -        return !prefix || /^fail/.test(prop) ? prop : -            prefix + prop.slice(0, 1).toUpperCase() + prop.slice(1); -    }; - -    assert = { -        failException: "AssertError", - -        fail: function fail(message) { -            var error = new Error(message); -            error.name = this.failException || assert.failException; - -            throw error; -        }, - -        pass: function pass(assertion) {}, - -        callOrder: function assertCallOrder() { -            verifyIsStub.apply(null, arguments); -            var expected = "", actual = ""; - -            if (!sinon.calledInOrder(arguments)) { -                try { -                    expected = [].join.call(arguments, ", "); -                    actual = sinon.orderByFirstCall(slice.call(arguments)).join(", "); -                } catch (e) { -                    // If this fails, we'll just fall back to the blank string -                } - -                failAssertion(this, "expected " + expected + " to be " + -                              "called in order but were called as " + actual); -            } else { -                assert.pass("callOrder"); -            } -        }, - -        callCount: function assertCallCount(method, count) { -            verifyIsStub(method); - -            if (method.callCount != count) { -                var msg = "expected %n to be called " + sinon.timesInWords(count) + -                    " but was called %c%C"; -                failAssertion(this, method.printf(msg)); -            } else { -                assert.pass("callCount"); -            } -        }, - -        expose: function expose(target, options) { -            if (!target) { -                throw new TypeError("target is null or undefined"); -            } - -            var o = options || {}; -            var prefix = typeof o.prefix == "undefined" && "assert" || o.prefix; -            var includeFail = typeof o.includeFail == "undefined" || !!o.includeFail; - -            for (var method in this) { -                if (method != "export" && (includeFail || !/^(fail)/.test(method))) { -                    target[exposedName(prefix, method)] = this[method]; -                } -            } - -            return target; -        } -    }; - -    mirrorPropAsAssertion("called", "expected %n to have been called at least once but was never called"); -    mirrorPropAsAssertion("notCalled", function (spy) { return !spy.called; }, -                          "expected %n to not have been called but was called %c%C"); -    mirrorPropAsAssertion("calledOnce", "expected %n to be called once but was called %c%C"); -    mirrorPropAsAssertion("calledTwice", "expected %n to be called twice but was called %c%C"); -    mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C"); -    mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t"); -    mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t"); -    mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C"); -    mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C"); -    mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C"); -    mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C"); -    mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C"); -    mirrorPropAsAssertion("threw", "%n did not throw exception%C"); -    mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C"); - -    if (commonJSModule) { -        module.exports = assert; -    } else { -        sinon.assert = assert; -    } -}(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : global)); - -return sinon;}.call(typeof window != 'undefined' && window || {})); diff --git a/spec/login_spec.js b/spec/login_spec.js index 461a4bb..24c7f4f 100644 --- a/spec/login_spec.js +++ b/spec/login_spec.js @@ -42,6 +42,10 @@ describe("Login with srp var", function() {      beforeEach(function() {        specHelper.setupFakeXHR.apply(this); +      calculate = new srp.Calculate(); +      calculate.randomSalt = function() {return "4c78c3f8"}; +      srp.session = new srp.Session(undefined, calculate); +        A_ = srp.session.calculateAndSetA(data.a)        old_login = $('#srp_username').val();        old_conf = $('#srp_password_confirmation').val(); @@ -68,7 +72,7 @@ describe("Login with srp var", function() {      });      it("authenticates successfully", function(){ -      srp.loggedIn = sinon.spy(); +      srp.loggedIn = jasmine.createSpy();        srp.login();        this.expectRequest('/1/sessions.json', 'login=' +data.username+ '&A=' +data.aa, 'POST'); @@ -80,7 +84,7 @@ describe("Login with srp var", function() {      });      it("reports errors during handshake", function(){ -      srp.error = sinon.spy(); +      srp.error = jasmine.createSpy();        var error = {login: "something went wrong on the server side"};        srp.login(); @@ -88,14 +92,12 @@ describe("Login with srp var", function() {        this.respondJSON(error, 422);        //this.expectNoMoreRequests(); -      expect(srp.error).toHaveBeenCalled; -      var args = srp.error.args[0]; -      expect(args[0]).toEqual(error); +      expect(srp.error).toHaveBeenCalledWith(error);      });      it("rejects B = 0", function(){ -      srp.loggedIn = sinon.spy(); -      srp.error = sinon.spy(); +      srp.loggedIn = jasmine.createSpy(); +      srp.error = jasmine.createSpy();        srp.login();        this.expectRequest('/1/sessions.json', 'login=' +data.username+ '&A=' +data.aa, 'POST'); diff --git a/spec/runner.html b/spec/runner.html deleted file mode 100644 index d0a5d5d..0000000 --- a/spec/runner.html +++ /dev/null @@ -1,79 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" -  "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<head> -  <meta http-equiv = "Content-Type" content = "text/html; charset=utf-8"> -  <title>Jasmine Spec Runner</title> - -  <link rel="shortcut icon" type="image/png" href="lib/jasmine-1.1.0.rc1/jasmine_favicon.png"> - -  <link rel="stylesheet" type="text/css" href="lib/jasmine/jasmine.css"> -  <script type="text/javascript" src="lib/jasmine/jasmine.js"></script> -  <script type="text/javascript" src="lib/jasmine/jasmine-html.js"></script> - -  <script type="text/javascript" src="lib/sinon/sinon-1.3.4.js"></script> -  <script type="text/javascript" src="lib/jasmine-sinon.js"></script> -  <script type="text/javascript" src="http://code.jquery.com/jquery-1.8.2.js"></script> - -  <!-- the files we are testing... --> -  <script type="text/javascript" src="../lib/SHA256.js"></script> -  <script type="text/javascript" src="../lib/prng4.js"></script> -  <script type="text/javascript" src="../lib/rng.js"></script> -  <script type="text/javascript" src="../lib/jsbn.js"></script> -  <script type="text/javascript" src="../lib/jsbn2.js"></script> -  <script type="text/javascript" src="../src/srp.js"></script> -  <script type="text/javascript" src="../src/jqueryRest.js"></script> -  <script type="text/javascript" src="../src/srp_account.js"></script> -  <script type="text/javascript" src="../src/srp_calculate.js"></script> -  <script type="text/javascript" src="../src/srp_session.js"></script> -   -  <!-- include spec files here... --> -  <script type="text/javascript" src="helper.js"></script> -  <script type="text/javascript" src="signup_spec.js"></script> -  <script type="text/javascript" src="login_spec.js"></script> -  <script type="text/javascript" src="account_spec.js"></script> -  <script type="text/javascript" src="calculate_spec.js"></script> -  <script type="text/javascript" src="session_spec.js"></script> - -  <script type="text/javascript"> - -    (function() { -      var jasmineEnv = jasmine.getEnv(); -      jasmineEnv.updateInterval = 1000; - -      var htmlReporter = new jasmine.HtmlReporter(); - -      jasmineEnv.addReporter(htmlReporter); - -      jasmineEnv.specFilter = function(spec) { -        return htmlReporter.specFilter(spec); -      }; - -      var currentWindowOnload = window.onload; -      window.onload = function() { -        if (currentWindowOnload) { -          currentWindowOnload(); -        } - -        execJasmine(); -      }; - -      function execJasmine() { -        jasmineEnv.execute(); -      } -    })(); - -  </script> - -</head> - -<body> -    <form action="." onsubmit="return register()"> -    <table> -    <tr><td>Username:</td><td><input type="text" id="srp_username" value="testuser" /></td></tr> -    <tr><td>Password:</td><td><input type="password" id="srp_password" value="password"/></td></tr> -    </table> -    <input type="submit"/> -    </form> -</body> -</html> diff --git a/spec/signup_spec.js b/spec/signup_spec.js index 0bd8d48..89b0936 100644 --- a/spec/signup_spec.js +++ b/spec/signup_spec.js @@ -19,7 +19,7 @@ describe("Signup with srp var", function() {    });    it("identifies after successful registration (INTEGRATION)", function(){ -    var callback = sinon.spy(); +    var callback = jasmine.createSpy();      srp.signedUp = callback;      srp.signup();      this.expectRequest('/1/users.json', "user[login]=testuser&user[password_salt]=4c78c3f8&user[password_verifier]=474c26aa42d11f20544a00f7bf9711c4b5cf7aab95ed448df82b95521b96668e7480b16efce81c861870302560ddf6604c67df54f1d04b99d5bb9d0f02c6051ada5dc9d594f0d4314e12f876cfca3dcd99fc9c98c2e6a5e04298b11061fb8549a22cde0564e91514080df79bca1c38c682214d65d590f66b3719f954b078b83c", 'POST') | 
