Skip to content
Browse files

including dependencies in repo

  • Loading branch information...
1 parent 6d58a07 commit 356cb0ab1dc17b874170935b18cc50fdb0647a75 @aoberoi aoberoi committed Jun 10, 2012
Showing with 51,267 additions and 0 deletions.
  1. +1 −0 node_modules/.bin/jasmine-node
  2. +12 −0 node_modules/jasmine-node/.npmignore
  3. +6 −0 node_modules/jasmine-node/.travis.yml
  4. +22 −0 node_modules/jasmine-node/LICENSE
  5. +83 −0 node_modules/jasmine-node/README.md
  6. +7 −0 node_modules/jasmine-node/bin/jasmine-node
  7. +54 −0 node_modules/jasmine-node/lib/jasmine-node/async-callback.js
  8. +90 −0 node_modules/jasmine-node/lib/jasmine-node/autotest.js
  9. +176 −0 node_modules/jasmine-node/lib/jasmine-node/cli.js
  10. +148 −0 node_modules/jasmine-node/lib/jasmine-node/index.js
  11. +2,479 −0 node_modules/jasmine-node/lib/jasmine-node/jasmine-2.0.0.rc1.js
  12. +275 −0 node_modules/jasmine-node/lib/jasmine-node/reporter.js
  13. +80 −0 node_modules/jasmine-node/lib/jasmine-node/requirejs-runner.js
  14. +48 −0 node_modules/jasmine-node/lib/jasmine-node/requirejs-spec-loader.js
  15. +65 −0 node_modules/jasmine-node/lib/jasmine-node/requirejs-wrapper-template.js
  16. +35 −0 node_modules/jasmine-node/lib/jasmine-node/spec-collection.js
  17. +1 −0 node_modules/jasmine-node/node_modules/.bin/cake
  18. +1 −0 node_modules/jasmine-node/node_modules/.bin/coffee
  19. +1 −0 node_modules/jasmine-node/node_modules/.bin/r.js
  20. +11 −0 node_modules/jasmine-node/node_modules/coffee-script/.npmignore
  21. +1 −0 node_modules/jasmine-node/node_modules/coffee-script/CNAME
  22. +22 −0 node_modules/jasmine-node/node_modules/coffee-script/LICENSE
  23. +51 −0 node_modules/jasmine-node/node_modules/coffee-script/README
  24. +78 −0 node_modules/jasmine-node/node_modules/coffee-script/Rakefile
  25. +7 −0 node_modules/jasmine-node/node_modules/coffee-script/bin/cake
  26. +7 −0 node_modules/jasmine-node/node_modules/coffee-script/bin/coffee
  27. +44 −0 node_modules/jasmine-node/node_modules/coffee-script/extras/jsl.conf
  28. +92 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/browser.js
  29. +111 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/cake.js
  30. +167 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/coffee-script.js
  31. +500 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/command.js
  32. +606 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/grammar.js
  33. +77 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/helpers.js
  34. +11 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/index.js
  35. +788 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/lexer.js
  36. +2,986 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/nodes.js
  37. +138 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/optparse.js
  38. +683 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/parser.js
  39. +261 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/repl.js
  40. +349 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/rewriter.js
  41. +146 −0 node_modules/jasmine-node/node_modules/coffee-script/lib/coffee-script/scope.js
  42. +51 −0 node_modules/jasmine-node/node_modules/coffee-script/package.json
  43. +2 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/.npmignore
  44. +21 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/LICENSE
  45. +52 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/README.markdown
  46. +13,989 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/ext/env.rhino.1.2.js
  47. +182 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/ext/jasmine-html.js
  48. +166 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/ext/jasmine.css
  49. +2,421 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/ext/jasmine.js
  50. BIN node_modules/jasmine-node/node_modules/jasmine-reporters/ext/jline.jar
  51. BIN node_modules/jasmine-node/node_modules/jasmine-reporters/ext/js.jar
  52. +30 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/package.json
  53. +142 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/src/jasmine.console_reporter.js
  54. +200 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/src/jasmine.junit_reporter.js
  55. +139 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/src/jasmine.teamcity_reporter.js
  56. +3 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/src/load_reporters.js
  57. +214 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/JUnitXmlReporterSpec.js
  58. +36 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/console_reporter.html
  59. +14 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/envjs.bootstrap.js
  60. +7 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/envjs.runner.sh
  61. +23 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/junit_xml_reporter.html
  62. +183 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/phantomjs-testrunner.js
  63. +36 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/phantomjs.runner.sh
  64. +36 −0 node_modules/jasmine-node/node_modules/jasmine-reporters/test/teamcity_reporter.html
  65. +1 −0 node_modules/jasmine-node/node_modules/requirejs/.npmignore
  66. +16,711 −0 node_modules/jasmine-node/node_modules/requirejs/bin/r.js
  67. +40 −0 node_modules/jasmine-node/node_modules/requirejs/package.json
  68. +1,988 −0 node_modules/jasmine-node/node_modules/requirejs/require.js
  69. +3 −0 node_modules/jasmine-node/node_modules/underscore/.npmignore
  70. +1 −0 node_modules/jasmine-node/node_modules/underscore/CNAME
  71. +22 −0 node_modules/jasmine-node/node_modules/underscore/LICENSE
  72. +19 −0 node_modules/jasmine-node/node_modules/underscore/README.md
  73. BIN node_modules/jasmine-node/node_modules/underscore/favicon.ico
  74. +2,109 −0 node_modules/jasmine-node/node_modules/underscore/index.html
  75. +1 −0 node_modules/jasmine-node/node_modules/underscore/index.js
  76. +37 −0 node_modules/jasmine-node/node_modules/underscore/package.json
  77. BIN node_modules/jasmine-node/node_modules/underscore/raw/underscore.psd
  78. +32 −0 node_modules/jasmine-node/node_modules/underscore/underscore-min.js
  79. +1,059 −0 node_modules/jasmine-node/node_modules/underscore/underscore.js
  80. +3 −0 node_modules/jasmine-node/node_modules/walkdir/.jshintignore
  81. +2 −0 node_modules/jasmine-node/node_modules/walkdir/.npmignore
  82. +3 −0 node_modules/jasmine-node/node_modules/walkdir/.travis.yml
  83. +48 −0 node_modules/jasmine-node/node_modules/walkdir/package.json
  84. +141 −0 node_modules/jasmine-node/node_modules/walkdir/readme.md
  85. +19 −0 node_modules/jasmine-node/node_modules/walkdir/test.sh
  86. +62 −0 node_modules/jasmine-node/node_modules/walkdir/test/async.js
  87. +33 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/find.js
  88. +26 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/find.py
  89. +15 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/finditsynctest.js
  90. +14 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/findittest.js
  91. +24 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/fstream.js
  92. +1 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/install_test_deps.sh
  93. +18 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/lsr.js
  94. +10 −0 node_modules/jasmine-node/node_modules/walkdir/test/comparison/package.json
  95. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/foo/a/b/c/w
  96. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/foo/a/b/z
  97. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/foo/a/y
  98. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/foo/x
  99. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/symlinks/dir1/file1
  100. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/symlinks/dir2/file2
  101. 0 node_modules/jasmine-node/node_modules/walkdir/test/dir/symlinks/file
  102. +19 −0 node_modules/jasmine-node/node_modules/walkdir/test/endearly.js
  103. +27 −0 node_modules/jasmine-node/node_modules/walkdir/test/max_depth.js
  104. +25 −0 node_modules/jasmine-node/node_modules/walkdir/test/no_recurse.js
  105. +37 −0 node_modules/jasmine-node/node_modules/walkdir/test/symlink.js
  106. +50 −0 node_modules/jasmine-node/node_modules/walkdir/test/sync.js
Sorry, we could not display the entire diff because it was too big.
View
1 node_modules/.bin/jasmine-node
View
12 node_modules/jasmine-node/.npmignore
@@ -0,0 +1,12 @@
+.DS_Store
+.idea
+*.iml
+*.ipr
+*.iws
+*.tmproj
+.project
+.settings
+.externalToolBuilders
+*.swp
+node_modules
+*~
View
6 node_modules/jasmine-node/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+ - 0.6
+branches:
+ only:
+ - travis
View
22 node_modules/jasmine-node/LICENSE
@@ -0,0 +1,22 @@
+The MIT License
+
+Copyright (c) 2010 Adam Abrons and Misko Hevery http://getangular.com
+
+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.
+
View
83 node_modules/jasmine-node/README.md
@@ -0,0 +1,83 @@
+jasmine-node
+======
+
+[![Build Status](https://secure.travis-ci.org/spaghetticode/jasmine-node.png)](http://travis-ci.org/spaghetticode/jasmine-node)
+
+This node.js module makes the wonderful Pivotal Lab's jasmine
+(http://github.com/pivotal/jasmine) spec framework available in
+node.js.
+
+install
+------
+ npm install jasmine-node -g
+
+usage
+------
+
+Write the specifications for your code in *.js and *.coffee files in the
+spec/ directory (note: your specification files must end with either
+.spec.js or .spec.coffee; otherwise jasmine-node won't find them!). You
+can use sub-directories to better organise your specs.
+
+If you have installed the npm package, you can run it with:
+
+ jasmine-node
+
+If you aren't using npm, you should add `pwd`/lib to the $NODE_PATH
+environment variable, then run:
+
+ node lib/jasmine-node/cli.js
+
+
+You can supply the following arguments:
+
+ * <code>--autotest</code>, provides automatic execution of specs after
+ each changes
+ * <code>--coffee</code>, allow execution of .coffee specs
+ * <code>--color</code>, indicates spec output should uses color to
+indicates passing (green) or failing (red) specs
+ * <code>--noColor</code>, do not use color in the output
+ * <code>--verbose</code>, verbose output as the specs are run
+ * <code>--junitreport</code>, export tests results as junitreport xml format'
+
+Checkout spec/SampleSpecs.js to see how to use it.
+
+async tests
+-----------
+
+jasmine-node includes an alternate syntax for writing asynchronous tests. Accepting
+a done callback in the specification will trigger jasmine-node to run the test
+asynchronously waiting until the done() callback is called.
+
+```javascript
+ it("should respond with hello world", function(done) {
+ request("http://localhost:3000/hello", function(error, response, body){
+ expect(body).toEqual("hello world");
+ done();
+ });
+ });
+```
+
+An asynchronous test will fail after 5000 ms if done() is not called. This timeout
+can be changed by setting jasmine.DEFAULT_TIMEOUT_INTERVAL or by passing a timeout
+interval in the specification.
+
+ it("should respond with hello world", function(done) {
+ request("http://localhost:3000/hello", function(error, response, body){
+ done();
+ }, 250); // timeout after 250 ms
+ });
+
+development
+-----------
+Install the dependent packages by running:
+
+ npm install
+
+Run the specs before you send your pull request:
+
+ scripts/specs
+
+or
+
+ scripts/specs --verbose
View
7 node_modules/jasmine-node/bin/jasmine-node
@@ -0,0 +1,7 @@
+#!/usr/bin/env node
+
+if( !process.env.NODE_ENV ) process.env.NODE_ENV = 'test';
+
+var path = require('path');
+var fs = require('fs');
+require(path.join(__dirname,'../lib/jasmine-node/cli.js'));
View
54 node_modules/jasmine-node/lib/jasmine-node/async-callback.js
@@ -0,0 +1,54 @@
+(function() {
+ var withoutAsync = {};
+
+ ["it", "beforeEach", "afterEach"].forEach(function(jasmineFunction) {
+ withoutAsync[jasmineFunction] = jasmine.Env.prototype[jasmineFunction];
+ return jasmine.Env.prototype[jasmineFunction] = function() {
+ var args = Array.prototype.slice.call(arguments, 0);
+ var timeout = null;
+ if (isLastArgumentATimeout(args)) {
+ timeout = args.pop();
+ }
+ if (isLastArgumentAnAsyncSpecFunction(args))
+ {
+ var specFunction = args.pop();
+ args.push(function() {
+ return asyncSpec(specFunction, this, timeout);
+ });
+ }
+ return withoutAsync[jasmineFunction].apply(this, args);
+ };
+ });
+
+ function isLastArgumentATimeout(args)
+ {
+ return args.length > 0 && (typeof args[args.length-1]) === "number";
+ }
+
+ function isLastArgumentAnAsyncSpecFunction(args)
+ {
+ return args.length > 0 && (typeof args[args.length-1]) === "function" && args[args.length-1].length > 0;
+ }
+
+ function asyncSpec(specFunction, spec, timeout) {
+ if (timeout == null) timeout = jasmine.DEFAULT_TIMEOUT_INTERVAL || 1000;
+ var done = false;
+ spec.runs(function() {
+ try {
+ return specFunction(function(error) {
+ done = true;
+ if (error != null) return spec.fail(error);
+ });
+ } catch (e) {
+ done = true;
+ throw e;
+ }
+ });
+ return spec.waitsFor(function() {
+ if (done === true) {
+ return true;
+ }
+ }, "spec to complete", timeout);
+ };
+
+}).call(this);
View
90 node_modules/jasmine-node/lib/jasmine-node/autotest.js
@@ -0,0 +1,90 @@
+var walkdir = require('walkdir');
+var collection = require('./spec-collection');
+var path = require('path');
+var fs = require('fs');
+var child_process = require('child_process');
+
+var baseArgv = [];
+
+for(var i = 0; i < process.argv.length; i++) {
+ if(process.argv[i] !== '--autotest') {
+ baseArgv.push(process.argv[i]);
+ }
+}
+
+var run_external = function(command, args, callback) {
+ var child = child_process.spawn(command, args);
+ child.stdout.on('data', function(data) {
+ process.stdout.write(data);
+ });
+ child.stderr.on('data', function(data) {
+ process.stderr.write(data);
+ });
+ if(typeof callback == 'function') {
+ child.on('exit', callback);
+ }
+}
+
+var run_everything = function() {
+ // run the suite when it starts
+ var argv = [].concat(baseArgv);
+ run_external(argv.shift(), argv, function() { console.log(arguments) });
+}
+
+var last_run_succesful = true;
+
+var watchFile = function(file, stat) {
+
+ var file = path.normalize(file)
+
+ var prevStats = stat;
+
+ var watcher = fs.watch(file, function(ev) {
+
+ if(!path.existsSync(file)) {
+ watcher.close();
+ return;
+ }
+
+ var currStats = fs.statSync( file );
+
+ if(prevStats.mtime.getTime() != currStats.mtime.getTime()) {
+ prevStats = currStats;
+
+ // narrow down a pattern to reduce the specs runned
+ var match = path.basename(file, path.extname(file)) + ".*";
+ match = match.replace(new RegExp("spec", "i"), "");
+
+ // so we need to rerun the jasmine suite
+ var argv = [].concat(baseArgv, ["--match", match]);
+ run_external(argv.shift(), argv, function(code) {
+ // run everything if we fixed some bugs
+ if(code == 0) {
+ if(!last_run_succesful) {
+ run_everything();
+ }
+ last_run_succesful = true;
+ } else {
+ last_run_succesful = false;
+ }
+ });
+ }
+ });
+}
+
+
+exports.start = function(loadpath, pattern) {
+
+ var finder = walkdir.find(loadpath);
+
+ finder.on('file', function(file, stat) {
+ var basename = path.basename(file);
+
+ if(pattern.test(basename)) {
+ watchFile(file,stat);
+ }
+
+ });
+
+ run_everything();
+}
View
176 node_modules/jasmine-node/lib/jasmine-node/cli.js
@@ -0,0 +1,176 @@
+var jasmine = require('./index');
+var util,
+ Path= require('path');
+try {
+ util = require('util')
+} catch(e) {
+ util = require('sys')
+}
+
+var helperCollection = require('./spec-collection');
+
+var specFolder = null;
+
+for (var key in jasmine)
+ global[key] = jasmine[key];
+
+var isVerbose = false;
+var showColors = true;
+var teamcity = process.env.TEAMCITY_PROJECT_NAME || false;
+var useRequireJs = false;
+var extentions = "js";
+var match = '.';
+var matchall = false;
+var autotest = false;
+var useHelpers = true;
+var forceExit = false;
+
+var junitreport = {
+ report: false,
+ savePath : "./reports/",
+ useDotNotation: true,
+ consolidate: true
+}
+
+var args = process.argv.slice(2);
+
+while(args.length) {
+ var arg = args.shift();
+
+ switch(arg)
+ {
+ case '--color':
+ showColors = true;
+ break;
+ case '--noColor':
+ case '--nocolor':
+ showColors = false;
+ break;
+ case '--verbose':
+ isVerbose = true;
+ break;
+ case '--coffee':
+ require('coffee-script');
+ extentions = "js|coffee";
+ break;
+ case '-m':
+ case '--match':
+ match = args.shift();
+ break;
+ case '--matchall':
+ matchall = true;
+ break;
+ case '--junitreport':
+ junitreport.report = true;
+ break;
+ case '--output':
+ junitreport.savePath = args.shift();
+ break;
+ case '--teamcity':
+ teamcity = true;
+ break;
+ case '--runWithRequireJs':
+ useRequireJs = true;
+ break;
+ case '--nohelpers':
+ useHelpers = false;
+ break;
+ case '--test-dir':
+ var dir = args.shift();
+
+ if(!Path.existsSync(dir))
+ throw new Error("Test root path '" + dir + "' doesn't exist!");
+
+ specFolder = dir; // NOTE: Does not look from current working directory.
+ break;
+ case '--autotest':
+ autotest = true;
+ break;
+ case '--forceexit':
+ forceExit = true;
+ break;
+ case '-h':
+ help();
+ default:
+ if (arg.match(/^--/)) help();
+ if (arg.match(/^\/.*/)) {
+ specFolder = arg;
+ } else {
+ specFolder = Path.join(process.cwd(), arg);
+ }
+ break;
+ }
+}
+
+if (!specFolder) {
+ help();
+}
+
+if (autotest) {
+ require('./autotest').start(specFolder,
+ new RegExp(".+\\.(" + extentions + ")$", "i"));
+ return;
+}
+
+var exitCode = 0;
+
+process.on("exit", onExit);
+
+function onExit() {
+ process.removeListener("exit", onExit);
+ process.exit(exitCode);
+}
+
+var onComplete = function(runner, log) {
+ util.print('\n');
+ if (runner.results().failedCount == 0) {
+ exitCode = 0;
+ } else {
+ exitCode = 1;
+ }
+ if (forceExit) {
+ process.exit(exitCode);
+ }
+};
+
+if(useHelpers){
+ jasmine.loadHelpersInFolder(specFolder,
+ new RegExp("helpers?\\.(" + extentions + ")$", 'i'));
+}
+
+var regExpSpec = new RegExp(match + (matchall ? "" : "spec\\.") + "(" + extentions + ")$", 'i')
+
+jasmine.executeSpecsInFolder(specFolder,
+ onComplete,
+ isVerbose,
+ showColors,
+ teamcity,
+ useRequireJs,
+ regExpSpec,
+ junitreport);
+
+function help(){
+ util.print([
+ 'USAGE: jasmine-node [--color|--noColor] [--verbose] [--coffee] directory'
+ , ''
+ , 'Options:'
+ , ' --autotest - rerun automatically the specs when a file changes'
+ , ' --color - use color coding for output'
+ , ' --noColor - do not use color coding for output'
+ , ' -m, --match REGEXP - load only specs containing "REGEXPspec"'
+ , ' --matchall - relax requirement of "spec" in spec file names'
+ , ' --verbose - print extra information per each test run'
+ , ' --coffee - load coffee-script which allows execution .coffee files'
+ , ' --junitreport - export tests results as junitreport xml format'
+ , ' --output - defines the output folder for junitreport files'
+ , ' --teamcity - converts all console output to teamcity custom test runner commands. (Normally auto detected.)'
+ , ' --runWithRequireJs - loads all specs using requirejs instead of node\'s native require method'
+ , ' --test-dir - the absolute root directory path where tests are located'
+ , ' --nohelpers - does not load helpers.'
+ , ' --forceexit - force exit once tests complete.'
+ , ' -h, --help - display this help and exit'
+ , ''
+ ].join("\n"));
+
+ process.exit(-1);
+}
View
148 node_modules/jasmine-node/lib/jasmine-node/index.js
@@ -0,0 +1,148 @@
+var fs = require('fs');
+var util;
+try {
+ util = require('util')
+} catch(e) {
+ util = require('sys')
+}
+
+var path = require('path');
+
+var filename = __dirname + '/jasmine-2.0.0.rc1.js';
+global.window = {
+ setTimeout: setTimeout,
+ clearTimeout: clearTimeout,
+ setInterval: setInterval,
+ clearInterval: clearInterval
+};
+
+var src = fs.readFileSync(filename);
+var jasmine;
+var minorVersion = process.version.match(/\d\.(\d)\.\d/)[1];
+switch (minorVersion) {
+ case "1":
+ case "2":
+ jasmine = process.compile(src + '\njasmine;', filename);
+ break;
+ default:
+ jasmine = require('vm').runInThisContext(src + "\njasmine;", filename);
+}
+
+delete global.window;
+require("./async-callback");
+require("jasmine-reporters");
+
+var jasmineNode = require('./reporter').jasmineNode;
+
+jasmine.loadHelpersInFolder=function(folder, matcher)
+{
+ var helpers = [],
+ helperCollection = require('./spec-collection');
+
+ helperCollection.load(folder, matcher);
+ helpers = helperCollection.getSpecs();
+
+ for (var i = 0, len = helpers.length; i < len; ++i)
+ {
+ var file = helpers[i].path();
+ var helper= require(file.replace(/\.*$/, ""));
+ for (var key in helper)
+ global[key]= helper[key];
+ }
+};
+
+function removeJasmineFrames(text) {
+ var lines = [];
+ text.split(/\n/).forEach(function(line){
+ if (line.indexOf(filename) == -1) {
+ lines.push(line);
+ }
+ });
+ return lines.join('\n');
+}
+
+jasmine.executeSpecsInFolder = function(folder,
+ done,
+ isVerbose,
+ showColors,
+ teamcity,
+ useRequireJs,
+ matcher,
+ junitreport){
+ var fileMatcher = matcher || new RegExp(".(js)$", "i"),
+ colors = showColors || false,
+ specs = require('./spec-collection'),
+ jasmineEnv = jasmine.getEnv();
+
+ specs.load(folder, fileMatcher);
+
+ if(junitreport && junitreport.report) {
+ if(!path.existsSync(junitreport.savePath)) {
+ util.puts('creating junit xml report save path: ' + junitreport.savePath);
+ fs.mkdirSync(junitreport.savePath, "0755");
+ }
+ jasmineEnv.addReporter(new jasmine.JUnitXmlReporter(junitreport.savePath,
+ junitreport.consolidate,
+ junitreport.useDotNotation));
+ }
+
+ if(teamcity){
+ jasmineEnv.addReporter(new jasmineNode.TerminalReporter({print: util.print,
+ color: false,
+ onComplete: done,
+ stackFilter: removeJasmineFrames}));
+ } else if(isVerbose) {
+ jasmineEnv.addReporter(new jasmineNode.TerminalVerboseReporter({ print: util.print,
+ color: showColors,
+ onComplete: done,
+ stackFilter: removeJasmineFrames}));
+ } else {
+ jasmineEnv.addReporter(new jasmineNode.TerminalReporter({print: util.print,
+ color: showColors,
+ onComplete: done,
+ stackFilter: removeJasmineFrames}));
+ }
+
+ if (useRequireJs) {
+ require('./requirejs-runner').executeJsRunner(specs, done, jasmineEnv);
+ } else {
+ var specsList = specs.getSpecs();
+
+ for (var i = 0, len = specsList.length; i < len; ++i) {
+ var filename = specsList[i];
+ require(filename.path().replace(/\.\w+$/, ""));
+ }
+
+ jasmineEnv.execute();
+ }
+};
+
+function now(){
+ return new Date().getTime();
+}
+
+jasmine.asyncSpecWait = function(){
+ var wait = jasmine.asyncSpecWait;
+ wait.start = now();
+ wait.done = false;
+ (function innerWait(){
+ waits(10);
+ runs(function() {
+ if (wait.start + wait.timeout < now()) {
+ expect('timeout waiting for spec').toBeNull();
+ } else if (wait.done) {
+ wait.done = false;
+ } else {
+ innerWait();
+ }
+ });
+ })();
+};
+jasmine.asyncSpecWait.timeout = 4 * 1000;
+jasmine.asyncSpecDone = function(){
+ jasmine.asyncSpecWait.done = true;
+};
+
+for ( var key in jasmine) {
+ exports[key] = jasmine[key];
+}
View
2,479 node_modules/jasmine-node/lib/jasmine-node/jasmine-2.0.0.rc1.js
@@ -0,0 +1,2479 @@
+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);
+};
+
+/**
+ * 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, '&amp;')
+ .replace(/</g, '&lt;')
+ .replace(/>/g, '&gt;');
+};
+
+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_) {
+ 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;
+ } else {
+ return "version unknown";
+ }
+};
+
+/**
+ * @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 instanceof jasmine.Matchers.Any) {
+ return a.matches(b);
+ }
+
+ if (b instanceof jasmine.Matchers.Any) {
+ 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.toNotEqual() 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.toNotContain() 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.matches = 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.toString = function() {
+ return '<jasmine.any(' + this.expectedClass + ')>';
+};
+
+/**
+ * @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;
+ /**