From 22d43bf40caf85e702cf48fa73f357023f18f89a Mon Sep 17 00:00:00 2001 From: Alex Pop Date: Sat, 29 Aug 2015 23:41:56 +0100 Subject: [PATCH] updated packages and minor refactoring --- collections/transformations/SpecRunner.html | 6 +- collections/transformations/bower.json | 8 +- .../bower_components/jasmine/.bower.json | 53 +- .../bower_components/jasmine/.gitignore | 24 - .../bower_components/jasmine/.gitmodules | 3 - .../bower_components/jasmine/.jshintrc | 9 - .../bower_components/jasmine/.npmignore | 20 - .../bower_components/jasmine/.rspec | 1 - .../bower_components/jasmine/.travis.yml | 51 - .../bower_components/jasmine/CONTRIBUTING.md | 43 +- .../bower_components/jasmine/Gemfile | 12 - .../bower_components/jasmine/Gruntfile.js | 53 - .../bower_components/jasmine/README.md | 45 +- .../bower_components/jasmine/RELEASE.md | 20 +- .../bower_components/jasmine/Rakefile | 18 - .../bower_components/jasmine/bower.json | 41 + .../jasmine/dist/jasmine-standalone-1.0.0.zip | Bin 21084 -> 0 bytes .../jasmine/dist/jasmine-standalone-1.1.0.zip | Bin 27051 -> 0 bytes .../jasmine/dist/jasmine-standalone-1.2.0.zip | Bin 24798 -> 0 bytes .../jasmine/dist/jasmine-standalone-1.3.0.zip | Bin 25788 -> 0 bytes .../jasmine/dist/jasmine-standalone-1.3.1.zip | Bin 25786 -> 0 bytes .../jasmine/dist/jasmine-standalone-2.0.0.zip | Bin 32242 -> 0 bytes .../jasmine/dist/jasmine-standalone-2.0.1.zip | Bin 39173 -> 0 bytes .../jasmine/dist/jasmine-standalone-2.0.2.zip | Bin 39235 -> 0 bytes .../jasmine/grunt/config/compass.js | 10 - .../jasmine/grunt/config/compress.js | 66 - .../jasmine/grunt/config/concat.js | 61 - .../jasmine/grunt/config/jshint.js | 11 - .../jasmine/grunt/tasks/build_standalone.js | 31 - .../jasmine/grunt/tasks/version.js | 14 - .../grunt/templates/SpecRunner.html.jst | 26 - .../grunt/templates/licenseBanner.js.jst | 22 - .../jasmine/grunt/templates/version.rb.jst | 9 - .../jasmine/images/__init__.py | 0 .../jasmine/jasmine-core.gemspec | 23 - .../jasmine/lib/console/console.js | 30 +- .../jasmine/lib/jasmine-core.js | 54 +- .../jasmine/lib/jasmine-core.rb | 53 - .../jasmine/lib/jasmine-core/__init__.py | 1 - .../jasmine/lib/jasmine-core/boot.js | 19 +- .../jasmine/lib/jasmine-core/boot/boot.js | 120 - .../lib/jasmine-core/boot/node_boot.js | 19 - .../jasmine/lib/jasmine-core/core.py | 60 - .../{src => lib/jasmine_examples}/Player.js | 0 .../{src => lib/jasmine_examples}/Song.js | 0 .../example/node_example/spec/PlayerSpec.js | 60 - .../example/node_example/spec/SpecHelper.js | 15 - .../jasmine-core/example/spec/PlayerSpec.js | 58 - .../jasmine-core/example/spec/SpecHelper.js | 15 - .../lib/jasmine-core/example/src/Player.js | 22 - .../lib/jasmine-core/example/src/Song.js | 7 - .../jasmine/lib/jasmine-core/jasmine-html.js | 96 +- .../jasmine/lib/jasmine-core/jasmine.css | 33 +- .../jasmine/lib/jasmine-core/jasmine.js | 2093 +++++--- .../jasmine/lib/jasmine-core/json2.js | 135 +- .../jasmine/lib/jasmine-core/node_boot.js | 2 +- .../jasmine/lib/jasmine-core/version.rb | 9 - .../bower_components/jasmine/package.json | 25 +- .../jasmine/release_notes/2.0.1.md | 70 - .../jasmine/release_notes/2.0.2.md | 25 - .../jasmine/release_notes/20.md | 179 - .../bower_components/jasmine/setup.py | 47 - .../spec/console/ConsoleReporterSpec.js | 239 - .../jasmine/spec/core/AnySpec.js | 46 - .../jasmine/spec/core/CallTrackerSpec.js | 105 - .../jasmine/spec/core/ClockSpec.js | 445 -- .../spec/core/DelayedFunctionSchedulerSpec.js | 246 - .../jasmine/spec/core/EnvSpec.js | 85 - .../spec/core/ExceptionFormatterSpec.js | 63 - .../jasmine/spec/core/ExceptionsSpec.js | 68 - .../spec/core/ExpectationResultSpec.js | 61 - .../jasmine/spec/core/ExpectationSpec.js | 427 -- .../jasmine/spec/core/JsApiReporterSpec.js | 214 - .../jasmine/spec/core/MockDateSpec.js | 199 - .../jasmine/spec/core/ObjectContainingSpec.js | 70 - .../jasmine/spec/core/PrettyPrintSpec.js | 156 - .../jasmine/spec/core/QueueRunnerSpec.js | 271 -- .../jasmine/spec/core/ReportDispatcherSpec.js | 40 - .../jasmine/spec/core/SpecSpec.js | 260 - .../jasmine/spec/core/SpySpec.js | 67 - .../jasmine/spec/core/SpyStrategySpec.js | 111 - .../jasmine/spec/core/SuiteSpec.js | 216 - .../jasmine/spec/core/TimerSpec.js | 31 - .../jasmine/spec/core/UtilSpec.js | 28 - .../core/integration/CustomMatchersSpec.js | 149 - .../jasmine/spec/core/integration/EnvSpec.js | 506 -- .../spec/core/integration/SpecRunningSpec.js | 306 -- .../spec/core/matchers/matchersUtilSpec.js | 239 - .../spec/core/matchers/toBeCloseToSpec.js | 51 - .../spec/core/matchers/toBeDefinedSpec.js | 18 - .../spec/core/matchers/toBeFalsySpec.js | 38 - .../spec/core/matchers/toBeGreaterThanSpec.js | 20 - .../spec/core/matchers/toBeLessThanSpec.js | 20 - .../jasmine/spec/core/matchers/toBeNaNSpec.js | 37 - .../spec/core/matchers/toBeNullSpec.js | 17 - .../jasmine/spec/core/matchers/toBeSpec.js | 17 - .../spec/core/matchers/toBeTruthySpec.js | 38 - .../spec/core/matchers/toBeUndefinedSpec.js | 18 - .../spec/core/matchers/toContainSpec.js | 26 - .../jasmine/spec/core/matchers/toEqualSpec.js | 28 - .../core/matchers/toHaveBeenCalledSpec.js | 47 - .../core/matchers/toHaveBeenCalledWithSpec.js | 66 - .../jasmine/spec/core/matchers/toMatchSpec.js | 34 - .../spec/core/matchers/toThrowErrorSpec.js | 280 -- .../jasmine/spec/core/matchers/toThrowSpec.js | 99 - .../jasmine/spec/helpers/BrowserFlags.js | 23 - .../spec/helpers/defineJasmineUnderTest.js | 7 - .../helpers/nodeDefineJasmineUnderTest.js | 33 - .../jasmine/spec/html/HtmlReporterSpec.js | 616 --- .../jasmine/spec/html/HtmlSpecFilterSpec.js | 18 - .../jasmine/spec/html/MatchersHtmlSpec.js | 37 - .../jasmine/spec/html/PrettyPrintHtmlSpec.js | 15 - .../jasmine/spec/html/QueryStringSpec.js | 43 - .../jasmine/spec/html/ResultsNodeSpec.js | 62 - .../support/jasmine_selenium_runner.yml | 16 - .../spec/performance/large_object_test.js | 36 - .../spec/performance/performance_test.js | 10 - .../spec/support/jasmine-performance.json | 9 - .../spec/support/jasmine-performance.yml | 9 - .../jasmine/spec/support/jasmine.json | 10 - .../jasmine/spec/support/jasmine.yml | 25 - .../jasmine/src/console/ConsoleReporter.js | 131 - .../jasmine/src/console/requireConsole.js | 12 - .../bower_components/jasmine/src/core/Any.js | 36 - .../jasmine/src/core/CallTracker.js | 50 - .../jasmine/src/core/Clock.js | 113 - .../src/core/DelayedFunctionScheduler.js | 145 - .../bower_components/jasmine/src/core/Env.js | 341 -- .../jasmine/src/core/ExceptionFormatter.js | 29 - .../jasmine/src/core/Expectation.js | 107 - .../jasmine/src/core/ExpectationResult.js | 45 - .../jasmine/src/core/JsApiReporter.js | 73 - .../jasmine/src/core/MockDate.js | 81 - .../jasmine/src/core/ObjectContaining.js | 34 - .../jasmine/src/core/PrettyPrinter.js | 137 - .../jasmine/src/core/QueueRunner.js | 92 - .../jasmine/src/core/ReportDispatcher.js | 35 - .../bower_components/jasmine/src/core/Spec.js | 126 - .../jasmine/src/core/SpyStrategy.js | 51 - .../jasmine/src/core/Suite.js | 92 - .../jasmine/src/core/Timer.js | 22 - .../bower_components/jasmine/src/core/base.js | 102 - .../jasmine/src/core/matchers/matchersUtil.js | 181 - .../src/core/matchers/requireMatchers.js | 29 - .../jasmine/src/core/matchers/toBe.js | 13 - .../jasmine/src/core/matchers/toBeCloseTo.js | 18 - .../jasmine/src/core/matchers/toBeDefined.js | 13 - .../jasmine/src/core/matchers/toBeFalsy.js | 13 - .../src/core/matchers/toBeGreaterThan.js | 15 - .../jasmine/src/core/matchers/toBeLessThan.js | 14 - .../jasmine/src/core/matchers/toBeNaN.js | 22 - .../jasmine/src/core/matchers/toBeNull.js | 14 - .../jasmine/src/core/matchers/toBeTruthy.js | 14 - .../src/core/matchers/toBeUndefined.js | 14 - .../jasmine/src/core/matchers/toContain.js | 16 - .../jasmine/src/core/matchers/toEqual.js | 20 - .../src/core/matchers/toHaveBeenCalled.js | 28 - .../src/core/matchers/toHaveBeenCalledWith.js | 33 - .../jasmine/src/core/matchers/toMatch.js | 16 - .../jasmine/src/core/matchers/toThrow.js | 46 - .../jasmine/src/core/matchers/toThrowError.js | 156 - .../jasmine/src/core/requireCore.js | 39 - .../jasmine/src/core/requireInterface.js | 59 - .../bower_components/jasmine/src/core/util.js | 44 - .../jasmine/src/html/HtmlReporter.js | 280 -- .../jasmine/src/html/HtmlSpecFilter.js | 12 - .../jasmine/src/html/QueryString.js | 47 - .../jasmine/src/html/ResultsNode.js | 19 - .../jasmine/src/html/_HTMLReporter.scss | 355 -- .../jasmine/src/html/jasmine.scss | 1 - .../jasmine/src/html/requireHtml.js | 6 - .../example_project_jasmine_tags.html.erb | 3 - .../jasmine/src/templates/version.js.erb | 7 - .../jasmine/src/templates/version.rb.erb | 6 - .../bower_components/jasmine/src/version.js | 3 - .../jasmine/travis-core-script.sh | 14 - .../jasmine/travis-docs-script.sh | 5 - .../jasmine/travis-node-script.sh | 6 - .../bower_components/jquery/.bower.json | 16 +- .../bower_components/jquery/bower.json | 5 +- .../bower_components/jquery/dist/jquery.js | 4224 ++++++----------- .../jquery/dist/jquery.min.js | 8 +- .../jquery/dist/jquery.min.map | 2 +- .../bower_components/jquery/src/ajax.js | 75 +- .../bower_components/jquery/src/ajax/load.js | 4 +- .../jquery/src/ajax/parseJSON.js | 44 +- .../jquery/src/ajax/parseXML.js | 17 +- .../jquery/src/ajax/script.js | 67 +- .../bower_components/jquery/src/ajax/xhr.js | 252 +- .../bower_components/jquery/src/attributes.js | 4 +- .../jquery/src/attributes/attr.js | 168 +- .../jquery/src/attributes/classes.js | 23 +- .../jquery/src/attributes/prop.js | 56 +- .../jquery/src/attributes/support.js | 55 +- .../jquery/src/attributes/val.js | 35 +- .../bower_components/jquery/src/callbacks.js | 10 +- .../bower_components/jquery/src/core.js | 162 +- .../jquery/src/core/access.js | 6 +- .../bower_components/jquery/src/core/init.js | 19 +- .../bower_components/jquery/src/core/ready.js | 73 +- .../bower_components/jquery/src/css.js | 238 +- .../jquery/src/css/addGetHookIf.js | 16 +- .../bower_components/jquery/src/css/curCSS.js | 124 +- .../jquery/src/css/defaultDisplay.js | 5 +- .../jquery/src/css/hiddenVisibleSelectors.js | 11 +- .../jquery/src/css/support.js | 189 +- .../jquery/src/css/var/getStyles.js | 12 + .../bower_components/jquery/src/data.js | 325 +- .../bower_components/jquery/src/data/Data.js | 181 + .../jquery/src/data/accepts.js | 19 +- .../jquery/src/data/support.js | 25 - .../jquery/src/data/var/data_priv.js | 5 + .../jquery/src/data/var/data_user.js | 5 + .../bower_components/jquery/src/deferred.js | 7 +- .../bower_components/jquery/src/dimensions.js | 6 +- .../bower_components/jquery/src/effects.js | 110 +- .../jquery/src/effects/Tween.js | 16 +- .../jquery/src/effects/support.js | 55 - .../bower_components/jquery/src/event.js | 359 +- .../bower_components/jquery/src/event/ajax.js | 13 + .../jquery/src/event/support.js | 19 +- .../jquery/src/exports/global.js | 4 +- .../bower_components/jquery/src/intro.js | 16 +- .../bower_components/jquery/src/jquery.js | 2 +- .../jquery/src/manipulation.js | 426 +- .../jquery/src/manipulation/support.js | 80 +- .../bower_components/jquery/src/offset.js | 62 +- .../bower_components/jquery/src/queue.js | 22 +- .../jquery/src/selector-native.js | 172 + .../bower_components/jquery/src/serialize.js | 3 +- .../jquery/src/sizzle/dist/sizzle.js | 143 +- .../jquery/src/sizzle/dist/sizzle.min.js | 6 +- .../jquery/src/sizzle/dist/sizzle.min.map | 2 +- .../bower_components/jquery/src/support.js | 58 - .../bower_components/jquery/src/traversing.js | 65 +- .../jquery/src/traversing/findFilter.js | 6 +- .../jquery/src/var/{deletedIds.js => arr.js} | 0 .../bower_components/jquery/src/var/concat.js | 6 +- .../jquery/src/var/indexOf.js | 6 +- .../bower_components/jquery/src/var/push.js | 6 +- .../bower_components/jquery/src/var/slice.js | 6 +- .../bower_components/jquery/src/wrap.js | 26 +- .../bower_components/underscore/.bower.json | 16 +- .../bower_components/underscore/.eslintrc | 35 - .../bower_components/underscore/.gitignore | 2 - .../bower_components/underscore/LICENSE | 2 +- .../bower_components/underscore/bower.json | 4 +- .../underscore/component.json | 10 - .../bower_components/underscore/package.json | 41 - .../underscore/underscore-min.js | 6 +- .../underscore/underscore-min.map | 2 +- .../bower_components/underscore/underscore.js | 745 +-- collections/transformations/index.html | 2 +- collections/transformations/index.js | 16 +- .../transformations/propertyFormatter.js | 6 +- .../bicycleTransformerSpec.js} | 2 +- 256 files changed, 5357 insertions(+), 17547 deletions(-) delete mode 100644 collections/transformations/bower_components/jasmine/.gitignore delete mode 100644 collections/transformations/bower_components/jasmine/.gitmodules delete mode 100644 collections/transformations/bower_components/jasmine/.jshintrc delete mode 100644 collections/transformations/bower_components/jasmine/.npmignore delete mode 100644 collections/transformations/bower_components/jasmine/.rspec delete mode 100644 collections/transformations/bower_components/jasmine/.travis.yml delete mode 100644 collections/transformations/bower_components/jasmine/Gemfile delete mode 100644 collections/transformations/bower_components/jasmine/Gruntfile.js delete mode 100644 collections/transformations/bower_components/jasmine/Rakefile create mode 100644 collections/transformations/bower_components/jasmine/bower.json delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.0.0.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.1.0.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.2.0.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.3.0.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.3.1.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.0.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.1.zip delete mode 100644 collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.2.zip delete mode 100644 collections/transformations/bower_components/jasmine/grunt/config/compass.js delete mode 100644 collections/transformations/bower_components/jasmine/grunt/config/compress.js delete mode 100644 collections/transformations/bower_components/jasmine/grunt/config/concat.js delete mode 100644 collections/transformations/bower_components/jasmine/grunt/config/jshint.js delete mode 100644 collections/transformations/bower_components/jasmine/grunt/tasks/build_standalone.js delete mode 100644 collections/transformations/bower_components/jasmine/grunt/tasks/version.js delete mode 100644 collections/transformations/bower_components/jasmine/grunt/templates/SpecRunner.html.jst delete mode 100644 collections/transformations/bower_components/jasmine/grunt/templates/licenseBanner.js.jst delete mode 100644 collections/transformations/bower_components/jasmine/grunt/templates/version.rb.jst delete mode 100644 collections/transformations/bower_components/jasmine/images/__init__.py delete mode 100644 collections/transformations/bower_components/jasmine/jasmine-core.gemspec delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core.rb delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/__init__.py delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/boot.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/node_boot.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/core.py rename collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/{src => lib/jasmine_examples}/Player.js (100%) rename collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/{src => lib/jasmine_examples}/Song.js (100%) delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/PlayerSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/SpecHelper.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/PlayerSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/SpecHelper.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Player.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Song.js delete mode 100644 collections/transformations/bower_components/jasmine/lib/jasmine-core/version.rb delete mode 100644 collections/transformations/bower_components/jasmine/release_notes/2.0.1.md delete mode 100644 collections/transformations/bower_components/jasmine/release_notes/2.0.2.md delete mode 100644 collections/transformations/bower_components/jasmine/release_notes/20.md delete mode 100644 collections/transformations/bower_components/jasmine/setup.py delete mode 100644 collections/transformations/bower_components/jasmine/spec/console/ConsoleReporterSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/AnySpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/CallTrackerSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ClockSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/DelayedFunctionSchedulerSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/EnvSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ExceptionFormatterSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ExceptionsSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ExpectationResultSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ExpectationSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/JsApiReporterSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/MockDateSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ObjectContainingSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/PrettyPrintSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/QueueRunnerSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/ReportDispatcherSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/SpecSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/SpySpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/SpyStrategySpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/SuiteSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/TimerSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/UtilSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/integration/CustomMatchersSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/integration/EnvSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/integration/SpecRunningSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/matchersUtilSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeCloseToSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeDefinedSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeFalsySpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeGreaterThanSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeLessThanSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNaNSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNullSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeTruthySpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toBeUndefinedSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toContainSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toEqualSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledWithSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toMatchSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowErrorSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/helpers/BrowserFlags.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/helpers/defineJasmineUnderTest.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/helpers/nodeDefineJasmineUnderTest.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/html/HtmlReporterSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/html/HtmlSpecFilterSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/html/MatchersHtmlSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/html/PrettyPrintHtmlSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/html/QueryStringSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/html/ResultsNodeSpec.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/javascripts/support/jasmine_selenium_runner.yml delete mode 100644 collections/transformations/bower_components/jasmine/spec/performance/large_object_test.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/performance/performance_test.js delete mode 100644 collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.json delete mode 100644 collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.yml delete mode 100644 collections/transformations/bower_components/jasmine/spec/support/jasmine.json delete mode 100644 collections/transformations/bower_components/jasmine/spec/support/jasmine.yml delete mode 100644 collections/transformations/bower_components/jasmine/src/console/ConsoleReporter.js delete mode 100644 collections/transformations/bower_components/jasmine/src/console/requireConsole.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Any.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/CallTracker.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Clock.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/DelayedFunctionScheduler.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Env.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/ExceptionFormatter.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Expectation.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/ExpectationResult.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/JsApiReporter.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/MockDate.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/ObjectContaining.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/PrettyPrinter.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/QueueRunner.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/ReportDispatcher.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Spec.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/SpyStrategy.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Suite.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/Timer.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/base.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/matchersUtil.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/requireMatchers.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBe.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeCloseTo.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeDefined.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeFalsy.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeGreaterThan.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeLessThan.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeNaN.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeNull.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeTruthy.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toBeUndefined.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toContain.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toEqual.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalled.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalledWith.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toMatch.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toThrow.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/matchers/toThrowError.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/requireCore.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/requireInterface.js delete mode 100644 collections/transformations/bower_components/jasmine/src/core/util.js delete mode 100644 collections/transformations/bower_components/jasmine/src/html/HtmlReporter.js delete mode 100644 collections/transformations/bower_components/jasmine/src/html/HtmlSpecFilter.js delete mode 100644 collections/transformations/bower_components/jasmine/src/html/QueryString.js delete mode 100644 collections/transformations/bower_components/jasmine/src/html/ResultsNode.js delete mode 100644 collections/transformations/bower_components/jasmine/src/html/_HTMLReporter.scss delete mode 100644 collections/transformations/bower_components/jasmine/src/html/jasmine.scss delete mode 100644 collections/transformations/bower_components/jasmine/src/html/requireHtml.js delete mode 100644 collections/transformations/bower_components/jasmine/src/templates/example_project_jasmine_tags.html.erb delete mode 100644 collections/transformations/bower_components/jasmine/src/templates/version.js.erb delete mode 100644 collections/transformations/bower_components/jasmine/src/templates/version.rb.erb delete mode 100644 collections/transformations/bower_components/jasmine/src/version.js delete mode 100644 collections/transformations/bower_components/jasmine/travis-core-script.sh delete mode 100644 collections/transformations/bower_components/jasmine/travis-docs-script.sh delete mode 100644 collections/transformations/bower_components/jasmine/travis-node-script.sh create mode 100644 collections/transformations/bower_components/jquery/src/css/var/getStyles.js create mode 100644 collections/transformations/bower_components/jquery/src/data/Data.js delete mode 100644 collections/transformations/bower_components/jquery/src/data/support.js create mode 100644 collections/transformations/bower_components/jquery/src/data/var/data_priv.js create mode 100644 collections/transformations/bower_components/jquery/src/data/var/data_user.js delete mode 100644 collections/transformations/bower_components/jquery/src/effects/support.js create mode 100644 collections/transformations/bower_components/jquery/src/event/ajax.js create mode 100644 collections/transformations/bower_components/jquery/src/selector-native.js delete mode 100644 collections/transformations/bower_components/jquery/src/support.js rename collections/transformations/bower_components/jquery/src/var/{deletedIds.js => arr.js} (100%) delete mode 100644 collections/transformations/bower_components/underscore/.eslintrc delete mode 100644 collections/transformations/bower_components/underscore/.gitignore delete mode 100644 collections/transformations/bower_components/underscore/component.json delete mode 100644 collections/transformations/bower_components/underscore/package.json rename collections/transformations/{tests/bicycleTransformerSpecs.js => spec/bicycleTransformerSpec.js} (99%) diff --git a/collections/transformations/SpecRunner.html b/collections/transformations/SpecRunner.html index c5a7d24..34bfe18 100755 --- a/collections/transformations/SpecRunner.html +++ b/collections/transformations/SpecRunner.html @@ -3,7 +3,7 @@ - Jasmine Spec Runner v2.0.2 + Jasmine Spec Runner v2.3.4 @@ -17,11 +17,11 @@ - + - + \ No newline at end of file diff --git a/collections/transformations/bower.json b/collections/transformations/bower.json index b2746a1..dc9cae7 100644 --- a/collections/transformations/bower.json +++ b/collections/transformations/bower.json @@ -16,10 +16,10 @@ "tests" ], "dependencies": { - "jquery": "1.11.1", - "underscore": "1.7.0" + "jquery": "2.1.4", + "underscore": "1.8.3" }, "devDependencies": { - "jasmine": "2.0.2" + "jasmine": "2.3.4" } -} +} \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/.bower.json b/collections/transformations/bower_components/jasmine/.bower.json index 0d9e845..473cd65 100644 --- a/collections/transformations/bower_components/jasmine/.bower.json +++ b/collections/transformations/bower_components/jasmine/.bower.json @@ -1,15 +1,50 @@ { - "name": "jasmine", - "homepage": "https://github.com/pivotal/jasmine", - "version": "2.0.2", - "_release": "2.0.2", + "name": "jasmine-core", + "version": "2.3.4", + "homepage": "http://jasmine.github.io", + "authors": [ + "slackersoft " + ], + "description": "Official packaging of Jasmine's core files", + "keywords": [ + "test", + "jasmine", + "tdd", + "bdd" + ], + "license": "MIT", + "moduleType": "globals", + "main": "lib/jasmine-core/jasmine.js", + "ignore": [ + "**/.*", + "dist", + "grunt", + "node_modules", + "pkg", + "release_notes", + "spec", + "src", + "Gemfile", + "Gemfile.lock", + "Rakefile", + "jasmine-core.gemspec", + "*.sh", + "*.py", + "Gruntfile.js", + "lib/jasmine-core.rb", + "lib/jasmine-core/boot/", + "lib/jasmine-core/spec", + "lib/jasmine-core/version.rb", + "lib/jasmine-core/*.py", + "sauce_connect.log" + ], + "_release": "2.3.4", "_resolution": { "type": "version", - "tag": "v2.0.2", - "commit": "0c8056cca7acc8170b62cc8573f73c557478111c" + "tag": "v2.3.4", + "commit": "651426b6583020e2f3fdae56d2873514963ba65e" }, "_source": "git://github.com/pivotal/jasmine.git", - "_target": "2.0.2", - "_originalSource": "jasmine", - "_direct": true + "_target": "2.3.4", + "_originalSource": "jasmine" } \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/.gitignore b/collections/transformations/bower_components/jasmine/.gitignore deleted file mode 100644 index 277c7aa..0000000 --- a/collections/transformations/bower_components/jasmine/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -.idea/ -.svn/ -.DS_Store -site/ -.bundle/ -.pairs -.rvmrc -.ruby-gemset -.ruby-version -*.gem -.bundle -tags -Gemfile.lock -pkg/* -.sass-cache/* -src/html/.sass-cache/* -node_modules/ -*.pyc -sauce_connect.log -*.swp -build/ -*.egg-info/ -dist/*.tar.gz -nbproject/ diff --git a/collections/transformations/bower_components/jasmine/.gitmodules b/collections/transformations/bower_components/jasmine/.gitmodules deleted file mode 100644 index d88c394..0000000 --- a/collections/transformations/bower_components/jasmine/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "pages"] - path = pages - url = https://github.com/pivotal/jasmine.git diff --git a/collections/transformations/bower_components/jasmine/.jshintrc b/collections/transformations/bower_components/jasmine/.jshintrc deleted file mode 100644 index d540bf3..0000000 --- a/collections/transformations/bower_components/jasmine/.jshintrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "bitwise": true, - "curly": true, - "immed": true, - "newcap": true, - "trailing": true, - "loopfunc": true, - "quotmark": "single" -} \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/.npmignore b/collections/transformations/bower_components/jasmine/.npmignore deleted file mode 100644 index 50bd4c4..0000000 --- a/collections/transformations/bower_components/jasmine/.npmignore +++ /dev/null @@ -1,20 +0,0 @@ -dist/ -grunt/ -images/ -node_modules -release_notes/ -spec/ -src/ -Gemfile -Gemfile.lock -Rakefile -jasmine-core.gemspec -.rspec -.travis.yml -.jshintrc -.gitignore -*.sh -Gruntfile.js -lib/jasmine-core/boot/ -lib/jasmine-core/spec -lib/jasmine-core/version.rb diff --git a/collections/transformations/bower_components/jasmine/.rspec b/collections/transformations/bower_components/jasmine/.rspec deleted file mode 100644 index 4e1e0d2..0000000 --- a/collections/transformations/bower_components/jasmine/.rspec +++ /dev/null @@ -1 +0,0 @@ ---color diff --git a/collections/transformations/bower_components/jasmine/.travis.yml b/collections/transformations/bower_components/jasmine/.travis.yml deleted file mode 100644 index 318dff8..0000000 --- a/collections/transformations/bower_components/jasmine/.travis.yml +++ /dev/null @@ -1,51 +0,0 @@ ---- -script: $TEST_COMMAND -language: ruby -cache: bundler -rvm: 1.9.3 -env: - global: - - USE_SAUCE=true - - NOKOGIRI_USE_SYSTEM_LIBRARIES=true - - TEST_COMMAND="bash travis-core-script.sh" - - JASMINE_BROWSER="firefox" - - SAUCE_OS="Linux" - - SAUCE_BROWSER_VERSION='' - - secure: WSPWhlnC4mWSnSPquX+m1/BCu5ch5NygkaHuM2Nea7lD8oS3XLX8QncZZAsQ4lnNfqoDDuBOizG0AESiqNvE4y6x5qvLLTS6q+ce255ZEMZ71TBdZgDEEvGMEjOPPsVXiXyTQOP1lwOPlrbZvaPgWV7e11KIBab6DfFcQpnvDgo= - - secure: SW7CJhZnwaNT749Gdnhvqb5rbXlAOsygUAzh9qhtyvbqXKkmJdBIEsO01YF6pbju1X2twE9JvWCOxeZju43NgQChJlPsGbjY2j3k/TdQeTAJesQe2K7ytwghunI30gjEovtRH0T3w1EmcKPH8yj5eBIcB2OYoJHx8KEC7e68q1g= -matrix: - include: - - env: - - USE_SAUCE=false - - TEST_COMMAND="bash travis-node-script.sh" - - env: - - JASMINE_BROWSER="safari" - - SAUCE_OS="OS X 10.8" - - SAUCE_BROWSER_VERSION=6 - - env: - - JASMINE_BROWSER="safari" - - SAUCE_OS="OS X 10.6" - - SAUCE_BROWSER_VERSION=5 - - env: - - JASMINE_BROWSER="internet explorer" - - SAUCE_OS="Windows 8" - - SAUCE_BROWSER_VERSION=10 - - env: - - JASMINE_BROWSER="internet explorer" - - SAUCE_OS="Windows 7" - - SAUCE_BROWSER_VERSION=9 - - env: - - JASMINE_BROWSER="internet explorer" - - SAUCE_OS="Windows 7" - - SAUCE_BROWSER_VERSION=8 - - env: - - JASMINE_BROWSER="chrome" - - SAUCE_OS="Linux" - - SAUCE_BROWSER_VERSION='' - - env: - - JASMINE_BROWSER="phantomjs" - - USE_SAUCE=false - - env: - - USE_SAUCE=false - - JASMINE_BROWSER="phantomjs" - - TEST_COMMAND="bash travis-docs-script.sh" diff --git a/collections/transformations/bower_components/jasmine/CONTRIBUTING.md b/collections/transformations/bower_components/jasmine/CONTRIBUTING.md index e9eab67..19e56ef 100644 --- a/collections/transformations/bower_components/jasmine/CONTRIBUTING.md +++ b/collections/transformations/bower_components/jasmine/CONTRIBUTING.md @@ -1,23 +1,28 @@ # Developing for Jasmine Core -We welcome your contributions - Thanks for helping make Jasmine a better project for everyone. Please review the backlog and discussion lists (the main group - [http://groups.google.com/group/jasmine-js](http://groups.google.com/group/jasmine-js) and the developer's list - [http://groups.google.com/group/jasmine-js-dev](http://groups.google.com/group/jasmine-js-dev)) before starting work - what you're looking for may already have been done. If it hasn't, the community can help make your contribution better. +We welcome your contributions! Thanks for helping make Jasmine a better project for everyone. Please review the backlog and discussion lists before starting work. What you're looking for may already have been done. If it hasn't, the community can help make your contribution better. + +## Links + +- [Jasmine Google Group](http://groups.google.com/group/jasmine-js) +- [Jasmine-dev Google Group](http://groups.google.com/group/jasmine-js-dev) +- [Jasmine on PivotalTracker](https://www.pivotaltracker.com/n/projects/10606) ## General Workflow Please submit pull requests via feature branches using the semi-standard workflow of: -1. Fork it -1. Clone your fork: (`git clone git@github.com:yourUserName/jasmine.git`) -1. Change directory: (`cd jasmine`) -1. Asign original repository to a remote named 'upstream': (`git remote add -upstream https://github.com/pivotal/jasmine.git`) -1. Pull in changes not present in your local repository: (`git fetch upstream`) -1. Create your feature branch (`git checkout -b my-new-feature`) -1. Commit your changes (`git commit -am 'Add some feature'`) -1. Push to the branch (`git push origin my-new-feature`) -1. Create new Pull Request +```bash +git clone git@github.com:yourUserName/jasmine.git # Clone your fork +cd jasmine # Change directory +git remote add upstream https://github.com/jasmine/jasmine.git # Assign original repository to a remote named 'upstream' +git fetch upstream # Pull in changes not present in your local repository +git checkout -b my-new-feature # Create your feature branch +git commit -am 'Add some feature' # Commit your changes +git push origin my-new-feature # Push to the branch +``` -We favor pull requests with very small, single commits with a single purpose. +Once you've pushed a feature branch to your forked repo, you're ready to open a pull request. We favor pull requests with very small, single commits with a single purpose. ## Background @@ -67,7 +72,11 @@ To install the Ruby dependencies, you will need Ruby, Rubygems, and Bundler avai $ bundle -...will install all of the Ruby dependencies. +...will install all of the Ruby dependencies. If the ffi gem fails to build its native extensions, you may need to manually install some system dependencies. On Ubuntu: + + $ apt-get install gcc ruby ruby-dev libxml2 libxml2-dev libxslt1-dev + +...should get you to the point that `bundle` can install everything. To install the Node dependencies, you will need Node.js, Npm, and [Grunt](http://gruntjs.com/), the [grunt-cli](https://github.com/gruntjs/grunt-cli) and ensure that `grunt` is on your path. @@ -94,13 +103,13 @@ Follow these tips and your pull request, patch, or suggestion is much more likel ### Running Specs -Jasmine uses the [Jasmine Ruby gem](http://github.com/pivotal/jasmine-gem) to test itself in browser. +Jasmine uses the [Jasmine Ruby gem](http://github.com/jasmine/jasmine-gem) to test itself in browser. $ rake jasmine ...and then visit `http://localhost:8888` to run specs. -Jasmine uses Node.js with a custom runner to test outside of a browser. +Jasmine uses the [Jasmine NPM package](http://github.com/jasmine/jasmine-npm) to test itself in a Node.js/npm environment. $ grunt execSpecsInNode @@ -114,8 +123,8 @@ Jasmine uses Node.js with a custom runner to test outside of a browser. ## Submitting a Pull Request 1. Revert your changes to `jasmine.js` and `jasmine-html.js` - * We do this because `jasmine.js` and `jasmine-html.js` are auto-generated (as you've seen in the previous steps) and accepting multiple pull requests when this auto-generated file changes causes lots of headaches. -1. When we accept your pull request, we will generate these files as a separate commit and merge the entire branch into master. + * We do this because `jasmine.js` and `jasmine-html.js` are auto-generated (as you've seen in the previous steps) and accepting multiple pull requests when this auto-generated file changes causes lots of headaches +1. When we accept your pull request, we will generate these files as a separate commit and merge the entire branch into master Note that we use Travis for Continuous Integration. We only accept green pull requests. diff --git a/collections/transformations/bower_components/jasmine/Gemfile b/collections/transformations/bower_components/jasmine/Gemfile deleted file mode 100644 index 901b170..0000000 --- a/collections/transformations/bower_components/jasmine/Gemfile +++ /dev/null @@ -1,12 +0,0 @@ -source 'https://rubygems.org' -gem "jasmine", :git => 'https://github.com/pivotal/jasmine-gem.git' -# gem "jasmine", path: "/Users/pivotal/workspace/jasmine-gem" -unless ENV["TRAVIS"] - group :debug do - gem 'debugger' - end -end - -gemspec - -gem "anchorman" diff --git a/collections/transformations/bower_components/jasmine/Gruntfile.js b/collections/transformations/bower_components/jasmine/Gruntfile.js deleted file mode 100644 index f4319b7..0000000 --- a/collections/transformations/bower_components/jasmine/Gruntfile.js +++ /dev/null @@ -1,53 +0,0 @@ -module.exports = function(grunt) { - var pkg = require("./package.json"); - global.jasmineVersion = pkg.version; - - grunt.initConfig({ - pkg: pkg, - jshint: require('./grunt/config/jshint.js'), - concat: require('./grunt/config/concat.js'), - compass: require('./grunt/config/compass.js'), - compress: require('./grunt/config/compress.js') - }); - - require('load-grunt-tasks')(grunt); - - grunt.loadTasks('grunt/tasks'); - - grunt.registerTask('default', ['jshint:all']); - - var version = require('./grunt/tasks/version.js'); - var standaloneBuilder = require('./grunt/tasks/build_standalone.js'); - - grunt.registerTask('build:copyVersionToGem', - "Propagates the version from package.json to version.rb", - version.copyToGem); - - grunt.registerTask('buildDistribution', - 'Builds and lints jasmine.js, jasmine-html.js, jasmine.css', - [ - 'compass', - 'jshint:beforeConcat', - 'concat', - 'jshint:afterConcat', - 'build:copyVersionToGem' - ] - ); - - grunt.registerTask("execSpecsInNode", - "Run Jasmine core specs in Node.js", - function() { - var exitInfo = require("shelljs").exec("node_modules/.bin/jasmine"); - if (exitInfo.code !== 0) { - grunt.fail.fatal("Specs Failed", exitInfo.code); - } - } - ); - - grunt.registerTask("execSpecsInNode:performance", - "Run Jasmine performance specs in Node.js", - function() { - require("shelljs").exec("node_modules/.bin/jasmine JASMINE_CONFIG_PATH=spec/support/jasmine-performance.json"); - } - ); -}; diff --git a/collections/transformations/bower_components/jasmine/README.md b/collections/transformations/bower_components/jasmine/README.md index 3f5caa9..f0cffb5 100644 --- a/collections/transformations/bower_components/jasmine/README.md +++ b/collections/transformations/bower_components/jasmine/README.md @@ -1,6 +1,6 @@ -[](http://jasmine.github.io) +[](http://jasmine.github.io) -[![Build Status](https://travis-ci.org/pivotal/jasmine.png?branch=master)](https://travis-ci.org/pivotal/jasmine) [![Code Climate](https://codeclimate.com/github/pivotal/jasmine.png)](https://codeclimate.com/github/pivotal/jasmine) +[![Build Status](https://travis-ci.org/jasmine/jasmine.png?branch=master)](https://travis-ci.org/jasmine/jasmine) [![Code Climate](https://codeclimate.com/github/pivotal/jasmine.png)](https://codeclimate.com/github/pivotal/jasmine) ======= @@ -11,37 +11,43 @@ Jasmine is a Behavior Driven Development testing framework for JavaScript. It do Documentation & guides live here: [http://jasmine.github.io](http://jasmine.github.io/) For a quick start guide of Jasmine 2.0, see the beginning of [http://jasmine.github.io/2.0/introduction.html](http://jasmine.github.io/2.0/introduction.html) -Upgrading from Jasmine 1.x? Check out the [2.0 release notes](https://github.com/pivotal/jasmine/blob/v2.0.0/release_notes/20.md) for a list of what's new (including breaking interface changes). +Upgrading from Jasmine 1.x? Check out the [2.0 release notes](https://github.com/jasmine/jasmine/blob/v2.0.0/release_notes/20.md) for a list of what's new (including breaking interface changes). You can also read the [upgrade guide](http://jasmine.github.io/2.0/upgrading.html). ## Contributing -Please read the [contributors' guide](https://github.com/pivotal/jasmine/blob/master/CONTRIBUTING.md) +Please read the [contributors' guide](https://github.com/jasmine/jasmine/blob/master/CONTRIBUTING.md) ## Installation -To install Jasmine on your local box: +For the Jasmine NPM module:
+[https://github.com/jasmine/jasmine-npm](https://github.com/jasmine/jasmine-npm) -* Clone Jasmine - `git clone https://github.com/pivotal/jasmine.git` +For the Jasmine Ruby Gem:
+[https://github.com/jasmine/jasmine-gem](https://github.com/jasmine/jasmine-gem) + +For the Jasmine Python Egg:
+[https://github.com/jasmine/jasmine-py](https://github.com/jasmine/jasmine-py) + +To install Jasmine standalone on your local box: + +* Download the standalone distribution for your desired release from the [releases page](https://github.com/jasmine/jasmine/releases) * Create a Jasmine directory in your project - `mkdir my-project/jasmine` -* Move latest dist to your project directory - `mv jasmine/dist/jasmine-standalone-2.0.0.zip my-project/jasmine` +* Move the dist to your project directory - `mv jasmine/dist/jasmine-standalone-2.0.0.zip my-project/jasmine` * Change directory - `cd my-project/jasmine` * Unzip the dist - `unzip jasmine-standalone-2.0.0.zip` Add the following to your HTML file: - + -For the Jasmine Ruby Gem:
-[https://github.com/pivotal/jasmine-gem](https://github.com/pivotal/jasmine-gem) - -For the Jasmine Python Egg:
-[https://github.com/pivotal/jasmine-py](https://github.com/pivotal/jasmine-py) +## Supported environments +Jasmine tests itself across many browsers (Safari, Chrome, Firefox, PhantomJS, and new Internet Explorer) as well as node. To see the exact version tests are run against look at our [.travis.yml](https://github.com/jasmine/jasmine/blob/master/.travis.yml) ## Support @@ -53,12 +59,15 @@ For the Jasmine Python Egg:
## Maintainers -* [Davis W. Frank](mailto:dwfrank@pivotallabs.com), Pivotal Labs -* [Rajan Agaskar](mailto:rajan@pivotallabs.com), Pivotal Labs -* [Sheel Choksi](mailto:schoksi@pivotallabs.com), Pivotal Labs +* [Davis W. Frank](mailto:dwfrank@pivotal.io), Pivotal Labs +* [Rajan Agaskar](mailto:rajan@pivotal.io), Pivotal Labs +* [Gregg Van Hove](mailto:gvanhove@pivotal.io), Pivotal Labs +* [Greg Cobb](mailto:gcobb@pivotal.io), Pivotal Labs +* [Chris Amavisca](mailto:camavisca@pivotal.io), Pivotal Labs ### Maintainers Emeritus -* [Christian Williams](mailto:antixian666@gmail.com), Square +* [Christian Williams](mailto:antixian666@gmail.com), Cloud Foundry +* Sheel Choksi -Copyright (c) 2008-2014 Pivotal Labs. This software is licensed under the MIT License. +Copyright (c) 2008-2015 Pivotal Labs. This software is licensed under the MIT License. diff --git a/collections/transformations/bower_components/jasmine/RELEASE.md b/collections/transformations/bower_components/jasmine/RELEASE.md index 6fe1bc2..67863e7 100644 --- a/collections/transformations/bower_components/jasmine/RELEASE.md +++ b/collections/transformations/bower_components/jasmine/RELEASE.md @@ -15,11 +15,16 @@ Please attempt to keep commits to `master` small, but cohesive. If a feature is We attempt to stick to [Semantic Versioning](http://semver.org/). Most of the time, development should be against a new minor version - fixing bugs and adding new features that are backwards compatible. -The current version lives in the file `/package.json`. This file should be set to the version that is _currently_ under development. That is, if version 1.0.0 is the current release then version should be incremented say, to 1.1.0. +The current version lives in the file `/package.json`. This version will be the version number that is currently released. When releasing a new version, update `package.json` and `bower.json` with the new version and `grunt build:copyVersionToGem` to update the gem version number. This version is used by both `jasmine.js` and the `jasmine-core` Ruby gem. -Note that Jasmine should *not* use the "patch" version number. Let downstream projects rev their patch versions as needed, keeping their major and minor version numbers in sync with Jasmine core. +Note that Jasmine should only use the "patch" version number in the following cases: + +* Changes related to packaging for a specific platform (npm, gem, or pip). +* Fixes for regressions. + +When jasmine-core revs its major or minor version, the binding libraries should also rev to that version. ## Release @@ -32,8 +37,6 @@ When ready to release - specs are all green and the stories are done: ### Build standalone distribution 1. Build the standalone distribution with `grunt buildStandaloneDist` -1. Make sure you add the new ZIP file to git - 1. Should we still do this? Given we want to use guthub releases... ### Release the Python egg @@ -52,9 +55,16 @@ When ready to release - specs are all green and the stories are done: 1. `npm adduser` to save your credentials locally 1. `npm publish .` to publish what's in `package.json` +### Release the docs + +Probably only need to do this when releasing a minor version, and not a patch version. + +1. `cp -R edge ${version}` to copy the current edge docs to the new version +1. Add a link to the new version in `index.html` + ### Finally -1. Visit the [Releases page for Jasmine](https://github.com/pivotal/jasmine/releases), find the tag just pushed. +1. Visit the [Releases page for Jasmine](https://github.com/jasmine/jasmine/releases), find the tag just pushed. 1. Paste in a link to the correct release notes for this release. The link should reference the blob and tag correctly, and the markdown file for the notes. 1. If it is a pre-release, mark it as such. 1. Attach the standalone zipfile diff --git a/collections/transformations/bower_components/jasmine/Rakefile b/collections/transformations/bower_components/jasmine/Rakefile deleted file mode 100644 index da16114..0000000 --- a/collections/transformations/bower_components/jasmine/Rakefile +++ /dev/null @@ -1,18 +0,0 @@ -require "bundler" -Bundler::GemHelper.install_tasks -require "json" -require "jasmine" -unless ENV["JASMINE_BROWSER"] == 'phantomjs' - require "jasmine_selenium_runner" -end -load "jasmine/tasks/jasmine.rake" - -namespace :jasmine do - task :set_env do - ENV['JASMINE_CONFIG_PATH'] ||= 'spec/support/jasmine.yml' - end -end - -task "jasmine:configure" => "jasmine:set_env" - -task :default => "jasmine:ci" diff --git a/collections/transformations/bower_components/jasmine/bower.json b/collections/transformations/bower_components/jasmine/bower.json new file mode 100644 index 0000000..fbb7588 --- /dev/null +++ b/collections/transformations/bower_components/jasmine/bower.json @@ -0,0 +1,41 @@ +{ + "name": "jasmine-core", + "version": "2.3.4", + "homepage": "http://jasmine.github.io", + "authors": [ + "slackersoft " + ], + "description": "Official packaging of Jasmine's core files", + "keywords": [ + "test", + "jasmine", + "tdd", + "bdd" + ], + "license": "MIT", + "moduleType": "globals", + "main": "lib/jasmine-core/jasmine.js", + "ignore": [ + "**/.*", + "dist", + "grunt", + "node_modules", + "pkg", + "release_notes", + "spec", + "src", + "Gemfile", + "Gemfile.lock", + "Rakefile", + "jasmine-core.gemspec", + "*.sh", + "*.py", + "Gruntfile.js", + "lib/jasmine-core.rb", + "lib/jasmine-core/boot/", + "lib/jasmine-core/spec", + "lib/jasmine-core/version.rb", + "lib/jasmine-core/*.py", + "sauce_connect.log" + ] +} diff --git a/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.0.0.zip b/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.0.0.zip deleted file mode 100644 index f46fdf7208c84934c00fad14d8160a5daa354d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21084 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 Dw|4wc diff --git a/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.1.0.zip b/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.1.0.zip deleted file mode 100644 index bb9d3ab505c3848e2ea3e83a24a037b241c7afa8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27051 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
%~ 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 diff --git a/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.3.0.zip b/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-1.3.0.zip deleted file mode 100644 index fc10942ba82b1f15433076814ab8860888890f87..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25788 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%0Amgx~37k0kU1DL8dLQTMf2QwA| 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 diff --git a/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.1.zip b/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.1.zip deleted file mode 100644 index 351f0b7f143e3864d174d5f595c84ce754d1fcdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39173 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 diff --git a/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.2.zip b/collections/transformations/bower_components/jasmine/dist/jasmine-standalone-2.0.2.zip deleted file mode 100644 index 65aec5116c8e29883115fddafc7d2ed2554ac142..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 39235 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 F@L%LjM%(}Z diff --git a/collections/transformations/bower_components/jasmine/grunt/config/compass.js b/collections/transformations/bower_components/jasmine/grunt/config/compass.js deleted file mode 100644 index 4c224ff..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/config/compass.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - jasmine: { - options: { - cssDir: 'lib/jasmine-core/', - sassDir: 'src/html', - outputStyle: 'compact', - noLineComments: true, - } - } -}; diff --git a/collections/transformations/bower_components/jasmine/grunt/config/compress.js b/collections/transformations/bower_components/jasmine/grunt/config/compress.js deleted file mode 100644 index ab994db..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/config/compress.js +++ /dev/null @@ -1,66 +0,0 @@ -var standaloneLibDir = "lib/jasmine-" + jasmineVersion; - -function root(path) { return "./" + path; } -function libJasmineCore(path) { return root("lib/jasmine-core/" + path); } -function libConsole() { return "lib/console/" } -function dist(path) { return root("dist/" + path); } - -module.exports = { - standalone: { - options: { - archive: root("dist/jasmine-standalone-" + global.jasmineVersion + ".zip") - }, - - files: [ - { src: [ root("MIT.LICENSE") ] }, - { - src: [ "jasmine_favicon.png"], - dest: standaloneLibDir, - expand: true, - cwd: root("images") - }, - { - src: [ - "jasmine.js", - "jasmine-html.js", - "jasmine.css" - ], - dest: standaloneLibDir, - expand: true, - cwd: libJasmineCore("") - }, - { - src: [ - "console.js" - ], - dest: standaloneLibDir, - expand: true, - cwd: libConsole() - }, - { - src: [ "boot.js" ], - dest: standaloneLibDir, - expand: true, - cwd: libJasmineCore("boot") - }, - { - src: [ "SpecRunner.html" ], - dest: root(""), - expand: true, - cwd: dist("tmp") - }, - { - src: [ "*.js" ], - dest: "src", - expand: true, - cwd: libJasmineCore("example/src/") - }, - { - src: [ "*.js" ], - dest: "spec", - expand: true, - cwd: libJasmineCore("example/spec/") - } - ] - } -}; diff --git a/collections/transformations/bower_components/jasmine/grunt/config/concat.js b/collections/transformations/bower_components/jasmine/grunt/config/concat.js deleted file mode 100644 index 555a2f0..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/config/concat.js +++ /dev/null @@ -1,61 +0,0 @@ -var grunt = require('grunt'); - -function license() { - var currentYear = "" + new Date(Date.now()).getFullYear(); - - return grunt.template.process( - grunt.file.read("grunt/templates/licenseBanner.js.jst"), - { data: { currentYear: currentYear}}); -} - -module.exports = { - 'jasmine-html': { - src: [ - 'src/html/requireHtml.js', - 'src/html/HtmlReporter.js', - 'src/html/HtmlSpecFilter.js', - 'src/html/ResultsNode.js', - 'src/html/QueryString.js' - ], - dest: 'lib/jasmine-core/jasmine-html.js' - }, - jasmine: { - src: [ - 'src/core/requireCore.js', - 'src/core/matchers/requireMatchers.js', - 'src/core/base.js', - 'src/core/util.js', - 'src/core/Spec.js', - 'src/core/Env.js', - 'src/core/JsApiReporter.js', - 'src/core/PrettyPrinter', - 'src/core/Suite', - 'src/core/**/*.js', - 'src/version.js' - ], - dest: 'lib/jasmine-core/jasmine.js' - }, - boot: { - src: ['lib/jasmine-core/boot/boot.js'], - dest: 'lib/jasmine-core/boot.js' - }, - nodeBoot: { - src: ['lib/jasmine-core/boot/node_boot.js'], - dest: 'lib/jasmine-core/node_boot.js' - }, - console: { - src: [ - 'src/console/requireConsole.js', - 'src/console/ConsoleReporter.js' - ], - dest: 'lib/console/console.js' - }, - options: { - banner: license(), - process: { - data: { - version: global.jasmineVersion - } - } - } -}; diff --git a/collections/transformations/bower_components/jasmine/grunt/config/jshint.js b/collections/transformations/bower_components/jasmine/grunt/config/jshint.js deleted file mode 100644 index 253c739..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/config/jshint.js +++ /dev/null @@ -1,11 +0,0 @@ -module.exports = { - beforeConcat: ['src/**/*.js'], - afterConcat: [ - 'lib/jasmine-core/jasmine-html.js', - 'lib/jasmine-core/jasmine.js' - ], - options: { - jshintrc: '.jshintrc' - }, - all: ['src/**/*.js'] -}; diff --git a/collections/transformations/bower_components/jasmine/grunt/tasks/build_standalone.js b/collections/transformations/bower_components/jasmine/grunt/tasks/build_standalone.js deleted file mode 100644 index 1abccf2..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/tasks/build_standalone.js +++ /dev/null @@ -1,31 +0,0 @@ -var grunt = require("grunt"); - -function standaloneTmpDir(path) { return "dist/tmp/" + path; } - -grunt.registerTask("build:compileSpecRunner", - "Processes the spec runner template and writes to a tmp file", - function() { - var runnerHtml = grunt.template.process( - grunt.file.read("grunt/templates/SpecRunner.html.jst"), - { data: { jasmineVersion: global.jasmineVersion }}); - - grunt.file.write(standaloneTmpDir("SpecRunner.html"), runnerHtml); - } -); - -grunt.registerTask("build:cleanSpecRunner", - "Deletes the tmp spec runner file", - function() { - grunt.file.delete(standaloneTmpDir("")); - } -); - -grunt.registerTask("buildStandaloneDist", - "Builds a standalone distribution", - [ - "buildDistribution", - "build:compileSpecRunner", - "compress:standalone", - "build:cleanSpecRunner" - ] -); diff --git a/collections/transformations/bower_components/jasmine/grunt/tasks/version.js b/collections/transformations/bower_components/jasmine/grunt/tasks/version.js deleted file mode 100644 index f8ff6a1..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/tasks/version.js +++ /dev/null @@ -1,14 +0,0 @@ -var grunt = require("grunt"); - -function gemLib(path) { return './lib/jasmine-core/' + path; } -function nodeToRuby(version) { return version.replace('-', '.'); } - -module.exports = { - copyToGem: function() { - var versionRb = grunt.template.process( - grunt.file.read("grunt/templates/version.rb.jst"), - { data: { jasmineVersion: nodeToRuby(global.jasmineVersion) }}); - - grunt.file.write(gemLib("version.rb"), versionRb); - } -}; diff --git a/collections/transformations/bower_components/jasmine/grunt/templates/SpecRunner.html.jst b/collections/transformations/bower_components/jasmine/grunt/templates/SpecRunner.html.jst deleted file mode 100644 index a74cd47..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/templates/SpecRunner.html.jst +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Jasmine Spec Runner v<%= jasmineVersion %> - - - - - - - - - - - - - - - - - - - - - diff --git a/collections/transformations/bower_components/jasmine/grunt/templates/licenseBanner.js.jst b/collections/transformations/bower_components/jasmine/grunt/templates/licenseBanner.js.jst deleted file mode 100644 index 2b28f22..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/templates/licenseBanner.js.jst +++ /dev/null @@ -1,22 +0,0 @@ -/* -Copyright (c) 2008-<%= currentYear %> 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/collections/transformations/bower_components/jasmine/grunt/templates/version.rb.jst b/collections/transformations/bower_components/jasmine/grunt/templates/version.rb.jst deleted file mode 100644 index 411403c..0000000 --- a/collections/transformations/bower_components/jasmine/grunt/templates/version.rb.jst +++ /dev/null @@ -1,9 +0,0 @@ -# -# DO NOT Edit this file. Canonical version of Jasmine lives in the repo's package.json. This file is generated -# by a grunt task when the standalone release is built. -# -module Jasmine - module Core - VERSION = "<%= jasmineVersion %>" - end -end diff --git a/collections/transformations/bower_components/jasmine/images/__init__.py b/collections/transformations/bower_components/jasmine/images/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/collections/transformations/bower_components/jasmine/jasmine-core.gemspec b/collections/transformations/bower_components/jasmine/jasmine-core.gemspec deleted file mode 100644 index 9100d82..0000000 --- a/collections/transformations/bower_components/jasmine/jasmine-core.gemspec +++ /dev/null @@ -1,23 +0,0 @@ -# -*- encoding: utf-8 -*- -$:.push File.expand_path("../lib", __FILE__) -require "jasmine-core/version" - -Gem::Specification.new do |s| - s.name = "jasmine-core" - s.version = Jasmine::Core::VERSION - s.platform = Gem::Platform::RUBY - s.authors = ["Rajan Agaskar", "Davis W. Frank", "Christian Williams"] - s.summary = %q{JavaScript BDD framework} - s.description = %q{Test your JavaScript without any framework dependencies, in any environment, and with a nice descriptive syntax.} - s.email = %q{jasmine-js@googlegroups.com} - s.homepage = "http://pivotal.github.com/jasmine" - s.rubyforge_project = "jasmine-core" - s.license = "MIT" - - s.files = Dir.glob("./lib/**/*") + Dir.glob("./lib/jasmine-core/spec/**/*.js") - s.require_paths = ["lib"] - s.add_development_dependency "rake" - s.add_development_dependency "sauce-connect" - s.add_development_dependency "compass" - s.add_development_dependency "jasmine_selenium_runner", ">= 0.2.0" -end diff --git a/collections/transformations/bower_components/jasmine/lib/console/console.js b/collections/transformations/bower_components/jasmine/lib/console/console.js index 78b5615..e154806 100644 --- a/collections/transformations/bower_components/jasmine/lib/console/console.js +++ b/collections/transformations/bower_components/jasmine/lib/console/console.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2008-2014 Pivotal Labs +Copyright (c) 2008-2015 Pivotal Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -54,7 +54,10 @@ getJasmineRequireObj().ConsoleReporter = function() { red: '\x1B[31m', yellow: '\x1B[33m', none: '\x1B[0m' - }; + }, + failedSuites = []; + + print('ConsoleReporter is deprecated and will be removed in a future version.'); this.jasmineStarted = function() { specCount = 0; @@ -89,9 +92,12 @@ getJasmineRequireObj().ConsoleReporter = function() { printNewline(); var seconds = timer.elapsed() / 1000; print('Finished in ' + seconds + ' ' + plural('second', seconds)); - printNewline(); + for(i = 0; i < failedSuites.length; i++) { + suiteFailureDetails(failedSuites[i]); + } + onComplete(failureCount === 0); }; @@ -116,6 +122,13 @@ getJasmineRequireObj().ConsoleReporter = function() { } }; + this.suiteDone = function(result) { + if (result.failedExpectations && result.failedExpectations.length > 0) { + failureCount++; + failedSuites.push(result); + } + }; + return this; function printNewline() { @@ -160,6 +173,17 @@ getJasmineRequireObj().ConsoleReporter = function() { printNewline(); } + + function suiteFailureDetails(result) { + for (var i = 0; i < result.failedExpectations.length; i++) { + printNewline(); + print(colored('red', 'An error was thrown in an afterAll')); + printNewline(); + print(colored('red', 'AfterAll ' + result.failedExpectations[i].message)); + + } + printNewline(); + } } return ConsoleReporter; diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core.js index ca0de60..fe0ecd8 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core.js +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core.js @@ -1,29 +1,37 @@ module.exports = require("./jasmine-core/jasmine.js"); module.exports.boot = require('./jasmine-core/node_boot.js'); -module.exports.files = (function() { - var path = require('path'), - fs = require('fs'), - glob = require('glob'); +var path = require('path'), + fs = require('fs'); - var rootPath = path.join(__dirname, "jasmine-core"), - bootFiles = ['boot.js'], - nodeBootFiles = ['node_boot.js']; +var rootPath = path.join(__dirname, "jasmine-core"), + bootFiles = ['boot.js'], + nodeBootFiles = ['node_boot.js'], + cssFiles = [], + jsFiles = [], + jsFilesToSkip = ['jasmine.js'].concat(bootFiles, nodeBootFiles); - var cssFiles = glob.sync(path.join(rootPath, '*.css')).map(path.basename); - var jsFiles = glob.sync(path.join(rootPath, '*.js')).map(path.basename); +fs.readdirSync(rootPath).forEach(function(file) { + if(fs.statSync(path.join(rootPath, file)).isFile()) { + switch(path.extname(file)) { + case '.css': + cssFiles.push(file); + break; + case '.js': + if (jsFilesToSkip.indexOf(file) < 0) { + jsFiles.push(file); + } + break; + } + } +}); - ['jasmine.js'].concat(bootFiles, nodeBootFiles).forEach(function(file) { - jsFiles.splice(jsFiles.indexOf(file), 1); - }); - - return { - path: rootPath, - bootDir: rootPath, - bootFiles: bootFiles, - nodeBootFiles: nodeBootFiles, - cssFiles: cssFiles, - jsFiles: ['jasmine.js'].concat(jsFiles), - imagesDir: path.join(__dirname, '../images') - }; -}()); +module.exports.files = { + path: rootPath, + bootDir: rootPath, + bootFiles: bootFiles, + nodeBootFiles: nodeBootFiles, + cssFiles: cssFiles, + jsFiles: ['jasmine.js'].concat(jsFiles), + imagesDir: path.join(__dirname, '../images') +}; diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core.rb b/collections/transformations/bower_components/jasmine/lib/jasmine-core.rb deleted file mode 100644 index dc8682e..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core.rb +++ /dev/null @@ -1,53 +0,0 @@ -module Jasmine - module Core - class << self - def path - File.join(File.dirname(__FILE__), "jasmine-core") - end - - def js_files - (["jasmine.js"] + Dir.glob(File.join(path, "*.js"))).map { |f| File.basename(f) }.uniq - boot_files - node_boot_files - end - - SPEC_TYPES = ["core", "html", "node"] - - def core_spec_files - spec_files("core") - end - - def html_spec_files - spec_files("html") - end - - def node_spec_files - spec_files("node") - end - - def boot_files - ["boot.js"] - end - - def node_boot_files - ["node_boot.js"] - end - - def boot_dir - path - end - - def spec_files(type) - raise ArgumentError.new("Unrecognized spec type") unless SPEC_TYPES.include?(type) - (Dir.glob(File.join(path, "spec", type, "*.js"))).map { |f| File.join("spec", type, File.basename(f)) }.uniq - end - - def css_files - Dir.glob(File.join(path, "*.css")).map { |f| File.basename(f) } - end - - def images_dir - File.join(File.dirname(__FILE__), '../images') - end - - end - end -end diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/__init__.py b/collections/transformations/bower_components/jasmine/lib/jasmine-core/__init__.py deleted file mode 100644 index a8d584a..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from .core import Core \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot.js index b2a9da5..8b66e00 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot.js +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2008-2014 Pivotal Labs +Copyright (c) 2008-2015 Pivotal Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -21,7 +21,7 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** - Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. + Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js` and `jasmine_html.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. @@ -57,13 +57,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var jasmineInterface = jasmineRequire.interface(jasmine, env); /** - * Add all of the Jasmine global/public interface to the proper global, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. + * Add all of the Jasmine global/public interface to the global scope, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. */ - if (typeof window == "undefined" && typeof exports == "object") { - extend(exports, jasmineInterface); - } else { - extend(window, jasmineInterface); - } + extend(window, jasmineInterface); /** * ## Runner Parameters @@ -78,13 +74,18 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. var catchingExceptions = queryString.getParam("catch"); env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); + var throwingExpectationFailures = queryString.getParam("throwFailures"); + env.throwOnExpectationFailure(throwingExpectationFailures); + /** * ## Reporters * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). */ var htmlReporter = new jasmine.HtmlReporter({ env: env, - onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); }, + onRaiseExceptionsClick: function() { queryString.navigateWithNewParam("catch", !env.catchingExceptions()); }, + onThrowExpectationsClick: function() { queryString.navigateWithNewParam("throwFailures", !env.throwingExpectationFailures()); }, + addToExistingQueryString: function(key, value) { return queryString.fullStringWithNewParam(key, value); }, getContainer: function() { return document.body; }, createElement: function() { return document.createElement.apply(document, arguments); }, createTextNode: function() { return document.createTextNode.apply(document, arguments); }, diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/boot.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/boot.js deleted file mode 100644 index 406145e..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/boot.js +++ /dev/null @@ -1,120 +0,0 @@ -/** - Starting with version 2.0, this file "boots" Jasmine, performing all of the necessary initialization before executing the loaded environment and all of a project's specs. This file should be loaded after `jasmine.js`, but before any project source files or spec files are loaded. Thus this file can also be used to customize Jasmine for a project. - - If a project is using Jasmine via the standalone distribution, this file can be customized directly. If a project is using Jasmine via the [Ruby gem][jasmine-gem], this file can be copied into the support directory via `jasmine copy_boot_js`. Other environments (e.g., Python) will have different mechanisms. - - The location of `boot.js` can be specified and/or overridden in `jasmine.yml`. - - [jasmine-gem]: http://github.com/pivotal/jasmine-gem - */ - -(function() { - - /** - * ## Require & Instantiate - * - * Require Jasmine's core files. Specifically, this requires and attaches all of Jasmine's code to the `jasmine` reference. - */ - window.jasmine = jasmineRequire.core(jasmineRequire); - - /** - * Since this is being run in a browser and the results should populate to an HTML page, require the HTML-specific Jasmine code, injecting the same reference. - */ - jasmineRequire.html(jasmine); - - /** - * Create the Jasmine environment. This is used to run all specs in a project. - */ - var env = jasmine.getEnv(); - - /** - * ## The Global Interface - * - * Build up the functions that will be exposed as the Jasmine public interface. A project can customize, rename or alias any of these functions as desired, provided the implementation remains unchanged. - */ - var jasmineInterface = jasmineRequire.interface(jasmine, env); - - /** - * Add all of the Jasmine global/public interface to the proper global, so a project can use the public interface directly. For example, calling `describe` in specs instead of `jasmine.getEnv().describe`. - */ - if (typeof window == "undefined" && typeof exports == "object") { - extend(exports, jasmineInterface); - } else { - extend(window, jasmineInterface); - } - - /** - * ## Runner Parameters - * - * More browser specific code - wrap the query string in an object and to allow for getting/setting parameters from the runner user interface. - */ - - var queryString = new jasmine.QueryString({ - getWindowLocation: function() { return window.location; } - }); - - var catchingExceptions = queryString.getParam("catch"); - env.catchExceptions(typeof catchingExceptions === "undefined" ? true : catchingExceptions); - - /** - * ## Reporters - * The `HtmlReporter` builds all of the HTML UI for the runner page. This reporter paints the dots, stars, and x's for specs, as well as all spec names and all failures (if any). - */ - var htmlReporter = new jasmine.HtmlReporter({ - env: env, - onRaiseExceptionsClick: function() { queryString.setParam("catch", !env.catchingExceptions()); }, - getContainer: function() { return document.body; }, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); }, - timer: new jasmine.Timer() - }); - - /** - * The `jsApiReporter` also receives spec results, and is used by any environment that needs to extract the results from JavaScript. - */ - env.addReporter(jasmineInterface.jsApiReporter); - env.addReporter(htmlReporter); - - /** - * Filter which specs will be run by matching the start of the full name against the `spec` query param. - */ - var specFilter = new jasmine.HtmlSpecFilter({ - filterString: function() { return queryString.getParam("spec"); } - }); - - env.specFilter = function(spec) { - return specFilter.matches(spec.getFullName()); - }; - - /** - * Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack. - */ - window.setTimeout = window.setTimeout; - window.setInterval = window.setInterval; - window.clearTimeout = window.clearTimeout; - window.clearInterval = window.clearInterval; - - /** - * ## Execution - * - * Replace the browser window's `onload`, ensure it's called, and then run all of the loaded specs. This includes initializing the `HtmlReporter` instance and then executing the loaded Jasmine environment. All of this will happen after all of the specs are loaded. - */ - var currentWindowOnload = window.onload; - - window.onload = function() { - if (currentWindowOnload) { - currentWindowOnload(); - } - htmlReporter.initialize(); - env.execute(); - }; - - /** - * Helper function for readability above. - */ - function extend(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; - } - -}()); diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/node_boot.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/node_boot.js deleted file mode 100644 index 6a4caf0..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/boot/node_boot.js +++ /dev/null @@ -1,19 +0,0 @@ -module.exports = function(jasmineRequire) { - var jasmine = jasmineRequire.core(jasmineRequire); - - var consoleFns = require('../console/console.js'); - consoleFns.console(consoleFns, jasmine); - - var env = jasmine.getEnv(); - - var jasmineInterface = jasmineRequire.interface(jasmine, env); - - extend(global, jasmineInterface); - - function extend(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; - } - - return jasmine; -}; diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/core.py b/collections/transformations/bower_components/jasmine/lib/jasmine-core/core.py deleted file mode 100644 index 226c95d..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/core.py +++ /dev/null @@ -1,60 +0,0 @@ -import pkg_resources - -try: - from collections import OrderedDict -except ImportError: - from ordereddict import OrderedDict - -class Core(object): - @classmethod - def js_package(cls): - return __package__ - - @classmethod - def css_package(cls): - return __package__ - - @classmethod - def image_package(cls): - return __package__ + ".images" - - @classmethod - def js_files(cls): - js_files = sorted(list(filter(lambda x: '.js' in x, pkg_resources.resource_listdir(cls.js_package(), '.')))) - - # jasmine.js needs to be first - js_files.insert(0, 'jasmine.js') - - # boot needs to be last - js_files.remove('boot.js') - js_files.append('boot.js') - - return cls._uniq(js_files) - - @classmethod - def css_files(cls): - return cls._uniq(sorted(filter(lambda x: '.css' in x, pkg_resources.resource_listdir(cls.css_package(), '.')))) - - @classmethod - def favicon(cls): - return 'jasmine_favicon.png' - - @classmethod - def _uniq(self, items, idfun=None): - # order preserving - - if idfun is None: - def idfun(x): return x - seen = {} - result = [] - for item in items: - marker = idfun(item) - # in old Python versions: - # if seen.has_key(marker) - # but in new ones: - if marker in seen: - continue - - seen[marker] = 1 - result.append(item) - return result \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/src/Player.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Player.js similarity index 100% rename from collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/src/Player.js rename to collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Player.js diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/src/Song.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Song.js similarity index 100% rename from collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/src/Song.js rename to collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/lib/jasmine_examples/Song.js diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/PlayerSpec.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/PlayerSpec.js deleted file mode 100644 index 6d04bec..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/PlayerSpec.js +++ /dev/null @@ -1,60 +0,0 @@ -describe("Player", function() { - var Player = require('../../jasmine_examples/Player.js'); - var Song = require('../../jasmine_examples/Song.js'); - var player; - var song; - - beforeEach(function() { - player = new Player(); - song = new Song(); - }); - - it("should be able to play a Song", function() { - player.play(song); - expect(player.currentlyPlayingSong).toEqual(song); - - //demonstrates use of custom matcher - expect(player).toBePlaying(song); - }); - - describe("when song has been paused", function() { - beforeEach(function() { - player.play(song); - player.pause(); - }); - - it("should indicate that the song is currently paused", function() { - expect(player.isPlaying).toBeFalsy(); - - // demonstrates use of 'not' with a custom matcher - expect(player).not.toBePlaying(song); - }); - - it("should be possible to resume", function() { - player.resume(); - expect(player.isPlaying).toBeTruthy(); - expect(player.currentlyPlayingSong).toEqual(song); - }); - }); - - // demonstrates use of spies to intercept and test method calls - it("tells the current song if the user has made it a favorite", function() { - spyOn(song, 'persistFavoriteStatus'); - - player.play(song); - player.makeFavorite(); - - expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true); - }); - - //demonstrates use of expected exceptions - describe("#resume", function() { - it("should throw an exception if song is already playing", function() { - player.play(song); - - expect(function() { - player.resume(); - }).toThrowError("song is already playing"); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/SpecHelper.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/SpecHelper.js deleted file mode 100644 index 578b3e8..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/node_example/spec/SpecHelper.js +++ /dev/null @@ -1,15 +0,0 @@ -beforeEach(function () { - jasmine.addMatchers({ - toBePlaying: function () { - return { - compare: function (actual, expected) { - var player = actual; - - return { - pass: player.currentlyPlayingSong === expected && player.isPlaying - } - } - }; - } - }); -}); diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/PlayerSpec.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/PlayerSpec.js deleted file mode 100644 index f17521f..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/PlayerSpec.js +++ /dev/null @@ -1,58 +0,0 @@ -describe("Player", function() { - var player; - var song; - - beforeEach(function() { - player = new Player(); - song = new Song(); - }); - - it("should be able to play a Song", function() { - player.play(song); - expect(player.currentlyPlayingSong).toEqual(song); - - //demonstrates use of custom matcher - expect(player).toBePlaying(song); - }); - - describe("when song has been paused", function() { - beforeEach(function() { - player.play(song); - player.pause(); - }); - - it("should indicate that the song is currently paused", function() { - expect(player.isPlaying).toBeFalsy(); - - // demonstrates use of 'not' with a custom matcher - expect(player).not.toBePlaying(song); - }); - - it("should be possible to resume", function() { - player.resume(); - expect(player.isPlaying).toBeTruthy(); - expect(player.currentlyPlayingSong).toEqual(song); - }); - }); - - // demonstrates use of spies to intercept and test method calls - it("tells the current song if the user has made it a favorite", function() { - spyOn(song, 'persistFavoriteStatus'); - - player.play(song); - player.makeFavorite(); - - expect(song.persistFavoriteStatus).toHaveBeenCalledWith(true); - }); - - //demonstrates use of expected exceptions - describe("#resume", function() { - it("should throw an exception if song is already playing", function() { - player.play(song); - - expect(function() { - player.resume(); - }).toThrowError("song is already playing"); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/SpecHelper.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/SpecHelper.js deleted file mode 100644 index 578b3e8..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/spec/SpecHelper.js +++ /dev/null @@ -1,15 +0,0 @@ -beforeEach(function () { - jasmine.addMatchers({ - toBePlaying: function () { - return { - compare: function (actual, expected) { - var player = actual; - - return { - pass: player.currentlyPlayingSong === expected && player.isPlaying - } - } - }; - } - }); -}); diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Player.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Player.js deleted file mode 100644 index fcce826..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Player.js +++ /dev/null @@ -1,22 +0,0 @@ -function Player() { -} -Player.prototype.play = function(song) { - this.currentlyPlayingSong = song; - this.isPlaying = true; -}; - -Player.prototype.pause = function() { - this.isPlaying = false; -}; - -Player.prototype.resume = function() { - if (this.isPlaying) { - throw new Error("song is already playing"); - } - - this.isPlaying = true; -}; - -Player.prototype.makeFavorite = function() { - this.currentlyPlayingSong.persistFavoriteStatus(true); -}; \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Song.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Song.js deleted file mode 100644 index a8a3f2d..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/example/src/Song.js +++ /dev/null @@ -1,7 +0,0 @@ -function Song() { -} - -Song.prototype.persistFavoriteStatus = function(value) { - // something complicated - throw new Error("not yet implemented"); -}; \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine-html.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine-html.js index 9d95903..259f45c 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine-html.js +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine-html.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2008-2014 Pivotal Labs +Copyright (c) 2008-2015 Pivotal Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -40,13 +40,16 @@ jasmineRequire.HtmlReporter = function(j$) { createElement = options.createElement, createTextNode = options.createTextNode, onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, + onThrowExpectationsClick = options.onThrowExpectationsClick || function() {}, + addToExistingQueryString = options.addToExistingQueryString || defaultQueryString, timer = options.timer || noopTimer, results = [], specsExecuted = 0, failureCount = 0, pendingSpecCount = 0, htmlReporterMain, - symbols; + symbols, + failedSuites = []; this.initialize = function() { clearPrior(); @@ -83,6 +86,10 @@ jasmineRequire.HtmlReporter = function(j$) { }; this.suiteDone = function(result) { + if (result.status == 'failed') { + failedSuites.push(result); + } + if (currentParent == topResults) { return; } @@ -96,7 +103,7 @@ jasmineRequire.HtmlReporter = function(j$) { var failures = []; this.specDone = function(result) { - if(noExpectations(result) && console && console.error) { + if(noExpectations(result) && typeof console !== 'undefined' && typeof console.error !== 'undefined') { console.error('Spec \'' + result.fullName + '\' has no expectations.'); } @@ -139,22 +146,51 @@ jasmineRequire.HtmlReporter = function(j$) { this.jasmineDone = function() { var banner = find('.banner'); - banner.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); - var alert = find('.alert'); + alert.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); + + banner.appendChild( + createDom('div', { className: 'run-options' }, + createDom('span', { className: 'trigger' }, 'Options'), + createDom('div', { className: 'payload' }, + createDom('div', { className: 'exceptions' }, + createDom('input', { + className: 'raise', + id: 'raise-exceptions', + type: 'checkbox' + }), + createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions')), + createDom('div', { className: 'throw-failures' }, + createDom('input', { + className: 'throw', + id: 'throw-failures', + type: 'checkbox' + }), + createDom('label', { className: 'label', 'for': 'throw-failures' }, 'stop spec on expectation failure')) + ) + )); - alert.appendChild(createDom('span', { className: 'exceptions' }, - createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions'), - createDom('input', { - className: 'raise', - id: 'raise-exceptions', - type: 'checkbox' - }) - )); - var checkbox = find('#raise-exceptions'); + var raiseCheckbox = find('#raise-exceptions'); + + raiseCheckbox.checked = !env.catchingExceptions(); + raiseCheckbox.onclick = onRaiseExceptionsClick; + + var throwCheckbox = find('#throw-failures'); + throwCheckbox.checked = env.throwingExpectationFailures(); + throwCheckbox.onclick = onThrowExpectationsClick; - checkbox.checked = !env.catchingExceptions(); - checkbox.onclick = onRaiseExceptionsClick; + var optionsMenu = find('.run-options'), + optionsTrigger = optionsMenu.querySelector('.trigger'), + optionsPayload = optionsMenu.querySelector('.payload'), + isOpen = /\bopen\b/; + + optionsTrigger.onclick = function() { + if (isOpen.test(optionsPayload.className)) { + optionsPayload.className = optionsPayload.className.replace(isOpen, ''); + } else { + optionsPayload.className += ' open'; + } + }; if (specsExecuted < totalSpecsDefined) { var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; @@ -178,6 +214,15 @@ jasmineRequire.HtmlReporter = function(j$) { alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage)); + for(i = 0; i < failedSuites.length; i++) { + var failedSuite = failedSuites[i]; + for(var j = 0; j < failedSuite.failedExpectations.length; j++) { + var errorBarMessage = 'AfterAll ' + failedSuite.failedExpectations[j].message; + var errorBarClassName = 'bar errored'; + alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage)); + } + } + var results = find('.results'); results.appendChild(summary); @@ -206,6 +251,9 @@ jasmineRequire.HtmlReporter = function(j$) { if(noExpectations(resultNode.result)) { specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; } + if(resultNode.result.status === 'pending' && resultNode.result.pendingReason !== '') { + specDescription = specDescription + ' PENDING WITH MESSAGE: ' + resultNode.result.pendingReason; + } specListNode.appendChild( createDom('li', { className: resultNode.result.status, @@ -253,7 +301,7 @@ jasmineRequire.HtmlReporter = function(j$) { function clearPrior() { // return the reporter var oldReporter = find(''); - + if(oldReporter) { getContainer().removeChild(oldReporter); } @@ -292,7 +340,11 @@ jasmineRequire.HtmlReporter = function(j$) { } function specHref(result) { - return '?spec=' + encodeURIComponent(result.fullName); + return addToExistingQueryString('spec', result.fullName); + } + + function defaultQueryString(key, value) { + return '?' + key + '=' + value; } function setMenuModeTo(mode) { @@ -344,10 +396,14 @@ jasmineRequire.ResultsNode = function() { jasmineRequire.QueryString = function() { function QueryString(options) { - this.setParam = function(key, value) { + this.navigateWithNewParam = function(key, value) { + options.getWindowLocation().search = this.fullStringWithNewParam(key, value); + }; + + this.fullStringWithNewParam = function(key, value) { var paramMap = queryStringToParamMap(); paramMap[key] = value; - options.getWindowLocation().search = toQueryString(paramMap); + return toQueryString(paramMap); }; this.getParam = function(key) { diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.css b/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.css index fb2afd1..f9f4ae9 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.css +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.css @@ -1,18 +1,17 @@ body { overflow-y: scroll; } -.jasmine_html-reporter { background-color: #eeeeee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; } +.jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; } .jasmine_html-reporter a { text-decoration: none; } .jasmine_html-reporter a:hover { text-decoration: underline; } .jasmine_html-reporter p, .jasmine_html-reporter h1, .jasmine_html-reporter h2, .jasmine_html-reporter h3, .jasmine_html-reporter h4, .jasmine_html-reporter h5, .jasmine_html-reporter h6 { margin: 0; line-height: 14px; } .jasmine_html-reporter .banner, .jasmine_html-reporter .symbol-summary, .jasmine_html-reporter .summary, .jasmine_html-reporter .result-message, .jasmine_html-reporter .spec .description, .jasmine_html-reporter .spec-detail .description, .jasmine_html-reporter .alert .bar, .jasmine_html-reporter .stack-trace { padding-left: 9px; padding-right: 9px; } .jasmine_html-reporter .banner { position: relative; } -.jasmine_html-reporter .banner .title { background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAAAZCAMAAACGusnyAAACdlBMVEX/////AP+AgICqVaqAQICZM5mAVYCSSZKAQICOOY6ATYCLRouAQICJO4mSSYCIRIiPQICHPIeOR4CGQ4aMQICGPYaLRoCFQ4WKQICPPYWJRYCOQoSJQICNPoSIRICMQoSHQICHRICKQoOHQICKPoOJO4OJQYOMQICMQ4CIQYKLQICIPoKLQ4CKQICNPoKJQISMQ4KJQoSLQYKJQISLQ4KIQoSKQYKIQICIQISMQoSKQYKLQIOLQoOJQYGLQIOKQIOMQoGKQYOLQYGKQIOLQoGJQYOJQIOKQYGJQIOKQoGKQIGLQIKLQ4KKQoGLQYKJQIGKQYKJQIGKQIKJQoGKQYKLQIGKQYKLQIOJQoKKQoOJQYKKQIOJQoKKQoOKQIOLQoKKQYOLQYKJQIOKQoKKQYKKQoKJQYOKQYKLQIOKQoKLQYOKQYKLQIOJQoGKQYKJQYGJQoGKQYKLQoGLQYGKQoGJQYKKQYGJQIKKQoGJQYKLQIKKQYGLQYKKQYGKQYGKQYKJQYOKQoKJQYOKQYKLQYOLQYOKQYKLQYOKQoKKQYKKQYOKQYOJQYKKQYKLQYKKQIKKQoKKQYKKQYKKQoKJQIKKQYKLQYKKQYKKQIKKQYKKQYKKQYKKQIKKQYKJQYGLQYGKQYKKQYKKQYGKQIKKQYGKQYOJQoKKQYOLQYKKQYOKQoKKQYKKQoKKQYKKQYKJQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKJQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKLQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKKQYKmIDpEAAAA0XRSTlMAAQIDBAUGBwgJCgsMDQ4PEBESExQVFhcYGRobHB0eHyAiIyQlJycoKissLS4wMTQ1Njc4OTo7PDw+P0BCQ0RISUpLTE1OUFNUVVdYWFlaW15fYGFiY2ZnaGlqa2xtb3BxcnN0dnh5ent8fX5/gIGChIWIioyNjo+QkZOUlZaYmZqbnJ2eoKGio6WmqKmsra6vsLGztre4ubq7vL2+wMHDxMjJysvNzs/Q0dLU1tfY2dvc3t/g4eLj5ebn6Onq6+zt7u/w8vP09fb3+Pn6+/z9/vkVQXAAAAMaSURBVHhe5dXxV1N1GMfxz2ABbDgIAm5VDJOyVDIJLUMaVpBWUZUaGbmqoGpZRSiGiRWp6KoZ5AB0ZY50RImZQIlahKkMYXv/R90dBvET/rJfOr3Ouc8v99zPec59zvf56j+vYKlViSf7250X4Mr3O29Tgq08BdGB4DhcekEJ5YkQKFsgWZdtj9JpV+I8xPjLFqkrsEIqO8PHSpis36jWazcqjEsfJjkvRssVU37SdIOu4XCf5vEJPsnwJpnRNU9JmxhMk8l1gehIrq7hTFjzOD+Vf88629qKMJVNltInFeRexRQyJlNeqd1iGDlSzrIUIyXbyFfm3RYprcQRe7lqtWyGYbfc6dT0R2vmdOOkX3u55C1rP37ftiH+tDby4r/RBT0w8TyEkr+epB9XgPDmSYYWbrhCuFYaIyw3fDQAXTnSkh+ANofiHmWf9l+FY1I90FdQTetstO00o23novzVsJ7uB3/C5TkbjRwZ5JerwV4iRWq9HFbFMaK/d0TYqayRiQPuIxxS3Bu8JWU90/60tKi7vkhaznez0a/TbVOKj5CaOZh6fWG6/Lyv9B/ZLR1gw/S/fpbeVD3MCW1li6SvWDOn65tr99/uvWtBS0XDm4s1t+sOHpG0kpBKx/l77wOSnxLpcx6TXmXLTPQOKYOf9Q1dfr8/SJ2mFdCvl1Yl93DiHUZvXeLJbGSzYu5gVJ2slbSakOR8dxCq5adQ2oFLqsE9Ex3L4qQO0eOPeU5x56bypXp4onSEb5OkICX6lDat55TeoztNKQcJaakrz9KCb95oD69IKq+yKW4XPjknaS52V0TZqE2cTtXjcHSCRmUO88e+85hj3EP74i9p8pylw7lxgMDyyl6OV7ZejnjNMfatu87LxRbH0IS35gt2a4ZjmGpVBdKK3Wr6INk8jWWSGqbA55CKgjBRC6E9w78ydTg3ABS3AFV1QN0Y4Aa2pgEjWnQURj9L0ayK6R2ysEqxHUKzYnLvvyU+i9KM2JHJzE4vyZOyDcOwOsySajeLPc8sNvPJkFlyJd20wpqAzZeAfZ3oWybxd+P/3j+SG3uSBdf2VQAAAABJRU5ErkJggg==') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -webkit-background-size: 100%; -moz-background-size: 100%; -o-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } +.jasmine_html-reporter .banner .title { background: url('data:image/png;base64,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') no-repeat; background: url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgdmVyc2lvbj0iMS4xIgogICB3aWR0aD0iNjgxLjk2MjUyIgogICBoZWlnaHQ9IjE4Ny41IgogICBpZD0ic3ZnMiIKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSI+PG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhOCI+PHJkZjpSREY+PGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPjxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PjxkYzp0eXBlCiAgICAgICAgICAgcmRmOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz48L2NjOldvcms+PC9yZGY6UkRGPjwvbWV0YWRhdGE+PGRlZnMKICAgICBpZD0iZGVmczYiPjxjbGlwUGF0aAogICAgICAgaWQ9ImNsaXBQYXRoMTgiPjxwYXRoCiAgICAgICAgIGQ9Ik0gMCwxNTAwIDAsMCBsIDU0NTUuNzQsMCAwLDE1MDAgTCAwLDE1MDAgeiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgaWQ9InBhdGgyMCIgLz48L2NsaXBQYXRoPjwvZGVmcz48ZwogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsMTg3LjUpIgogICAgIGlkPSJnMTAiPjxnCiAgICAgICB0cmFuc2Zvcm09InNjYWxlKDAuMSwwLjEpIgogICAgICAgaWQ9ImcxMiI+PGcKICAgICAgICAgaWQ9ImcxNCI+PGcKICAgICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGgxOCkiCiAgICAgICAgICAgaWQ9ImcxNiI+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTU0NCw1OTkuNDM0IGMgMC45MiwtNDAuMzUyIDI1LjY4LC04MS42MDIgNzEuNTMsLTgxLjYwMiAyNy41MSwwIDQ3LjY4LDEyLjgzMiA2MS40NCwzNS43NTQgMTIuODMsMjIuOTMgMTIuODMsNTYuODUyIDEyLjgzLDgyLjUyNyBsIDAsMzI5LjE4NCAtNzEuNTIsMCAwLDEwNC41NDMgMjY2LjgzLDAgMCwtMTA0LjU0MyAtNzAuNiwwIDAsLTM0NC43NyBjIDAsLTU4LjY5MSAtMy42OCwtMTA0LjUzMSAtNDQuOTMsLTE1Mi4yMTggLTM2LjY4LC00Mi4xOCAtOTYuMjgsLTY2LjAyIC0xNTMuMTQsLTY2LjAyIC0xMTcuMzcsMCAtMjA3LjI0LDc3Ljk0MSAtMjAyLjY0LDE5Ny4xNDUgbCAxMzAuMiwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMjIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDIzMDEuNCw2NjIuNjk1IGMgMCw4MC43MDMgLTY2Ljk0LDE0NS44MTMgLTE0Ny42MywxNDUuODEzIC04My40NCwwIC0xNDcuNjMsLTY4Ljc4MSAtMTQ3LjYzLC0xNTEuMzAxIDAsLTc5Ljc4NSA2Ni45NCwtMTQ1LjgwMSAxNDUuOCwtMTQ1LjgwMSA4NC4zNSwwIDE0OS40Niw2Ny44NTIgMTQ5LjQ2LDE1MS4yODkgeiBtIC0xLjgzLC0xODEuNTQ3IGMgLTM1Ljc3LC01NC4wOTcgLTkzLjUzLC03OC44NTkgLTE1Ny43MiwtNzguODU5IC0xNDAuMywwIC0yNTEuMjQsMTE2LjQ0OSAtMjUxLjI0LDI1NC45MTggMCwxNDIuMTI5IDExMy43LDI2MC40MSAyNTYuNzQsMjYwLjQxIDYzLjI3LDAgMTE4LjI5LC0yOS4zMzYgMTUyLjIyLC04Mi41MjMgbCAwLDY5LjY4NyAxNzUuMTQsMCAwLC0xMDQuNTI3IC02MS40NCwwIDAsLTI4MC41OTggNjEuNDQsMCAwLC0xMDQuNTI3IC0xNzUuMTQsMCAwLDY2LjAxOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAyNjIyLjMzLDU1Ny4yNTggYyAzLjY3LC00NC4wMTYgMzMuMDEsLTczLjM0OCA3OC44NiwtNzMuMzQ4IDMzLjkzLDAgNjYuOTMsMjMuODI0IDY2LjkzLDYwLjUwNCAwLDQ4LjYwNiAtNDUuODQsNTYuODU2IC04My40NCw2Ni45NDEgLTg1LjI4LDIyLjAwNCAtMTc4LjgxLDQ4LjYwNiAtMTc4LjgxLDE1NS44NzkgMCw5My41MzYgNzguODYsMTQ3LjYzMyAxNjUuOTgsMTQ3LjYzMyA0NCwwIDgzLjQzLC05LjE3NiAxMTAuOTQsLTQ0LjAwOCBsIDAsMzMuOTIyIDgyLjUzLDAgMCwtMTMyLjk2NSAtMTA4LjIxLDAgYyAtMS44MywzNC44NTYgLTI4LjQyLDU3Ljc3NCAtNjMuMjYsNTcuNzc0IC0zMC4yNiwwIC02Mi4zNSwtMTcuNDIyIC02Mi4zNSwtNTEuMzQ4IDAsLTQ1Ljg0NyA0NC45MywtNTUuOTMgODAuNjksLTY0LjE4IDg4LjAyLC0yMC4xNzUgMTgyLjQ3LC00Ny42OTUgMTgyLjQ3LC0xNTcuNzM0IDAsLTk5LjAyNyAtODMuNDQsLTE1NC4wMzkgLTE3NS4xMywtMTU0LjAzOSAtNDkuNTMsMCAtOTQuNDYsMTUuNTgyIC0xMjYuNTUsNTMuMTggbCAwLC00MC4zNCAtODUuMjcsMCAwLDE0Mi4xMjkgMTE0LjYyLDAiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGgyNiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMjk4OC4xOCw4MDAuMjU0IC02My4yNiwwIDAsMTA0LjUyNyAxNjUuMDUsMCAwLC03My4zNTUgYyAzMS4xOCw1MS4zNDcgNzguODYsODUuMjc3IDE0MS4yMSw4NS4yNzcgNjcuODUsMCAxMjQuNzEsLTQxLjI1OCAxNTIuMjEsLTEwMi42OTkgMjYuNiw2Mi4zNTEgOTIuNjIsMTAyLjY5OSAxNjAuNDcsMTAyLjY5OSA1My4xOSwwIDEwNS40NiwtMjIgMTQxLjIxLC02Mi4zNTEgMzguNTIsLTQ0LjkzOCAzOC41MiwtOTMuNTMyIDM4LjUyLC0xNDkuNDU3IGwgMCwtMTg1LjIzOSA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40MiwwIDAsMTA0LjUyNyA2My4yOCwwIDAsMTU3LjcxNSBjIDAsMzIuMTAyIDAsNjAuNTI3IC0xNC42Nyw4OC45NTcgLTE4LjM0LDI2LjU4MiAtNDguNjEsNDAuMzQ0IC03OS43Nyw0MC4zNDQgLTMwLjI2LDAgLTYzLjI4LC0xMi44NDQgLTgyLjUzLC0zNi42NzIgLTIyLjkzLC0yOS4zNTUgLTIyLjkzLC01Ni44NjMgLTIyLjkzLC05Mi42MjkgbCAwLC0xNTcuNzE1IDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM4LjQxLDAgMCwxMDQuNTI3IDYzLjI4LDAgMCwxNTAuMzgzIGMgMCwyOS4zNDggMCw2Ni4wMjMgLTE0LjY3LDkxLjY5OSAtMTUuNTksMjkuMzM2IC00Ny42OSw0NC45MzQgLTgwLjcsNDQuOTM0IC0zMS4xOCwwIC01Ny43NywtMTEuMDA4IC03Ny45NCwtMzUuNzc0IC0yNC43NywtMzAuMjUzIC0yNi42LC02Mi4zNDMgLTI2LjYsLTk5Ljk0MSBsIDAsLTE1MS4zMDEgNjMuMjcsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNiwwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDI4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSAzOTk4LjY2LDk1MS41NDcgLTExMS44NywwIDAsMTE4LjI5MyAxMTEuODcsMCAwLC0xMTguMjkzIHogbSAwLC00MzEuODkxIDYzLjI3LDAgMCwtMTA0LjUyNyAtMjM5LjMzLDAgMCwxMDQuNTI3IDY0LjE5LDAgMCwyODAuNTk4IC02My4yNywwIDAsMTA0LjUyNyAxNzUuMTQsMCAwLC0zODUuMTI1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzAiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDQxNTkuMTIsODAwLjI1NCAtNjMuMjcsMCAwLDEwNC41MjcgMTc1LjE0LDAgMCwtNjkuNjg3IGMgMjkuMzUsNTQuMTAxIDg0LjM2LDgwLjY5OSAxNDQuODcsODAuNjk5IDUzLjE5LDAgMTA1LjQ1LC0yMi4wMTYgMTQxLjIyLC02MC41MjcgNDAuMzQsLTQ0LjkzNCA0MS4yNiwtODguMDMyIDQxLjI2LC0xNDMuOTU3IGwgMCwtMTkxLjY1MyA2My4yNywwIDAsLTEwNC41MjcgLTIzOC40LDAgMCwxMDQuNTI3IDYzLjI2LDAgMCwxNTguNjM3IGMgMCwzMC4yNjIgMCw2MS40MzQgLTE5LjI2LDg4LjAzNSAtMjAuMTcsMjYuNTgyIC01My4xOCwzOS40MTQgLTg2LjE5LDM5LjQxNCAtMzMuOTMsMCAtNjguNzcsLTEzLjc1IC04OC45NCwtNDEuMjUgLTIxLjA5LC0yNy41IC0yMS4wOSwtNjkuNjg3IC0yMS4wOSwtMTAyLjcwNyBsIDAsLTE0Mi4xMjkgNjMuMjYsMCAwLC0xMDQuNTI3IC0yMzguNCwwIDAsMTA0LjUyNyA2My4yNywwIDAsMjgwLjU5OCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDMyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA1MDgyLjQ4LDcwMy45NjUgYyAtMTkuMjQsNzAuNjA1IC04MS42LDExNS41NDcgLTE1NC4wNCwxMTUuNTQ3IC02Ni4wNCwwIC0xMjkuMywtNTEuMzQ4IC0xNDMuMDUsLTExNS41NDcgbCAyOTcuMDksMCB6IG0gODUuMjcsLTE0NC44ODMgYyAtMzguNTEsLTkzLjUyMyAtMTI5LjI3LC0xNTYuNzkzIC0yMzEuMDUsLTE1Ni43OTMgLTE0My4wNywwIC0yNTcuNjgsMTExLjg3MSAtMjU3LjY4LDI1NS44MzYgMCwxNDQuODgzIDEwOS4xMiwyNjEuMzI4IDI1NC45MSwyNjEuMzI4IDY3Ljg3LDAgMTM1LjcyLC0zMC4yNTggMTgzLjM5LC03OC44NjMgNDguNjIsLTUxLjM0NCA2OC43OSwtMTEzLjY5NSA2OC43OSwtMTgzLjM4MyBsIC0zLjY3LC0zOS40MzQgLTM5Ni4xMywwIGMgMTQuNjcsLTY3Ljg2MyA3Ny4wMywtMTE3LjM2MyAxNDYuNzIsLTExNy4zNjMgNDguNTksMCA5MC43NiwxOC4zMjggMTE4LjI4LDU4LjY3MiBsIDExNi40NCwwIgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDY5MC44OTUsODUwLjcwMyA5MC43NSwwIDIyLjU0MywzMS4wMzUgMCwyNDMuMTIyIC0xMzUuODI5LDAgMCwtMjQzLjE0MSAyMi41MzYsLTMxLjAxNiIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDM2IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA2MzIuMzk1LDc0Mi4yNTggMjguMDM5LDg2LjMwNCAtMjIuNTUxLDMxLjA0IC0yMzEuMjIzLDc1LjEyOCAtNDEuOTc2LC0xMjkuMTgzIDIzMS4yNTcsLTc1LjEzNyAzNi40NTQsMTEuODQ4IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoMzgiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDcxNy40NDksNjUzLjEwNSAtNzMuNDEsNTMuMzYgLTM2LjQ4OCwtMTEuODc1IC0xNDIuOTAzLC0xOTYuNjkyIDEwOS44ODMsLTc5LjgyOCAxNDIuOTE4LDE5Ni43MDMgMCwzOC4zMzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gODI4LjUyLDcwNi40NjUgLTczLjQyNiwtNTMuMzQgMC4wMTEsLTM4LjM1OSBMIDg5OC4wMDQsNDE4LjA3IDEwMDcuOSw0OTcuODk4IDg2NC45NzMsNjk0LjYwOSA4MjguNTIsNzA2LjQ2NSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQyIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA4MTIuMDg2LDgyOC41ODYgMjguMDU1LC04Ni4zMiAzNi40ODQsLTExLjgzNiAyMzEuMjI1LDc1LjExNyAtNDEuOTcsMTI5LjE4MyAtMjMxLjIzOSwtNzUuMTQgLTIyLjU1NSwtMzEuMDA0IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNDQiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDczNi4zMDEsMTMzNS44OCBjIC0zMjMuMDQ3LDAgLTU4NS44NzUsLTI2Mi43OCAtNTg1Ljg3NSwtNTg1Ljc4MiAwLC0zMjMuMTE4IDI2Mi44MjgsLTU4NS45NzcgNTg1Ljg3NSwtNTg1Ljk3NyAzMjMuMDE5LDAgNTg1LjgwOSwyNjIuODU5IDU4NS44MDksNTg1Ljk3NyAwLDMyMy4wMDIgLTI2Mi43OSw1ODUuNzgyIC01ODUuODA5LDU4NS43ODIgbCAwLDAgeiBtIDAsLTExOC42MSBjIDI1Ny45NzIsMCA0NjcuMTg5LC0yMDkuMTMgNDY3LjE4OSwtNDY3LjE3MiAwLC0yNTguMTI5IC0yMDkuMjE3LC00NjcuMzQ4IC00NjcuMTg5LC00NjcuMzQ4IC0yNTguMDc0LDAgLTQ2Ny4yNTQsMjA5LjIxOSAtNDY3LjI1NCw0NjcuMzQ4IDAsMjU4LjA0MiAyMDkuMTgsNDY3LjE3MiA0NjcuMjU0LDQ2Ny4xNzIiCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg0NiIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiM4YTQxODI7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiIC8+PHBhdGgKICAgICAgICAgICAgIGQ9Im0gMTA5MS4xMyw2MTkuODgzIC0xNzUuNzcxLDU3LjEyMSAxMS42MjksMzUuODA4IDE3NS43NjIsLTU3LjEyMSAtMTEuNjIsLTM1LjgwOCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDQ4IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA4NjYuOTU3LDkwMi4wNzQgODM2LjUsOTI0LjE5OSA5NDUuMTIxLDEwNzMuNzMgOTc1LjU4NiwxMDUxLjYxIDg2Ni45NTcsOTAyLjA3NCIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDUwIgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0iTSA2MDcuNDY1LDkwMy40NDUgNDk4Ljg1NSwxMDUyLjk3IDUyOS4zMiwxMDc1LjEgNjM3LjkzLDkyNS41NjYgNjA3LjQ2NSw5MDMuNDQ1IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTIiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjxwYXRoCiAgICAgICAgICAgICBkPSJtIDM4MC42ODgsNjIyLjEyOSAtMTEuNjI2LDM1LjgwMSAxNzUuNzU4LDU3LjA5IDExLjYyMSwtMzUuODAxIC0xNzUuNzUzLC01Ny4wOSIKICAgICAgICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICAgICAgICBpZD0icGF0aDU0IgogICAgICAgICAgICAgc3R5bGU9ImZpbGw6IzhhNDE4MjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIgLz48cGF0aAogICAgICAgICAgICAgZD0ibSA3MTYuMjg5LDM3Ni41OSAzNy42NDA2LDAgMCwxODQuODE2IC0zNy42NDA2LDAgMCwtMTg0LjgxNiB6IgogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNTYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojOGE0MTgyO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIiAvPjwvZz48L2c+PC9nPjwvZz48L3N2Zz4=') no-repeat, none; -moz-background-size: 100%; -o-background-size: 100%; -webkit-background-size: 100%; background-size: 100%; display: block; float: left; width: 90px; height: 25px; } .jasmine_html-reporter .banner .version { margin-left: 14px; position: relative; top: 6px; } -.jasmine_html-reporter .banner .duration { position: absolute; right: 14px; top: 6px; } .jasmine_html-reporter #jasmine_content { position: fixed; right: 100%; } -.jasmine_html-reporter .version { color: #aaaaaa; } +.jasmine_html-reporter .version { color: #aaa; } .jasmine_html-reporter .banner { margin-top: 14px; } -.jasmine_html-reporter .duration { color: #aaaaaa; float: right; } +.jasmine_html-reporter .duration { color: #fff; float: right; line-height: 28px; padding-right: 9px; } .jasmine_html-reporter .symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; } .jasmine_html-reporter .symbol-summary li { display: inline-block; height: 8px; width: 14px; font-size: 16px; } .jasmine_html-reporter .symbol-summary li.passed { font-size: 14px; } @@ -25,24 +24,21 @@ body { overflow-y: scroll; } .jasmine_html-reporter .symbol-summary li.pending:before { color: #ba9d37; content: "*"; } .jasmine_html-reporter .symbol-summary li.empty { font-size: 14px; } .jasmine_html-reporter .symbol-summary li.empty:before { color: #ba9d37; content: "\02022"; } -.jasmine_html-reporter .exceptions { color: #fff; float: right; margin-top: 5px; margin-right: 5px; } +.jasmine_html-reporter .run-options { float: right; margin-right: 5px; border: 1px solid #8a4182; color: #8a4182; position: relative; line-height: 20px; } +.jasmine_html-reporter .run-options .trigger { cursor: pointer; padding: 8px 16px; } +.jasmine_html-reporter .run-options .payload { position: absolute; display: none; right: -1px; border: 1px solid #8a4182; background-color: #eee; white-space: nowrap; padding: 4px 8px; } +.jasmine_html-reporter .run-options .payload.open { display: block; } .jasmine_html-reporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; } .jasmine_html-reporter .bar.failed { background-color: #ca3a11; } .jasmine_html-reporter .bar.passed { background-color: #007069; } .jasmine_html-reporter .bar.skipped { background-color: #bababa; } -.jasmine_html-reporter .bar.menu { background-color: #fff; color: #aaaaaa; } -.jasmine_html-reporter .bar.menu a { color: #333333; } +.jasmine_html-reporter .bar.errored { background-color: #ca3a11; } +.jasmine_html-reporter .bar.menu { background-color: #fff; color: #aaa; } +.jasmine_html-reporter .bar.menu a { color: #333; } .jasmine_html-reporter .bar a { color: white; } .jasmine_html-reporter.spec-list .bar.menu.failure-list, .jasmine_html-reporter.spec-list .results .failures { display: none; } .jasmine_html-reporter.failure-list .bar.menu.spec-list, .jasmine_html-reporter.failure-list .summary { display: none; } -.jasmine_html-reporter .running-alert { background-color: #666666; } .jasmine_html-reporter .results { margin-top: 14px; } -.jasmine_html-reporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; } -.jasmine_html-reporter.showDetails .summaryMenuItem:hover { text-decoration: underline; } -.jasmine_html-reporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; } -.jasmine_html-reporter.showDetails .summary { display: none; } -.jasmine_html-reporter.showDetails #details { display: block; } -.jasmine_html-reporter .summaryMenuItem { font-weight: bold; text-decoration: underline; } .jasmine_html-reporter .summary { margin-top: 14px; } .jasmine_html-reporter .summary ul { list-style-type: none; margin-left: 14px; padding-top: 0; padding-left: 0; } .jasmine_html-reporter .summary ul.suite { margin-top: 7px; margin-bottom: 7px; } @@ -50,12 +46,13 @@ body { overflow-y: scroll; } .jasmine_html-reporter .summary li.failed a { color: #ca3a11; } .jasmine_html-reporter .summary li.empty a { color: #ba9d37; } .jasmine_html-reporter .summary li.pending a { color: #ba9d37; } +.jasmine_html-reporter .summary li.disabled a { color: #bababa; } .jasmine_html-reporter .description + .suite { margin-top: 0; } .jasmine_html-reporter .suite { margin-top: 14px; } -.jasmine_html-reporter .suite a { color: #333333; } +.jasmine_html-reporter .suite a { color: #333; } .jasmine_html-reporter .failures .spec-detail { margin-bottom: 28px; } .jasmine_html-reporter .failures .spec-detail .description { background-color: #ca3a11; } .jasmine_html-reporter .failures .spec-detail .description a { color: white; } -.jasmine_html-reporter .result-message { padding-top: 14px; color: #333333; white-space: pre; } +.jasmine_html-reporter .result-message { padding-top: 14px; color: #333; white-space: pre; } .jasmine_html-reporter .result-message span.result { display: block; } -.jasmine_html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; } +.jasmine_html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666; border: 1px solid #ddd; background: white; white-space: pre; } diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.js index ffe9757..312d591 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.js +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core/jasmine.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2008-2014 Pivotal Labs +Copyright (c) 2008-2015 Pivotal Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the @@ -20,45 +20,62 @@ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -function getJasmineRequireObj() { +var getJasmineRequireObj = (function (jasmineGlobal) { + var jasmineRequire; + if (typeof module !== 'undefined' && module.exports) { - return exports; + jasmineGlobal = global; + jasmineRequire = exports; } else { - window.jasmineRequire = window.jasmineRequire || {}; - return window.jasmineRequire; + if (typeof window !== 'undefined' && typeof window.toString === 'function' && window.toString() === '[object GjsGlobal]') { + jasmineGlobal = window; + } + jasmineRequire = jasmineGlobal.jasmineRequire = jasmineGlobal.jasmineRequire || {}; } -} -getJasmineRequireObj().core = function(jRequire) { - var j$ = {}; - - jRequire.base(j$); - j$.util = jRequire.util(); - j$.Any = jRequire.Any(); - j$.CallTracker = jRequire.CallTracker(); - j$.MockDate = jRequire.MockDate(); - j$.Clock = jRequire.Clock(); - j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); - j$.Env = jRequire.Env(j$); - j$.ExceptionFormatter = jRequire.ExceptionFormatter(); - j$.Expectation = jRequire.Expectation(); - j$.buildExpectationResult = jRequire.buildExpectationResult(); - j$.JsApiReporter = jRequire.JsApiReporter(); - j$.matchersUtil = jRequire.matchersUtil(j$); - j$.ObjectContaining = jRequire.ObjectContaining(j$); - j$.pp = jRequire.pp(j$); - j$.QueueRunner = jRequire.QueueRunner(j$); - j$.ReportDispatcher = jRequire.ReportDispatcher(); - j$.Spec = jRequire.Spec(j$); - j$.SpyStrategy = jRequire.SpyStrategy(); - j$.Suite = jRequire.Suite(); - j$.Timer = jRequire.Timer(); - j$.version = jRequire.version(); - - j$.matchers = jRequire.requireMatchers(jRequire, j$); - - return j$; -}; + function getJasmineRequire() { + return jasmineRequire; + } + + getJasmineRequire().core = function(jRequire) { + var j$ = {}; + + jRequire.base(j$, jasmineGlobal); + j$.util = jRequire.util(); + j$.errors = jRequire.errors(); + j$.Any = jRequire.Any(j$); + j$.Anything = jRequire.Anything(j$); + j$.CallTracker = jRequire.CallTracker(); + j$.MockDate = jRequire.MockDate(); + j$.Clock = jRequire.Clock(); + j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); + j$.Env = jRequire.Env(j$); + j$.ExceptionFormatter = jRequire.ExceptionFormatter(); + j$.Expectation = jRequire.Expectation(); + j$.buildExpectationResult = jRequire.buildExpectationResult(); + j$.JsApiReporter = jRequire.JsApiReporter(); + j$.matchersUtil = jRequire.matchersUtil(j$); + j$.ObjectContaining = jRequire.ObjectContaining(j$); + j$.ArrayContaining = jRequire.ArrayContaining(j$); + j$.pp = jRequire.pp(j$); + j$.QueueRunner = jRequire.QueueRunner(j$); + j$.ReportDispatcher = jRequire.ReportDispatcher(); + j$.Spec = jRequire.Spec(j$); + j$.SpyRegistry = jRequire.SpyRegistry(j$); + j$.SpyStrategy = jRequire.SpyStrategy(); + j$.StringMatching = jRequire.StringMatching(j$); + j$.Suite = jRequire.Suite(j$); + j$.Timer = jRequire.Timer(); + j$.TreeProcessor = jRequire.TreeProcessor(); + j$.version = jRequire.version(); + + j$.matchers = jRequire.requireMatchers(jRequire, j$); + + return j$; + }; + + return getJasmineRequire; +})(this); getJasmineRequireObj().requireMatchers = function(jRequire, j$) { var availableMatchers = [ @@ -90,108 +107,128 @@ getJasmineRequireObj().requireMatchers = function(jRequire, j$) { return matchers; }; -getJasmineRequireObj().base = (function (jasmineGlobal) { - if (typeof module !== 'undefined' && module.exports) { - jasmineGlobal = global; - } +getJasmineRequireObj().base = function(j$, jasmineGlobal) { + j$.unimplementedMethod_ = function() { + throw new Error('unimplemented method'); + }; - return function(j$) { - j$.unimplementedMethod_ = function() { - throw new Error('unimplemented method'); - }; + j$.MAX_PRETTY_PRINT_DEPTH = 40; + j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 100; + j$.DEFAULT_TIMEOUT_INTERVAL = 5000; - j$.MAX_PRETTY_PRINT_DEPTH = 40; - j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 100; - j$.DEFAULT_TIMEOUT_INTERVAL = 5000; + j$.getGlobal = function() { + return jasmineGlobal; + }; - j$.getGlobal = function() { - return jasmineGlobal; - }; + j$.getEnv = function(options) { + var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); + //jasmine. singletons in here (setTimeout blah blah). + return env; + }; - j$.getEnv = function(options) { - var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); - //jasmine. singletons in here (setTimeout blah blah). - return env; - }; + j$.isArray_ = function(value) { + return j$.isA_('Array', value); + }; - j$.isArray_ = function(value) { - return j$.isA_('Array', value); - }; + j$.isString_ = function(value) { + return j$.isA_('String', value); + }; - j$.isString_ = function(value) { - return j$.isA_('String', value); - }; + j$.isNumber_ = function(value) { + return j$.isA_('Number', value); + }; - j$.isNumber_ = function(value) { - return j$.isA_('Number', value); - }; + j$.isA_ = function(typeName, value) { + return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; + }; - j$.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; - }; + j$.isDomNode = function(obj) { + return obj.nodeType > 0; + }; - j$.isDomNode = function(obj) { - return obj.nodeType > 0; - }; + j$.fnNameFor = function(func) { + return func.name || func.toString().match(/^\s*function\s*(\w*)\s*\(/)[1]; + }; - j$.any = function(clazz) { - return new j$.Any(clazz); - }; + j$.any = function(clazz) { + return new j$.Any(clazz); + }; - j$.objectContaining = function(sample) { - return new j$.ObjectContaining(sample); - }; + j$.anything = function() { + return new j$.Anything(); + }; - j$.createSpy = function(name, originalFn) { + j$.objectContaining = function(sample) { + return new j$.ObjectContaining(sample); + }; - var spyStrategy = new j$.SpyStrategy({ - name: name, - fn: originalFn, - getSpy: function() { return spy; } - }), - callTracker = new j$.CallTracker(), - spy = function() { - callTracker.track({ - object: this, - args: Array.prototype.slice.apply(arguments) - }); - return spyStrategy.exec.apply(this, arguments); + j$.stringMatching = function(expected) { + return new j$.StringMatching(expected); + }; + + j$.arrayContaining = function(sample) { + return new j$.ArrayContaining(sample); + }; + + j$.createSpy = function(name, originalFn) { + + var spyStrategy = new j$.SpyStrategy({ + name: name, + fn: originalFn, + getSpy: function() { return spy; } + }), + callTracker = new j$.CallTracker(), + spy = function() { + var callData = { + object: this, + args: Array.prototype.slice.apply(arguments) }; - for (var prop in originalFn) { - if (prop === 'and' || prop === 'calls') { - throw new Error('Jasmine spies would overwrite the \'and\' and \'calls\' properties on the object being spied upon'); - } + callTracker.track(callData); + var returnValue = spyStrategy.exec.apply(this, arguments); + callData.returnValue = returnValue; + + return returnValue; + }; - spy[prop] = originalFn[prop]; + for (var prop in originalFn) { + if (prop === 'and' || prop === 'calls') { + throw new Error('Jasmine spies would overwrite the \'and\' and \'calls\' properties on the object being spied upon'); } - spy.and = spyStrategy; - spy.calls = callTracker; + spy[prop] = originalFn[prop]; + } - return spy; - }; + spy.and = spyStrategy; + spy.calls = callTracker; - j$.isSpy = function(putativeSpy) { - if (!putativeSpy) { - return false; - } - return putativeSpy.and instanceof j$.SpyStrategy && - putativeSpy.calls instanceof j$.CallTracker; - }; + return spy; + }; - j$.createSpyObj = function(baseName, methodNames) { - if (!j$.isArray_(methodNames) || methodNames.length === 0) { - throw 'createSpyObj requires a non-empty array of method names to create spies for'; - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]); - } - return obj; - }; + j$.isSpy = function(putativeSpy) { + if (!putativeSpy) { + return false; + } + return putativeSpy.and instanceof j$.SpyStrategy && + putativeSpy.calls instanceof j$.CallTracker; }; -})(this); + + j$.createSpyObj = function(baseName, methodNames) { + if (j$.isArray_(baseName) && j$.util.isUndefined(methodNames)) { + methodNames = baseName; + baseName = 'unknown'; + } + + if (!j$.isArray_(methodNames) || methodNames.length === 0) { + throw 'createSpyObj requires a non-empty array of method names to create spies for'; + } + var obj = {}; + for (var i = 0; i < methodNames.length; i++) { + obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]); + } + return obj; + }; +}; getJasmineRequireObj().util = function() { @@ -228,13 +265,28 @@ getJasmineRequireObj().util = function() { util.arrayContains = function(array, search) { var i = array.length; while (i--) { - if (array[i] == search) { + if (array[i] === search) { return true; } } return false; }; + util.clone = function(obj) { + if (Object.prototype.toString.apply(obj) === '[object Array]') { + return obj.slice(); + } + + var cloned = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + cloned[prop] = obj[prop]; + } + } + + return cloned; + }; + return util; }; @@ -244,17 +296,17 @@ getJasmineRequireObj().Spec = function(j$) { this.resultCallback = attrs.resultCallback || function() {}; this.id = attrs.id; this.description = attrs.description || ''; - this.fn = attrs.fn; - this.beforeFns = attrs.beforeFns || function() { return []; }; - this.afterFns = attrs.afterFns || function() { return []; }; + this.queueableFn = attrs.queueableFn; + this.beforeAndAfterFns = attrs.beforeAndAfterFns || function() { return {befores: [], afters: []}; }; + this.userContext = attrs.userContext || function() { return {}; }; this.onStart = attrs.onStart || function() {}; - this.exceptionFormatter = attrs.exceptionFormatter || function() {}; this.getSpecName = attrs.getSpecName || function() { return ''; }; this.expectationResultFactory = attrs.expectationResultFactory || function() { }; this.queueRunnerFactory = attrs.queueRunnerFactory || function() {}; this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; - if (!this.fn) { + if (!this.queueableFn.fn) { this.pend(); } @@ -263,16 +315,21 @@ getJasmineRequireObj().Spec = function(j$) { description: this.description, fullName: this.getFullName(), failedExpectations: [], - passedExpectations: [] + passedExpectations: [], + pendingReason: '' }; } - Spec.prototype.addExpectationResult = function(passed, data) { + Spec.prototype.addExpectationResult = function(passed, data, isError) { var expectationResult = this.expectationResultFactory(data); if (passed) { this.result.passedExpectations.push(expectationResult); } else { this.result.failedExpectations.push(expectationResult); + + if (this.throwOnExpectationFailure && !isError) { + throw new j$.errors.ExpectationFailed(); + } } }; @@ -280,42 +337,28 @@ getJasmineRequireObj().Spec = function(j$) { return this.expectationFactory(actual, this); }; - Spec.prototype.execute = function(onComplete) { + Spec.prototype.execute = function(onComplete, enabled) { var self = this; this.onStart(this); - if (this.markedPending || this.disabled) { - complete(); + if (!this.isExecutable() || this.markedPending || enabled === false) { + complete(enabled); return; } - var allFns = this.beforeFns().concat(this.fn).concat(this.afterFns()); + var fns = this.beforeAndAfterFns(); + var allFns = fns.befores.concat(this.queueableFn).concat(fns.afters); this.queueRunnerFactory({ - fns: allFns, - onException: onException, + queueableFns: allFns, + onException: function() { self.onException.apply(self, arguments); }, onComplete: complete, - enforceTimeout: function() { return true; } + userContext: this.userContext() }); - function onException(e) { - if (Spec.isPendingSpecException(e)) { - self.pend(); - return; - } - - self.addExpectationResult(false, { - matcherName: '', - passed: false, - expected: '', - actual: '', - error: e - }); - } - - function complete() { - self.result.status = self.status(); + function complete(enabledAgain) { + self.result.status = self.status(enabledAgain); self.resultCallback(self.result); if (onComplete) { @@ -324,16 +367,43 @@ getJasmineRequireObj().Spec = function(j$) { } }; + Spec.prototype.onException = function onException(e) { + if (Spec.isPendingSpecException(e)) { + this.pend(extractCustomPendingMessage(e)); + return; + } + + if (e instanceof j$.errors.ExpectationFailed) { + return; + } + + this.addExpectationResult(false, { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: e + }, true); + }; + Spec.prototype.disable = function() { this.disabled = true; }; - Spec.prototype.pend = function() { + Spec.prototype.pend = function(message) { this.markedPending = true; + if (message) { + this.result.pendingReason = message; + } }; - Spec.prototype.status = function() { - if (this.disabled) { + Spec.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Spec.prototype.status = function(enabled) { + if (this.disabled || enabled === false) { return 'disabled'; } @@ -348,10 +418,22 @@ getJasmineRequireObj().Spec = function(j$) { } }; + Spec.prototype.isExecutable = function() { + return !this.disabled; + }; + Spec.prototype.getFullName = function() { return this.getSpecName(this); }; + var extractCustomPendingMessage = function(e) { + var fullMessage = e.toString(), + boilerplateStart = fullMessage.indexOf(Spec.pendingSpecExceptionMessage), + boilerplateEnd = boilerplateStart + Spec.pendingSpecExceptionMessage.length; + + return fullMessage.substr(boilerplateEnd); + }; + Spec.pendingSpecExceptionMessage = '=> marked Pending'; Spec.isPendingSpecException = function(e) { @@ -378,14 +460,23 @@ getJasmineRequireObj().Env = function(j$) { var realSetTimeout = j$.getGlobal().setTimeout; var realClearTimeout = j$.getGlobal().clearTimeout; - this.clock = new j$.Clock(global, new j$.DelayedFunctionScheduler(), new j$.MockDate(global)); + this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global)); var runnableLookupTable = {}; - - var spies = []; + var runnableResources = {}; var currentSpec = null; - var currentSuite = null; + var currentlyExecutingSuites = []; + var currentDeclarationSuite = null; + var throwOnExpectationFailure = false; + + var currentSuite = function() { + return currentlyExecutingSuites[currentlyExecutingSuites.length - 1]; + }; + + var currentRunnable = function() { + return currentSpec || currentSuite(); + }; var reporter = new j$.ReportDispatcher([ 'jasmineStarted', @@ -400,11 +491,21 @@ getJasmineRequireObj().Env = function(j$) { return true; }; - var equalityTesters = []; - - var customEqualityTesters = []; this.addCustomEqualityTester = function(tester) { - customEqualityTesters.push(tester); + if(!currentRunnable()) { + throw new Error('Custom Equalities must be added in a before function or a spec'); + } + runnableResources[currentRunnable().id].customEqualityTesters.push(tester); + }; + + this.addMatchers = function(matchersToAdd) { + if(!currentRunnable()) { + throw new Error('Matchers must be added in a before function or a spec'); + } + var customMatchers = runnableResources[currentRunnable().id].customMatchers; + for (var matcherName in matchersToAdd) { + customMatchers[matcherName] = matchersToAdd[matcherName]; + } }; j$.Expectation.addCoreMatchers(j$.matchers); @@ -422,7 +523,8 @@ getJasmineRequireObj().Env = function(j$) { var expectationFactory = function(actual, spec) { return j$.Expectation.Factory({ util: j$.matchersUtil, - customEqualityTesters: customEqualityTesters, + customEqualityTesters: runnableResources[spec.id].customEqualityTesters, + customMatchers: runnableResources[spec.id].customMatchers, actual: actual, addExpectationResult: addExpectationResult }); @@ -432,30 +534,38 @@ getJasmineRequireObj().Env = function(j$) { } }; - var specStarted = function(spec) { - currentSpec = spec; - reporter.specStarted(spec.result); + var defaultResourcesForRunnable = function(id, parentRunnableId) { + var resources = {spies: [], customEqualityTesters: [], customMatchers: {}}; + + if(runnableResources[parentRunnableId]){ + resources.customEqualityTesters = j$.util.clone(runnableResources[parentRunnableId].customEqualityTesters); + resources.customMatchers = j$.util.clone(runnableResources[parentRunnableId].customMatchers); + } + + runnableResources[id] = resources; }; - var beforeFns = function(suite) { - return function() { - var befores = []; - while(suite) { - befores = befores.concat(suite.beforeFns); - suite = suite.parentSuite; - } - return befores.reverse(); - }; + var clearResourcesForRunnable = function(id) { + spyRegistry.clearSpies(); + delete runnableResources[id]; }; - var afterFns = function(suite) { + var beforeAndAfterFns = function(suite) { return function() { - var afters = []; + var befores = [], + afters = []; + while(suite) { + befores = befores.concat(suite.beforeFns); afters = afters.concat(suite.afterFns); + suite = suite.parentSuite; } - return afters; + + return { + befores: befores.reverse(), + afters: afters + }; }; }; @@ -500,10 +610,19 @@ getJasmineRequireObj().Env = function(j$) { return j$.Spec.isPendingSpecException(e) || catchExceptions; }; + this.throwOnExpectationFailure = function(value) { + throwOnExpectationFailure = !!value; + }; + + this.throwingExpectationFailures = function() { + return throwOnExpectationFailure; + }; + var queueRunnerFactory = function(options) { options.catchException = catchException; options.clearStack = options.clearStack || clearStack; - options.timer = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}; + options.timeout = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}; + options.fail = self.fail; new j$.QueueRunner(options).execute(); }; @@ -512,66 +631,66 @@ getJasmineRequireObj().Env = function(j$) { env: this, id: getNextSuiteId(), description: 'Jasmine__TopLevel__Suite', - queueRunner: queueRunnerFactory, - resultCallback: function() {} // TODO - hook this up + queueRunner: queueRunnerFactory }); runnableLookupTable[topSuite.id] = topSuite; - currentSuite = topSuite; + defaultResourcesForRunnable(topSuite.id); + currentDeclarationSuite = topSuite; this.topSuite = function() { return topSuite; }; this.execute = function(runnablesToRun) { - runnablesToRun = runnablesToRun || [topSuite.id]; + if(!runnablesToRun) { + if (focusedRunnables.length) { + runnablesToRun = focusedRunnables; + } else { + runnablesToRun = [topSuite.id]; + } + } + var processor = new j$.TreeProcessor({ + tree: topSuite, + runnableIds: runnablesToRun, + queueRunnerFactory: queueRunnerFactory, + nodeStart: function(suite) { + currentlyExecutingSuites.push(suite); + defaultResourcesForRunnable(suite.id, suite.parentSuite.id); + reporter.suiteStarted(suite.result); + }, + nodeComplete: function(suite, result) { + if (!suite.disabled) { + clearResourcesForRunnable(suite.id); + } + currentlyExecutingSuites.pop(); + reporter.suiteDone(result); + } + }); - var allFns = []; - for(var i = 0; i < runnablesToRun.length; i++) { - var runnable = runnableLookupTable[runnablesToRun[i]]; - allFns.push((function(runnable) { return function(done) { runnable.execute(done); }; })(runnable)); + if(!processor.processTree().valid) { + throw new Error('Invalid order: would cause a beforeAll or afterAll to be run multiple times'); } reporter.jasmineStarted({ totalSpecsDefined: totalSpecsDefined }); - queueRunnerFactory({fns: allFns, onComplete: reporter.jasmineDone}); + processor.execute(reporter.jasmineDone); }; this.addReporter = function(reporterToAdd) { reporter.addReporter(reporterToAdd); }; - this.addMatchers = function(matchersToAdd) { - j$.Expectation.addMatchers(matchersToAdd); - }; - - this.spyOn = function(obj, methodName) { - if (j$.util.isUndefined(obj)) { - throw new Error('spyOn could not find an object to spy upon for ' + methodName + '()'); - } - - if (j$.util.isUndefined(obj[methodName])) { - throw new Error(methodName + '() method does not exist'); - } - - if (obj[methodName] && j$.isSpy(obj[methodName])) { - //TODO?: should this return the current spy? Downside: may cause user confusion about spy state - throw new Error(methodName + ' has already been spied upon'); + var spyRegistry = new j$.SpyRegistry({currentSpies: function() { + if(!currentRunnable()) { + throw new Error('Spies must be created in a before function or a spec'); } + return runnableResources[currentRunnable().id].spies; + }}); - var spy = j$.createSpy(methodName, obj[methodName]); - - spies.push({ - spy: spy, - baseObj: obj, - methodName: methodName, - originalValue: obj[methodName] - }); - - obj[methodName] = spy; - - return spy; + this.spyOn = function() { + return spyRegistry.spyOn.apply(spyRegistry, arguments); }; var suiteFactory = function(description) { @@ -579,12 +698,10 @@ getJasmineRequireObj().Env = function(j$) { env: self, id: getNextSuiteId(), description: description, - parentSuite: currentSuite, - queueRunner: queueRunnerFactory, - onStart: suiteStarted, - resultCallback: function(attrs) { - reporter.suiteDone(attrs); - } + parentSuite: currentDeclarationSuite, + expectationFactory: expectationFactory, + expectationResultFactory: expectationResultFactory, + throwOnExpectationFailure: throwOnExpectationFailure }); runnableLookupTable[suite.id] = suite; @@ -593,10 +710,33 @@ getJasmineRequireObj().Env = function(j$) { this.describe = function(description, specDefinitions) { var suite = suiteFactory(description); + addSpecsToSuite(suite, specDefinitions); + return suite; + }; + + this.xdescribe = function(description, specDefinitions) { + var suite = this.describe(description, specDefinitions); + suite.disable(); + return suite; + }; + + var focusedRunnables = []; + + this.fdescribe = function(description, specDefinitions) { + var suite = suiteFactory(description); + suite.isFocused = true; + + focusedRunnables.push(suite.id); + unfocusAncestor(); + addSpecsToSuite(suite, specDefinitions); + + return suite; + }; - var parentSuite = currentSuite; + function addSpecsToSuite(suite, specDefinitions) { + var parentSuite = currentDeclarationSuite; parentSuite.addChild(suite); - currentSuite = suite; + currentDeclarationSuite = suite; var declarationError = null; try { @@ -606,31 +746,43 @@ getJasmineRequireObj().Env = function(j$) { } if (declarationError) { - this.it('encountered a declaration exception', function() { + self.it('encountered a declaration exception', function() { throw declarationError; }); } - currentSuite = parentSuite; + currentDeclarationSuite = parentSuite; + } - return suite; - }; + function findFocusedAncestor(suite) { + while (suite) { + if (suite.isFocused) { + return suite.id; + } + suite = suite.parentSuite; + } - this.xdescribe = function(description, specDefinitions) { - var suite = this.describe(description, specDefinitions); - suite.disable(); - return suite; - }; + return null; + } - var specFactory = function(description, fn, suite) { - totalSpecsDefined++; + function unfocusAncestor() { + var focusedAncestor = findFocusedAncestor(currentDeclarationSuite); + if (focusedAncestor) { + for (var i = 0; i < focusedRunnables.length; i++) { + if (focusedRunnables[i] === focusedAncestor) { + focusedRunnables.splice(i, 1); + break; + } + } + } + } + var specFactory = function(description, fn, suite, timeout) { + totalSpecsDefined++; var spec = new j$.Spec({ id: getNextSpecId(), - beforeFns: beforeFns(suite), - afterFns: afterFns(suite), + beforeAndAfterFns: beforeAndAfterFns(suite), expectationFactory: expectationFactory, - exceptionFormatter: exceptionFormatter, resultCallback: specResultCallback, getSpecName: function(spec) { return getSpecName(spec, suite); @@ -639,7 +791,12 @@ getJasmineRequireObj().Env = function(j$) { description: description, expectationResultFactory: expectationResultFactory, queueRunnerFactory: queueRunnerFactory, - fn: fn + userContext: function() { return suite.clonedSharedUserContext(); }, + queueableFn: { + fn: fn, + timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } + }, + throwOnExpectationFailure: throwOnExpectationFailure }); runnableLookupTable[spec.id] = spec; @@ -650,57 +807,98 @@ getJasmineRequireObj().Env = function(j$) { return spec; - function removeAllSpies() { - for (var i = 0; i < spies.length; i++) { - var spyEntry = spies[i]; - spyEntry.baseObj[spyEntry.methodName] = spyEntry.originalValue; - } - spies = []; - } - function specResultCallback(result) { - removeAllSpies(); - j$.Expectation.resetMatchers(); - customEqualityTesters = []; + clearResourcesForRunnable(spec.id); currentSpec = null; reporter.specDone(result); } - }; - var suiteStarted = function(suite) { - reporter.suiteStarted(suite.result); + function specStarted(spec) { + currentSpec = spec; + defaultResourcesForRunnable(spec.id, suite.id); + reporter.specStarted(spec.result); + } }; - this.it = function(description, fn) { - var spec = specFactory(description, fn, currentSuite); - currentSuite.addChild(spec); + this.it = function(description, fn, timeout) { + var spec = specFactory(description, fn, currentDeclarationSuite, timeout); + currentDeclarationSuite.addChild(spec); return spec; }; - this.xit = function(description, fn) { - var spec = this.it(description, fn); + this.xit = function() { + var spec = this.it.apply(this, arguments); spec.pend(); return spec; }; + this.fit = function(){ + var spec = this.it.apply(this, arguments); + + focusedRunnables.push(spec.id); + unfocusAncestor(); + return spec; + }; + this.expect = function(actual) { - if (!currentSpec) { + if (!currentRunnable()) { throw new Error('\'expect\' was used when there was no current spec, this could be because an asynchronous test timed out'); } - return currentSpec.expect(actual); + return currentRunnable().expect(actual); }; - this.beforeEach = function(beforeEachFunction) { - currentSuite.beforeEach(beforeEachFunction); + this.beforeEach = function(beforeEachFunction, timeout) { + currentDeclarationSuite.beforeEach({ + fn: beforeEachFunction, + timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } + }); + }; + + this.beforeAll = function(beforeAllFunction, timeout) { + currentDeclarationSuite.beforeAll({ + fn: beforeAllFunction, + timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } + }); + }; + + this.afterEach = function(afterEachFunction, timeout) { + currentDeclarationSuite.afterEach({ + fn: afterEachFunction, + timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } + }); + }; + + this.afterAll = function(afterAllFunction, timeout) { + currentDeclarationSuite.afterAll({ + fn: afterAllFunction, + timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; } + }); }; - this.afterEach = function(afterEachFunction) { - currentSuite.afterEach(afterEachFunction); + this.pending = function(message) { + var fullMessage = j$.Spec.pendingSpecExceptionMessage; + if(message) { + fullMessage += message; + } + throw fullMessage; }; - this.pending = function() { - throw j$.Spec.pendingSpecExceptionMessage; + this.fail = function(error) { + var message = 'Failed'; + if (error) { + message += ': '; + message += error.message || error; + } + + currentRunnable().addExpectationResult(false, { + matcherName: '', + passed: false, + expected: '', + actual: '', + message: message, + error: error && error.message ? error : null + }); }; } @@ -739,26 +937,31 @@ getJasmineRequireObj().JsApiReporter = function() { return status; }; - var suites = {}; + var suites = [], + suites_hash = {}; this.suiteStarted = function(result) { - storeSuite(result); + suites_hash[result.id] = result; }; this.suiteDone = function(result) { storeSuite(result); }; + this.suiteResults = function(index, length) { + return suites.slice(index, index + length); + }; + function storeSuite(result) { - suites[result.id] = result; + suites.push(result); + suites_hash[result.id] = result; } this.suites = function() { - return suites; + return suites_hash; }; var specs = []; - this.specStarted = function(result) { }; this.specDone = function(result) { specs.push(result); @@ -781,59 +984,22 @@ getJasmineRequireObj().JsApiReporter = function() { return JsApiReporter; }; -getJasmineRequireObj().Any = function() { +getJasmineRequireObj().CallTracker = function() { - function Any(expectedObject) { - this.expectedObject = expectedObject; - } + function CallTracker() { + var calls = []; - Any.prototype.jasmineMatches = function(other) { - if (this.expectedObject == String) { - return typeof other == 'string' || other instanceof String; - } + this.track = function(context) { + calls.push(context); + }; - if (this.expectedObject == Number) { - return typeof other == 'number' || other instanceof Number; - } + this.any = function() { + return !!calls.length; + }; - if (this.expectedObject == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedObject == Object) { - return typeof other == 'object'; - } - - if (this.expectedObject == Boolean) { - return typeof other == 'boolean'; - } - - return other instanceof this.expectedObject; - }; - - Any.prototype.jasmineToString = function() { - return ''; - }; - - return Any; -}; - -getJasmineRequireObj().CallTracker = function() { - - function CallTracker() { - var calls = []; - - this.track = function(context) { - calls.push(context); - }; - - this.any = function() { - return !!calls.length; - }; - - this.count = function() { - return calls.length; - }; + this.count = function() { + return calls.length; + }; this.argsFor = function(index) { var call = calls[index]; @@ -870,7 +1036,7 @@ getJasmineRequireObj().CallTracker = function() { }; getJasmineRequireObj().Clock = function() { - function Clock(global, delayedFunctionScheduler, mockDate) { + function Clock(global, delayedFunctionSchedulerFactory, mockDate) { var self = this, realTimingFunctions = { setTimeout: global.setTimeout, @@ -885,19 +1051,24 @@ getJasmineRequireObj().Clock = function() { clearInterval: clearInterval }, installed = false, + delayedFunctionScheduler, timer; self.install = function() { + if(!originalTimingFunctionsIntact()) { + throw new Error('Jasmine Clock was unable to install over custom global timer functions. Is the clock already installed?'); + } replace(global, fakeTimingFunctions); timer = fakeTimingFunctions; + delayedFunctionScheduler = delayedFunctionSchedulerFactory(); installed = true; return self; }; self.uninstall = function() { - delayedFunctionScheduler.reset(); + delayedFunctionScheduler = null; mockDate.uninstall(); replace(global, realTimingFunctions); @@ -905,6 +1076,15 @@ getJasmineRequireObj().Clock = function() { installed = false; }; + self.withMock = function(closure) { + this.install(); + try { + closure(); + } finally { + this.uninstall(); + } + }; + self.mockDate = function(initialDate) { mockDate.install(initialDate); }; @@ -948,6 +1128,13 @@ getJasmineRequireObj().Clock = function() { return self; + function originalTimingFunctionsIntact() { + return global.setTimeout === realTimingFunctions.setTimeout && + global.clearTimeout === realTimingFunctions.clearTimeout && + global.setInterval === realTimingFunctions.setInterval && + global.clearInterval === realTimingFunctions.clearInterval; + } + function legacyIE() { //if these methods are polyfilled, apply will be present return !(realTimingFunctions.setTimeout || realTimingFunctions.setInterval).apply; @@ -1057,13 +1244,6 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() { } }; - self.reset = function() { - currentTime = 0; - scheduledLookup = []; - scheduledFunctions = {}; - delayedFnCount = 0; - }; - return self; function indexOfFirstToPass(array, testFn) { @@ -1099,6 +1279,12 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() { scheduledFn.runAtMillis + scheduledFn.millis); } + function forEachFunction(funcsToRun, callback) { + for (var i = 0; i < funcsToRun.length; ++i) { + callback(funcsToRun[i]); + } + } + function runScheduledFunctions(endTime) { if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { return; @@ -1110,14 +1296,15 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() { var funcsToRun = scheduledFunctions[currentTime]; delete scheduledFunctions[currentTime]; - for (var i = 0; i < funcsToRun.length; ++i) { - var funcToRun = funcsToRun[i]; - funcToRun.funcToCall.apply(null, funcToRun.params || []); - + forEachFunction(funcsToRun, function(funcToRun) { if (funcToRun.recurring) { reschedule(funcToRun); } - } + }); + + forEachFunction(funcsToRun, function(funcToRun) { + funcToRun.funcToCall.apply(null, funcToRun.params || []); + }); } while (scheduledLookup.length > 0 && // checking first if we're out of time prevents setTimeout(0) // scheduled in a funcToRun from forcing an extra iteration @@ -1161,8 +1348,6 @@ getJasmineRequireObj().ExceptionFormatter = function() { getJasmineRequireObj().Expectation = function() { - var matchers = {}; - function Expectation(options) { this.util = options.util || { buildFailureMessage: function() {} }; this.customEqualityTesters = options.customEqualityTesters || []; @@ -1170,8 +1355,9 @@ getJasmineRequireObj().Expectation = function() { this.addExpectationResult = options.addExpectationResult || function(){}; this.isNot = options.isNot; - for (var matcherName in matchers) { - this[matcherName] = matchers[matcherName]; + var customMatchers = options.customMatchers || {}; + for (var matcherName in customMatchers) { + this[matcherName] = Expectation.prototype.wrapCompare(matcherName, customMatchers[matcherName]); } } @@ -1238,19 +1424,6 @@ getJasmineRequireObj().Expectation = function() { } }; - Expectation.addMatchers = function(matchersToAdd) { - for (var name in matchersToAdd) { - var matcher = matchersToAdd[name]; - matchers[name] = Expectation.prototype.wrapCompare(name, matcher); - } - }; - - Expectation.resetMatchers = function() { - for (var name in matchers) { - delete matchers[name]; - } - }; - Expectation.Factory = function(options) { options = options || {}; @@ -1273,15 +1446,20 @@ getJasmineRequireObj().buildExpectationResult = function() { var messageFormatter = options.messageFormatter || function() {}, stackFormatter = options.stackFormatter || function() {}; - return { + var result = { matcherName: options.matcherName, - expected: options.expected, - actual: options.actual, message: message(), stack: stack(), passed: options.passed }; + if(!result.passed) { + result.expected = options.expected; + result.actual = options.actual; + } + + return result; + function message() { if (options.passed) { return 'Passed.'; @@ -1369,13 +1547,14 @@ getJasmineRequireObj().MockDate = function() { case 6: return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5]); - case 7: + default: return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], arguments[4], arguments[5], arguments[6]); } } function createDateProperties() { + FakeDate.prototype = GlobalDate.prototype; FakeDate.now = function() { if (GlobalDate.now) { @@ -1395,41 +1574,6 @@ getJasmineRequireObj().MockDate = function() { return MockDate; }; -getJasmineRequireObj().ObjectContaining = function(j$) { - - function ObjectContaining(sample) { - this.sample = sample; - } - - ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); } - - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var hasKey = function(obj, keyName) { - return obj !== null && !j$.util.isUndefined(obj[keyName]); - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push('expected has key \'' + property + '\', but missing from actual.'); - } - else if (!j$.matchersUtil.equals(other[property], this.sample[property])) { - mismatchValues.push('\'' + property + '\' was \'' + (other[property] ? j$.util.htmlEscape(other[property].toString()) : other[property]) + '\' in actual, but was \'' + (this.sample[property] ? j$.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + '\' in expected.'); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); - }; - - ObjectContaining.prototype.jasmineToString = function() { - return ''; - }; - - return ObjectContaining; -}; - getJasmineRequireObj().pp = function(j$) { function PrettyPrinter() { @@ -1525,17 +1669,36 @@ getJasmineRequireObj().pp = function(j$) { if(array.length > length){ this.append(', ...'); } + + var self = this; + var first = array.length === 0; + this.iterateObject(array, function(property, isGetter) { + if (property.match(/^\d+$/)) { + return; + } + + if (first) { + first = false; + } else { + self.append(', '); + } + + self.formatProperty(array, property, isGetter); + }); + this.append(' ]'); }; StringPrettyPrinter.prototype.emitObject = function(obj) { + var constructorName = obj.constructor ? j$.fnNameFor(obj.constructor) : 'null'; + this.append(constructorName); + if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { - this.append('Object'); return; } var self = this; - this.append('{ '); + this.append('({ '); var first = true; this.iterateObject(obj, function(property, isGetter) { @@ -1545,16 +1708,20 @@ getJasmineRequireObj().pp = function(j$) { self.append(', '); } - self.append(property); - self.append(': '); + self.formatProperty(obj, property, isGetter); + }); + + this.append(' })'); + }; + + StringPrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) { + this.append(property); + this.append(': '); if (isGetter) { - self.append(''); + this.append(''); } else { - self.format(obj[property]); + this.format(obj[property]); } - }); - - this.append(' }'); }; StringPrettyPrinter.prototype.append = function(value) { @@ -1581,31 +1748,33 @@ getJasmineRequireObj().QueueRunner = function(j$) { } function QueueRunner(attrs) { - this.fns = attrs.fns || []; + this.queueableFns = attrs.queueableFns || []; this.onComplete = attrs.onComplete || function() {}; this.clearStack = attrs.clearStack || function(fn) {fn();}; this.onException = attrs.onException || function() {}; this.catchException = attrs.catchException || function() { return true; }; - this.enforceTimeout = attrs.enforceTimeout || function() { return false; }; - this.userContext = {}; - this.timer = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout}; + this.userContext = attrs.userContext || {}; + this.timeout = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout}; + this.fail = attrs.fail || function() {}; } QueueRunner.prototype.execute = function() { - this.run(this.fns, 0); + this.run(this.queueableFns, 0); }; - QueueRunner.prototype.run = function(fns, recursiveIndex) { - var length = fns.length, - self = this, - iterativeIndex; + QueueRunner.prototype.run = function(queueableFns, recursiveIndex) { + var length = queueableFns.length, + self = this, + iterativeIndex; + for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) { - var fn = fns[iterativeIndex]; - if (fn.length > 0) { - return attemptAsync(fn); + var queueableFn = queueableFns[iterativeIndex]; + if (queueableFn.fn.length > 0) { + attemptAsync(queueableFn); + return; } else { - attemptSync(fn); + attemptSync(queueableFn); } } @@ -1615,41 +1784,51 @@ getJasmineRequireObj().QueueRunner = function(j$) { this.clearStack(this.onComplete); } - function attemptSync(fn) { + function attemptSync(queueableFn) { try { - fn.call(self.userContext); + queueableFn.fn.call(self.userContext); } catch (e) { - handleException(e); + handleException(e, queueableFn); } } - function attemptAsync(fn) { + function attemptAsync(queueableFn) { var clearTimeout = function () { - Function.prototype.apply.apply(self.timer.clearTimeout, [j$.getGlobal(), [timeoutId]]); + Function.prototype.apply.apply(self.timeout.clearTimeout, [j$.getGlobal(), [timeoutId]]); }, next = once(function () { clearTimeout(timeoutId); - self.run(fns, iterativeIndex + 1); + self.run(queueableFns, iterativeIndex + 1); }), timeoutId; - if (self.enforceTimeout()) { - timeoutId = Function.prototype.apply.apply(self.timer.setTimeout, [j$.getGlobal(), [function() { - self.onException(new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.')); + next.fail = function() { + self.fail.apply(null, arguments); + next(); + }; + + if (queueableFn.timeout) { + timeoutId = Function.prototype.apply.apply(self.timeout.setTimeout, [j$.getGlobal(), [function() { + var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.'); + onException(error, queueableFn); next(); - }, j$.DEFAULT_TIMEOUT_INTERVAL]]); + }, queueableFn.timeout()]]); } try { - fn.call(self.userContext, next); + queueableFn.fn.call(self.userContext, next); } catch (e) { - handleException(e); + handleException(e, queueableFn); next(); } } - function handleException(e) { + function onException(e, queueableFn) { self.onException(e); + } + + function handleException(e, queueableFn) { + onException(e, queueableFn); if (!self.catchException(e)) { //TODO: set a var when we catch an exception and //use a finally block to close the loop in a nice way.. @@ -1697,174 +1876,670 @@ getJasmineRequireObj().ReportDispatcher = function() { }; -getJasmineRequireObj().SpyStrategy = function() { +getJasmineRequireObj().SpyRegistry = function(j$) { + + function SpyRegistry(options) { + options = options || {}; + var currentSpies = options.currentSpies || function() { return []; }; + + this.spyOn = function(obj, methodName) { + if (j$.util.isUndefined(obj)) { + throw new Error('spyOn could not find an object to spy upon for ' + methodName + '()'); + } + + if (j$.util.isUndefined(methodName)) { + throw new Error('No method name supplied'); + } + + if (j$.util.isUndefined(obj[methodName])) { + throw new Error(methodName + '() method does not exist'); + } + + if (obj[methodName] && j$.isSpy(obj[methodName])) { + //TODO?: should this return the current spy? Downside: may cause user confusion about spy state + throw new Error(methodName + ' has already been spied upon'); + } + + var spy = j$.createSpy(methodName, obj[methodName]); + + currentSpies().push({ + spy: spy, + baseObj: obj, + methodName: methodName, + originalValue: obj[methodName] + }); + + obj[methodName] = spy; + + return spy; + }; + + this.clearSpies = function() { + var spies = currentSpies(); + for (var i = 0; i < spies.length; i++) { + var spyEntry = spies[i]; + spyEntry.baseObj[spyEntry.methodName] = spyEntry.originalValue; + } + }; + } + + return SpyRegistry; +}; + +getJasmineRequireObj().SpyStrategy = function() { + + function SpyStrategy(options) { + options = options || {}; + + var identity = options.name || 'unknown', + originalFn = options.fn || function() {}, + getSpy = options.getSpy || function() {}, + plan = function() {}; + + this.identity = function() { + return identity; + }; + + this.exec = function() { + return plan.apply(this, arguments); + }; + + this.callThrough = function() { + plan = originalFn; + return getSpy(); + }; + + this.returnValue = function(value) { + plan = function() { + return value; + }; + return getSpy(); + }; + + this.returnValues = function() { + var values = Array.prototype.slice.call(arguments); + plan = function () { + return values.shift(); + }; + return getSpy(); + }; + + this.throwError = function(something) { + var error = (something instanceof Error) ? something : new Error(something); + plan = function() { + throw error; + }; + return getSpy(); + }; + + this.callFake = function(fn) { + plan = fn; + return getSpy(); + }; + + this.stub = function(fn) { + plan = function() {}; + return getSpy(); + }; + } + + return SpyStrategy; +}; + +getJasmineRequireObj().Suite = function(j$) { + function Suite(attrs) { + this.env = attrs.env; + this.id = attrs.id; + this.parentSuite = attrs.parentSuite; + this.description = attrs.description; + this.expectationFactory = attrs.expectationFactory; + this.expectationResultFactory = attrs.expectationResultFactory; + this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure; + + this.beforeFns = []; + this.afterFns = []; + this.beforeAllFns = []; + this.afterAllFns = []; + this.disabled = false; + + this.children = []; + + this.result = { + id: this.id, + description: this.description, + fullName: this.getFullName(), + failedExpectations: [] + }; + } + + Suite.prototype.expect = function(actual) { + return this.expectationFactory(actual, this); + }; + + Suite.prototype.getFullName = function() { + var fullName = this.description; + for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { + if (parentSuite.parentSuite) { + fullName = parentSuite.description + ' ' + fullName; + } + } + return fullName; + }; + + Suite.prototype.disable = function() { + this.disabled = true; + }; + + Suite.prototype.beforeEach = function(fn) { + this.beforeFns.unshift(fn); + }; + + Suite.prototype.beforeAll = function(fn) { + this.beforeAllFns.push(fn); + }; + + Suite.prototype.afterEach = function(fn) { + this.afterFns.unshift(fn); + }; + + Suite.prototype.afterAll = function(fn) { + this.afterAllFns.push(fn); + }; + + Suite.prototype.addChild = function(child) { + this.children.push(child); + }; + + Suite.prototype.status = function() { + if (this.disabled) { + return 'disabled'; + } + + if (this.result.failedExpectations.length > 0) { + return 'failed'; + } else { + return 'finished'; + } + }; + + Suite.prototype.isExecutable = function() { + return !this.disabled; + }; + + Suite.prototype.canBeReentered = function() { + return this.beforeAllFns.length === 0 && this.afterAllFns.length === 0; + }; + + Suite.prototype.getResult = function() { + this.result.status = this.status(); + return this.result; + }; + + Suite.prototype.sharedUserContext = function() { + if (!this.sharedContext) { + this.sharedContext = this.parentSuite ? clone(this.parentSuite.sharedUserContext()) : {}; + } + + return this.sharedContext; + }; + + Suite.prototype.clonedSharedUserContext = function() { + return clone(this.sharedUserContext()); + }; + + Suite.prototype.onException = function() { + if (arguments[0] instanceof j$.errors.ExpectationFailed) { + return; + } + + if(isAfterAll(this.children)) { + var data = { + matcherName: '', + passed: false, + expected: '', + actual: '', + error: arguments[0] + }; + this.result.failedExpectations.push(this.expectationResultFactory(data)); + } else { + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + child.onException.apply(child, arguments); + } + } + }; + + Suite.prototype.addExpectationResult = function () { + if(isAfterAll(this.children) && isFailure(arguments)){ + var data = arguments[1]; + this.result.failedExpectations.push(this.expectationResultFactory(data)); + if(this.throwOnExpectationFailure) { + throw new j$.errors.ExpectationFailed(); + } + } else { + for (var i = 0; i < this.children.length; i++) { + var child = this.children[i]; + try { + child.addExpectationResult.apply(child, arguments); + } catch(e) { + // keep going + } + } + } + }; + + function isAfterAll(children) { + return children && children[0].result.status; + } + + function isFailure(args) { + return !args[0]; + } + + function clone(obj) { + var clonedObj = {}; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + clonedObj[prop] = obj[prop]; + } + } + + return clonedObj; + } + + return Suite; +}; + +if (typeof window == void 0 && typeof exports == 'object') { + exports.Suite = jasmineRequire.Suite; +} + +getJasmineRequireObj().Timer = function() { + var defaultNow = (function(Date) { + return function() { return new Date().getTime(); }; + })(Date); + + function Timer(options) { + options = options || {}; + + var now = options.now || defaultNow, + startTime; + + this.start = function() { + startTime = now(); + }; + + this.elapsed = function() { + return now() - startTime; + }; + } + + return Timer; +}; + +getJasmineRequireObj().TreeProcessor = function() { + function TreeProcessor(attrs) { + var tree = attrs.tree, + runnableIds = attrs.runnableIds, + queueRunnerFactory = attrs.queueRunnerFactory, + nodeStart = attrs.nodeStart || function() {}, + nodeComplete = attrs.nodeComplete || function() {}, + stats = { valid: true }, + processed = false, + defaultMin = Infinity, + defaultMax = 1 - Infinity; + + this.processTree = function() { + processNode(tree, false); + processed = true; + return stats; + }; + + this.execute = function(done) { + if (!processed) { + this.processTree(); + } + + if (!stats.valid) { + throw 'invalid order'; + } + + var childFns = wrapChildren(tree, 0); + + queueRunnerFactory({ + queueableFns: childFns, + userContext: tree.sharedUserContext(), + onException: function() { + tree.onException.apply(tree, arguments); + }, + onComplete: done + }); + }; + + function runnableIndex(id) { + for (var i = 0; i < runnableIds.length; i++) { + if (runnableIds[i] === id) { + return i; + } + } + } + + function processNode(node, parentEnabled) { + var executableIndex = runnableIndex(node.id); + + if (executableIndex !== undefined) { + parentEnabled = true; + } + + parentEnabled = parentEnabled && node.isExecutable(); + + if (!node.children) { + stats[node.id] = { + executable: parentEnabled && node.isExecutable(), + segments: [{ + index: 0, + owner: node, + nodes: [node], + min: startingMin(executableIndex), + max: startingMax(executableIndex) + }] + }; + } else { + var hasExecutableChild = false; + + for (var i = 0; i < node.children.length; i++) { + var child = node.children[i]; + + processNode(child, parentEnabled); + + if (!stats.valid) { + return; + } + + var childStats = stats[child.id]; + + hasExecutableChild = hasExecutableChild || childStats.executable; + } + + stats[node.id] = { + executable: hasExecutableChild + }; + + segmentChildren(node, stats[node.id], executableIndex); + + if (!node.canBeReentered() && stats[node.id].segments.length > 1) { + stats = { valid: false }; + } + } + } + + function startingMin(executableIndex) { + return executableIndex === undefined ? defaultMin : executableIndex; + } + + function startingMax(executableIndex) { + return executableIndex === undefined ? defaultMax : executableIndex; + } + + function segmentChildren(node, nodeStats, executableIndex) { + var currentSegment = { index: 0, owner: node, nodes: [], min: startingMin(executableIndex), max: startingMax(executableIndex) }, + result = [currentSegment], + lastMax = defaultMax, + orderedChildSegments = orderChildSegments(node.children); + + function isSegmentBoundary(minIndex) { + return lastMax !== defaultMax && minIndex !== defaultMin && lastMax < minIndex - 1; + } + + for (var i = 0; i < orderedChildSegments.length; i++) { + var childSegment = orderedChildSegments[i], + maxIndex = childSegment.max, + minIndex = childSegment.min; + + if (isSegmentBoundary(minIndex)) { + currentSegment = {index: result.length, owner: node, nodes: [], min: defaultMin, max: defaultMax}; + result.push(currentSegment); + } + + currentSegment.nodes.push(childSegment); + currentSegment.min = Math.min(currentSegment.min, minIndex); + currentSegment.max = Math.max(currentSegment.max, maxIndex); + lastMax = maxIndex; + } + + nodeStats.segments = result; + } + + function orderChildSegments(children) { + var specifiedOrder = [], + unspecifiedOrder = []; + + for (var i = 0; i < children.length; i++) { + var child = children[i], + segments = stats[child.id].segments; + + for (var j = 0; j < segments.length; j++) { + var seg = segments[j]; + + if (seg.min === defaultMin) { + unspecifiedOrder.push(seg); + } else { + specifiedOrder.push(seg); + } + } + } + + specifiedOrder.sort(function(a, b) { + return a.min - b.min; + }); + + return specifiedOrder.concat(unspecifiedOrder); + } + + function executeNode(node, segmentNumber) { + if (node.children) { + return { + fn: function(done) { + nodeStart(node); + + queueRunnerFactory({ + onComplete: function() { + nodeComplete(node, node.getResult()); + done(); + }, + queueableFns: wrapChildren(node, segmentNumber), + userContext: node.sharedUserContext(), + onException: function() { + node.onException.apply(node, arguments); + } + }); + } + }; + } else { + return { + fn: function(done) { node.execute(done, stats[node.id].executable); } + }; + } + } + + function wrapChildren(node, segmentNumber) { + var result = [], + segmentChildren = stats[node.id].segments[segmentNumber].nodes; + + for (var i = 0; i < segmentChildren.length; i++) { + result.push(executeNode(segmentChildren[i].owner, segmentChildren[i].index)); + } + + if (!stats[node.id].executable) { + return result; + } + + return node.beforeAllFns.concat(result).concat(node.afterAllFns); + } + } + + return TreeProcessor; +}; + +getJasmineRequireObj().Any = function(j$) { + + function Any(expectedObject) { + this.expectedObject = expectedObject; + } + + Any.prototype.asymmetricMatch = function(other) { + if (this.expectedObject == String) { + return typeof other == 'string' || other instanceof String; + } + + if (this.expectedObject == Number) { + return typeof other == 'number' || other instanceof Number; + } + + if (this.expectedObject == Function) { + return typeof other == 'function' || other instanceof Function; + } - function SpyStrategy(options) { - options = options || {}; + if (this.expectedObject == Object) { + return typeof other == 'object'; + } - var identity = options.name || 'unknown', - originalFn = options.fn || function() {}, - getSpy = options.getSpy || function() {}, - plan = function() {}; + if (this.expectedObject == Boolean) { + return typeof other == 'boolean'; + } - this.identity = function() { - return identity; - }; + return other instanceof this.expectedObject; + }; - this.exec = function() { - return plan.apply(this, arguments); - }; + Any.prototype.jasmineToString = function() { + return ''; + }; - this.callThrough = function() { - plan = originalFn; - return getSpy(); - }; + return Any; +}; - this.returnValue = function(value) { - plan = function() { - return value; - }; - return getSpy(); - }; +getJasmineRequireObj().Anything = function(j$) { - this.throwError = function(something) { - var error = (something instanceof Error) ? something : new Error(something); - plan = function() { - throw error; - }; - return getSpy(); - }; + function Anything() {} - this.callFake = function(fn) { - plan = fn; - return getSpy(); - }; + Anything.prototype.asymmetricMatch = function(other) { + return !j$.util.isUndefined(other) && other !== null; + }; - this.stub = function(fn) { - plan = function() {}; - return getSpy(); - }; - } + Anything.prototype.jasmineToString = function() { + return ''; + }; - return SpyStrategy; + return Anything; }; -getJasmineRequireObj().Suite = function() { - function Suite(attrs) { - this.env = attrs.env; - this.id = attrs.id; - this.parentSuite = attrs.parentSuite; - this.description = attrs.description; - this.onStart = attrs.onStart || function() {}; - this.resultCallback = attrs.resultCallback || function() {}; - this.clearStack = attrs.clearStack || function(fn) {fn();}; - - this.beforeFns = []; - this.afterFns = []; - this.queueRunner = attrs.queueRunner || function() {}; - this.disabled = false; - - this.children = []; - - this.result = { - id: this.id, - status: this.disabled ? 'disabled' : '', - description: this.description, - fullName: this.getFullName() - }; +getJasmineRequireObj().ArrayContaining = function(j$) { + function ArrayContaining(sample) { + this.sample = sample; } - Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - if (parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; + ArrayContaining.prototype.asymmetricMatch = function(other) { + var className = Object.prototype.toString.call(this.sample); + if (className !== '[object Array]') { throw new Error('You must provide an array to arrayContaining, not \'' + this.sample + '\'.'); } + + for (var i = 0; i < this.sample.length; i++) { + var item = this.sample[i]; + if (!j$.matchersUtil.contains(other, item)) { + return false; } } - return fullName; - }; - Suite.prototype.disable = function() { - this.disabled = true; - this.result.status = 'disabled'; + return true; }; - Suite.prototype.beforeEach = function(fn) { - this.beforeFns.unshift(fn); + ArrayContaining.prototype.jasmineToString = function () { + return ''; }; - Suite.prototype.afterEach = function(fn) { - this.afterFns.unshift(fn); - }; + return ArrayContaining; +}; - Suite.prototype.addChild = function(child) { - this.children.push(child); - }; +getJasmineRequireObj().ObjectContaining = function(j$) { - Suite.prototype.execute = function(onComplete) { - var self = this; + function ObjectContaining(sample) { + this.sample = sample; + } - this.onStart(this); + function getPrototype(obj) { + if (Object.getPrototypeOf) { + return Object.getPrototypeOf(obj); + } - if (this.disabled) { - complete(); - return; + if (obj.constructor.prototype == obj) { + return null; } - var allFns = []; + return obj.constructor.prototype; + } - for (var i = 0; i < this.children.length; i++) { - allFns.push(wrapChildAsAsync(this.children[i])); + function hasProperty(obj, property) { + if (!obj) { + return false; } - this.queueRunner({ - fns: allFns, - onComplete: complete - }); + if (Object.prototype.hasOwnProperty.call(obj, property)) { + return true; + } - function complete() { - self.resultCallback(self.result); + return hasProperty(getPrototype(obj), property); + } - if (onComplete) { - onComplete(); + ObjectContaining.prototype.asymmetricMatch = function(other) { + if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); } + + for (var property in this.sample) { + if (!hasProperty(other, property) || + !j$.matchersUtil.equals(this.sample[property], other[property])) { + return false; } } - function wrapChildAsAsync(child) { - return function(done) { child.execute(done); }; - } + return true; }; - return Suite; -}; + ObjectContaining.prototype.jasmineToString = function() { + return ''; + }; -if (typeof window == void 0 && typeof exports == 'object') { - exports.Suite = jasmineRequire.Suite; -} + return ObjectContaining; +}; -getJasmineRequireObj().Timer = function() { - var defaultNow = (function(Date) { - return function() { return new Date().getTime(); }; - })(Date); +getJasmineRequireObj().StringMatching = function(j$) { - function Timer(options) { - options = options || {}; + function StringMatching(expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error('Expected is not a String or a RegExp'); + } - var now = options.now || defaultNow, - startTime; + this.regexp = new RegExp(expected); + } - this.start = function() { - startTime = now(); - }; + StringMatching.prototype.asymmetricMatch = function(other) { + return this.regexp.test(other); + }; - this.elapsed = function() { - return now() - startTime; - }; - } + StringMatching.prototype.jasmineToString = function() { + return ''; + }; - return Timer; + return StringMatching; }; +getJasmineRequireObj().errors = function() { + function ExpectationFailed() {} + + ExpectationFailed.prototype = new Error(); + ExpectationFailed.prototype.constructor = ExpectationFailed; + + return { + ExpectationFailed: ExpectationFailed + }; +}; getJasmineRequireObj().matchersUtil = function(j$) { // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter? @@ -1878,7 +2553,9 @@ getJasmineRequireObj().matchersUtil = function(j$) { contains: function(haystack, needle, customTesters) { customTesters = customTesters || []; - if (Object.prototype.toString.apply(haystack) === '[object Array]') { + if ((Object.prototype.toString.apply(haystack) === '[object Array]') || + (!!haystack && !haystack.indexOf)) + { for (var i = 0; i < haystack.length; i++) { if (eq(haystack[i], needle, [], [], customTesters)) { return true; @@ -1886,6 +2563,7 @@ getJasmineRequireObj().matchersUtil = function(j$) { } return false; } + return !!haystack && haystack.indexOf(needle) >= 0; }, @@ -1915,11 +2593,37 @@ getJasmineRequireObj().matchersUtil = function(j$) { } }; + function isAsymmetric(obj) { + return obj && j$.isA_('Function', obj.asymmetricMatch); + } + + function asymmetricMatch(a, b) { + var asymmetricA = isAsymmetric(a), + asymmetricB = isAsymmetric(b); + + if (asymmetricA && asymmetricB) { + return undefined; + } + + if (asymmetricA) { + return a.asymmetricMatch(b); + } + + if (asymmetricB) { + return b.asymmetricMatch(a); + } + } + // Equality function lovingly adapted from isEqual in // [Underscore](http://underscorejs.org) function eq(a, b, aStack, bStack, customTesters) { var result = true; + var asymmetricResult = asymmetricMatch(a, b); + if (!j$.util.isUndefined(asymmetricResult)) { + return asymmetricResult; + } + for (var i = 0; i < customTesters.length; i++) { var customTesterResult = customTesters[i](a, b); if (!j$.util.isUndefined(customTesterResult)) { @@ -1927,27 +2631,6 @@ getJasmineRequireObj().matchersUtil = function(j$) { } } - if (a instanceof j$.Any) { - result = a.jasmineMatches(b); - if (result) { - return true; - } - } - - if (b instanceof j$.Any) { - result = b.jasmineMatches(a); - if (result) { - return true; - } - } - - if (b instanceof j$.ObjectContaining) { - result = b.jasmineMatches(a); - if (result) { - return true; - } - } - if (a instanceof Error && b instanceof Error) { return a.message == b.message; } @@ -1983,6 +2666,29 @@ getJasmineRequireObj().matchersUtil = function(j$) { a.ignoreCase == b.ignoreCase; } if (typeof a != 'object' || typeof b != 'object') { return false; } + + var aIsDomNode = j$.isDomNode(a); + var bIsDomNode = j$.isDomNode(b); + if (aIsDomNode && bIsDomNode) { + // At first try to use DOM3 method isEqualNode + if (a.isEqualNode) { + return a.isEqualNode(b); + } + // IE8 doesn't support isEqualNode, try to use outerHTML && innerText + var aIsElement = a instanceof Element; + var bIsElement = b instanceof Element; + if (aIsElement && bIsElement) { + return a.outerHTML == b.outerHTML; + } + if (aIsElement || bIsElement) { + return false; + } + return a.innerText == b.innerText && a.textContent == b.textContent; + } + if (aIsDomNode || bIsDomNode) { + return false; + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. var length = aStack.length; @@ -1996,23 +2702,20 @@ getJasmineRequireObj().matchersUtil = function(j$) { bStack.push(b); var size = 0; // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - if (!(result = eq(a[size], b[size], aStack, bStack, customTesters))) { break; } - } - } - } else { + // Compare array lengths to determine if a deep comparison is necessary. + if (className == '[object Array]' && a.length !== b.length) { + result = false; + } + + if (result) { // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(isFunction(aCtor) && (aCtor instanceof aCtor) && - isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; + // or `Array`s from different frames are. + if (className !== '[object Array]') { + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor && + isFunction(bCtor) && bCtor instanceof bCtor)) { + return false; + } } // Deep compare objects. for (var key in a) { @@ -2038,7 +2741,7 @@ getJasmineRequireObj().matchersUtil = function(j$) { return result; function has(obj, key) { - return obj.hasOwnProperty(key); + return Object.prototype.hasOwnProperty.call(obj, key); } function isFunction(obj) { @@ -2307,11 +3010,15 @@ getJasmineRequireObj().toHaveBeenCalledWith = function(j$) { return toHaveBeenCalledWith; }; -getJasmineRequireObj().toMatch = function() { +getJasmineRequireObj().toMatch = function(j$) { function toMatch() { return { compare: function(actual, expected) { + if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) { + throw new Error('Expected is not a String or a RegExp'); + } + var regexp = new RegExp(expected); return { @@ -2378,18 +3085,13 @@ getJasmineRequireObj().toThrowError = function(j$) { var threw = false, pass = {pass: true}, fail = {pass: false}, - thrown, - errorType, - message, - regexp, - name, - constructorName; + thrown; if (typeof actual != 'function') { throw new Error('Actual is not a Function'); } - extractExpectedParams.apply(null, arguments); + var errorMatcher = getMatcher.apply(null, arguments); try { actual(); @@ -2408,121 +3110,104 @@ getJasmineRequireObj().toThrowError = function(j$) { return fail; } - if (arguments.length == 1) { - pass.message = 'Expected function not to throw an Error, but it threw ' + fnNameFor(thrown) + '.'; + if (errorMatcher.hasNoSpecifics()) { + pass.message = 'Expected function not to throw an Error, but it threw ' + j$.fnNameFor(thrown) + '.'; return pass; } - if (errorType) { - name = fnNameFor(errorType); - constructorName = fnNameFor(thrown.constructor); + if (errorMatcher.matches(thrown)) { + pass.message = function() { + return 'Expected function not to throw ' + errorMatcher.errorTypeDescription + errorMatcher.messageDescription() + '.'; + }; + return pass; + } else { + fail.message = function() { + return 'Expected function to throw ' + errorMatcher.errorTypeDescription + errorMatcher.messageDescription() + + ', but it threw ' + errorMatcher.thrownDescription(thrown) + '.'; + }; + return fail; } + } + }; - if (errorType && message) { - if (thrown.constructor == errorType && util.equals(thrown.message, message)) { - pass.message = function() { return 'Expected function not to throw ' + name + ' with message ' + j$.pp(message) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw ' + name + ' with message ' + j$.pp(message) + - ', but it threw ' + constructorName + ' with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } - } + function getMatcher() { + var expected = null, + errorType = null; - if (errorType && regexp) { - if (thrown.constructor == errorType && regexp.test(thrown.message)) { - pass.message = function() { return 'Expected function not to throw ' + name + ' with message matching ' + j$.pp(regexp) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw ' + name + ' with message matching ' + j$.pp(regexp) + - ', but it threw ' + constructorName + ' with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } + if (arguments.length == 2) { + expected = arguments[1]; + if (isAnErrorType(expected)) { + errorType = expected; + expected = null; } - - if (errorType) { - if (thrown.constructor == errorType) { - pass.message = 'Expected function not to throw ' + name + '.'; - return pass; - } else { - fail.message = 'Expected function to throw ' + name + ', but it threw ' + constructorName + '.'; - return fail; - } + } else if (arguments.length > 2) { + errorType = arguments[1]; + expected = arguments[2]; + if (!isAnErrorType(errorType)) { + throw new Error('Expected error type is not an Error.'); } + } - if (message) { - if (thrown.message == message) { - pass.message = function() { return 'Expected function not to throw an exception with message ' + j$.pp(message) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw an exception with message ' + j$.pp(message) + - ', but it threw an exception with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } + if (expected && !isStringOrRegExp(expected)) { + if (errorType) { + throw new Error('Expected error message is not a string or RegExp.'); + } else { + throw new Error('Expected is not an Error, string, or RegExp.'); } + } - if (regexp) { - if (regexp.test(thrown.message)) { - pass.message = function() { return 'Expected function not to throw an exception with a message matching ' + j$.pp(regexp) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw an exception with a message matching ' + j$.pp(regexp) + - ', but it threw an exception with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } + function messageMatch(message) { + if (typeof expected == 'string') { + return expected == message; + } else { + return expected.test(message); } + } - function fnNameFor(func) { - return func.name || func.toString().match(/^\s*function\s*(\w*)\s*\(/)[1]; - } + return { + errorTypeDescription: errorType ? j$.fnNameFor(errorType) : 'an exception', + thrownDescription: function(thrown) { + var thrownName = errorType ? j$.fnNameFor(thrown.constructor) : 'an exception', + thrownMessage = ''; - function extractExpectedParams() { - if (arguments.length == 1) { - return; + if (expected) { + thrownMessage = ' with message ' + j$.pp(thrown.message); } - if (arguments.length == 2) { - var expected = arguments[1]; - - if (expected instanceof RegExp) { - regexp = expected; - } else if (typeof expected == 'string') { - message = expected; - } else if (checkForAnErrorType(expected)) { - errorType = expected; - } - - if (!(errorType || message || regexp)) { - throw new Error('Expected is not an Error, string, or RegExp.'); - } + return thrownName + thrownMessage; + }, + messageDescription: function() { + if (expected === null) { + return ''; + } else if (expected instanceof RegExp) { + return ' with a message matching ' + j$.pp(expected); } else { - if (checkForAnErrorType(arguments[1])) { - errorType = arguments[1]; - } else { - throw new Error('Expected error type is not an Error.'); - } - - if (arguments[2] instanceof RegExp) { - regexp = arguments[2]; - } else if (typeof arguments[2] == 'string') { - message = arguments[2]; - } else { - throw new Error('Expected error message is not a string or RegExp.'); - } + return ' with message ' + j$.pp(expected); } + }, + hasNoSpecifics: function() { + return expected === null && errorType === null; + }, + matches: function(error) { + return (errorType === null || error instanceof errorType) && + (expected === null || messageMatch(error.message)); } + }; + } - function checkForAnErrorType(type) { - if (typeof type !== 'function') { - return false; - } + function isStringOrRegExp(potential) { + return potential instanceof RegExp || (typeof potential == 'string'); + } - var Surrogate = function() {}; - Surrogate.prototype = type.prototype; - return (new Surrogate()) instanceof Error; - } + function isAnErrorType(type) { + if (typeof type !== 'function') { + return false; } - }; + + var Surrogate = function() {}; + Surrogate.prototype = type.prototype; + return (new Surrogate()) instanceof Error; + } } return toThrowError; @@ -2538,20 +3223,36 @@ getJasmineRequireObj().interface = function(jasmine, env) { return env.xdescribe(description, specDefinitions); }, - it: function(desc, func) { - return env.it(desc, func); + fdescribe: function(description, specDefinitions) { + return env.fdescribe(description, specDefinitions); + }, + + it: function() { + return env.it.apply(env, arguments); }, - xit: function(desc, func) { - return env.xit(desc, func); + xit: function() { + return env.xit.apply(env, arguments); }, - beforeEach: function(beforeEachFunction) { - return env.beforeEach(beforeEachFunction); + fit: function() { + return env.fit.apply(env, arguments); }, - afterEach: function(afterEachFunction) { - return env.afterEach(afterEachFunction); + beforeEach: function() { + return env.beforeEach.apply(env, arguments); + }, + + afterEach: function() { + return env.afterEach.apply(env, arguments); + }, + + beforeAll: function() { + return env.beforeAll.apply(env, arguments); + }, + + afterAll: function() { + return env.afterAll.apply(env, arguments); }, expect: function(actual) { @@ -2559,7 +3260,11 @@ getJasmineRequireObj().interface = function(jasmine, env) { }, pending: function() { - return env.pending(); + return env.pending.apply(env, arguments); + }, + + fail: function() { + return env.fail.apply(env, arguments); }, spyOn: function(obj, methodName) { @@ -2589,5 +3294,5 @@ getJasmineRequireObj().interface = function(jasmine, env) { }; getJasmineRequireObj().version = function() { - return '2.0.2'; + return '2.3.4'; }; diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/json2.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/json2.js index ac58079..deb88ec 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/json2.js +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core/json2.js @@ -1,6 +1,6 @@ /* - http://www.JSON.org/json2.js - 2009-08-17 + json2.js + 2014-02-04 Public Domain. @@ -8,6 +8,14 @@ See http://www.JSON.org/js.html + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + This file creates a global JSON object containing two methods: stringify and parse. @@ -136,15 +144,9 @@ This is a reference implementation. You are free to copy, modify, or redistribute. - - This code should be minified before deployment. - See http://javascript.crockford.com/jsmin.html - - USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO - NOT CONTROL. */ -/*jslint evil: true */ +/*jslint evil: true, regexp: true */ /*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, @@ -153,16 +155,16 @@ test, toJSON, toString, valueOf */ -"use strict"; // Create a JSON object only if one does not already exist. We create the // methods in a closure to avoid creating global variables. -if (!this.JSON) { - this.JSON = {}; +if (typeof JSON !== 'object') { + JSON = {}; } (function () { + 'use strict'; function f(n) { // Format integers to have at least two digits. @@ -171,37 +173,30 @@ if (!this.JSON) { if (typeof Date.prototype.toJSON !== 'function') { - Date.prototype.toJSON = function (key) { + Date.prototype.toJSON = function () { - return isFinite(this.valueOf()) ? - this.getUTCFullYear() + '-' + - f(this.getUTCMonth() + 1) + '-' + - f(this.getUTCDate()) + 'T' + - f(this.getUTCHours()) + ':' + - f(this.getUTCMinutes()) + ':' + - f(this.getUTCSeconds()) + 'Z' : null; + return isFinite(this.valueOf()) + ? this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' + : null; }; - String.prototype.toJSON = - Number.prototype.toJSON = - Boolean.prototype.toJSON = function (key) { - return this.valueOf(); - }; + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function () { + return this.valueOf(); + }; } - var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, - escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + var cx, + escapable, gap, indent, - meta = { // table of character substitutions - '\b': '\\b', - '\t': '\\t', - '\n': '\\n', - '\f': '\\f', - '\r': '\\r', - '"' : '\\"', - '\\': '\\\\' - }, + meta, rep; @@ -213,17 +208,17 @@ if (!this.JSON) { // sequences. escapable.lastIndex = 0; - return escapable.test(string) ? - '"' + string.replace(escapable, function (a) { - var c = meta[a]; - return typeof c === 'string' ? c : - '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); - }) + '"' : - '"' + string + '"'; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' + ? c + : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; } function str(key, holder) { + // Produce a string from holder[key]. var i, // The loop counter. @@ -301,11 +296,11 @@ if (!this.JSON) { // Join all of the elements together, separated with commas, and wrap them in // brackets. - v = partial.length === 0 ? '[]' : - gap ? '[\n' + gap + - partial.join(',\n' + gap) + '\n' + - mind + ']' : - '[' + partial.join(',') + ']'; + v = partial.length === 0 + ? '[]' + : gap + ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' + : '[' + partial.join(',') + ']'; gap = mind; return v; } @@ -315,8 +310,8 @@ if (!this.JSON) { if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { - k = rep[i]; - if (typeof k === 'string') { + if (typeof rep[i] === 'string') { + k = rep[i]; v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); @@ -328,7 +323,7 @@ if (!this.JSON) { // Otherwise, iterate through all of the keys in the object. for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { + if (Object.prototype.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); @@ -340,9 +335,11 @@ if (!this.JSON) { // Join all of the member texts together, separated with commas, // and wrap them in braces. - v = partial.length === 0 ? '{}' : - gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + - mind + '}' : '{' + partial.join(',') + '}'; + v = partial.length === 0 + ? '{}' + : gap + ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' + : '{' + partial.join(',') + '}'; gap = mind; return v; } @@ -351,7 +348,18 @@ if (!this.JSON) { // If the JSON object does not yet have a stringify method, give it one. if (typeof JSON.stringify !== 'function') { + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }; JSON.stringify = function (value, replacer, space) { + // The stringify method takes a value and an optional replacer, and an optional // space parameter, and returns a JSON text. The replacer can be a function // that can replace values, or an array of strings that will select the keys. @@ -382,7 +390,7 @@ if (!this.JSON) { rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || - typeof replacer.length !== 'number')) { + typeof replacer.length !== 'number')) { throw new Error('JSON.stringify'); } @@ -397,6 +405,7 @@ if (!this.JSON) { // If the JSON object does not yet have a parse method, give it one. if (typeof JSON.parse !== 'function') { + cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g; JSON.parse = function (text, reviver) { // The parse method takes a text and an optional reviver function, and returns @@ -412,7 +421,7 @@ if (!this.JSON) { var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { - if (Object.hasOwnProperty.call(value, k)) { + if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; @@ -430,6 +439,7 @@ if (!this.JSON) { // Unicode characters with escape sequences. JavaScript handles many characters // incorrectly, either silently deleting them, or treating them as line endings. + text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { @@ -451,10 +461,10 @@ if (!this.JSON) { // we look to see that the remaining characters are only whitespace or ']' or // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. - if (/^[\],:{}\s]*$/. -test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). -replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). -replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { // In the third stage we use the eval function to compile the text into a // JavaScript structure. The '{' operator is subject to a syntactic ambiguity @@ -466,8 +476,9 @@ replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { // In the optional fourth stage, we recursively walk the new structure, passing // each name/value pair to a reviver function for possible transformation. - return typeof reviver === 'function' ? - walk({'': j}, '') : j; + return typeof reviver === 'function' + ? walk({'': j}, '') + : j; } // If the text is not JSON parseable, then a SyntaxError is thrown. diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/node_boot.js b/collections/transformations/bower_components/jasmine/lib/jasmine-core/node_boot.js index fb4faa0..a0fc4a2 100644 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/node_boot.js +++ b/collections/transformations/bower_components/jasmine/lib/jasmine-core/node_boot.js @@ -1,5 +1,5 @@ /* -Copyright (c) 2008-2014 Pivotal Labs +Copyright (c) 2008-2015 Pivotal Labs Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/collections/transformations/bower_components/jasmine/lib/jasmine-core/version.rb b/collections/transformations/bower_components/jasmine/lib/jasmine-core/version.rb deleted file mode 100644 index cbab7e4..0000000 --- a/collections/transformations/bower_components/jasmine/lib/jasmine-core/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -# -# DO NOT Edit this file. Canonical version of Jasmine lives in the repo's package.json. This file is generated -# by a grunt task when the standalone release is built. -# -module Jasmine - module Core - VERSION = "2.0.2" - end -end diff --git a/collections/transformations/bower_components/jasmine/package.json b/collections/transformations/bower_components/jasmine/package.json index a5dde10..eaf1683 100644 --- a/collections/transformations/bower_components/jasmine/package.json +++ b/collections/transformations/bower_components/jasmine/package.json @@ -1,23 +1,34 @@ { "name": "jasmine-core", "license": "MIT", - "version": "2.0.2", + "version": "2.3.4", "repository": { "type": "git", - "url": "https://github.com/pivotal/jasmine.git" + "url": "https://github.com/jasmine/jasmine.git" + }, + "keywords": [ + "test", + "jasmine", + "tdd", + "bdd" + ], + "scripts": { + "test": "./node_modules/.bin/grunt jshint execSpecsInNode" }, "description": "Official packaging of Jasmine's core files for use by Node.js projects.", "homepage": "http://jasmine.github.io", "main": "./lib/jasmine-core.js", "devDependencies": { + "glob": "~3.2.9", "grunt": "~0.4.1", - "grunt-contrib-jshint": "~0.7.0", - "grunt-contrib-concat": "~0.3.0", + "grunt-cli": "^0.1.13", "grunt-contrib-compass": "~0.6.0", "grunt-contrib-compress": "~0.5.2", + "grunt-contrib-concat": "~0.3.0", + "grunt-contrib-jshint": "~0.7.0", + "jasmine": "https://github.com/jasmine/jasmine-npm/archive/master.tar.gz", + "load-grunt-tasks": "^0.4.0", "shelljs": "~0.1.4", - "glob": "~3.2.9", - "jasmine": "https://github.com/pivotal/jasmine-npm/archive/master.tar.gz", - "load-grunt-tasks": "^0.4.0" + "temp": "~0.8.1" } } diff --git a/collections/transformations/bower_components/jasmine/release_notes/2.0.1.md b/collections/transformations/bower_components/jasmine/release_notes/2.0.1.md deleted file mode 100644 index fe71759..0000000 --- a/collections/transformations/bower_components/jasmine/release_notes/2.0.1.md +++ /dev/null @@ -1,70 +0,0 @@ -# Jasmine Core 2.0.1 Release Notes - -## Summary - -This release is for small bug fixes and enhancements ahead of a real-soon-now 2.1. - -## Changes - -### Features - -* NodeJS is now supported with a jasmine-core npm -* [Support browsers that don't supply a `Date.now()` by having a `mockDate` object](http://www.pivotaltracker.com/story/66606132) - Closes #361 -* [Show message if no specs where loaded](http://www.pivotaltracker.com/story/12784235) -* When using `jasmine.any`, the `class` will now be included in the error message -* Reporters now receive the number of passed expectations in a spec -* Use default failure message for `toBeNaN` -* Use the latest `jasmine_selenium_runner` so we use the fix for printing objects with cycles -* Add jasmine logo image to HTML runner -* Stop Jasmine's CSS affecting the style of the body tag - Closes #600 -* Standardized location of the standalone distributions - they now live in the repo in `/dist` as well as on the Releases page - -### Bugs - -* Don't allow calling the same done callback multiple times - Fixes #523 -* [Remove 'empty' as an option as a spec result](http://www.pivotaltracker.com/story/73741032) as this was a breaking change - * Instead, we determine if a spec has no expectations using the added -key of `passedExpectations` in combination of the `failedExpectations` -to determine that there a spec is 'empty' -* Fix build in IE8 (IE8 doesn't support `Object.freeze`) -* Fix `ObjectContaining` to match recursively - -### Documentation - -* Update release doc to use GitHub releases -* Add installation instructions to README - Merges #621 -* Add Ruby Gem and Python Egg to docs -* Add detailed steps on how to contribute - Merges #580 from @pablofiu - -## Pull Requests and Issues - -* Contains is explicitly false if actual is `undefined` or `null` - Fixes #627 -* namespace `html-reporter` -> `jasmine_html-reporter` - Fixes #600 -* Throw a more specific error when `expect` is used without a `currentSpec` - Fixes #602 -* Reduced size of logo with PNG Gauntlet - Merges #588 -* HTML Reporter resets previous DOM when re-initialized - Merges #594 from @plukevdh -* Narrow down raise exceptions query selector; Finding by any input tag is a little bit broad - Closes #605 -* Pass through custom equality testers in toHaveBeenCalledWith - Fixes #536 -* Fix outdated copyright year (update to 2014) - Merges #550 from @slothmonster -* [Add package.json to Python egg to get correct version number](http://www.pivotaltracker.com/story/67556148) - Fixes #551 -* Allow users to set the maximum length of array that the pretty-printer -will print out - Fixes #323 @mikemoraned and #374 @futuraprime -* `matchersUtil.equals()` does not expect a matcher as its first argument, -so send the "actual" value first and the "expected" value second. - Merges #538 from @cbandy -* Add single quote check to `jshint` and fix src files for that - Closes #522 -* Remove an `eval` in order to support running jasmine within CSP - Closes #503 -* Allow matcher custom failure messages to be a function - Closes #520 -* More color blind friendly CSS from @dleppik - Closes #463 & #509 -* Use `load-grunt-tasks` Merges #521 from @robinboehm -* Special case printing `-0` - Closes #496 -* Allow stub or spy Date object safely using a closure to get a clean copy - Closes #506 -* [Use `\d7` instead of plain 'x' for more square appearance](http://www.pivotaltracker.com/story/48434179) -* Better support in pretty printer when an object has null prototype - Fixes #500 -* Update link at top of README to improve access to Jasmine 2.0 docs - Merges #486 from @nextmat -* Force query selector to seek within the html-reporter element - Merges #479 from @shprink -* Netbeans files are in gitignore - Merges #478 from @shprink - - ------- - -_Release Notes generated with [Anchorman](http://github.com/infews/anchorman)_ diff --git a/collections/transformations/bower_components/jasmine/release_notes/2.0.2.md b/collections/transformations/bower_components/jasmine/release_notes/2.0.2.md deleted file mode 100644 index 68542d5..0000000 --- a/collections/transformations/bower_components/jasmine/release_notes/2.0.2.md +++ /dev/null @@ -1,25 +0,0 @@ -# Release Notes - -## Summary - -## Changes - -* keep the files for running in a webpage around in the npm package -* Expose files and paths necessary to embed jasmine in an html page for nodejs -* Pull out the building of the jasmine interface so node and web both get the same one. -* Show a dot with color of pending spec when no expectations -* Console reporter prints out failed expectation's message - -### Bugs - -* Allow mocked Date constructor to be called with a subset of full params - -## Pull Requests and Issues - -* a disabled suite should call resultCallback with status being disabled -* disabled suite should still call onStart callback - - ------- - -_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_ diff --git a/collections/transformations/bower_components/jasmine/release_notes/20.md b/collections/transformations/bower_components/jasmine/release_notes/20.md deleted file mode 100644 index 485ae5f..0000000 --- a/collections/transformations/bower_components/jasmine/release_notes/20.md +++ /dev/null @@ -1,179 +0,0 @@ -# Jasmine Core 2.0 Release Notes - -## Summary - -These notes are for Jasmine Core 2.0. - -## Breaking Changes - -The [`introduction.js`][intro] page covers the current syntax, highlighting the changes. Here are the known interface changes that are not backwards compatible with 1.x. - -* New syntax for asynchronous specs -* New syntax for spies -* New interface for reporters -* Better Equality testing -* Replaced custom matchers for ease of use -* Change to `toThrow` matcher -* Clock now remains installed when a spec finishes -* More Jasmine internal variables/functions have been moved into closures - -### New syntax for asynchronous specs - -Similar to [Mocha][mocha], Jasmine `before`s, `spec`s, and `after`s can take an optional `done` callback in order to force asynchronous tests. The next function, whether it's a `before`, `spec` or `after`, will wait until this function is called or until a timeout is reached. - -### New syntax for spies - -Spies have a slightly modified syntax. The idea came from a desire to preserve any of the properties on a spied-upon function and some better testing patterns. - -### New interface for reporters - -The reporter interface has been **replaced**. The callbacks are different and more consistent. The objects passed in should only provide what is needed to report results. This enforces an interface to result data so custom reporters will be less coupled to the Jasmine implementation. The Jasmine reporter API now includes a slot for a `timer` object. - -### Better Equality testing - -We removed the previous equality code and are now using new code for testing equality. We started with [Underscore.js][underscore]'s `isEqual`, refactored a bit and added some additional tests. - -### Replaced custom matchers for ease of use - -The interface for adding custom matchers has been **replaced**. It has always been possible to add custom matchers, but the API was barely documented and difficult to test. We've changed how matchers are added and tested. Jasmine adds its own matchers by the same mechanism that custom matchers use. Dogfooding FTW. - -### Change to `toThrow` matcher - -We've changed the behavior of the `toThrow` matcher, moving some functionality to the `toThrowError` matcher. This should allow more of the requested use cases. - -### Clock now remains installed when a spec finishes - -After installing the Jasmine Clock, it will stay installed until `uninstall` is called -- clearing up any ambiguity for when those timing functions will revert to using the global clock object. - -## More Jasmine internal variables/functions have been moved into closures - -Certain variables/functions like a function to get the next spec id have been moved into closures, making the Jasmine interface cleaner. - -## Other Changes - -* Massive refactoring and better testing -* Environment setup now in `boot.js` -* Development and Build moved to Grunt -* Changes to how Jasmine is loaded -* Changes to how Jasmine is tested -* Better node.js support -* Better Continuous Integration Environment at Travis -* Support matrix updated -* Removed JsDoc Pages -* Adding Code Climate for JavaScript - -## Massive refactoring and better testing - -This is the biggest set of changes. We've touched nearly every file and every object. We've merged objects together and factored out code. We styled the code more consistently. We've improved nearly every test. - -In general, Jasmine is made of smaller, more-loosely-coupled objects, unit-tested with explicit dependencies injected. This made tests easier to read, write, and maintain. We know this has made Jasmine development easier for the core team. We expect (and hope) this makes it easier for the community to extend Jasmine and provide pull requests that make more sense the first time out. - -## Environment setup now in `boot.js` - -Instantiation and setup of the Jasmine environment, including building reporters, exposing the "global" functions, and executing tests has moved into its own file: `boot.js`. This should make it easier to add custom reporters, configure some objects, or just in general change how you use Jasmine from the outside. - -For example, during development, Jasmine uses its own `devboot.js` to load itself twice - once from `jasmine.js` and once from the source directories. - -## Development and Build moved to Grunt - -We've moved away from Ruby and embraced [Node.js][node] and [Grunt.js][grunt] for the various command line tasks during development. Yes, it's a just a different set of dependencies. But it's less code for the team to maintain - it turns out that JavaScript tools are pretty good at building JavaScript projects. This will make it easier for the community to make sure contributions work in browsers and in Node.js before submitting Pull Requests. There is more detail in the [Contributor's Guide][contrib]. - -## Changes to how Jasmine is loaded - -We did not want to add new run-time dependencies, yet we needed to be cleaner when loading Jasmine. So we wrote a custom "require" scheme that works in Node.js and in browsers. This only affects pull requests which add files - please be careful in these cases. Again, the [Contributor's Guide][contrib] should help. - -## Changes to how Jasmine is tested with Jasmine - -Writing a custom require system helped enforce self-testing - the built `jasmine.js` testing Jasmine from the source directories. Overall this has improved the stability of the code. When you look at Jasmine's tests, you'll see both `jasmine` and `j$` used. The former, `jasmine`, will always be used to test the code from source, which is loaded into the reference `j$`. Please adhere to this pattern when writing tests for contributions. - -## Better node.js support - -`Node.js` is now officially a first-class citizen. For a long time we've made sure tests were green in Node before releasing. But it is now officially part of Jasmine's CI build at [Travis][travis]. For the curious, the [`node_suite.js`][node_suite], is essentially a `boot.js` for Node. An official `npm` is coming. - -## Better Continuous Integration Environment at Travis - -The [CI build at Travis][travis_jasmine] now runs the core specs in a build matrix across browsers. It's far from complete on the operating system matrix, but you will see that Jasmine runs against: Firefox, Chrome, Safari 5, Safari 6, [Phantom.js][phantom], [Node.js][node], and IE versions 8, 9, and 10. Big thanks to [SauceLabs][sauce] for their support of open source projects. We will happily take pull requests for additional OS/Browser combos within the matrix. - -## Support Matrix Updated - -We're dropping support for IE < 8. [Jasmine 1.x][jasmine_downloads] remains for projects that need to support older browsers. - -## Removed JsDoc Pages - -Comments in code are lies waiting to happen. Jasmine's JsDoc comments were no exception. The comments were out of date, the generated pages were even more out of date, and frankly they were not helpful. So they're gone. - -Last year saw the posting of the [`introduction.js`][intro] page to document the real, practical interface for projects to use. This page has received a lot of positive feedback so expect more pages like this one. - -## Adding Code Climate for JavaScript - -We are running Code Climate for Jasmine. We have some work to do here but it's helping us easily find code hotspots. - -## Pull Requests and Issues - -The following Pull Requests were merged: - -* ObjectContaining wrong filed value error message #[394](https://github.com/pivotal/jasmine/issues/394) from albertandrejev -* Removed unnecessary parameter from `suiteFactory()` call #[397](https://github.com/pivotal/jasmine/issues/397) from valera-rozuvan -* `jasmine.Any` supports `Boolean` #[392](https://github.com/pivotal/jasmine/issues/392) from albertandrejev -* Reporters get execution time #[30](https://github.com/pivotal/jasmine/issues/30) -* `toThrow` matchers handle falsy exceptions #[317](https://github.com/pivotal/jasmine/issues/371) -* Removed deprecated `jasmine.Matchers.pp` #[363](https://github.com/pivotal/jasmine/issues/363) from robinboehm -* Fix for Clock ticking to default to 0 #[340](https://github.com/pivotal/jasmine/issues/340) from Caio Cunha -* Whitespace failures should be easier to understand #[332](https://github.com/pivotal/jasmine/issues/332) from bjornblomqvist -* Fix for more markdown-y image for Build status #[329](https://github.com/pivotal/jasmine/issues/329) from sunliwen -* UTF-8 encoding fixes #[333](https://github.com/pivotal/jasmine/issues/333) from bjornblomqvist -* Replaced deprecated octal literal with hexadecimal from kris7t -* Make getGlobal() work in strict mode from metaweta -* Clears timeout timer even when async spec throws an exception from tidoust -* Timeouts scheduled within a delayed function are correctly scheduled and executed from maciej-filip-sz - -### Bug Fixes -* Improved the performance of the HTML output with a CSS change #[428](https://github.com/pivotal/jasmine/issues/428) - Thanks @tjgrathwell -* Removed an accidental global pollution of `j$` as a reference to Jasmine. Thanks to Morten Maxild from the mailing list -* There is now a consistent `this` between `beforeEach`, `it` and `afterEach` for a spec -* A spy's strategy now has properties `returnValue` and `throwError` because they are better names -* Make it easy to copy the title of failing specs from the HTML output -* Don't add periods to the full name of a spec fix #[427](https://github.com/pivotal/jasmine/issues/427) -* Allow Env to take optional spec/suite ids when asked to `execute` -* [Mock clock now less intrusive, replacing global timer functions only when clock is installed](http://www.pivotaltracker.com/story/54168708) -* Restore custom failure messages for `toHaveBeenCalledWith` -* Jasmine global object has a addCustomEqualityTester and addMatchers (no longer directly on global) -* Fixed a global leak of `timer` -* Remove currentRunner from Env (users can use topSuite from Env instead) -* [Specs without expectations are now considered passing](http://www.pivotaltracker.com/story/59422744) -* Improve error message when a spec does not call the async callback within the default time interval -* Allow passing a negativeCompare in a custom matcher for more custom implementations when `.not` is called -* Update favicon to be higher resolution -* Make all async functions be subject to the timeout - -There were several other pull requests that either had already been fixed, or were good starting points for the various changes above. Thank you for all of the hard work to keep Jasmine awesome. - -## Other Bugs and Features - -There were a few small changes and fixes that didn't fit into any of the above categories: - -* HTML Reporter refactored for simplicity and performance -* Default character encoding on the HTML runner page is UTF-8 -* [Escape special regex characters from the spec param](http://www.pivotaltracker.com/story/52731407) -* Favicon returns -* [Clock supports `eval`'d strings as functions](http://www.pivotaltracker.com/story/40853563) -* There should always be stack traces on failures -* Removed references to unused `jasmine.VERBOSE` -* Removed references to unused `jasmine.XmlHttpRequest` - -[mocha]: http://visionmedia.github.io/mocha/ -[underscore]: http://underscorejs.org/ -[grunt]: http://gruntjs.com -[node]: http://nodejs.org -[phantom]: http://phantomjs.org -[jasmine_downloads]: https://github.com/pivotal/jasmine/downloads -[contrib]: https://github.com/pivotal/jasmine/blob/master/CONTRIBUTING.md -[travis]: http://travis-ci.org -[travis_jasmine]: http://travis-ci.org/jasmine -[sauce]: http://saucelabs.com -[node_suite]: https://github.com/pivotal/jasmine/blob/master/spec/node_suite.js -[intro]: http://jasmine.github.io/2.0/introduction.html - ------- - -_Release Notes generated with [Anchorman](http://github.com/infews/anchorman)_ diff --git a/collections/transformations/bower_components/jasmine/setup.py b/collections/transformations/bower_components/jasmine/setup.py deleted file mode 100644 index a10d019..0000000 --- a/collections/transformations/bower_components/jasmine/setup.py +++ /dev/null @@ -1,47 +0,0 @@ -from setuptools import setup, find_packages, os -import json - -with open('package.json') as packageFile: - version = json.load(packageFile)['version'] - -setup( - name="jasmine-core", - version=version, - url="http://pivotal.github.io/jasmine/", - author="Pivotal Labs", - author_email="jasmine-js@googlegroups.com", - description=('Jasmine is a Behavior Driven Development testing framework for JavaScript. It does not rely on '+ - 'browsers, DOM, or any JavaScript framework. Thus it\'s suited for websites, '+ - 'Node.js (http://nodejs.org) projects, or anywhere that JavaScript can run.'), - license='MIT', - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Console', - 'Environment :: Web Environment', - 'Framework :: Django', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: OS Independent', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2', - 'Programming Language :: Python :: 2.6', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.2', - 'Programming Language :: Python :: 3.3', - 'Programming Language :: Python :: Implementation :: PyPy', - 'Topic :: Internet :: WWW/HTTP', - 'Topic :: Software Development :: Libraries :: Python Modules', - 'Topic :: Software Development :: Build Tools', - 'Topic :: Software Development :: Quality Assurance', - 'Topic :: Software Development :: Testing', - ], - - packages=['jasmine_core', 'jasmine_core.images'], - package_dir={'jasmine_core': 'lib/jasmine-core', 'jasmine_core.images': 'images'}, - package_data={'jasmine_core': ['*.js', '*.css'], 'jasmine_core.images': ['*.png']}, - - include_package_data=True, - - install_requires=['glob2>=0.4.1', 'ordereddict==1.1'] -) diff --git a/collections/transformations/bower_components/jasmine/spec/console/ConsoleReporterSpec.js b/collections/transformations/bower_components/jasmine/spec/console/ConsoleReporterSpec.js deleted file mode 100644 index b19f51c..0000000 --- a/collections/transformations/bower_components/jasmine/spec/console/ConsoleReporterSpec.js +++ /dev/null @@ -1,239 +0,0 @@ -describe("ConsoleReporter", function() { - var out; - - beforeEach(function() { - out = (function() { - var output = ""; - return { - print: function(str) { - output += str; - }, - getOutput: function() { - return output; - }, - clear: function() { - output = ""; - } - }; - }()); - }); - - it("reports that the suite has started to the console", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.jasmineStarted(); - - expect(out.getOutput()).toEqual("Started\n"); - }); - - it("starts the provided timer when jasmine starts", function() { - var timerSpy = jasmine.createSpyObj('timer', ['start']), - reporter = new j$.ConsoleReporter({ - print: out.print, - timer: timerSpy - }); - - reporter.jasmineStarted(); - - expect(timerSpy.start).toHaveBeenCalled(); - }); - - it("reports a passing spec as a dot", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.specDone({status: "passed"}); - - expect(out.getOutput()).toEqual("."); - }); - - it("does not report a disabled spec", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.specDone({status: "disabled"}); - - expect(out.getOutput()).toEqual(""); - }); - - it("reports a failing spec as an 'F'", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.specDone({status: "failed"}); - - expect(out.getOutput()).toEqual("F"); - }); - - it("reports a pending spec as a '*'", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.specDone({status: "pending"}); - - expect(out.getOutput()).toEqual("*"); - }); - - it("alerts user if there are no specs", function(){ - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.jasmineStarted(); - out.clear(); - reporter.jasmineDone(); - - expect(out.getOutput()).toMatch(/No specs found/); - }); - - it("reports a summary when done (singular spec and time)", function() { - var timerSpy = jasmine.createSpyObj('timer', ['start', 'elapsed']), - reporter = new j$.ConsoleReporter({ - print: out.print, - timer: timerSpy - }); - - reporter.jasmineStarted(); - reporter.specDone({status: "passed"}); - - timerSpy.elapsed.and.returnValue(1000); - - out.clear(); - reporter.jasmineDone(); - - expect(out.getOutput()).toMatch(/1 spec, 0 failures/); - expect(out.getOutput()).not.toMatch(/0 pending specs/); - expect(out.getOutput()).toMatch("Finished in 1 second\n"); - }); - - it("reports a summary when done (pluralized specs and seconds)", function() { - var timerSpy = jasmine.createSpyObj('timer', ['start', 'elapsed']), - reporter = new j$.ConsoleReporter({ - print: out.print, - timer: timerSpy - }); - - reporter.jasmineStarted(); - reporter.specDone({status: "passed"}); - reporter.specDone({status: "pending"}); - reporter.specDone({ - status: "failed", - description: "with a failing spec", - fullName: "A suite with a failing spec", - failedExpectations: [ - { - passed: false, - message: "Expected true to be false.", - expected: false, - actual: true, - stack: "foo\nbar\nbaz" - } - ] - }); - - out.clear(); - - timerSpy.elapsed.and.returnValue(100); - - reporter.jasmineDone(); - - expect(out.getOutput()).toMatch(/3 specs, 1 failure, 1 pending spec/); - expect(out.getOutput()).toMatch("Finished in 0.1 seconds\n"); - }); - - it("reports a summary when done that includes stack traces for a failing suite", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print - }); - - reporter.jasmineStarted(); - reporter.specDone({status: "passed"}); - reporter.specDone({ - status: "failed", - description: "with a failing spec", - fullName: "A suite with a failing spec", - failedExpectations: [ - { - passed: false, - message: "Expected true to be false.", - expected: false, - actual: true, - stack: "foo bar baz" - } - ] - }); - - out.clear(); - - reporter.jasmineDone({}); - - expect(out.getOutput()).toMatch(/true to be false/); - expect(out.getOutput()).toMatch(/foo bar baz/); - }); - - it("calls the onComplete callback when the suite is done", function() { - var onComplete = jasmine.createSpy('onComplete'), - reporter = new j$.ConsoleReporter({ - print: out.print, - onComplete: onComplete - }); - - reporter.jasmineDone({}); - - expect(onComplete).toHaveBeenCalled(); - }); - - - describe("with color", function() { - - it("reports that the suite has started to the console", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print, - showColors: true - }); - - reporter.jasmineStarted(); - - expect(out.getOutput()).toEqual("Started\n"); - }); - - it("reports a passing spec as a dot", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print, - showColors: true - }); - - reporter.specDone({status: "passed"}); - - expect(out.getOutput()).toEqual("\x1B[32m.\x1B[0m"); - }); - - it("does not report a disabled spec", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print, - showColors: true - }); - - reporter.specDone({status: 'disabled'}); - - expect(out.getOutput()).toEqual(""); - }); - - it("reports a failing spec as an 'F'", function() { - var reporter = new j$.ConsoleReporter({ - print: out.print, - showColors: true - }); - - reporter.specDone({status: 'failed'}); - - expect(out.getOutput()).toEqual("\x1B[31mF\x1B[0m"); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/AnySpec.js b/collections/transformations/bower_components/jasmine/spec/core/AnySpec.js deleted file mode 100644 index 139a413..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/AnySpec.js +++ /dev/null @@ -1,46 +0,0 @@ -describe("Any", function() { - it("matches a string", function() { - var any = new j$.Any(String); - - expect(any.jasmineMatches("foo")).toBe(true); - }); - - it("matches a number", function() { - var any = new j$.Any(Number); - - expect(any.jasmineMatches(1)).toBe(true); - }); - - it("matches a function", function() { - var any = new j$.Any(Function); - - expect(any.jasmineMatches(function(){})).toBe(true); - }); - - it("matches an Object", function() { - var any = new j$.Any(Object); - - expect(any.jasmineMatches({})).toBe(true); - }); - - it("matches a Boolean", function() { - var any = new j$.Any(Boolean); - - expect(any.jasmineMatches(true)).toBe(true); - }); - - it("matches another constructed object", function() { - var Thing = function() {}, - any = new j$.Any(Thing); - - expect(any.jasmineMatches(new Thing())).toBe(true); - }); - - it("jasmineToString's itself", function() { - var any = new j$.Any(Number); - - expect(any.jasmineToString()).toMatch(' ] ]"); - }); - - it("should stringify objects properly", function() { - expect(j$.pp({foo: 'bar'})).toEqual("{ foo: 'bar' }"); - expect(j$.pp({foo:'bar', baz:3, nullValue: null, undefinedValue: jasmine.undefined})).toEqual("{ foo: 'bar', baz: 3, nullValue: null, undefinedValue: undefined }"); - expect(j$.pp({foo: function () { - }, bar: [1, 2, 3]})).toEqual("{ foo: Function, bar: [ 1, 2, 3 ] }"); - }); - - it("should not include inherited properties when stringifying an object", function() { - var SomeClass = function() {}; - SomeClass.prototype.foo = "inherited foo"; - var instance = new SomeClass(); - instance.bar = "my own bar"; - expect(j$.pp(instance)).toEqual("{ bar: 'my own bar' }"); - }); - - it("should not recurse objects and arrays more deeply than j$.MAX_PRETTY_PRINT_DEPTH", function() { - var originalMaxDepth = j$.MAX_PRETTY_PRINT_DEPTH; - var nestedObject = { level1: { level2: { level3: { level4: "leaf" } } } }; - var nestedArray = [1, [2, [3, [4, "leaf"]]]]; - - try { - j$.MAX_PRETTY_PRINT_DEPTH = 2; - expect(j$.pp(nestedObject)).toEqual("{ level1: { level2: Object } }"); - expect(j$.pp(nestedArray)).toEqual("[ 1, [ 2, Array ] ]"); - - j$.MAX_PRETTY_PRINT_DEPTH = 3; - expect(j$.pp(nestedObject)).toEqual("{ level1: { level2: { level3: Object } } }"); - expect(j$.pp(nestedArray)).toEqual("[ 1, [ 2, [ 3, Array ] ] ]"); - - j$.MAX_PRETTY_PRINT_DEPTH = 4; - expect(j$.pp(nestedObject)).toEqual("{ level1: { level2: { level3: { level4: 'leaf' } } } }"); - expect(j$.pp(nestedArray)).toEqual("[ 1, [ 2, [ 3, [ 4, 'leaf' ] ] ] ]"); - } finally { - j$.MAX_PRETTY_PRINT_DEPTH = originalMaxDepth; - } - }); - - it("should stringify immutable circular objects", function(){ - if(Object.freeze){ - var frozenObject = {foo: {bar: 'baz'}}; - frozenObject.circular = frozenObject; - frozenObject = Object.freeze(frozenObject); - expect(j$.pp(frozenObject)).toEqual("{ foo: { bar: 'baz' }, circular: }"); - } - }); - - it("should truncate arrays that are longer than j$.MAX_PRETTY_PRINT_ARRAY_LENGTH", function() { - var originalMaxLength = j$.MAX_PRETTY_PRINT_ARRAY_LENGTH; - var array = [1, 2, 3]; - - try { - j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 2; - expect(j$.pp(array)).toEqual("[ 1, 2, ... ]"); - } finally { - j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = originalMaxLength; - } - }); - - it("should stringify RegExp objects properly", function() { - expect(j$.pp(/x|y|z/)).toEqual("/x|y|z/"); - }); - - it("should indicate circular object references", function() { - var sampleValue = {foo: 'hello'}; - sampleValue.nested = sampleValue; - expect(j$.pp(sampleValue)).toEqual("{ foo: 'hello', nested: }"); - }); - - it("should indicate getters on objects as such", function() { - var sampleValue = {id: 1}; - if (sampleValue.__defineGetter__) { - //not supported in IE! - sampleValue.__defineGetter__('calculatedValue', function() { - throw new Error("don't call me!"); - }); - } - if (sampleValue.__defineGetter__) { - expect(j$.pp(sampleValue)).toEqual("{ id: 1, calculatedValue: }"); - } - else { - expect(j$.pp(sampleValue)).toEqual("{ id: 1 }"); - } - }); - - - it('should not do HTML escaping of strings', function() { - expect(j$.pp('some html string &', false)).toEqual('\'some html string &\''); - }); - - it("should abbreviate the global (usually window) object", function() { - expect(j$.pp(jasmine.getGlobal())).toEqual(""); - }); - - it("should stringify Date objects properly", function() { - var now = new Date(); - expect(j$.pp(now)).toEqual("Date(" + now.toString() + ")"); - }); - - it("should stringify spy objects properly", function() { - var TestObject = { - someFunction: function() {} - }, - env = new j$.Env(); - - env.spyOn(TestObject, 'someFunction'); - expect(j$.pp(TestObject.someFunction)).toEqual("spy on someFunction"); - - expect(j$.pp(j$.createSpy("something"))).toEqual("spy on something"); - }); - - it("should stringify objects that implement jasmineToString", function () { - var obj = { - jasmineToString: function () { return "strung"; } - }; - - expect(j$.pp(obj)).toEqual("strung"); - }); - - it("should handle objects with null prototype", function() { - if (jasmine.getEnv().ieVersion < 9) { return; } - - var obj = Object.create(null); - obj.foo = 'bar'; - - expect(j$.pp(obj)).toEqual("{ foo: 'bar' }"); - }); -}); - diff --git a/collections/transformations/bower_components/jasmine/spec/core/QueueRunnerSpec.js b/collections/transformations/bower_components/jasmine/spec/core/QueueRunnerSpec.js deleted file mode 100644 index 37e651e..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/QueueRunnerSpec.js +++ /dev/null @@ -1,271 +0,0 @@ -describe("QueueRunner", function() { - - it("runs all the functions it's passed", function() { - var calls = [], - fn1 = jasmine.createSpy('fn1'), - fn2 = jasmine.createSpy('fn2'), - queueRunner = new j$.QueueRunner({ - fns: [fn1, fn2] - }); - fn1.and.callFake(function() { - calls.push('fn1'); - }); - fn2.and.callFake(function() { - calls.push('fn2'); - }); - - queueRunner.execute(); - - expect(calls).toEqual(['fn1', 'fn2']); - }); - - it("calls each function with a consistent 'this'-- an empty object", function() { - var fn1 = jasmine.createSpy('fn1'), - fn2 = jasmine.createSpy('fn2'), - fn3 = function(done) { asyncContext = this; done(); }, - queueRunner = new j$.QueueRunner({ - fns: [fn1, fn2, fn3] - }), - asyncContext; - - queueRunner.execute(); - - var context = fn1.calls.first().object; - expect(context).toEqual({}); - expect(fn2.calls.first().object).toBe(context); - expect(asyncContext).toBe(context); - }); - - describe("with an asynchronous function", function() { - beforeEach(function() { - jasmine.clock().install(); - }); - - afterEach(function() { - jasmine.clock().uninstall(); - }); - - it("supports asynchronous functions, only advancing to next function after a done() callback", function() { - //TODO: it would be nice if spy arity could match the fake, so we could do something like: - //createSpy('asyncfn').and.callFake(function(done) {}); - - var onComplete = jasmine.createSpy('onComplete'), - beforeCallback = jasmine.createSpy('beforeCallback'), - fnCallback = jasmine.createSpy('fnCallback'), - afterCallback = jasmine.createSpy('afterCallback'), - fn1 = function(done) { - beforeCallback(); - setTimeout(done, 100); - }, - fn2 = function(done) { - fnCallback(); - setTimeout(done, 100); - }, - fn3 = function(done) { - afterCallback(); - setTimeout(done, 100); - }, - queueRunner = new j$.QueueRunner({ - fns: [fn1, fn2, fn3], - onComplete: onComplete - }); - - queueRunner.execute(); - - expect(beforeCallback).toHaveBeenCalled(); - expect(fnCallback).not.toHaveBeenCalled(); - expect(afterCallback).not.toHaveBeenCalled(); - expect(onComplete).not.toHaveBeenCalled(); - - jasmine.clock().tick(100); - - expect(fnCallback).toHaveBeenCalled(); - expect(afterCallback).not.toHaveBeenCalled(); - expect(onComplete).not.toHaveBeenCalled(); - - jasmine.clock().tick(100); - - expect(afterCallback).toHaveBeenCalled(); - expect(onComplete).not.toHaveBeenCalled(); - - jasmine.clock().tick(100); - - expect(onComplete).toHaveBeenCalled(); - }); - - it("sets a timeout if requested for asynchronous functions so they don't go on forever", function() { - var beforeFn = function(done) { }, - fn = jasmine.createSpy('fn'), - onComplete = jasmine.createSpy('onComplete'), - onException = jasmine.createSpy('onException'), - queueRunner = new j$.QueueRunner({ - fns: [beforeFn, fn], - onComplete: onComplete, - onException: onException, - enforceTimeout: function() { return true; } - }); - - queueRunner.execute(); - expect(fn).not.toHaveBeenCalled(); - - jasmine.clock().tick(j$.DEFAULT_TIMEOUT_INTERVAL); - - expect(onException).toHaveBeenCalledWith(jasmine.any(Error)); - expect(fn).toHaveBeenCalled(); - expect(onComplete).toHaveBeenCalled(); - }); - - it("by default does not set a timeout for asynchronous functions", function() { - var beforeFn = function(done) { }, - fn = jasmine.createSpy('fn'), - onComplete = jasmine.createSpy('onComplete'), - onException = jasmine.createSpy('onException'), - queueRunner = new j$.QueueRunner({ - fns: [beforeFn, fn], - onComplete: onComplete, - onException: onException, - }); - - queueRunner.execute(); - expect(fn).not.toHaveBeenCalled(); - - jasmine.clock().tick(j$.DEFAULT_TIMEOUT_INTERVAL); - - expect(onException).not.toHaveBeenCalled(); - expect(fn).not.toHaveBeenCalled(); - expect(onComplete).not.toHaveBeenCalled(); - }); - - it("clears the timeout when an async function throws an exception, to prevent additional onException calls", function() { - var fn = function(done) { throw new Error("error!"); }, - onComplete = jasmine.createSpy('onComplete'), - onException = jasmine.createSpy('onException'), - queueRunner = new j$.QueueRunner({ - fns: [fn], - onComplete: onComplete, - onException: onException - }); - - queueRunner.execute(); - - expect(onComplete).toHaveBeenCalled(); - expect(onException).toHaveBeenCalled(); - - jasmine.clock().tick(j$.DEFAULT_TIMEOUT_INTERVAL); - expect(onException.calls.count()).toEqual(1); - }); - - it("clears the timeout when the done callback is called", function() { - var fn = function(done) { done(); }, - onComplete = jasmine.createSpy('onComplete'), - onException = jasmine.createSpy('onException'), - queueRunner = new j$.QueueRunner({ - fns: [fn], - onComplete: onComplete, - onException: onException - }); - - queueRunner.execute(); - - expect(onComplete).toHaveBeenCalled(); - - jasmine.clock().tick(j$.DEFAULT_TIMEOUT_INTERVAL); - expect(onException).not.toHaveBeenCalled(); - }); - - it("only moves to the next spec the first time you call done", function() { - var fn = function(done) {done(); done();}, - nextFn = jasmine.createSpy('nextFn'); - queueRunner = new j$.QueueRunner({ - fns: [fn, nextFn] - }); - - queueRunner.execute(); - expect(nextFn.calls.count()).toEqual(1); - }); - - it("does not move to the next spec if done is called after an exception has ended the spec", function() { - var fn = function(done) { - setTimeout(done, 1); - throw new Error('error!'); - }, - nextFn = jasmine.createSpy('nextFn'); - queueRunner = new j$.QueueRunner({ - fns: [fn, nextFn] - }); - - queueRunner.execute(); - jasmine.clock().tick(1); - expect(nextFn.calls.count()).toEqual(1); - }); - }); - - it("calls an exception handler when an exception is thrown in a fn", function() { - var fn = function() { - throw new Error('fake error'); - }, - exceptionCallback = jasmine.createSpy('exception callback'), - queueRunner = new j$.QueueRunner({ - fns: [fn], - onException: exceptionCallback - }); - - queueRunner.execute(); - - expect(exceptionCallback).toHaveBeenCalledWith(jasmine.any(Error)); - }); - - it("rethrows an exception if told to", function() { - var fn = function() { - throw new Error('fake error'); - }, - queueRunner = new j$.QueueRunner({ - fns: [fn], - catchException: function(e) { return false; } - }); - - expect(queueRunner.execute).toThrow(); - }); - - it("continues running the functions even after an exception is thrown in an async spec", function() { - var fn = function(done) { throw new Error("error"); }, - nextFn = jasmine.createSpy("nextFunction"), - queueRunner = new j$.QueueRunner({ - fns: [fn, nextFn] - }); - - queueRunner.execute(); - expect(nextFn).toHaveBeenCalled(); - }); - - it("calls a provided complete callback when done", function() { - var fn = jasmine.createSpy('fn'), - completeCallback = jasmine.createSpy('completeCallback'), - queueRunner = new j$.QueueRunner({ - fns: [fn], - onComplete: completeCallback - }); - - queueRunner.execute(); - - expect(completeCallback).toHaveBeenCalled(); - }); - - it("calls a provided stack clearing function when done", function() { - var asyncFn = function(done) { done() }, - afterFn = jasmine.createSpy('afterFn'), - completeCallback = jasmine.createSpy('completeCallback'), - clearStack = jasmine.createSpy('clearStack'), - queueRunner = new j$.QueueRunner({ - fns: [asyncFn, afterFn], - clearStack: clearStack, - onComplete: completeCallback - }); - - clearStack.and.callFake(function(fn) { fn(); }); - - queueRunner.execute(); - expect(afterFn).toHaveBeenCalled(); - expect(clearStack).toHaveBeenCalledWith(completeCallback); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/ReportDispatcherSpec.js b/collections/transformations/bower_components/jasmine/spec/core/ReportDispatcherSpec.js deleted file mode 100644 index 98a9854..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/ReportDispatcherSpec.js +++ /dev/null @@ -1,40 +0,0 @@ -describe("ReportDispatcher", function() { - - it("builds an interface of requested methods", function() { - var dispatcher = new j$.ReportDispatcher(['foo', 'bar', 'baz']); - - expect(dispatcher.foo).toBeDefined(); - expect(dispatcher.bar).toBeDefined(); - expect(dispatcher.baz).toBeDefined(); - }); - - it("dispatches requested methods to added reporters", function() { - var dispatcher = new j$.ReportDispatcher(['foo', 'bar']), - reporter = jasmine.createSpyObj('reporter', ['foo', 'bar']), - anotherReporter = jasmine.createSpyObj('reporter', ['foo', 'bar']); - - dispatcher.addReporter(reporter); - dispatcher.addReporter(anotherReporter); - - dispatcher.foo(123, 456); - - expect(reporter.foo).toHaveBeenCalledWith(123, 456); - expect(anotherReporter.foo).toHaveBeenCalledWith(123, 456); - - dispatcher.bar('a', 'b'); - - expect(reporter.bar).toHaveBeenCalledWith('a', 'b'); - expect(anotherReporter.bar).toHaveBeenCalledWith('a', 'b'); - }); - - it("does not dispatch to a reporter if the reporter doesn't accept the method", function() { - var dispatcher = new j$.ReportDispatcher(['foo']), - reporter = jasmine.createSpyObj('reporter', ['baz']); - - dispatcher.addReporter(reporter); - - expect(function() { - dispatcher.foo(123, 456); - }).not.toThrow(); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/SpecSpec.js b/collections/transformations/bower_components/jasmine/spec/core/SpecSpec.js deleted file mode 100644 index 77229df..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/SpecSpec.js +++ /dev/null @@ -1,260 +0,0 @@ -describe("Spec", function() { - - it("#isPendingSpecException returns true for a pending spec exception", function() { - var e = new Error(j$.Spec.pendingSpecExceptionMessage); - - expect(j$.Spec.isPendingSpecException(e)).toBe(true); - }); - - it("#isPendingSpecException returns true for a pending spec exception (even when FF bug is present)", function() { - var fakeError = { - toString: function() { return "Error: " + j$.Spec.pendingSpecExceptionMessage; } - }; - - expect(j$.Spec.isPendingSpecException(fakeError)).toBe(true); - }); - - it("#isPendingSpecException returns true for a pending spec exception", function() { - var e = new Error("foo"); - - expect(j$.Spec.isPendingSpecException(e)).toBe(false); - }); - - it("#isPendingSpecException returns false for thrown values that don't have toString", function() { - expect(j$.Spec.isPendingSpecException(void 0)).toBe(false); - }); - - it("delegates execution to a QueueRunner", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - spec = new j$.Spec({ - description: 'my test', - id: 'some-id', - fn: function() {}, - queueRunnerFactory: fakeQueueRunner - }); - - spec.execute(); - - expect(fakeQueueRunner).toHaveBeenCalled(); - }); - - it("should call the start callback on execution", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - startCallback = jasmine.createSpy('startCallback'), - spec = new j$.Spec({ - id: 123, - description: 'foo bar', - fn: function() {}, - onStart: startCallback, - queueRunnerFactory: fakeQueueRunner - }); - - spec.execute(); - - // TODO: due to some issue with the Pretty Printer, this line fails, but the other two pass. - // This means toHaveBeenCalledWith on IE8 will always be broken. - - // expect(startCallback).toHaveBeenCalledWith(spec); - expect(startCallback).toHaveBeenCalled(); - expect(startCallback.calls.first().object).toEqual(spec); - }); - - it("should call the start callback on execution but before any befores are called", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - beforesWereCalled = false, - startCallback = jasmine.createSpy('start-callback').and.callFake(function() { - expect(beforesWereCalled).toBe(false); - }), - spec = new j$.Spec({ - fn: function() {}, - beforeFns: function() { - return [function() { - beforesWereCalled = true - }] - }, - onStart: startCallback, - queueRunnerFactory: fakeQueueRunner - }); - - spec.execute(); - - expect(startCallback).toHaveBeenCalled(); - }); - - it("provides all before fns and after fns to be run", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - before = jasmine.createSpy('before'), - after = jasmine.createSpy('after'), - fn = jasmine.createSpy('test body').and.callFake(function() { - expect(before).toHaveBeenCalled(); - expect(after).not.toHaveBeenCalled(); - }), - spec = new j$.Spec({ - fn: fn, - beforeFns: function() { - return [before] - }, - afterFns: function() { - return [after] - }, - queueRunnerFactory: fakeQueueRunner - }); - - spec.execute(); - - var allSpecFns = fakeQueueRunner.calls.mostRecent().args[0].fns; - expect(allSpecFns).toEqual([before, fn, after]); - }); - - it("is marked pending if created without a function body", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - - startCallback = jasmine.createSpy('startCallback'), - resultCallback = jasmine.createSpy('resultCallback'), - spec = new j$.Spec({ - onStart: startCallback, - fn: null, - resultCallback: resultCallback, - queueRunnerFactory: fakeQueueRunner - }); - - - expect(spec.status()).toBe('pending'); - }); - - it("can be disabled, but still calls callbacks", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - startCallback = jasmine.createSpy('startCallback'), - specBody = jasmine.createSpy('specBody'), - resultCallback = jasmine.createSpy('resultCallback'), - spec = new j$.Spec({ - onStart:startCallback, - fn: specBody, - resultCallback: resultCallback, - queueRunnerFactory: fakeQueueRunner - }); - - spec.disable(); - - expect(spec.status()).toBe('disabled'); - - spec.execute(); - - expect(fakeQueueRunner).not.toHaveBeenCalled(); - expect(specBody).not.toHaveBeenCalled(); - - expect(startCallback).toHaveBeenCalled(); - expect(resultCallback).toHaveBeenCalled(); - }); - - it("can be marked pending, but still calls callbacks when executed", function() { - var fakeQueueRunner = jasmine.createSpy('fakeQueueRunner'), - startCallback = jasmine.createSpy('startCallback'), - resultCallback = jasmine.createSpy('resultCallback'), - spec = new j$.Spec({ - onStart: startCallback, - resultCallback: resultCallback, - description: "with a spec", - getSpecName: function() { - return "a suite with a spec" - }, - queueRunnerFactory: fakeQueueRunner - }); - - spec.pend(); - - expect(spec.status()).toBe('pending'); - - spec.execute(); - - expect(fakeQueueRunner).not.toHaveBeenCalled(); - - expect(startCallback).toHaveBeenCalled(); - expect(resultCallback).toHaveBeenCalledWith({ - id: spec.id, - status: 'pending', - description: 'with a spec', - fullName: 'a suite with a spec', - failedExpectations: [], - passedExpectations: [] - }); - }); - - it("should call the done callback on execution complete", function() { - var done = jasmine.createSpy('done callback'), - spec = new j$.Spec({ - fn: function() {}, - catchExceptions: function() { return false; }, - resultCallback: function() {}, - queueRunnerFactory: function(attrs) { attrs.onComplete(); } - }); - - spec.execute(done); - - expect(done).toHaveBeenCalled(); - }); - - it("#status returns passing by default", function(){ - var spec = new j$.Spec({ fn: function () {} }); - expect(spec.status()).toBe("passed"); - }); - - it("#status returns passed if all expectations in the spec have passed", function() { - var spec = new j$.Spec({fn: jasmine.createSpy("spec body")}); - spec.addExpectationResult(true); - expect(spec.status()).toBe('passed'); - }); - - it("#status returns failed if any expectations in the spec have failed", function() { - var spec = new j$.Spec({ fn: jasmine.createSpy("spec body") }); - spec.addExpectationResult(true); - spec.addExpectationResult(false); - expect(spec.status()).toBe('failed'); - }); - - it("keeps track of passed and failed expectations", function() { - var resultCallback = jasmine.createSpy('resultCallback'), - spec = new j$.Spec({ - fn: jasmine.createSpy("spec body"), - expectationResultFactory: function (data) { return data; }, - queueRunnerFactory: function(attrs) { attrs.onComplete(); }, - resultCallback: resultCallback - }); - spec.addExpectationResult(true, 'expectation1'); - spec.addExpectationResult(false, 'expectation2'); - - spec.execute(); - - expect(resultCallback.calls.first().args[0].passedExpectations).toEqual(['expectation1']); - expect(resultCallback.calls.first().args[0].failedExpectations).toEqual(['expectation2']); - }); - - it("can return its full name", function() { - var specNameSpy = jasmine.createSpy('specNameSpy').and.returnValue('expected val'); - - var spec = new j$.Spec({ - getSpecName: specNameSpy - }); - - expect(spec.getFullName()).toBe('expected val'); - expect(specNameSpy.calls.mostRecent().args[0].id).toEqual(spec.id); - }); - - describe("when a spec is marked pending during execution", function() { - it("should mark the spec as pending", function() { - var fakeQueueRunner = function(opts) { - opts.onException(new Error(j$.Spec.pendingSpecExceptionMessage)); - }, - spec = new j$.Spec({ - description: 'my test', - id: 'some-id', - fn: function() { }, - queueRunnerFactory: fakeQueueRunner - }); - - spec.execute(); - - expect(spec.status()).toEqual("pending"); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/SpySpec.js b/collections/transformations/bower_components/jasmine/spec/core/SpySpec.js deleted file mode 100644 index 5e2905b..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/SpySpec.js +++ /dev/null @@ -1,67 +0,0 @@ -describe('Spies', function () { - describe("createSpy", function() { - var TestClass; - - beforeEach(function() { - TestClass = function() {}; - TestClass.prototype.someFunction = function() {}; - TestClass.prototype.someFunction.bob = "test"; - }); - - it("preserves the properties of the spied function", function() { - var spy = j$.createSpy(TestClass.prototype, TestClass.prototype.someFunction); - - expect(spy.bob).toEqual("test"); - }); - - it("warns the user that we intend to overwrite an existing property", function() { - TestClass.prototype.someFunction.and = "turkey"; - - expect(function() { - j$.createSpy(TestClass.prototype, TestClass.prototype.someFunction); - }).toThrowError("Jasmine spies would overwrite the 'and' and 'calls' properties on the object being spied upon"); - }); - - it("adds a spyStrategy and callTracker to the spy", function() { - var spy = j$.createSpy(TestClass.prototype, TestClass.prototype.someFunction); - - expect(spy.and).toEqual(jasmine.any(j$.SpyStrategy)); - expect(spy.calls).toEqual(jasmine.any(j$.CallTracker)); - }); - - it("tracks the argument of calls", function () { - var spy = j$.createSpy(TestClass.prototype, TestClass.prototype.someFunction); - var trackSpy = spyOn(spy.calls, "track"); - - spy("arg"); - - expect(trackSpy.calls.mostRecent().args[0].args).toEqual(["arg"]); - }); - - it("tracks the context of calls", function () { - var spy = j$.createSpy(TestClass.prototype, TestClass.prototype.someFunction); - var trackSpy = spyOn(spy.calls, "track"); - - var contextObject = { spyMethod: spy }; - contextObject.spyMethod(); - - expect(trackSpy.calls.mostRecent().args[0].object).toEqual(contextObject); - }); - }); - - describe("createSpyObj", function() { - it("should create an object with a bunch of spy methods when you call jasmine.createSpyObj()", function() { - var spyObj = j$.createSpyObj('BaseName', ['method1', 'method2']); - - expect(spyObj).toEqual({ method1: jasmine.any(Function), method2: jasmine.any(Function)}); - expect(spyObj.method1.and.identity()).toEqual('BaseName.method1'); - expect(spyObj.method2.and.identity()).toEqual('BaseName.method2'); - }); - - it("should throw if you do not pass an array argument", function() { - expect(function() { - j$.createSpyObj('BaseName'); - }).toThrow("createSpyObj requires a non-empty array of method names to create spies for"); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/SpyStrategySpec.js b/collections/transformations/bower_components/jasmine/spec/core/SpyStrategySpec.js deleted file mode 100644 index 3fc32a3..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/SpyStrategySpec.js +++ /dev/null @@ -1,111 +0,0 @@ -describe("SpyStrategy", function() { - - it("defaults its name to unknown", function() { - var spyStrategy = new j$.SpyStrategy(); - - expect(spyStrategy.identity()).toEqual("unknown"); - }); - - it("takes a name", function() { - var spyStrategy = new j$.SpyStrategy({name: "foo"}); - - expect(spyStrategy.identity()).toEqual("foo"); - }); - - it("stubs an original function, if provided", function() { - var originalFn = jasmine.createSpy("original"), - spyStrategy = new j$.SpyStrategy({fn: originalFn}); - - spyStrategy.exec(); - - expect(originalFn).not.toHaveBeenCalled(); - }); - - it("allows an original function to be called, passed through the params and returns it's value", function() { - var originalFn = jasmine.createSpy("original").and.returnValue(42), - spyStrategy = new j$.SpyStrategy({fn: originalFn}), - returnValue; - - spyStrategy.callThrough(); - returnValue = spyStrategy.exec("foo"); - - expect(originalFn).toHaveBeenCalled(); - expect(originalFn.calls.mostRecent().args).toEqual(["foo"]); - expect(returnValue).toEqual(42); - }); - - it("can return a specified value when executed", function() { - var originalFn = jasmine.createSpy("original"), - spyStrategy = new j$.SpyStrategy({fn: originalFn}), - returnValue; - - spyStrategy.returnValue(17); - returnValue = spyStrategy.exec(); - - expect(originalFn).not.toHaveBeenCalled(); - expect(returnValue).toEqual(17); - }); - - it("allows an exception to be thrown when executed", function() { - var originalFn = jasmine.createSpy("original"), - spyStrategy = new j$.SpyStrategy({fn: originalFn}); - - spyStrategy.throwError(new TypeError("bar")); - - expect(function() { spyStrategy.exec(); }).toThrowError(TypeError, "bar"); - expect(originalFn).not.toHaveBeenCalled(); - }); - - it("allows a non-Error to be thrown, wrapping it into an exception when executed", function() { - var originalFn = jasmine.createSpy("original"), - spyStrategy = new j$.SpyStrategy({fn: originalFn}); - - spyStrategy.throwError("bar"); - - expect(function() { spyStrategy.exec(); }).toThrowError(Error, "bar"); - expect(originalFn).not.toHaveBeenCalled(); - }); - - it("allows a fake function to be called instead", function() { - var originalFn = jasmine.createSpy("original"), - fakeFn = jasmine.createSpy("fake").and.returnValue(67), - spyStrategy = new j$.SpyStrategy({fn: originalFn}), - returnValue; - - spyStrategy.callFake(fakeFn); - returnValue = spyStrategy.exec(); - - expect(originalFn).not.toHaveBeenCalled(); - expect(returnValue).toEqual(67); - }); - - it("allows a return to plan stubbing after another strategy", function() { - var originalFn = jasmine.createSpy("original"), - fakeFn = jasmine.createSpy("fake").and.returnValue(67), - spyStrategy = new j$.SpyStrategy({fn: originalFn}), - returnValue; - - spyStrategy.callFake(fakeFn); - returnValue = spyStrategy.exec(); - - expect(originalFn).not.toHaveBeenCalled(); - expect(returnValue).toEqual(67); - - spyStrategy.stub(); - returnValue = spyStrategy.exec(); - - expect(returnValue).toEqual(void 0); - }); - - it("returns the spy after changing the strategy", function(){ - var spy = {}, - spyFn = jasmine.createSpy('spyFn').and.returnValue(spy), - spyStrategy = new j$.SpyStrategy({getSpy: spyFn}); - - expect(spyStrategy.callThrough()).toBe(spy); - expect(spyStrategy.returnValue()).toBe(spy); - expect(spyStrategy.throwError()).toBe(spy); - expect(spyStrategy.callFake()).toBe(spy); - expect(spyStrategy.stub()).toBe(spy); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/SuiteSpec.js b/collections/transformations/bower_components/jasmine/spec/core/SuiteSpec.js deleted file mode 100644 index c29d2f4..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/SuiteSpec.js +++ /dev/null @@ -1,216 +0,0 @@ -describe("Suite", function() { - - it("keeps its id", function() { - var env = new j$.Env(), - suite = new j$.Suite({ - env: env, - id: 456, - description: "I am a suite" - }); - - expect(suite.id).toEqual(456); - }); - - it("returns its full name", function() { - var env = new j$.Env(), - suite = new j$.Suite({ - env: env, - description: "I am a suite" - }); - - expect(suite.getFullName()).toEqual("I am a suite"); - }); - - it("returns its full name when it has parent suites", function() { - var env = new j$.Env(), - parentSuite = new j$.Suite({ - env: env, - description: "I am a parent suite", - parentSuite: jasmine.createSpy('pretend top level suite') - }), - suite = new j$.Suite({ - env: env, - description: "I am a suite", - parentSuite: parentSuite - }); - - expect(suite.getFullName()).toEqual("I am a parent suite I am a suite"); - }); - - it("adds before functions in order of needed execution", function() { - var env = new j$.Env(), - suite = new j$.Suite({ - env: env, - description: "I am a suite" - }), - outerBefore = jasmine.createSpy('outerBeforeEach'), - innerBefore = jasmine.createSpy('insideBeforeEach'); - - suite.beforeEach(outerBefore); - suite.beforeEach(innerBefore); - - expect(suite.beforeFns).toEqual([innerBefore, outerBefore]); - }); - - it("adds after functions in order of needed execution", function() { - var env = new j$.Env(), - suite = new j$.Suite({ - env: env, - description: "I am a suite" - }), - outerAfter = jasmine.createSpy('outerAfterEach'), - innerAfter = jasmine.createSpy('insideAfterEach'); - - suite.afterEach(outerAfter); - suite.afterEach(innerAfter); - - expect(suite.afterFns).toEqual([innerAfter, outerAfter]); - }); - - it("can be disabled, but still calls callbacks", function() { - var env = new j$.Env(), - fakeQueueRunner = jasmine.createSpy('fake queue runner'), - onStart = jasmine.createSpy('onStart'), - resultCallback = jasmine.createSpy('resultCallback'), - onComplete = jasmine.createSpy('onComplete'), - suite = new j$.Suite({ - env: env, - description: "with a child suite", - onStart: onStart, - resultCallback: resultCallback, - queueRunner: fakeQueueRunner - }); - - suite.disable(); - - expect(suite.disabled).toBe(true); - - suite.execute(onComplete); - - expect(fakeQueueRunner).not.toHaveBeenCalled(); - expect(onStart).toHaveBeenCalled(); - expect(resultCallback).toHaveBeenCalled(); - expect(onComplete).toHaveBeenCalled(); - }); - - it("delegates execution of its specs and suites", function() { - var env = new j$.Env(), - parentSuiteDone = jasmine.createSpy('parent suite done'), - fakeQueueRunnerForParent = jasmine.createSpy('fake parent queue runner'), - parentSuite = new j$.Suite({ - env: env, - description: "I am a parent suite", - queueRunner: fakeQueueRunnerForParent - }), - fakeQueueRunner = jasmine.createSpy('fake queue runner'), - suite = new j$.Suite({ - env: env, - description: "with a child suite", - queueRunner: fakeQueueRunner - }), - fakeSpec1 = { - execute: jasmine.createSpy('fakeSpec1') - }; - - spyOn(suite, "execute"); - - parentSuite.addChild(fakeSpec1); - parentSuite.addChild(suite); - - parentSuite.execute(parentSuiteDone); - - var parentSuiteFns = fakeQueueRunnerForParent.calls.mostRecent().args[0].fns; - - parentSuiteFns[0](); - expect(fakeSpec1.execute).toHaveBeenCalled(); - parentSuiteFns[1](); - expect(suite.execute).toHaveBeenCalled(); - }); - - it("calls a provided onStart callback when starting", function() { - var env = new j$.Env(), - suiteStarted = jasmine.createSpy('suiteStarted'), - fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new j$.Suite({ - env: env, - description: "with a child suite", - onStart: suiteStarted, - queueRunner: fakeQueueRunner - }), - fakeSpec1 = { - execute: jasmine.createSpy('fakeSpec1') - }; - - suite.execute(); - - expect(suiteStarted).toHaveBeenCalledWith(suite); - }); - - it("calls a provided onComplete callback when done", function() { - var env = new j$.Env(), - suiteCompleted = jasmine.createSpy('parent suite done'), - fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new j$.Suite({ - env: env, - description: "with a child suite", - queueRunner: fakeQueueRunner - }), - fakeSpec1 = { - execute: jasmine.createSpy('fakeSpec1') - }; - - suite.execute(suiteCompleted); - - expect(suiteCompleted).toHaveBeenCalled(); - }); - - it("calls a provided result callback when done", function() { - var env = new j$.Env(), - suiteResultsCallback = jasmine.createSpy('suite result callback'), - fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new j$.Suite({ - env: env, - description: "with a child suite", - queueRunner: fakeQueueRunner, - resultCallback: suiteResultsCallback - }), - fakeSpec1 = { - execute: jasmine.createSpy('fakeSpec1') - }; - - suite.execute(); - - expect(suiteResultsCallback).toHaveBeenCalledWith({ - id: suite.id, - status: '', - description: "with a child suite", - fullName: "with a child suite" - }); - }); - - it("calls a provided result callback with status being disabled when disabled and done", function() { - var env = new j$.Env(), - suiteResultsCallback = jasmine.createSpy('suite result callback'), - fakeQueueRunner = function(attrs) { attrs.onComplete(); }, - suite = new j$.Suite({ - env: env, - description: "with a child suite", - queueRunner: fakeQueueRunner, - resultCallback: suiteResultsCallback - }), - fakeSpec1 = { - execute: jasmine.createSpy('fakeSpec1') - }; - - suite.disable(); - - suite.execute(); - - expect(suiteResultsCallback).toHaveBeenCalledWith({ - id: suite.id, - status: 'disabled', - description: "with a child suite", - fullName: "with a child suite" - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/TimerSpec.js b/collections/transformations/bower_components/jasmine/spec/core/TimerSpec.js deleted file mode 100644 index 41e2814..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/TimerSpec.js +++ /dev/null @@ -1,31 +0,0 @@ -describe("Timer", function() { - it("reports the time elapsed", function() { - var fakeNow = jasmine.createSpy('fake Date.now'), - timer = new j$.Timer({now: fakeNow}); - - fakeNow.and.returnValue(100); - timer.start(); - - fakeNow.and.returnValue(200); - - expect(timer.elapsed()).toEqual(100); - }); - - describe("when date is stubbed, perhaps by other testing helpers", function() { - var origDate = Date; - beforeEach(function() { - Date = jasmine.createSpy('date spy'); - }); - - afterEach(function() { - Date = origDate; - }); - - it("does not throw even though Date was taken away", function() { - var timer = new j$.Timer(); - - expect(timer.start).not.toThrow(); - expect(timer.elapsed()).toEqual(jasmine.any(Number)); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/UtilSpec.js b/collections/transformations/bower_components/jasmine/spec/core/UtilSpec.js deleted file mode 100644 index cddcc8d..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/UtilSpec.js +++ /dev/null @@ -1,28 +0,0 @@ -describe("j$.util", function() { - describe("isArray_", function() { - it("should return true if the argument is an array", function() { - expect(j$.isArray_([])).toBe(true); - expect(j$.isArray_(['a'])).toBe(true); - }); - - it("should return false if the argument is not an array", function() { - expect(j$.isArray_(undefined)).toBe(false); - expect(j$.isArray_({})).toBe(false); - expect(j$.isArray_(function() {})).toBe(false); - expect(j$.isArray_('foo')).toBe(false); - expect(j$.isArray_(5)).toBe(false); - expect(j$.isArray_(null)).toBe(false); - }); - }); - - describe("isUndefined", function() { - it("reports if a variable is defined", function() { - var a; - expect(j$.util.isUndefined(a)).toBe(true); - expect(j$.util.isUndefined(undefined)).toBe(true); - - var undefined = "diz be undefined yo"; - expect(j$.util.isUndefined(undefined)).toBe(false); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/integration/CustomMatchersSpec.js b/collections/transformations/bower_components/jasmine/spec/core/integration/CustomMatchersSpec.js deleted file mode 100644 index ee3e49a..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/integration/CustomMatchersSpec.js +++ /dev/null @@ -1,149 +0,0 @@ -describe("Custom Matchers (Integration)", function() { - var env; - var fakeTimer; - - beforeEach(function() { - env = new j$.Env(); - }); - - it("allows adding more matchers local to a spec", function(done) { - env.it('spec defining a custom matcher', function() { - env.addMatchers({ - matcherForSpec: function() { - return { - compare: function(actual, expected) { - return { pass: false, message: "matcherForSpec: actual: " + actual + "; expected: " + expected }; - } - } - } - }); - - env.expect("zzz").matcherForSpec("yyy"); - }); - - env.it("spec without custom matcher defined", function() { - expect(env.expect("zzz").matcherForSpec).toBeUndefined(); - }); - - var specDoneSpy = jasmine.createSpy("specDoneSpy"); - var expectations = function() { - var firstSpecResult = specDoneSpy.calls.first().args[0]; - expect(firstSpecResult.status).toEqual("failed"); - expect(firstSpecResult.failedExpectations[0].message).toEqual("matcherForSpec: actual: zzz; expected: yyy"); - done(); - }; - env.addReporter({ specDone:specDoneSpy, jasmineDone: expectations}); - - env.execute(); - }); - - it("passes the spec if the custom matcher passes", function(done) { - env.addMatchers({ - toBeReal: function() { - return { compare: function() { return { pass: true }; } }; - } - }); - - env.it("spec using custom matcher", function() { - env.expect(true).toBeReal(); - }); - - var specExpectations = function(result) { - expect(result.status).toEqual('passed'); - }; - - env.addReporter({ specDone: specExpectations, jasmineDone: done }); - env.execute(); - }); - - it("uses the negative compare function for a negative comparison, if provided", function(done) { - env.addMatchers({ - toBeReal: function() { - return { - compare: function() { return { pass: true }; }, - negativeCompare: function() { return { pass: true }; } - }; - } - }); - - env.it("spec with custom negative comparison matcher", function() { - env.expect(true).not.toBeReal(); - }); - - var specExpectations = function(result) { - expect(result.status).toEqual('passed'); - } - - env.addReporter({ specDone: specExpectations, jasmineDone: done }); - env.execute(); - }); - - it("generates messages with the same rules as built in matchers absent a custom message", function(done) { - env.addMatchers({ - toBeReal: function() { - return { - compare: function() { - return { pass: false }; - } - } - } - }); - - env.it('spec with an expectation', function() { - env.expect("a").toBeReal(); - }); - - var specExpectations = function(result) { - expect(result.failedExpectations[0].message).toEqual("Expected 'a' to be real."); - }; - - env.addReporter({ specDone: specExpectations, jasmineDone: done }); - env.execute(); - }); - - it("passes the expected and actual arguments to the comparison function", function(done) { - var argumentSpy = jasmine.createSpy("argument spy").and.returnValue({ pass: true }); - env.addMatchers({ - toBeReal: function() { - return { compare: argumentSpy }; - } - }); - - env.it('spec with an expectation', function () { - env.expect(true).toBeReal(); - env.expect(true).toBeReal("arg"); - env.expect(true).toBeReal("arg1", "arg2"); - }); - - var specExpectations = function() { - expect(argumentSpy).toHaveBeenCalledWith(true); - expect(argumentSpy).toHaveBeenCalledWith(true, "arg"); - expect(argumentSpy).toHaveBeenCalledWith(true, "arg1", "arg2"); - }; - - env.addReporter({ specDone: specExpectations, jasmineDone: done }); - env.execute(); - }); - - it("passes the jasmine utility and current equality matchers to the expectation factory", function(done) { - var matcherFactory = function() { return { compare: function() { return {pass: true}; }}; }, - argumentSpy = jasmine.createSpy("argument spy").and.returnValue(matcherFactory), - customEqualityFn = function() { return true; }; - - env.addCustomEqualityTester(customEqualityFn); - env.addMatchers({ - toBeReal: argumentSpy - }); - - env.it("spec with expectation", function() { - env.expect(true).toBeReal(); - }); - - var specExpectations = function() { - expect(argumentSpy).toHaveBeenCalledWith(j$.matchersUtil, [customEqualityFn]); - }; - - env.addReporter({ specDone: specExpectations, jasmineDone: done }); - env.execute(); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/integration/EnvSpec.js b/collections/transformations/bower_components/jasmine/spec/core/integration/EnvSpec.js deleted file mode 100644 index 5381fdd..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/integration/EnvSpec.js +++ /dev/null @@ -1,506 +0,0 @@ -describe("Env integration", function() { - - it("Suites execute as expected (no nesting)", function(done) { - var env = new j$.Env(), - calls = []; - - var assertions = function() { - expect(calls).toEqual([ - "with a spec", - "and another spec" - ]); - - done(); - }; - - env.addReporter({ jasmineDone: assertions}); - - env.describe("A Suite", function() { - env.it("with a spec", function() { - calls.push("with a spec"); - }); - env.it("and another spec", function() { - calls.push("and another spec"); - }); - }); - - env.execute(); - }); - - it("Nested Suites execute as expected", function(done) { - var env = new j$.Env(), - calls = []; - - var assertions = function() { - expect(calls).toEqual([ - 'an outer spec', - 'an inner spec', - 'another inner spec' - ]); - - done(); - }; - - env.addReporter({ jasmineDone: assertions }); - - env.describe("Outer suite", function() { - env.it("an outer spec", function() { - calls.push('an outer spec') - }); - env.describe("Inner suite", function() { - env.it("an inner spec", function() { - calls.push('an inner spec'); - }); - env.it("another inner spec", function() { - calls.push('another inner spec'); - }); - }); - }); - - env.execute(); - }); - - it("Multiple top-level Suites execute as expected", function(done) { - var env = new j$.Env(), - calls = []; - - var assertions = function() { - expect(calls).toEqual([ - 'an outer spec', - 'an inner spec', - 'another inner spec', - 'a 2nd outer spec' - ]); - - done(); - }; - - env.addReporter({ jasmineDone: assertions }); - - - env.describe("Outer suite", function() { - env.it("an outer spec", function() { - calls.push('an outer spec') - }); - env.describe("Inner suite", function() { - env.it("an inner spec", function() { - calls.push('an inner spec'); - }); - env.it("another inner spec", function() { - calls.push('another inner spec'); - }); - }); - }); - - env.describe("Another outer suite", function() { - env.it("a 2nd outer spec", function() { - calls.push('a 2nd outer spec') - }); - }); - - env.execute(); - }); - - it("calls associated befores/specs/afters with the same 'this'", function(done) { - var env = new j$.Env(); - - env.addReporter({jasmineDone: done}); - - env.describe("tests", function() { - var firstTimeThrough = true, firstSpecContext, secondSpecContext; - - env.beforeEach(function() { - if (firstTimeThrough) { - firstSpecContext = this; - } else { - secondSpecContext = this; - } - expect(this).toEqual({}); - }); - - env.it("sync spec", function() { - expect(this).toBe(firstSpecContext); - }); - - env.it("another sync spec", function() { - expect(this).toBe(secondSpecContext); - }); - - env.afterEach(function() { - if (firstTimeThrough) { - expect(this).toBe(firstSpecContext); - firstTimeThrough = false; - } else { - expect(this).toBe(secondSpecContext); - } - }); - }); - - env.execute(); - }); - - it("calls associated befores/its/afters with the same 'this' for an async spec", function(done) { - var env = new j$.Env(); - - env.addReporter({jasmineDone: done}); - - env.describe("with an async spec", function() { - var specContext; - - env.beforeEach(function() { - specContext = this; - expect(this).toEqual({}); - }); - - env.it("sync spec", function(underTestCallback) { - expect(this).toBe(specContext); - underTestCallback(); - }); - - env.afterEach(function() { - expect(this).toBe(specContext); - }); - }); - - env.execute(); - }); - - it("Allows specifying which specs and suites to run", function(done) { - var env = new j$.Env(), - calls = [], - suiteCallback = jasmine.createSpy('suite callback'), - firstSpec, - secondSuite; - - var assertions = function() { - expect(calls).toEqual([ - 'third spec', - 'first spec' - ]); - expect(suiteCallback).toHaveBeenCalled(); - done(); - }; - - env.addReporter({jasmineDone: assertions, suiteDone: suiteCallback}); - - env.describe("first suite", function() { - firstSpec = env.it("first spec", function() { - calls.push('first spec'); - }); - env.it("second spec", function() { - calls.push('second spec'); - }); - }); - - secondSuite = env.describe("second suite", function() { - env.it("third spec", function() { - calls.push('third spec'); - }); - }); - - env.execute([secondSuite.id, firstSpec.id]); - }); - - it("Functions can be spied on and have their calls tracked", function () { - var env = new j$.Env(); - - var originalFunctionWasCalled = false; - var subject = { spiedFunc: function() { originalFunctionWasCalled = true; } }; - - var spy = env.spyOn(subject, 'spiedFunc'); - - expect(subject.spiedFunc).toEqual(spy); - - expect(subject.spiedFunc.calls.any()).toEqual(false); - expect(subject.spiedFunc.calls.count()).toEqual(0); - - subject.spiedFunc('foo'); - - expect(subject.spiedFunc.calls.any()).toEqual(true); - expect(subject.spiedFunc.calls.count()).toEqual(1); - expect(subject.spiedFunc.calls.mostRecent().args).toEqual(['foo']); - expect(subject.spiedFunc.calls.mostRecent().object).toEqual(subject); - expect(originalFunctionWasCalled).toEqual(false); - - subject.spiedFunc('bar'); - expect(subject.spiedFunc.calls.count()).toEqual(2); - expect(subject.spiedFunc.calls.mostRecent().args).toEqual(['bar']); - }); - - it("Mock clock can be installed and used in tests", function(done) { - var globalSetTimeout = jasmine.createSpy('globalSetTimeout'), - delayedFunctionForGlobalClock = jasmine.createSpy('delayedFunctionForGlobalClock'), - delayedFunctionForMockClock = jasmine.createSpy('delayedFunctionForMockClock'), - env = new j$.Env({global: { setTimeout: globalSetTimeout }}); - - var assertions = function() { - expect(delayedFunctionForMockClock).toHaveBeenCalled(); - expect(globalSetTimeout).toHaveBeenCalledWith(delayedFunctionForGlobalClock, 100); - - done(); - }; - - env.addReporter({ jasmineDone: assertions }); - - env.describe("tests", function() { - env.it("test with mock clock", function() { - env.clock.install(); - env.clock.setTimeout(delayedFunctionForMockClock, 100); - env.clock.tick(100); - env.clock.uninstall(); - }); - env.it("test without mock clock", function() { - env.clock.setTimeout(delayedFunctionForGlobalClock, 100); - }); - }); - - expect(globalSetTimeout).not.toHaveBeenCalled(); - expect(delayedFunctionForMockClock).not.toHaveBeenCalled(); - - env.execute(); - }); - - it("should run async specs in order, waiting for them to complete", function(done) { - var env = new j$.Env(), mutatedVar; - - env.describe("tests", function() { - env.beforeEach(function() { - mutatedVar = 2; - }); - - env.it("async spec", function(underTestCallback) { - setTimeout(function() { - expect(mutatedVar).toEqual(2); - underTestCallback(); - done(); - }, 0); - }); - - env.it("after async spec", function() { - mutatedVar = 3; - }); - }); - - env.execute(); - }); - - describe("with a mock clock", function() { - var originalTimeout; - - beforeEach(function() { - originalTimeout = j$.DEFAULT_TIMEOUT_INTERVAL; - jasmine.getEnv().clock.install(); - }); - - afterEach(function() { - jasmine.getEnv().clock.uninstall(); - j$.DEFAULT_TIMEOUT_INTERVAL = originalTimeout; - }); - - it("should wait a specified interval before failing specs haven't called done yet", function(done) { - var env = new j$.Env(), - reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone" ]); - - reporter.specDone.and.callFake(function() { - expect(reporter.specDone).toHaveBeenCalledWith(jasmine.objectContaining({status: 'failed'})); - }); - - reporter.jasmineDone.and.callFake(function() { - expect(reporter.jasmineDone.calls.count()).toEqual(1); - done(); - }); - - env.addReporter(reporter); - j$.DEFAULT_TIMEOUT_INTERVAL = 8414; - - env.it("async spec that doesn't call done", function(underTestCallback) { - env.expect(true).toBeTruthy(); - jasmine.getEnv().clock.tick(8416); - }); - - env.execute(); - }); - }); - - // TODO: something is wrong with this spec - it("should report as expected", function(done) { - var env = new j$.Env(), - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - reporter.jasmineDone.and.callFake(function() { - expect(reporter.jasmineStarted).toHaveBeenCalledWith({ - totalSpecsDefined: 3 - }); - var suiteResult = reporter.suiteStarted.calls.first().args[0]; - expect(suiteResult.description).toEqual("A Suite"); - - done(); - }); - - env.addReporter(reporter); - - env.describe("A Suite", function() { - env.it("with a top level spec", function() { - env.expect(true).toBe(true); - }); - env.describe("with a nested suite", function() { - env.xit("with a pending spec", function() { - env.expect(true).toBe(true); - }); - env.it("with a spec", function() { - env.expect(true).toBe(false); - }); - }); - }); - - env.execute(); - }); - - it("should be possible to get full name from a spec", function() { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - topLevelSpec, nestedSpec, doublyNestedSpec; - - env.describe("my tests", function() { - topLevelSpec = env.it("are sometimes top level", function() { - }); - env.describe("are sometimes", function() { - nestedSpec = env.it("singly nested", function() { - }); - env.describe("even", function() { - doublyNestedSpec = env.it("doubly nested", function() { - }); - }); - }); - }); - - expect(topLevelSpec.getFullName()).toBe("my tests are sometimes top level"); - expect(nestedSpec.getFullName()).toBe("my tests are sometimes singly nested"); - expect(doublyNestedSpec.getFullName()).toBe("my tests are sometimes even doubly nested"); - }); - - it("Custom equality testers should be per spec", function(done) { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - reporter.jasmineDone.and.callFake(function() { - var firstSpecResult = reporter.specDone.calls.first().args[0], - secondSpecResult = reporter.specDone.calls.mostRecent().args[0]; - - expect(firstSpecResult.status).toEqual("passed"); - expect(secondSpecResult.status).toEqual("failed"); - - done(); - }); - - env.addReporter(reporter); - - env.describe("testing custom equality testers", function() { - env.it("with a custom tester", function() { - env.addCustomEqualityTester(function(a, b) { return true; }); - env.expect("a").toEqual("b"); - }); - - env.it("without a custom tester", function() { - env.expect("a").toEqual("b"); - }); - }); - - env.execute(); - }); - - it("Custom matchers should be per spec", function() { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - matchers = { - toFoo: function() {} - }, - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - env.addReporter(reporter); - - env.describe("testing custom matchers", function() { - env.it("with a custom matcher", function() { - env.addMatchers(matchers); - expect(env.expect().toFoo).toBeDefined(); - }); - - env.it("without a custom matcher", function() { - expect(env.expect().toFoo).toBeUndefined(); - }); - }); - - env.execute(); - }); - - it("Custom equality testers for toContain should be per spec", function(done) { - var env = new j$.Env({global: { setTimeout: setTimeout }}), - reporter = jasmine.createSpyObj('fakeReporter', [ - "jasmineStarted", - "jasmineDone", - "suiteStarted", - "suiteDone", - "specStarted", - "specDone" - ]); - - reporter.jasmineDone.and.callFake(function() { - var firstSpecResult = reporter.specDone.calls.first().args[0], - secondSpecResult = reporter.specDone.calls.mostRecent().args[0]; - - expect(firstSpecResult.status).toEqual("passed"); - expect(secondSpecResult.status).toEqual("failed"); - - done(); - }); - - env.addReporter(reporter); - - env.describe("testing custom equality testers", function() { - env.it("with a custom tester", function() { - env.addCustomEqualityTester(function(a, b) { return true; }); - env.expect(["a"]).toContain("b"); - }); - - env.it("without a custom tester", function() { - env.expect("a").toContain("b"); - }); - }); - - env.execute(); - }); - - it("produces an understandable error message when an 'expect' is used outside of a current spec", function(done) { - var env = new j$.Env(); - - env.describe("A Suite", function() { - env.it("an async spec that is actually synchronous", function(underTestCallback) { - underTestCallback(); - expect(function() { env.expect('a').toEqual('a'); }).toThrowError(/'expect' was used when there was no current spec/); - done(); - }); - }); - - env.execute(); - }); -}); - diff --git a/collections/transformations/bower_components/jasmine/spec/core/integration/SpecRunningSpec.js b/collections/transformations/bower_components/jasmine/spec/core/integration/SpecRunningSpec.js deleted file mode 100644 index 3adf8d0..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/integration/SpecRunningSpec.js +++ /dev/null @@ -1,306 +0,0 @@ -describe("jasmine spec running", function () { - var env; - var fakeTimer; - - beforeEach(function() { - env = new j$.Env(); - }); - - it('should assign spec ids sequentially', function() { - var it0, it1, it2, it3, it4; - env.describe('test suite', function() { - it0 = env.it('spec 0', function() { - }); - it1 = env.it('spec 1', function() { - }); - it2 = env.xit('spec 2', function() { - }); - it3 = env.it('spec 3', function() { - }); - }); - env.describe('test suite 2', function() { - it4 = env.it('spec 4', function() { - }); - }); - - expect(it0.id).toEqual('spec0'); - expect(it1.id).toEqual('spec1'); - expect(it2.id).toEqual('spec2'); - expect(it3.id).toEqual('spec3'); - expect(it4.id).toEqual('spec4'); - }); - - it('nested suites', function (done) { - - var foo = 0; - var bar = 0; - var baz = 0; - var quux = 0; - var nested = env.describe('suite', function () { - env.describe('nested', function () { - env.it('should run nested suites', function () { - foo++; - }); - env.it('should run nested suites', function () { - bar++; - }); - }); - - env.describe('nested 2', function () { - env.it('should run suites following nested suites', function () { - baz++; - }); - }); - - env.it('should run tests following nested suites', function () { - quux++; - }); - }); - - expect(foo).toEqual(0); - expect(bar).toEqual(0); - expect(baz).toEqual(0); - expect(quux).toEqual(0); - nested.execute(function() { - expect(foo).toEqual(1); - expect(bar).toEqual(1); - expect(baz).toEqual(1); - expect(quux).toEqual(1); - done(); - }); - }); - - it("should permit nested describes", function(done) { - var actions = []; - - env.beforeEach(function () { - actions.push('topSuite beforeEach'); - }); - - env.afterEach(function () { - actions.push('topSuite afterEach'); - }); - - env.describe('Something', function() { - env.beforeEach(function() { - actions.push('outer beforeEach'); - }); - - env.afterEach(function() { - actions.push('outer afterEach'); - }); - - env.it('does it 1', function() { - actions.push('outer it 1'); - }); - - env.describe('Inner 1', function() { - env.beforeEach(function() { - actions.push('inner 1 beforeEach'); - }); - - env.afterEach(function() { - actions.push('inner 1 afterEach'); - }); - - env.it('does it 2', function() { - actions.push('inner 1 it'); - }); - }); - - env.it('does it 3', function() { - actions.push('outer it 2'); - }); - - env.describe('Inner 2', function() { - env.beforeEach(function() { - actions.push('inner 2 beforeEach'); - }); - - env.afterEach(function() { - actions.push('inner 2 afterEach'); - }); - - env.it('does it 2', function() { - actions.push('inner 2 it'); - }); - }); - }); - - var assertions = function() { - var expected = [ - "topSuite beforeEach", - "outer beforeEach", - "outer it 1", - "outer afterEach", - "topSuite afterEach", - - "topSuite beforeEach", - "outer beforeEach", - "inner 1 beforeEach", - "inner 1 it", - "inner 1 afterEach", - "outer afterEach", - "topSuite afterEach", - - "topSuite beforeEach", - "outer beforeEach", - "outer it 2", - "outer afterEach", - "topSuite afterEach", - - "topSuite beforeEach", - "outer beforeEach", - "inner 2 beforeEach", - "inner 2 it", - "inner 2 afterEach", - "outer afterEach", - "topSuite afterEach" - ]; - expect(actions).toEqual(expected); - done(); - } - - env.addReporter({jasmineDone: assertions}); - - env.execute(); - }); - - it("should run multiple befores and afters in the order they are declared", function(done) { - var actions = []; - - env.beforeEach(function () { - actions.push('runner beforeEach1'); - }); - - env.afterEach(function () { - actions.push('runner afterEach1'); - }); - - env.beforeEach(function () { - actions.push('runner beforeEach2'); - }); - - env.afterEach(function () { - actions.push('runner afterEach2'); - }); - - env.describe('Something', function() { - env.beforeEach(function() { - actions.push('beforeEach1'); - }); - - env.afterEach(function() { - actions.push('afterEach1'); - }); - - env.beforeEach(function() { - actions.push('beforeEach2'); - }); - - env.afterEach(function() { - actions.push('afterEach2'); - }); - - env.it('does it 1', function() { - actions.push('outer it 1'); - }); - }); - - var assertions = function() { - var expected = [ - "runner beforeEach1", - "runner beforeEach2", - "beforeEach1", - "beforeEach2", - "outer it 1", - "afterEach2", - "afterEach1", - "runner afterEach2", - "runner afterEach1" - ]; - expect(actions).toEqual(expected); - done(); - }; - - env.addReporter({jasmineDone: assertions}); - - env.execute(); - }); - - it("shouldn't run disabled suites", function(done) { - var specInADisabledSuite = jasmine.createSpy("specInADisabledSuite"), - suite = env.describe('A Suite', function() { - env.xdescribe('with a disabled suite', function(){ - env.it('spec inside a disabled suite', specInADisabledSuite); - }); - }); - - suite.execute(function() { - expect(specInADisabledSuite).not.toHaveBeenCalled(); - done(); - }); - }); - - it("should set all pending specs to pending when a suite is run", function(done) { - var pendingSpec, - suite = env.describe('default current suite', function() { - pendingSpec = env.it("I am a pending spec"); - }); - - suite.execute(function() { - expect(pendingSpec.status()).toBe("pending"); - done(); - }); - }); - - - // TODO: is this useful? It doesn't catch syntax errors - xit("should recover gracefully when there are errors in describe functions", function() { - var specs = []; - var superSimpleReporter = new j$.Reporter(); - superSimpleReporter.reportSpecResults = function(result) { - specs.push("Spec: " + result.fullName); - }; - - try { - env.describe("outer1", function() { - env.describe("inner1", function() { - env.it("should thingy", function() { - this.expect(true).toEqual(true); - }); - - throw new Error("fake error"); - }); - - env.describe("inner2", function() { - env.it("should other thingy", function() { - this.expect(true).toEqual(true); - }); - }); - - throw new Error("fake error"); - - }); - } catch(e) { - } - - env.describe("outer2", function() { - env.it("should xxx", function() { - this.expect(true).toEqual(true); - }); - }); - - env.addReporter(superSimpleReporter); - env.execute(); - - expect(specs.join('')).toMatch(new RegExp( - 'Spec: outer1 inner1 should thingy.' + - 'Spec: outer1 inner1 encountered a declaration exception.' + - 'Spec: outer1 inner2 should other thingy.' + - 'Spec: outer1 encountered a declaration exception.' + - 'Spec: outer2 should xxx.' - )); - - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/matchersUtilSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/matchersUtilSpec.js deleted file mode 100644 index 4a981a1..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/matchersUtilSpec.js +++ /dev/null @@ -1,239 +0,0 @@ -describe("matchersUtil", function() { - describe("equals", function() { - it("passes for literals that are triple-equal", function() { - expect(j$.matchersUtil.equals(null, null)).toBe(true); - expect(j$.matchersUtil.equals(void 0, void 0)).toBe(true); - }); - - it("fails for things that are not equivalent", function() { - expect(j$.matchersUtil.equals({a: "foo"}, 1)).toBe(false); - }); - - it("passes for Strings that are equivalent", function() { - expect(j$.matchersUtil.equals("foo", "foo")).toBe(true); - }); - - it("fails for Strings that are not equivalent", function() { - expect(j$.matchersUtil.equals("foo", "bar")).toBe(false); - }); - - it("passes for Numbers that are equivalent", function() { - expect(j$.matchersUtil.equals(123, 123)).toBe(true); - }); - - it("fails for Numbers that are not equivalent", function() { - expect(j$.matchersUtil.equals(123, 456)).toBe(false); - }); - - it("passes for Dates that are equivalent", function() { - expect(j$.matchersUtil.equals(new Date("Jan 1, 1970"), new Date("Jan 1, 1970"))).toBe(true); - }); - - it("fails for Dates that are not equivalent", function() { - expect(j$.matchersUtil.equals(new Date("Jan 1, 1970"), new Date("Feb 3, 1991"))).toBe(false); - }); - - it("passes for Booleans that are equivalent", function() { - expect(j$.matchersUtil.equals(true, true)).toBe(true); - }); - - it("fails for Booleans that are not equivalent", function() { - expect(j$.matchersUtil.equals(true, false)).toBe(false); - }); - - it("passes for RegExps that are equivalent", function() { - expect(j$.matchersUtil.equals(/foo/, /foo/)).toBe(true); - }); - - it("fails for RegExps that are not equivalent", function() { - expect(j$.matchersUtil.equals(/foo/, /bar/)).toBe(false); - expect(j$.matchersUtil.equals(new RegExp("foo", "i"), new RegExp("foo"))).toBe(false); - }); - - it("passes for Arrays that are equivalent", function() { - expect(j$.matchersUtil.equals([1, 2], [1, 2])).toBe(true); - }); - - it("fails for Arrays that are not equivalent", function() { - expect(j$.matchersUtil.equals([1, 2], [1, 2, 3])).toBe(false); - }); - - it("passes for Errors that are the same type and have the same message", function() { - expect(j$.matchersUtil.equals(new Error("foo"), new Error("foo"))).toBe(true); - }); - - it("fails for Errors that are the same type and have different messages", function() { - expect(j$.matchersUtil.equals(new Error("foo"), new Error("bar"))).toBe(false); - }); - - it("passes for Objects that are equivalent (simple case)", function() { - expect(j$.matchersUtil.equals({a: "foo"}, {a: "foo"})).toBe(true); - }); - - it("fails for Objects that are not equivalent (simple case)", function() { - expect(j$.matchersUtil.equals({a: "foo"}, {a: "bar"})).toBe(false); - }); - - it("passes for Objects that are equivalent (deep case)", function() { - expect(j$.matchersUtil.equals({a: "foo", b: { c: "bar"}}, {a: "foo", b: { c: "bar"}})).toBe(true); - }); - - it("fails for Objects that are not equivalent (deep case)", function() { - expect(j$.matchersUtil.equals({a: "foo", b: { c: "baz"}}, {a: "foo", b: { c: "bar"}})).toBe(false); - }); - - it("passes for Objects that are equivalent (with cycles)", function() { - var actual = { a: "foo" }, - expected = { a: "foo" }; - - actual.b = actual; - expected.b = actual; - - expect(j$.matchersUtil.equals(actual, expected)).toBe(true); - }); - - it("fails for Objects that are not equivalent (with cycles)", function() { - var actual = { a: "foo" }, - expected = { a: "bar" }; - - actual.b = actual; - expected.b = actual; - - expect(j$.matchersUtil.equals(actual, expected)).toBe(false); - }); - - it("fails when comparing an empty object to an empty array (issue #114)", function() { - var emptyObject = {}, - emptyArray = []; - - expect(j$.matchersUtil.equals(emptyObject, emptyArray)).toBe(false); - expect(j$.matchersUtil.equals(emptyArray, emptyObject)).toBe(false); - }); - - it("passes for equivalent frozen objects (GitHub issue #266)", function() { - if (jasmine.getEnv().ieVersion < 9) { return; } - - var a = { foo: 1 }, - b = {foo: 1 }; - - Object.freeze(a); - Object.freeze(b); - - expect(j$.matchersUtil.equals(a,b)).toBe(true); - }); - - it("passes when Any is used", function() { - var number = 3, - anyNumber = new j$.Any(Number); - - expect(j$.matchersUtil.equals(number, anyNumber)).toBe(true); - expect(j$.matchersUtil.equals(anyNumber, number)).toBe(true); - }); - - it("fails when Any is compared to something unexpected", function() { - var number = 3, - anyString = new j$.Any(String); - - expect(j$.matchersUtil.equals(number, anyString)).toBe(false); - expect(j$.matchersUtil.equals(anyString, number)).toBe(false); - }); - - it("passes when ObjectContaining is used", function() { - var obj = { - foo: 3, - bar: 7 - }; - - expect(j$.matchersUtil.equals(obj, new j$.ObjectContaining({foo: 3}))).toBe(true); - }); - - it("passes when a custom equality matcher returns true", function() { - var tester = function(a, b) { return true; }; - - expect(j$.matchersUtil.equals(1, 2, [tester])).toBe(true); - }); - - it("passes for two empty Objects", function () { - expect(j$.matchersUtil.equals({}, {})).toBe(true); - }); - - describe("when a custom equality matcher is installed that returns 'undefined'", function () { - var tester = function(a, b) { return jasmine.undefined; }; - - it("passes for two empty Objects", function () { - expect(j$.matchersUtil.equals({}, {}, [tester])).toBe(true); - }); - }); - - it("fails for equivalents when a custom equality matcher returns false", function() { - var tester = function(a, b) { return false; }; - - expect(j$.matchersUtil.equals(1, 1, [tester])).toBe(false); - }); - }); - - describe("contains", function() { - it("passes when expected is a substring of actual", function() { - expect(j$.matchersUtil.contains("ABC", "B")).toBe(true); - }); - - it("fails when expected is a not substring of actual", function() { - expect(j$.matchersUtil.contains("ABC", "X")).toBe(false); - }); - - it("passes when expected is an element in an actual array", function() { - expect(j$.matchersUtil.contains(['foo', 'bar'], 'foo')).toBe(true); - }); - - it("fails when expected is not an element in an actual array", function() { - expect(j$.matchersUtil.contains(['foo', 'bar'], 'baz')).toBe(false); - }); - - it("passes with mixed-element arrays", function() { - expect(j$.matchersUtil.contains(["foo", {some: "bar"}], "foo")).toBe(true); - expect(j$.matchersUtil.contains(["foo", {some: "bar"}], {some: "bar"})).toBe(true); - }); - - it("uses custom equality testers if passed in and actual is an Array", function() { - var customTester = function(a, b) {return true;}; - - expect(j$.matchersUtil.contains([1, 2], 2, [customTester])).toBe(true); - }); - - it("fails when actual is undefined", function() { - expect(j$.matchersUtil.contains(undefined, 'A')).toBe(false); - }); - - it("fails when actual is null", function() { - expect(j$.matchersUtil.contains(null, 'A')).toBe(false); - }); - }); - - describe("buildMessage", function() { - - it("builds an English sentence for a failure case", function() { - var actual = "foo", - name = "toBar", - message = j$.matchersUtil.buildFailureMessage(name, false, actual); - - expect(message).toEqual("Expected 'foo' to bar."); - }); - - it("builds an English sentence for a 'not' failure case", function() { - var actual = "foo", - name = "toBar", - isNot = true, - message = message = j$.matchersUtil.buildFailureMessage(name, isNot, actual); - - expect(message).toEqual("Expected 'foo' not to bar."); - }); - - it("builds an English sentence for an arbitrary array of expected arguments", function() { - var actual = "foo", - name = "toBar", - message = j$.matchersUtil.buildFailureMessage(name, false, actual, "quux", "corge"); - - expect(message).toEqual("Expected 'foo' to bar 'quux', 'corge'."); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeCloseToSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeCloseToSpec.js deleted file mode 100644 index c7975bd..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeCloseToSpec.js +++ /dev/null @@ -1,51 +0,0 @@ -describe("toBeCloseTo", function() { - it("passes when within two decimal places by default", function() { - var matcher = j$.matchers.toBeCloseTo(), - result; - - result = matcher.compare(0, 0); - expect(result.pass).toBe(true); - - result = matcher.compare(0, 0.001); - expect(result.pass).toBe(true); - }); - - it("fails when not within two decimal places by default", function() { - var matcher = j$.matchers.toBeCloseTo(), - result; - - result = matcher.compare(0, 0.01); - expect(result.pass).toBe(false); - }); - - it("accepts an optional precision argument", function() { - var matcher = j$.matchers.toBeCloseTo(), - result; - - result = matcher.compare(0, 0.1, 0); - expect(result.pass).toBe(true); - - result = matcher.compare(0, 0.0001, 3); - expect(result.pass).toBe(true); - }); - - it("rounds expected values", function() { - var matcher = j$.matchers.toBeCloseTo(), - result; - - result = matcher.compare(1.23, 1.229); - expect(result.pass).toBe(true); - - result = matcher.compare(1.23, 1.226); - expect(result.pass).toBe(true); - - result = matcher.compare(1.23, 1.225); - expect(result.pass).toBe(true); - - result = matcher.compare(1.23, 1.2249999); - expect(result.pass).toBe(false); - - result = matcher.compare(1.23, 1.234); - expect(result.pass).toBe(true); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeDefinedSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeDefinedSpec.js deleted file mode 100644 index 7e6626a..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeDefinedSpec.js +++ /dev/null @@ -1,18 +0,0 @@ -describe("toBeDefined", function() { - it("matches for defined values", function() { - var matcher = j$.matchers.toBeDefined(), - result; - - - result = matcher.compare('foo'); - expect(result.pass).toBe(true); - }); - - it("fails when matching undefined values", function() { - var matcher = j$.matchers.toBeDefined(), - result; - - result = matcher.compare(void 0); - expect(result.pass).toBe(false); - }) -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeFalsySpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeFalsySpec.js deleted file mode 100644 index aa61283..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeFalsySpec.js +++ /dev/null @@ -1,38 +0,0 @@ -describe("toBeFalsy", function() { - it("passes for 'falsy' values", function() { - var matcher = j$.matchers.toBeFalsy(), - result; - - result = matcher.compare(false); - expect(result.pass).toBe(true); - - result = matcher.compare(0); - expect(result.pass).toBe(true); - - result = matcher.compare(''); - expect(result.pass).toBe(true); - - result = matcher.compare(null); - expect(result.pass).toBe(true); - - result = matcher.compare(void 0); - expect(result.pass).toBe(true); - }); - - it("fails for 'truthy' values", function() { - var matcher = j$.matchers.toBeFalsy(), - result; - - result = matcher.compare(true); - expect(result.pass).toBe(false); - - result = matcher.compare(1); - expect(result.pass).toBe(false); - - result = matcher.compare("foo"); - expect(result.pass).toBe(false); - - result = matcher.compare({}); - expect(result.pass).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeGreaterThanSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeGreaterThanSpec.js deleted file mode 100644 index c530dcf..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeGreaterThanSpec.js +++ /dev/null @@ -1,20 +0,0 @@ -describe("toBeGreaterThan", function() { - it("passes when actual > expected", function() { - var matcher = j$.matchers.toBeGreaterThan(), - result; - - result = matcher.compare(2, 1); - expect(result.pass).toBe(true); - }); - - it("fails when actual <= expected", function() { - var matcher = j$.matchers.toBeGreaterThan(), - result; - - result = matcher.compare(1, 1); - expect(result.pass).toBe(false); - - result = matcher.compare(1, 2); - expect(result.pass).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeLessThanSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeLessThanSpec.js deleted file mode 100644 index 53938d2..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeLessThanSpec.js +++ /dev/null @@ -1,20 +0,0 @@ -describe("toBeLessThan", function() { - it("passes when actual < expected", function() { - var matcher = j$.matchers.toBeLessThan(), - result; - - result = matcher.compare(1, 2); - expect(result.pass).toBe(true); - }); - - it("fails when actual <= expected", function() { - var matcher = j$.matchers.toBeLessThan(), - result; - - result = matcher.compare(1, 1); - expect(result.pass).toBe(false); - - result = matcher.compare(2, 1); - expect(result.pass).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNaNSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNaNSpec.js deleted file mode 100644 index 4c82a0f..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNaNSpec.js +++ /dev/null @@ -1,37 +0,0 @@ -describe("toBeNaN", function() { - it("passes for NaN with a custom .not fail", function() { - var matcher = j$.matchers.toBeNaN(), - result; - - result = matcher.compare(Number.NaN); - expect(result.pass).toBe(true); - expect(result.message).toEqual("Expected actual not to be NaN."); - }); - - it("fails for anything not a NaN", function() { - var matcher = j$.matchers.toBeNaN(), - result; - - result = matcher.compare(1); - expect(result.pass).toBe(false); - - result = matcher.compare(null); - expect(result.pass).toBe(false); - - result = matcher.compare(void 0); - expect(result.pass).toBe(false); - - result = matcher.compare(''); - expect(result.pass).toBe(false); - - result = matcher.compare(Number.POSITIVE_INFINITY); - expect(result.pass).toBe(false); - }); - - it("has a custom message on failure", function() { - var matcher = j$.matchers.toBeNaN(), - result = matcher.compare(0); - - expect(result.message()).toEqual("Expected 0 to be NaN."); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNullSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNullSpec.js deleted file mode 100644 index 8a178d5..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeNullSpec.js +++ /dev/null @@ -1,17 +0,0 @@ -describe("toBeNull", function() { - it("passes for null", function() { - var matcher = j$.matchers.toBeNull(), - result; - - result = matcher.compare(null); - expect(result.pass).toBe(true); - }); - - it("fails for non-null", function() { - var matcher = j$.matchers.toBeNull(), - result; - - result = matcher.compare('foo'); - expect(result.pass).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeSpec.js deleted file mode 100644 index 908c297..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeSpec.js +++ /dev/null @@ -1,17 +0,0 @@ -describe("toBe", function() { - it("passes when actual === expected", function() { - var matcher = j$.matchers.toBe(), - result; - - result = matcher.compare(1, 1); - expect(result.pass).toBe(true); - }); - - it("fails when actual !== expected", function() { - var matcher = j$.matchers.toBe(), - result; - - result = matcher.compare(1, 2); - expect(result.pass).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeTruthySpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeTruthySpec.js deleted file mode 100644 index 3acb1ff..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeTruthySpec.js +++ /dev/null @@ -1,38 +0,0 @@ -describe("toBeTruthy", function() { - it("passes for 'truthy' values", function() { - var matcher = j$.matchers.toBeTruthy(), - result; - - result = matcher.compare(true); - expect(result.pass).toBe(true); - - result = matcher.compare(1); - expect(result.pass).toBe(true); - - result = matcher.compare("foo"); - expect(result.pass).toBe(true); - - result = matcher.compare({}); - expect(result.pass).toBe(true); - }); - - it("fails for 'falsy' values", function() { - var matcher = j$.matchers.toBeTruthy(), - result; - - result = matcher.compare(false); - expect(result.pass).toBe(false); - - result = matcher.compare(0); - expect(result.pass).toBe(false); - - result = matcher.compare(''); - expect(result.pass).toBe(false); - - result = matcher.compare(null); - expect(result.pass).toBe(false); - - result = matcher.compare(void 0); - expect(result.pass).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeUndefinedSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeUndefinedSpec.js deleted file mode 100644 index eefe745..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toBeUndefinedSpec.js +++ /dev/null @@ -1,18 +0,0 @@ -describe("toBeUndefined", function() { - it("passes for undefined values", function() { - var matcher = j$.matchers.toBeUndefined(), - result; - - result = matcher.compare(void 0); - expect(result.pass).toBe(true); - - }); - - it("fails when matching defined values", function() { - var matcher = j$.matchers.toBeUndefined(), - result; - - result = matcher.compare('foo'); - expect(result.pass).toBe(false); - }) -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toContainSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toContainSpec.js deleted file mode 100644 index 1025dff..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toContainSpec.js +++ /dev/null @@ -1,26 +0,0 @@ -describe("toContain", function() { - it("delegates to j$.matchersUtil.contains", function() { - var util = { - contains: jasmine.createSpy('delegated-contains').and.returnValue(true) - }, - matcher = j$.matchers.toContain(util), - result; - - result = matcher.compare("ABC", "B"); - expect(util.contains).toHaveBeenCalledWith("ABC", "B", []); - expect(result.pass).toBe(true); - }); - - it("delegates to j$.matchersUtil.contains, passing in equality testers if present", function() { - var util = { - contains: jasmine.createSpy('delegated-contains').and.returnValue(true) - }, - customEqualityTesters = ['a', 'b'], - matcher = j$.matchers.toContain(util, customEqualityTesters), - result; - - result = matcher.compare("ABC", "B"); - expect(util.contains).toHaveBeenCalledWith("ABC", "B", ['a', 'b']); - expect(result.pass).toBe(true); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toEqualSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toEqualSpec.js deleted file mode 100644 index 55bfee1..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toEqualSpec.js +++ /dev/null @@ -1,28 +0,0 @@ -describe("toEqual", function() { - it("delegates to equals function", function() { - var util = { - equals: jasmine.createSpy('delegated-equals').and.returnValue(true) - }, - matcher = j$.matchers.toEqual(util), - result; - - result = matcher.compare(1, 1); - - expect(util.equals).toHaveBeenCalledWith(1, 1, []); - expect(result.pass).toBe(true); - }); - - it("delegates custom equality testers, if present", function() { - var util = { - equals: jasmine.createSpy('delegated-equals').and.returnValue(true) - }, - customEqualityTesters = ['a', 'b'], - matcher = j$.matchers.toEqual(util, customEqualityTesters), - result; - - result = matcher.compare(1, 1); - - expect(util.equals).toHaveBeenCalledWith(1, 1, ['a', 'b']); - expect(result.pass).toBe(true); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledSpec.js deleted file mode 100644 index 82d17e9..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledSpec.js +++ /dev/null @@ -1,47 +0,0 @@ -describe("toHaveBeenCalled", function() { - it("passes when the actual was called, with a custom .not fail message", function() { - var matcher = j$.matchers.toHaveBeenCalled(), - calledSpy = j$.createSpy('called-spy'), - result; - - calledSpy(); - - result = matcher.compare(calledSpy); - expect(result.pass).toBe(true); - expect(result.message).toEqual("Expected spy called-spy not to have been called."); - }); - - it("fails when the actual was not called", function() { - var matcher = j$.matchers.toHaveBeenCalled(), - uncalledSpy = j$.createSpy('uncalled spy'), - result; - - result = matcher.compare(uncalledSpy); - expect(result.pass).toBe(false); - }); - - it("throws an exception when the actual is not a spy", function() { - var matcher = j$.matchers.toHaveBeenCalled(), - fn = function() {}; - - expect(function() { matcher.compare(fn) }).toThrow(new Error("Expected a spy, but got Function.")); - }); - - it("throws an exception when invoked with any arguments", function() { - var matcher = j$.matchers.toHaveBeenCalled(), - spy = j$.createSpy('sample spy'); - - expect(function() { matcher.compare(spy, 'foo') }).toThrow(new Error("toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith")); - }); - - it("has a custom message on failure", function() { - var matcher = j$.matchers.toHaveBeenCalled(), - spy = j$.createSpy('sample-spy'), - result; - - result = matcher.compare(spy); - - expect(result.message).toEqual("Expected spy sample-spy to have been called."); - }); -}); - diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledWithSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledWithSpec.js deleted file mode 100644 index 0dd3ad7..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toHaveBeenCalledWithSpec.js +++ /dev/null @@ -1,66 +0,0 @@ -describe("toHaveBeenCalledWith", function() { - it("passes when the actual was called with matching parameters", function() { - var util = { - contains: jasmine.createSpy('delegated-contains').and.returnValue(true) - }, - matcher = j$.matchers.toHaveBeenCalledWith(util), - calledSpy = j$.createSpy('called-spy'), - result; - - calledSpy('a', 'b'); - result = matcher.compare(calledSpy, 'a', 'b'); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected spy called-spy not to have been called with [ 'a', 'b' ] but it was."); - }); - - it("passes through the custom equality testers", function() { - var util = { - contains: jasmine.createSpy('delegated-contains').and.returnValue(true) - }, - customEqualityTesters = [function() { return true; }], - matcher = j$.matchers.toHaveBeenCalledWith(util, customEqualityTesters), - calledSpy = j$.createSpy('called-spy'); - - calledSpy('a', 'b'); - matcher.compare(calledSpy, 'a', 'b'); - - expect(util.contains).toHaveBeenCalledWith([['a', 'b']], ['a', 'b'], customEqualityTesters); - }); - - it("fails when the actual was not called", function() { - var util = { - contains: jasmine.createSpy('delegated-contains').and.returnValue(false) - }, - matcher = j$.matchers.toHaveBeenCalledWith(util), - uncalledSpy = j$.createSpy('uncalled spy'), - result; - - result = matcher.compare(uncalledSpy); - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected spy uncalled spy to have been called with [ ] but it was never called."); - }); - - it("fails when the actual was called with different parameters", function() { - var util = { - contains: jasmine.createSpy('delegated-contains').and.returnValue(false) - }, - matcher = j$.matchers.toHaveBeenCalledWith(util), - calledSpy = j$.createSpy('called spy'), - result; - - calledSpy('a'); - calledSpy('c', 'd'); - result = matcher.compare(calledSpy, 'a', 'b'); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected spy called spy to have been called with [ 'a', 'b' ] but actual calls were [ 'a' ], [ 'c', 'd' ]."); - }); - - it("throws an exception when the actual is not a spy", function() { - var matcher = j$.matchers.toHaveBeenCalledWith(), - fn = function() {}; - - expect(function() { matcher.compare(fn) }).toThrow(new Error("Expected a spy, but got Function.")); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toMatchSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toMatchSpec.js deleted file mode 100644 index ae4c2e8..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toMatchSpec.js +++ /dev/null @@ -1,34 +0,0 @@ -describe("toMatch", function() { - it("passes when RegExps are equivalent", function() { - var matcher = j$.matchers.toMatch(), - result; - - result = matcher.compare(/foo/, /foo/); - expect(result.pass).toBe(true); - }); - - it("fails when RegExps are not equivalent", function() { - var matcher = j$.matchers.toMatch(), - result; - - result = matcher.compare(/bar/, /foo/); - expect(result.pass).toBe(false); - }); - - it("passes when the actual matches the expected string as a pattern", function() { - var matcher = j$.matchers.toMatch(), - result; - - result = matcher.compare('foosball', 'foo'); - expect(result.pass).toBe(true); - }); - - it("fails when the actual matches the expected string as a pattern", function() { - var matcher = j$.matchers.toMatch(), - result; - - result = matcher.compare('bar', 'foo'); - expect(result.pass).toBe(false); - }); -}); - diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowErrorSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowErrorSpec.js deleted file mode 100644 index 8dc88db..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowErrorSpec.js +++ /dev/null @@ -1,280 +0,0 @@ -describe("toThrowError", function() { - it("throws an error when the actual is not a function", function() { - var matcher = j$.matchers.toThrowError(); - - expect(function() { - matcher.compare({}); - }).toThrowError("Actual is not a Function"); - }); - - it("throws an error when the expected is not an Error, string, or RegExp", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("foo"); - }; - - expect(function() { - matcher.compare(fn, 1); - }).toThrowError("Expected is not an Error, string, or RegExp."); - }); - - it("throws an error when the expected error type is not an Error", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("foo"); - }; - - expect(function() { - matcher.compare(fn, void 0, "foo"); - }).toThrowError("Expected error type is not an Error."); - }); - - it("throws an error when the expected error message is not a string or RegExp", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("foo"); - }; - - expect(function() { - matcher.compare(fn, Error, 1); - }).toThrowError("Expected error message is not a string or RegExp."); - }); - - it("fails if actual does not throw at all", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - return true; - }, - result; - - result = matcher.compare(fn); - - expect(result.pass).toBe(false); - expect(result.message).toEqual("Expected function to throw an Error."); - }); - - it("fails if thrown is not an instanceof Error", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw 4; - }, - result; - - result = matcher.compare(fn); - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw an Error, but it threw 4."); - }); - - it("fails with the correct message if thrown is a falsy value", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw undefined; - }, - result; - - result = matcher.compare(fn); - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw an Error, but it threw undefined."); - }); - - it("passes if thrown is a type of Error, but there is no expected error", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new TypeError(); - }, - result; - - result = matcher.compare(fn); - - expect(result.pass).toBe(true); - expect(result.message).toEqual("Expected function not to throw an Error, but it threw TypeError."); - }); - - it("passes if thrown is an Error and the expected is the same message", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("foo"); - }, - result; - - result = matcher.compare(fn, "foo"); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw an exception with message 'foo'."); - }); - - it("fails if thrown is an Error and the expected is not the same message", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("foo"); - }, - result; - - result = matcher.compare(fn, "bar"); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw an exception with message 'bar', but it threw an exception with message 'foo'."); - }); - - it("passes if thrown is an Error and the expected is a RegExp that matches the message", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("a long message"); - }, - result; - - result = matcher.compare(fn, /long/); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw an exception with a message matching /long/."); - }); - - it("fails if thrown is an Error and the expected is a RegExp that does not match the message", function() { - var matcher = j$.matchers.toThrowError(), - fn = function() { - throw new Error("a long message"); - }, - result; - - result = matcher.compare(fn, /foo/); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw an exception with a message matching /foo/, but it threw an exception with message 'a long message'."); - }); - - it("passes if thrown is an Error and the expected the same Error", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrowError(util), - fn = function() { - throw new Error(); - }, - result; - - result = matcher.compare(fn, Error); - - expect(result.pass).toBe(true); - expect(result.message).toEqual("Expected function not to throw Error."); - }); - - it("passes if thrown is a custom error that takes arguments and the expected is the same error", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrowError(util), - CustomError = function CustomError(arg) { arg.x }, - fn = function() { - throw new CustomError({ x: 1 }); - }, - result; - - CustomError.prototype = new Error(); - CustomError.prototype.constructor = CustomError; - - result = matcher.compare(fn, CustomError); - - expect(result.pass).toBe(true); - expect(result.message).toEqual("Expected function not to throw CustomError."); - }); - - it("fails if thrown is an Error and the expected is a different Error", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false) - }, - matcher = j$.matchers.toThrowError(util), - fn = function() { - throw new Error(); - }, - result; - - result = matcher.compare(fn, TypeError); - - expect(result.pass).toBe(false); - expect(result.message).toEqual("Expected function to throw TypeError, but it threw Error."); - }); - - it("passes if thrown is a type of Error and it is equal to the expected Error and message", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrowError(util), - fn = function() { - throw new TypeError("foo"); - }, - result; - - result = matcher.compare(fn, TypeError, "foo"); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw TypeError with message 'foo'."); - }); - - it("passes if thrown is a custom error that takes arguments and it is equal to the expected custom error and message", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrowError(util), - CustomError = function CustomError(arg) { this.message = arg.message }, - fn = function() { - throw new CustomError({message: "foo"}); - }, - result; - - CustomError.prototype = new Error(); - CustomError.prototype.constructor = CustomError; - - result = matcher.compare(fn, CustomError, "foo"); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw CustomError with message 'foo'."); - }); - - it("fails if thrown is a type of Error and the expected is a different Error", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false) - }, - matcher = j$.matchers.toThrowError(util), - fn = function() { - throw new TypeError("foo"); - }, - result; - - result = matcher.compare(fn, TypeError, "bar"); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw TypeError with message 'bar', but it threw TypeError with message 'foo'."); - }); - - it("passes if thrown is a type of Error and has the same type as the expected Error and the message matches the expected message", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrowError(util), - fn = function() { - throw new TypeError("foo"); - }, - result; - - result = matcher.compare(fn, TypeError, /foo/); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw TypeError with message matching /foo/."); - }); - - it("fails if thrown is a type of Error and the expected is a different Error", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false) - }, - matcher = j$.matchers.toThrowError(util), - fn = function() { - throw new TypeError("foo"); - }, - result; - - result = matcher.compare(fn, TypeError, /bar/); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw TypeError with message matching /bar/, but it threw TypeError with message 'foo'."); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowSpec.js b/collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowSpec.js deleted file mode 100644 index 3348562..0000000 --- a/collections/transformations/bower_components/jasmine/spec/core/matchers/toThrowSpec.js +++ /dev/null @@ -1,99 +0,0 @@ -describe("toThrow", function() { - it("throws an error when the actual is not a function", function() { - var matcher = j$.matchers.toThrow(); - - expect(function() { - matcher.compare({}); - matcherComparator({}); - }).toThrowError("Actual is not a Function"); - }); - - it("fails if actual does not throw", function() { - var matcher = j$.matchers.toThrow(), - fn = function() { - return true; - }, - result; - - result = matcher.compare(fn); - - expect(result.pass).toBe(false); - expect(result.message).toEqual("Expected function to throw an exception."); - }); - - it("passes if it throws but there is no expected", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrow(util), - fn = function() { - throw 5; - }, - result; - - result = matcher.compare(fn); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw, but it threw 5."); - }); - - it("passes even if what is thrown is falsy", function() { - var matcher = j$.matchers.toThrow(), - fn = function() { - throw undefined; - }, - result; - - result = matcher.compare(fn); - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw, but it threw undefined."); - }); - - it("passes if what is thrown is equivalent to what is expected", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(true) - }, - matcher = j$.matchers.toThrow(util), - fn = function() { - throw 5; - }, - result; - - result = matcher.compare(fn, 5); - - expect(result.pass).toBe(true); - expect(result.message()).toEqual("Expected function not to throw 5."); - }); - - it("fails if what is thrown is not equivalent to what is expected", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false) - }, - matcher = j$.matchers.toThrow(util), - fn = function() { - throw 5; - }, - result; - - result = matcher.compare(fn, "foo"); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw 'foo', but it threw 5."); - }); - - it("fails if what is thrown is not equivalent to undefined", function() { - var util = { - equals: jasmine.createSpy('delegated-equal').and.returnValue(false) - }, - matcher = j$.matchers.toThrow(util), - fn = function() { - throw 5; - }, - result; - - result = matcher.compare(fn, void 0); - - expect(result.pass).toBe(false); - expect(result.message()).toEqual("Expected function to throw undefined, but it threw 5."); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/helpers/BrowserFlags.js b/collections/transformations/bower_components/jasmine/spec/helpers/BrowserFlags.js deleted file mode 100644 index c8300b6..0000000 --- a/collections/transformations/bower_components/jasmine/spec/helpers/BrowserFlags.js +++ /dev/null @@ -1,23 +0,0 @@ -(function(env) { - function browserVersion(matchFn) { - var userAgent = jasmine.getGlobal().navigator.userAgent; - if (!userAgent) { return void 0; } - - var match = matchFn(userAgent); - - return match ? parseFloat(match[1]) : void 0; - } - - env.ieVersion = browserVersion(function(userAgent) { - return /MSIE ([0-9]{1,}[\.0-9]{0,})/.exec(userAgent); - }); - - env.safariVersion = browserVersion(function(userAgent) { - return /Safari/.exec(userAgent) && /Version\/([0-9]{0,})/.exec(userAgent); - }); - - env.firefoxVersion = browserVersion(function(userAgent) { - return /Firefox\/([0-9]{0,})/.exec(userAgent); - }); - -})(jasmine.getEnv()); diff --git a/collections/transformations/bower_components/jasmine/spec/helpers/defineJasmineUnderTest.js b/collections/transformations/bower_components/jasmine/spec/helpers/defineJasmineUnderTest.js deleted file mode 100644 index 3fac8f9..0000000 --- a/collections/transformations/bower_components/jasmine/spec/helpers/defineJasmineUnderTest.js +++ /dev/null @@ -1,7 +0,0 @@ -(function() { - // By the time onload is called, jasmineRequire will be redefined to point - // to the Jasmine source files (and not jasmine.js). So re-require - window.j$ = jasmineRequire.core(jasmineRequire); - jasmineRequire.html(j$); - jasmineRequire.console(jasmineRequire, j$); -})(); diff --git a/collections/transformations/bower_components/jasmine/spec/helpers/nodeDefineJasmineUnderTest.js b/collections/transformations/bower_components/jasmine/spec/helpers/nodeDefineJasmineUnderTest.js deleted file mode 100644 index 4525ca1..0000000 --- a/collections/transformations/bower_components/jasmine/spec/helpers/nodeDefineJasmineUnderTest.js +++ /dev/null @@ -1,33 +0,0 @@ -(function() { - var path = require("path"), - fs = require("fs"); - - var glob = require("glob"); - - var j$Require = require(path.join(__dirname, "../../src/core/requireCore.js")); - - global.getJasmineRequireObj = function () { - return j$Require; - }; - - function extend(destination, source) { - for (var property in source) destination[property] = source[property]; - return destination; - } - - function getSourceFiles() { - var src_files = ['core/**/*.js', 'console/**/*.js', 'version.js']; - src_files.forEach(function(file) { - var filePath = path.join(__dirname, "../../", 'src/', file); - glob.sync(filePath).forEach(function(resolvedFile) { - require(resolvedFile); - }); - }); - } - - extend(j$Require, require(path.join(__dirname,"../../src/console/requireConsole.js"))); - getSourceFiles(); - global.j$ = j$Require.core(j$Require); - - j$Require.console(j$Require, j$); -})(); diff --git a/collections/transformations/bower_components/jasmine/spec/html/HtmlReporterSpec.js b/collections/transformations/bower_components/jasmine/spec/html/HtmlReporterSpec.js deleted file mode 100644 index 57b4872..0000000 --- a/collections/transformations/bower_components/jasmine/spec/html/HtmlReporterSpec.js +++ /dev/null @@ -1,616 +0,0 @@ -describe("New HtmlReporter", function() { - // TODO: Figure out why this isn't rendering... - it("builds the initial DOM elements, including the title banner", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - // Main top-level elements - expect(container.querySelector("div.jasmine_html-reporter")).toBeTruthy(); - expect(container.querySelector("div.banner")).toBeTruthy(); - expect(container.querySelector("div.alert")).toBeTruthy(); - expect(container.querySelector("div.results")).toBeTruthy(); - - expect(container.querySelector("ul.symbol-summary")).toBeTruthy(); - - // title banner - var banner = container.querySelector(".banner"); - - var title = banner.querySelector("a.title"); - expect(title.getAttribute('href')).toEqual('http://jasmine.github.io/'); - expect(title.getAttribute('target')).toEqual('_blank'); - - var version = banner.querySelector(".version"), - versionText = 'textContent' in version ? version.textContent : version.innerText; - expect(versionText).toEqual(j$.version); - }); - - it("builds a single reporter even if initialized multiple times", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - reporter.initialize(); - reporter.initialize(); - - expect(container.querySelectorAll("div.jasmine_html-reporter").length).toEqual(1); - }); - - it("starts the timer when jasmine begins", function() { - var env = new jasmine.Env(), - startTimerSpy = jasmine.createSpy("start-timer-spy"), - reporter = new j$.HtmlReporter({ - env: env, - createElement: function() { return document.createElement.apply(document, arguments); }, - timer: { start: startTimerSpy } - }); - - reporter.jasmineStarted({}); - - expect(startTimerSpy).toHaveBeenCalled(); - }); - - describe("when a spec is done", function() { - it("logs errors to the console and prints a special symbol if it is an empty spec", function() { - if (!window.console) { - window.console = { error: function(){} }; - } - - var env = new j$.Env(), - container = document.createElement('div'), - getContainer = function() {return container;}, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - - spyOn(console, 'error'); - - reporter.initialize(); - - reporter.specDone({ - status: "passed", - fullName: 'Some Name', - passedExpectations: [], - failedExpectations: [] - }); - expect(console.error).toHaveBeenCalledWith("Spec \'Some Name\' has no expectations."); - var specEl = container.querySelector('.symbol-summary li'); - expect(specEl.getAttribute("class")).toEqual("empty"); - }); - - it("reports the status symbol of a disabled spec", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.specDone({id: 789, status: "disabled", fullName: "symbols should have titles", passedExpectations: [], failedExpectations: []}); - - var specEl = container.querySelector('.symbol-summary li'); - expect(specEl.getAttribute("class")).toEqual("disabled"); - expect(specEl.getAttribute("id")).toEqual("spec_789"); - expect(specEl.getAttribute("title")).toEqual("symbols should have titles"); - }); - - it("reports the status symbol of a pending spec", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.specDone({id: 789, status: "pending", passedExpectations: [], failedExpectations: []}); - - var specEl = container.querySelector('.symbol-summary li'); - expect(specEl.getAttribute("class")).toEqual("pending"); - expect(specEl.getAttribute("id")).toEqual("spec_789"); - }); - - it("reports the status symbol of a passing spec", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.specDone({id: 123, status: "passed", passedExpectations: [{passed: true}], failedExpectations: []}); - - var statuses = container.querySelector(".symbol-summary"); - var specEl = statuses.querySelector("li"); - expect(specEl.getAttribute("class")).toEqual("passed"); - expect(specEl.getAttribute("id")).toEqual("spec_123"); - }); - - it("reports the status symbol of a failing spec", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - - reporter.initialize(); - - reporter.specDone({ - id: 345, - status: "failed", - failedExpectations: [], - passedExpectations: [] - }); - - var specEl = container.querySelector(".symbol-summary li"); - expect(specEl.getAttribute("class")).toEqual("failed"); - expect(specEl.getAttribute("id")).toEqual("spec_345"); - }); - }); - - describe("when Jasmine is done", function() { - it("adds EMPTY to the link title of specs that have no expectations", function() { - if (!window.console) { - window.console = { error: function(){} }; - } - var env = new j$.Env(), - container = document.createElement('div'), - getContainer = function() {return container;}, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - - spyOn(console, 'error'); - - reporter.initialize(); - reporter.jasmineStarted({}); - reporter.suiteStarted({id: 1}); - reporter.specStarted({id: 1, status: 'passed', passedExpectations: [], failedExpectations: []}); - reporter.specDone({ - id: 1, - status: 'passed', - description: 'Spec Description', - passedExpectations: [], - failedExpectations: [] - }); - reporter.suiteDone({id: 1}); - reporter.jasmineDone({}); - - var summary = container.querySelector('.summary'); - var suite = summary.childNodes[0]; - var specs = suite.childNodes[1]; - var spec = specs.childNodes[0]; - var specLink = spec.childNodes[0]; - expect(specLink.innerHTML).toMatch(/SPEC HAS NO EXPECTATIONS/); - }); - - it("reports the run time", function() { - var env = new j$.Env(), - container = document.createElement("div"), - timer = jasmine.createSpyObj('timer', ['start', 'elapsed']), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); }, - timer: timer - }); - - reporter.initialize(); - - reporter.jasmineStarted({}); - - timer.elapsed.and.returnValue(100); - reporter.jasmineDone(); - - var duration = container.querySelector(".banner .duration"); - expect(duration.innerHTML).toMatch(/finished in 0.1s/); - }); - - it("reports the suite and spec names with status", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.jasmineStarted({}); - reporter.suiteStarted({ - id: 1, - description: "A Suite", - fullName: "A Suite" - }); - - var specResult = { - id: 123, - description: "with a spec", - fullName: "A Suite with a spec", - status: "passed", - failedExpectations: [], - passedExpectations: [{passed: true}] - }; - reporter.specStarted(specResult); - reporter.specDone(specResult); - - reporter.suiteStarted({ - id: 2, - description: "inner suite", - fullName: "A Suite inner suite" - }); - - var specResult = { - id: 124, - description: "with another spec", - fullName: "A Suite inner suite with another spec", - status: "passed", - failedExpectations: [], - passedExpectations: [{passed: true}] - }; - reporter.specStarted(specResult); - reporter.specDone(specResult); - - reporter.suiteDone({id: 2}); - - specResult = { - id: 209, - description: "with a failing spec", - fullName: "A Suite inner with a failing spec", - status: "failed", - failedExpectations: [{}], - passedExpectations: [] - }; - reporter.specStarted(specResult); - reporter.specDone(specResult); - - reporter.suiteDone({id: 1}); - - reporter.jasmineDone({}); - var summary = container.querySelector(".summary"); - - expect(summary.childNodes.length).toEqual(1); - - var outerSuite = summary.childNodes[0]; - expect(outerSuite.childNodes.length).toEqual(4); - - var classes = []; - for (var i = 0; i < outerSuite.childNodes.length; i++) { - var node = outerSuite.childNodes[i]; - classes.push(node.getAttribute("class")); - } - expect(classes).toEqual(["suite-detail", "specs", "suite", "specs"]); - - var suiteDetail = outerSuite.childNodes[0]; - var suiteLink = suiteDetail.childNodes[0]; - expect(suiteLink.innerHTML).toEqual("A Suite"); - expect(suiteLink.getAttribute('href')).toEqual("?spec=A%20Suite"); - - var specs = outerSuite.childNodes[1]; - var spec = specs.childNodes[0]; - expect(spec.getAttribute("class")).toEqual("passed"); - expect(spec.getAttribute("id")).toEqual("spec-123"); - - var specLink = spec.childNodes[0]; - expect(specLink.innerHTML).toEqual("with a spec"); - expect(specLink.getAttribute("href")).toEqual("?spec=A%20Suite%20with%20a%20spec"); -// expect(specLink.getAttribute("title")).toEqual("A Suite with a spec"); - }); - - describe("UI for raising/catching exceptions", function() { - it("should be unchecked if the env is catching", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { - return container; - }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { - return document.createElement.apply(document, arguments); - }, - createTextNode: function() { - return document.createTextNode.apply(document, arguments); - } - }); - - reporter.initialize(); - reporter.jasmineDone({}); - - var raisingExceptionsUI = container.querySelector(".raise"); - expect(raisingExceptionsUI.checked).toBe(false); - }); - - it("should be checked if the env is not catching", function() { - var env = new j$.Env(), - container = document.createElement("div"), - getContainer = function() { - return container; - }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { - return document.createElement.apply(document, arguments); - }, - createTextNode: function() { - return document.createTextNode.apply(document, arguments); - } - }); - - reporter.initialize(); - env.catchExceptions(false); - reporter.jasmineDone({}); - - var raisingExceptionsUI = container.querySelector(".raise"); - expect(raisingExceptionsUI.checked).toBe(true); - }); - - it("should affect the query param for catching exceptions", function() { - var env = new j$.Env(), - container = document.createElement("div"), - exceptionsClickHandler = jasmine.createSpy("raise exceptions checked"), - getContainer = function() { - return container; - }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - onRaiseExceptionsClick: exceptionsClickHandler, - createElement: function() { - return document.createElement.apply(document, arguments); - }, - createTextNode: function() { - return document.createTextNode.apply(document, arguments); - } - }); - - reporter.initialize(); - reporter.jasmineDone({}); - - var input = container.querySelector(".raise"); - input.click(); - expect(exceptionsClickHandler).toHaveBeenCalled(); - }); - }); - - it("shows a message if no specs are run", function(){ - var env, container, reporter; - env = new j$.Env(); - container = document.createElement("div"); - var getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.jasmineStarted({}); - reporter.jasmineDone({}); - - var alertBars = container.querySelectorAll(".alert .bar"); - expect(alertBars[0].getAttribute('class')).toMatch(/skipped/); - expect(alertBars[0].innerHTML).toMatch(/No specs found/); - }); - - describe("and all specs pass", function() { - var env, container, reporter; - beforeEach(function() { - env = new j$.Env(); - container = document.createElement("div"); - var getContainer = function() { return container; }, - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.jasmineStarted({ totalSpecsDefined: 2 }); - reporter.specDone({ - id: 123, - description: "with a spec", - fullName: "A Suite with a spec", - status: "passed", - passedExpectations: [{passed: true}], - failedExpectations: [] - }); - reporter.specDone({ - id: 124, - description: "with another spec", - fullName: "A Suite inner suite with another spec", - status: "passed", - passedExpectations: [{passed: true}], - failedExpectations: [] - }); - reporter.jasmineDone({}); - }); - - it("reports the specs counts", function() { - var alertBars = container.querySelectorAll(".alert .bar"); - - expect(alertBars.length).toEqual(1); - expect(alertBars[0].getAttribute('class')).toMatch(/passed/); - expect(alertBars[0].innerHTML).toMatch(/2 specs, 0 failures/); - }); - - it("reports no failure details", function() { - var specFailure = container.querySelector(".failures"); - - expect(specFailure.childNodes.length).toEqual(0); - }); - - it("reports no pending specs", function() { - var alertBar = container.querySelector(".alert .bar"); - - expect(alertBar.innerHTML).not.toMatch(/pending spec[s]/); - }); - }); - - describe("and there are pending specs", function() { - var env, container, reporter; - beforeEach(function() { - env = new j$.Env(); - container = document.createElement("div"); - var getContainer = function() { return container; }; - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.jasmineStarted({ totalSpecsDefined: 1 }); - reporter.specDone({ - id: 123, - description: "with a spec", - fullName: "A Suite with a spec", - status: "pending", - passedExpectations: [], - failedExpectations: [] - }); - reporter.jasmineDone({}); - }); - - it("reports the pending specs count", function() { - var alertBar = container.querySelector(".alert .bar"); - - expect(alertBar.innerHTML).toMatch(/1 spec, 0 failures, 1 pending spec/); - }); - - it("reports no failure details", function() { - var specFailure = container.querySelector(".failures"); - - expect(specFailure.childNodes.length).toEqual(0); - }); - }); - - describe("and some tests fail", function() { - var env, container, reporter; - - beforeEach(function() { - env = new j$.Env(); - container = document.createElement("div"); - var getContainer = function() { return container; } - reporter = new j$.HtmlReporter({ - env: env, - getContainer: getContainer, - createElement: function() { return document.createElement.apply(document, arguments); }, - createTextNode: function() { return document.createTextNode.apply(document, arguments); } - }); - reporter.initialize(); - - reporter.jasmineStarted({ totalSpecsDefined: 1 }); - - var passingResult = {id: 123, status: "passed", passedExpectations: [{passed: true}], failedExpectations: []}; - reporter.specStarted(passingResult); - reporter.specDone(passingResult); - - var failingResult = { - id: 124, - status: "failed", - description: "a failing spec", - fullName: "a suite with a failing spec", - passedExpectations: [], - failedExpectations: [ - { - message: "a failure message", - stack: "a stack trace" - } - ] - }; - reporter.specStarted(failingResult); - reporter.specDone(failingResult); - reporter.jasmineDone({}); - }); - - it("reports the specs counts", function() { - var alertBar = container.querySelector(".alert .bar"); - - expect(alertBar.getAttribute('class')).toMatch(/failed/); - expect(alertBar.innerHTML).toMatch(/2 specs, 1 failure/); - }); - - it("reports failure messages and stack traces", function() { - var specFailures = container.querySelector(".failures"); - - var failure = specFailures.childNodes[0]; - expect(failure.getAttribute("class")).toMatch(/failed/); - expect(failure.getAttribute("class")).toMatch(/spec-detail/); - - var specDiv = failure.childNodes[0]; - expect(specDiv.getAttribute("class")).toEqual("description"); - - var specLink = specDiv.childNodes[0]; - expect(specLink.getAttribute("title")).toEqual("a suite with a failing spec"); - expect(specLink.getAttribute("href")).toEqual("?spec=a%20suite%20with%20a%20failing%20spec"); - - var message = failure.childNodes[1].childNodes[0]; - expect(message.getAttribute("class")).toEqual("result-message"); - expect(message.innerHTML).toEqual("a failure message"); - - var stackTrace = failure.childNodes[1].childNodes[1]; - expect(stackTrace.getAttribute("class")).toEqual("stack-trace"); - expect(stackTrace.innerHTML).toEqual("a stack trace"); - }); - - it("allows switching between failure details and the spec summary", function() { - var menuBar = container.querySelectorAll(".bar")[1]; - - expect(menuBar.getAttribute("class")).not.toMatch(/hidden/); - - var link = menuBar.querySelector('a'); - expect(link.innerHTML).toEqual("Failures"); - expect(link.getAttribute("href")).toEqual("#"); - }); - - it("sets the reporter to 'Failures List' mode", function() { - var reporterNode = container.querySelector(".jasmine_html-reporter"); - expect(reporterNode.getAttribute("class")).toMatch("failure-list"); - }); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/html/HtmlSpecFilterSpec.js b/collections/transformations/bower_components/jasmine/spec/html/HtmlSpecFilterSpec.js deleted file mode 100644 index 8bc2eb1..0000000 --- a/collections/transformations/bower_components/jasmine/spec/html/HtmlSpecFilterSpec.js +++ /dev/null @@ -1,18 +0,0 @@ -describe("j$.HtmlSpecFilter", function() { - - it("should match when no string is provided", function() { - var specFilter = new j$.HtmlSpecFilter(); - - expect(specFilter.matches("foo")).toBe(true); - expect(specFilter.matches("*bar")).toBe(true); - }); - - it("should only match the provided string", function() { - var specFilter = new j$.HtmlSpecFilter({ - filterString: function() { return "foo"; } - }); - - expect(specFilter.matches("foo")).toBe(true); - expect(specFilter.matches("bar")).toBe(false); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/html/MatchersHtmlSpec.js b/collections/transformations/bower_components/jasmine/spec/html/MatchersHtmlSpec.js deleted file mode 100644 index 4fd1560..0000000 --- a/collections/transformations/bower_components/jasmine/spec/html/MatchersHtmlSpec.js +++ /dev/null @@ -1,37 +0,0 @@ -describe("MatchersSpec - HTML Dependent", function () { - var env, spec; - - beforeEach(function() { - env = new j$.Env(); - - var suite = env.describe("suite", function() { - spec = env.it("spec", function() { - }); - }); - spyOn(spec, 'addExpectationResult'); - - addMatchers({ - toPass: function() { - return lastResult().passed; - }, - toFail: function() { - return !lastResult().passed; - } - }); - }); - - function match(value) { - return spec.expect(value); - } - - function lastResult() { - return spec.addExpectationResult.mostRecentCall.args[1]; - } - - xit("toEqual with DOM nodes", function() { - var nodeA = document.createElement('div'); - var nodeB = document.createElement('div'); - expect((match(nodeA).toEqual(nodeA))).toPass(); - expect((match(nodeA).toEqual(nodeB))).toFail(); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/html/PrettyPrintHtmlSpec.js b/collections/transformations/bower_components/jasmine/spec/html/PrettyPrintHtmlSpec.js deleted file mode 100644 index 3c5e15f..0000000 --- a/collections/transformations/bower_components/jasmine/spec/html/PrettyPrintHtmlSpec.js +++ /dev/null @@ -1,15 +0,0 @@ -describe("j$.pp (HTML Dependent)", function () { - it("should stringify HTML nodes properly", function() { - var sampleNode = document.createElement('div'); - sampleNode.innerHTML = 'foobar'; - expect(j$.pp(sampleNode)).toEqual("HTMLNode"); - expect(j$.pp({foo: sampleNode})).toEqual("{ foo: HTMLNode }"); - }); - - it("should print Firefox's wrapped native objects correctly", function() { - if(jasmine.getEnv().firefoxVersion) { - try { new CustomEvent(); } catch(e) { var err = e; }; - expect(j$.pp(err)).toMatch(/Not enough arguments/); - } - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/html/QueryStringSpec.js b/collections/transformations/bower_components/jasmine/spec/html/QueryStringSpec.js deleted file mode 100644 index 3779eae..0000000 --- a/collections/transformations/bower_components/jasmine/spec/html/QueryStringSpec.js +++ /dev/null @@ -1,43 +0,0 @@ -describe("QueryString", function() { - - describe("#setParam", function() { - - it("sets the query string to include the given key/value pair", function() { - var windowLocation = { - search: "" - }, - queryString = new j$.QueryString({ - getWindowLocation: function() { return windowLocation } - }); - - queryString.setParam("foo", "bar baz"); - - expect(windowLocation.search).toMatch(/foo=bar%20baz/); - }); - }); - - describe("#getParam", function() { - - it("returns the value of the requested key", function() { - var windowLocation = { - search: "?baz=quux%20corge" - }, - queryString = new j$.QueryString({ - getWindowLocation: function() { return windowLocation } - }); - - expect(queryString.getParam("baz")).toEqual("quux corge"); - }); - - it("returns null if the key is not present", function() { - var windowLocation = { - search: "" - }, - queryString = new j$.QueryString({ - getWindowLocation: function() { return windowLocation } - }); - - expect(queryString.getParam("baz")).toBeFalsy(); - }); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/html/ResultsNodeSpec.js b/collections/transformations/bower_components/jasmine/spec/html/ResultsNodeSpec.js deleted file mode 100644 index 9cf6927..0000000 --- a/collections/transformations/bower_components/jasmine/spec/html/ResultsNodeSpec.js +++ /dev/null @@ -1,62 +0,0 @@ -describe("ResultsNode", function() { - it("wraps a result", function() { - var fakeResult = { - id: 123, - message: "foo" - }, - node = new j$.ResultsNode(fakeResult, "suite", null); - - expect(node.result).toBe(fakeResult); - expect(node.type).toEqual("suite"); - }); - - it("can add children with a type", function() { - var fakeResult = { - id: 123, - message: "foo" - }, - fakeChildResult = { - id: 456, - message: "bar" - }, - node = new j$.ResultsNode(fakeResult, "suite", null); - - node.addChild(fakeChildResult, "spec"); - - expect(node.children.length).toEqual(1); - expect(node.children[0].result).toEqual(fakeChildResult); - expect(node.children[0].type).toEqual("spec"); - }); - - it("has a pointer back to its parent ResultNode", function() { - var fakeResult = { - id: 123, - message: "foo" - }, - fakeChildResult = { - id: 456, - message: "bar" - }, - node = new j$.ResultsNode(fakeResult, "suite", null); - - node.addChild(fakeChildResult, "spec"); - - expect(node.children[0].parent).toBe(node); - }); - - it("can provide the most recent child", function() { - var fakeResult = { - id: 123, - message: "foo" - }, - fakeChildResult = { - id: 456, - message: "bar" - }, - node = new j$.ResultsNode(fakeResult, "suite", null); - - node.addChild(fakeChildResult, "spec"); - - expect(node.last()).toBe(node.children[node.children.length - 1]); - }); -}); diff --git a/collections/transformations/bower_components/jasmine/spec/javascripts/support/jasmine_selenium_runner.yml b/collections/transformations/bower_components/jasmine/spec/javascripts/support/jasmine_selenium_runner.yml deleted file mode 100644 index 73df139..0000000 --- a/collections/transformations/bower_components/jasmine/spec/javascripts/support/jasmine_selenium_runner.yml +++ /dev/null @@ -1,16 +0,0 @@ ---- -use_sauce: <%= ENV['USE_SAUCE'] %> -browser: <%= ENV['JASMINE_BROWSER'] %> -sauce: - name: jasmine-core <%= Time.now.to_s %> - username: <%= ENV['SAUCE_USERNAME'] %> - access_key: <%= ENV['SAUCE_ACCESS_KEY'] %> - build: <%= ENV['TRAVIS_BUILD_NUMBER'] || 'Ran locally' %> - tags: - - <%= ENV['TRAVIS_RUBY_VERSION'] || RUBY_VERSION %> - - CI - tunnel_identifier: <%= ENV['TRAVIS_JOB_NUMBER'] ? %Q("#{ENV['TRAVIS_JOB_NUMBER']}") : nil %> - os: <%= ENV['SAUCE_OS'] %> - browser_version: <%= ENV['SAUCE_BROWSER_VERSION'] %> - - diff --git a/collections/transformations/bower_components/jasmine/spec/performance/large_object_test.js b/collections/transformations/bower_components/jasmine/spec/performance/large_object_test.js deleted file mode 100644 index 7741dec..0000000 --- a/collections/transformations/bower_components/jasmine/spec/performance/large_object_test.js +++ /dev/null @@ -1,36 +0,0 @@ -describe('Printing a big object', function(){ - var bigObject; - function rand(upper) { - return Math.round(upper * Math.random()); - } - - function generateObject(level) { - var object = {}; - - for (var i = 0; i < 50; i++) { - var decide = rand(2); - switch (decide) { - case 0: - object["cycle" + i] = object; - break; - case 1: - object["number" + i] = rand(100); - break; - case 2: - if (level < 3) { - object["nesting" + i] = generateObject(level + 1); - } - break; - } - - } - - return object; - } - - it('takes a resonable amount of time', function(){ - bigObject = generateObject(0); - expect(j$.pp(bigObject)).toMatch(/cycle/); - }); -}); - diff --git a/collections/transformations/bower_components/jasmine/spec/performance/performance_test.js b/collections/transformations/bower_components/jasmine/spec/performance/performance_test.js deleted file mode 100644 index 0c97d20..0000000 --- a/collections/transformations/bower_components/jasmine/spec/performance/performance_test.js +++ /dev/null @@ -1,10 +0,0 @@ -describe("performance", function() { - for (var i = 0; i < 10000; i++) { - it("should pass", function() { - expect(true).toBe(true); - }); - it("should fail", function() { - expect(true).toBe(false); - }); - } -}); diff --git a/collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.json b/collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.json deleted file mode 100644 index d1a8046..0000000 --- a/collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "spec_dir": "spec", - "spec_files": [ - "performance/performance_test.js" - ], - "helper_files": [ - "helpers/nodeDefineJasmineUnderTest.js" - ] -} diff --git a/collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.yml b/collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.yml deleted file mode 100644 index f00d87b..0000000 --- a/collections/transformations/bower_components/jasmine/spec/support/jasmine-performance.yml +++ /dev/null @@ -1,9 +0,0 @@ -src_dir: - - 'src' -src_files: - - '**/*.js' -helpers: - - 'helpers/**/*.js' -spec_files: - - 'performance/performance_test.js' -spec_dir: spec diff --git a/collections/transformations/bower_components/jasmine/spec/support/jasmine.json b/collections/transformations/bower_components/jasmine/spec/support/jasmine.json deleted file mode 100644 index 8583679..0000000 --- a/collections/transformations/bower_components/jasmine/spec/support/jasmine.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "spec_dir": "spec", - "spec_files": [ - "core/**/*.js", - "console/**/*.js" - ], - "helpers": [ - "helpers/nodeDefineJasmineUnderTest.js" - ] -} diff --git a/collections/transformations/bower_components/jasmine/spec/support/jasmine.yml b/collections/transformations/bower_components/jasmine/spec/support/jasmine.yml deleted file mode 100644 index 4a8ecb0..0000000 --- a/collections/transformations/bower_components/jasmine/spec/support/jasmine.yml +++ /dev/null @@ -1,25 +0,0 @@ -#This 'magic' inclusion order allows the travis build to pass. -#TODO: search for the correct files to include to prevent -src_dir: - - 'src' -src_files: - - 'core/base.js' - - 'core/util.js' - #end of known dependencies - - 'core/Spec.js' - - 'core/Env.js' - - 'core/JsApiReporter.js' - - 'core/PrettyPrinter.js' - - 'core/Suite.js' - - 'core/**/*.js' - - 'html/**.js' - - '**/*.js' -stylesheets: -helpers: - - 'helpers/BrowserFlags.js' - - 'helpers/defineJasmineUnderTest.js' -spec_files: - - '**/*[Ss]pec.js' -spec_dir: spec - - diff --git a/collections/transformations/bower_components/jasmine/src/console/ConsoleReporter.js b/collections/transformations/bower_components/jasmine/src/console/ConsoleReporter.js deleted file mode 100644 index a3895f4..0000000 --- a/collections/transformations/bower_components/jasmine/src/console/ConsoleReporter.js +++ /dev/null @@ -1,131 +0,0 @@ -getJasmineRequireObj().ConsoleReporter = function() { - - var noopTimer = { - start: function(){}, - elapsed: function(){ return 0; } - }; - - function ConsoleReporter(options) { - var print = options.print, - showColors = options.showColors || false, - onComplete = options.onComplete || function() {}, - timer = options.timer || noopTimer, - specCount, - failureCount, - failedSpecs = [], - pendingCount, - ansi = { - green: '\x1B[32m', - red: '\x1B[31m', - yellow: '\x1B[33m', - none: '\x1B[0m' - }; - - this.jasmineStarted = function() { - specCount = 0; - failureCount = 0; - pendingCount = 0; - print('Started'); - printNewline(); - timer.start(); - }; - - this.jasmineDone = function() { - printNewline(); - for (var i = 0; i < failedSpecs.length; i++) { - specFailureDetails(failedSpecs[i]); - } - - if(specCount > 0) { - printNewline(); - - var specCounts = specCount + ' ' + plural('spec', specCount) + ', ' + - failureCount + ' ' + plural('failure', failureCount); - - if (pendingCount) { - specCounts += ', ' + pendingCount + ' pending ' + plural('spec', pendingCount); - } - - print(specCounts); - } else { - print('No specs found'); - } - - printNewline(); - var seconds = timer.elapsed() / 1000; - print('Finished in ' + seconds + ' ' + plural('second', seconds)); - - printNewline(); - - onComplete(failureCount === 0); - }; - - this.specDone = function(result) { - specCount++; - - if (result.status == 'pending') { - pendingCount++; - print(colored('yellow', '*')); - return; - } - - if (result.status == 'passed') { - print(colored('green', '.')); - return; - } - - if (result.status == 'failed') { - failureCount++; - failedSpecs.push(result); - print(colored('red', 'F')); - } - }; - - return this; - - function printNewline() { - print('\n'); - } - - function colored(color, str) { - return showColors ? (ansi[color] + str + ansi.none) : str; - } - - function plural(str, count) { - return count == 1 ? str : str + 's'; - } - - function repeat(thing, times) { - var arr = []; - for (var i = 0; i < times; i++) { - arr.push(thing); - } - return arr; - } - - function indent(str, spaces) { - var lines = (str || '').split('\n'); - var newArr = []; - for (var i = 0; i < lines.length; i++) { - newArr.push(repeat(' ', spaces).join('') + lines[i]); - } - return newArr.join('\n'); - } - - function specFailureDetails(result) { - printNewline(); - print(result.fullName); - - for (var i = 0; i < result.failedExpectations.length; i++) { - var failedExpectation = result.failedExpectations[i]; - printNewline(); - print(indent(failedExpectation.message, 2)); - print(indent(failedExpectation.stack, 2)); - } - - printNewline(); - } - } - - return ConsoleReporter; -}; diff --git a/collections/transformations/bower_components/jasmine/src/console/requireConsole.js b/collections/transformations/bower_components/jasmine/src/console/requireConsole.js deleted file mode 100644 index a451517..0000000 --- a/collections/transformations/bower_components/jasmine/src/console/requireConsole.js +++ /dev/null @@ -1,12 +0,0 @@ -function getJasmineRequireObj() { - if (typeof module !== 'undefined' && module.exports) { - return exports; - } else { - window.jasmineRequire = window.jasmineRequire || {}; - return window.jasmineRequire; - } -} - -getJasmineRequireObj().console = function(jRequire, j$) { - j$.ConsoleReporter = jRequire.ConsoleReporter(); -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/Any.js b/collections/transformations/bower_components/jasmine/src/core/Any.js deleted file mode 100644 index 6621337..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Any.js +++ /dev/null @@ -1,36 +0,0 @@ -getJasmineRequireObj().Any = function() { - - function Any(expectedObject) { - this.expectedObject = expectedObject; - } - - Any.prototype.jasmineMatches = function(other) { - if (this.expectedObject == String) { - return typeof other == 'string' || other instanceof String; - } - - if (this.expectedObject == Number) { - return typeof other == 'number' || other instanceof Number; - } - - if (this.expectedObject == Function) { - return typeof other == 'function' || other instanceof Function; - } - - if (this.expectedObject == Object) { - return typeof other == 'object'; - } - - if (this.expectedObject == Boolean) { - return typeof other == 'boolean'; - } - - return other instanceof this.expectedObject; - }; - - Any.prototype.jasmineToString = function() { - return ''; - }; - - return Any; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/CallTracker.js b/collections/transformations/bower_components/jasmine/src/core/CallTracker.js deleted file mode 100644 index b80e6a8..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/CallTracker.js +++ /dev/null @@ -1,50 +0,0 @@ -getJasmineRequireObj().CallTracker = function() { - - function CallTracker() { - var calls = []; - - this.track = function(context) { - calls.push(context); - }; - - this.any = function() { - return !!calls.length; - }; - - this.count = function() { - return calls.length; - }; - - this.argsFor = function(index) { - var call = calls[index]; - return call ? call.args : []; - }; - - this.all = function() { - return calls; - }; - - this.allArgs = function() { - var callArgs = []; - for(var i = 0; i < calls.length; i++){ - callArgs.push(calls[i].args); - } - - return callArgs; - }; - - this.first = function() { - return calls[0]; - }; - - this.mostRecent = function() { - return calls[calls.length - 1]; - }; - - this.reset = function() { - calls = []; - }; - } - - return CallTracker; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/Clock.js b/collections/transformations/bower_components/jasmine/src/core/Clock.js deleted file mode 100644 index 984f350..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Clock.js +++ /dev/null @@ -1,113 +0,0 @@ -getJasmineRequireObj().Clock = function() { - function Clock(global, delayedFunctionScheduler, mockDate) { - var self = this, - realTimingFunctions = { - setTimeout: global.setTimeout, - clearTimeout: global.clearTimeout, - setInterval: global.setInterval, - clearInterval: global.clearInterval - }, - fakeTimingFunctions = { - setTimeout: setTimeout, - clearTimeout: clearTimeout, - setInterval: setInterval, - clearInterval: clearInterval - }, - installed = false, - timer; - - - self.install = function() { - replace(global, fakeTimingFunctions); - timer = fakeTimingFunctions; - installed = true; - - return self; - }; - - self.uninstall = function() { - delayedFunctionScheduler.reset(); - mockDate.uninstall(); - replace(global, realTimingFunctions); - - timer = realTimingFunctions; - installed = false; - }; - - self.mockDate = function(initialDate) { - mockDate.install(initialDate); - }; - - self.setTimeout = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error('IE < 9 cannot support extra params to setTimeout without a polyfill'); - } - return timer.setTimeout(fn, delay); - } - return Function.prototype.apply.apply(timer.setTimeout, [global, arguments]); - }; - - self.setInterval = function(fn, delay, params) { - if (legacyIE()) { - if (arguments.length > 2) { - throw new Error('IE < 9 cannot support extra params to setInterval without a polyfill'); - } - return timer.setInterval(fn, delay); - } - return Function.prototype.apply.apply(timer.setInterval, [global, arguments]); - }; - - self.clearTimeout = function(id) { - return Function.prototype.call.apply(timer.clearTimeout, [global, id]); - }; - - self.clearInterval = function(id) { - return Function.prototype.call.apply(timer.clearInterval, [global, id]); - }; - - self.tick = function(millis) { - if (installed) { - mockDate.tick(millis); - delayedFunctionScheduler.tick(millis); - } else { - throw new Error('Mock clock is not installed, use jasmine.clock().install()'); - } - }; - - return self; - - function legacyIE() { - //if these methods are polyfilled, apply will be present - return !(realTimingFunctions.setTimeout || realTimingFunctions.setInterval).apply; - } - - function replace(dest, source) { - for (var prop in source) { - dest[prop] = source[prop]; - } - } - - function setTimeout(fn, delay) { - return delayedFunctionScheduler.scheduleFunction(fn, delay, argSlice(arguments, 2)); - } - - function clearTimeout(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function setInterval(fn, interval) { - return delayedFunctionScheduler.scheduleFunction(fn, interval, argSlice(arguments, 2), true); - } - - function clearInterval(id) { - return delayedFunctionScheduler.removeFunctionWithId(id); - } - - function argSlice(argsObj, n) { - return Array.prototype.slice.call(argsObj, n); - } - } - - return Clock; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/DelayedFunctionScheduler.js b/collections/transformations/bower_components/jasmine/src/core/DelayedFunctionScheduler.js deleted file mode 100644 index 8079c70..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/DelayedFunctionScheduler.js +++ /dev/null @@ -1,145 +0,0 @@ -getJasmineRequireObj().DelayedFunctionScheduler = function() { - function DelayedFunctionScheduler() { - var self = this; - var scheduledLookup = []; - var scheduledFunctions = {}; - var currentTime = 0; - var delayedFnCount = 0; - - self.tick = function(millis) { - millis = millis || 0; - var endTime = currentTime + millis; - - runScheduledFunctions(endTime); - currentTime = endTime; - }; - - self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) { - var f; - if (typeof(funcToCall) === 'string') { - /* jshint evil: true */ - f = function() { return eval(funcToCall); }; - /* jshint evil: false */ - } else { - f = funcToCall; - } - - millis = millis || 0; - timeoutKey = timeoutKey || ++delayedFnCount; - runAtMillis = runAtMillis || (currentTime + millis); - - var funcToSchedule = { - runAtMillis: runAtMillis, - funcToCall: f, - recurring: recurring, - params: params, - timeoutKey: timeoutKey, - millis: millis - }; - - if (runAtMillis in scheduledFunctions) { - scheduledFunctions[runAtMillis].push(funcToSchedule); - } else { - scheduledFunctions[runAtMillis] = [funcToSchedule]; - scheduledLookup.push(runAtMillis); - scheduledLookup.sort(function (a, b) { - return a - b; - }); - } - - return timeoutKey; - }; - - self.removeFunctionWithId = function(timeoutKey) { - for (var runAtMillis in scheduledFunctions) { - var funcs = scheduledFunctions[runAtMillis]; - var i = indexOfFirstToPass(funcs, function (func) { - return func.timeoutKey === timeoutKey; - }); - - if (i > -1) { - if (funcs.length === 1) { - delete scheduledFunctions[runAtMillis]; - deleteFromLookup(runAtMillis); - } else { - funcs.splice(i, 1); - } - - // intervals get rescheduled when executed, so there's never more - // than a single scheduled function with a given timeoutKey - break; - } - } - }; - - self.reset = function() { - currentTime = 0; - scheduledLookup = []; - scheduledFunctions = {}; - delayedFnCount = 0; - }; - - return self; - - function indexOfFirstToPass(array, testFn) { - var index = -1; - - for (var i = 0; i < array.length; ++i) { - if (testFn(array[i])) { - index = i; - break; - } - } - - return index; - } - - function deleteFromLookup(key) { - var value = Number(key); - var i = indexOfFirstToPass(scheduledLookup, function (millis) { - return millis === value; - }); - - if (i > -1) { - scheduledLookup.splice(i, 1); - } - } - - function reschedule(scheduledFn) { - self.scheduleFunction(scheduledFn.funcToCall, - scheduledFn.millis, - scheduledFn.params, - true, - scheduledFn.timeoutKey, - scheduledFn.runAtMillis + scheduledFn.millis); - } - - function runScheduledFunctions(endTime) { - if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) { - return; - } - - do { - currentTime = scheduledLookup.shift(); - - var funcsToRun = scheduledFunctions[currentTime]; - delete scheduledFunctions[currentTime]; - - for (var i = 0; i < funcsToRun.length; ++i) { - var funcToRun = funcsToRun[i]; - funcToRun.funcToCall.apply(null, funcToRun.params || []); - - if (funcToRun.recurring) { - reschedule(funcToRun); - } - } - } while (scheduledLookup.length > 0 && - // checking first if we're out of time prevents setTimeout(0) - // scheduled in a funcToRun from forcing an extra iteration - currentTime !== endTime && - scheduledLookup[0] <= endTime); - } - } - - return DelayedFunctionScheduler; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/Env.js b/collections/transformations/bower_components/jasmine/src/core/Env.js deleted file mode 100644 index 48146ac..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Env.js +++ /dev/null @@ -1,341 +0,0 @@ -getJasmineRequireObj().Env = function(j$) { - function Env(options) { - options = options || {}; - - var self = this; - var global = options.global || j$.getGlobal(); - - var totalSpecsDefined = 0; - - var catchExceptions = true; - - var realSetTimeout = j$.getGlobal().setTimeout; - var realClearTimeout = j$.getGlobal().clearTimeout; - this.clock = new j$.Clock(global, new j$.DelayedFunctionScheduler(), new j$.MockDate(global)); - - var runnableLookupTable = {}; - - var spies = []; - - var currentSpec = null; - var currentSuite = null; - - var reporter = new j$.ReportDispatcher([ - 'jasmineStarted', - 'jasmineDone', - 'suiteStarted', - 'suiteDone', - 'specStarted', - 'specDone' - ]); - - this.specFilter = function() { - return true; - }; - - var equalityTesters = []; - - var customEqualityTesters = []; - this.addCustomEqualityTester = function(tester) { - customEqualityTesters.push(tester); - }; - - j$.Expectation.addCoreMatchers(j$.matchers); - - var nextSpecId = 0; - var getNextSpecId = function() { - return 'spec' + nextSpecId++; - }; - - var nextSuiteId = 0; - var getNextSuiteId = function() { - return 'suite' + nextSuiteId++; - }; - - var expectationFactory = function(actual, spec) { - return j$.Expectation.Factory({ - util: j$.matchersUtil, - customEqualityTesters: customEqualityTesters, - actual: actual, - addExpectationResult: addExpectationResult - }); - - function addExpectationResult(passed, result) { - return spec.addExpectationResult(passed, result); - } - }; - - var specStarted = function(spec) { - currentSpec = spec; - reporter.specStarted(spec.result); - }; - - var beforeFns = function(suite) { - return function() { - var befores = []; - while(suite) { - befores = befores.concat(suite.beforeFns); - suite = suite.parentSuite; - } - return befores.reverse(); - }; - }; - - var afterFns = function(suite) { - return function() { - var afters = []; - while(suite) { - afters = afters.concat(suite.afterFns); - suite = suite.parentSuite; - } - return afters; - }; - }; - - var getSpecName = function(spec, suite) { - return suite.getFullName() + ' ' + spec.description; - }; - - // TODO: we may just be able to pass in the fn instead of wrapping here - var buildExpectationResult = j$.buildExpectationResult, - exceptionFormatter = new j$.ExceptionFormatter(), - expectationResultFactory = function(attrs) { - attrs.messageFormatter = exceptionFormatter.message; - attrs.stackFormatter = exceptionFormatter.stack; - - return buildExpectationResult(attrs); - }; - - // TODO: fix this naming, and here's where the value comes in - this.catchExceptions = function(value) { - catchExceptions = !!value; - return catchExceptions; - }; - - this.catchingExceptions = function() { - return catchExceptions; - }; - - var maximumSpecCallbackDepth = 20; - var currentSpecCallbackDepth = 0; - - function clearStack(fn) { - currentSpecCallbackDepth++; - if (currentSpecCallbackDepth >= maximumSpecCallbackDepth) { - currentSpecCallbackDepth = 0; - realSetTimeout(fn, 0); - } else { - fn(); - } - } - - var catchException = function(e) { - return j$.Spec.isPendingSpecException(e) || catchExceptions; - }; - - var queueRunnerFactory = function(options) { - options.catchException = catchException; - options.clearStack = options.clearStack || clearStack; - options.timer = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}; - - new j$.QueueRunner(options).execute(); - }; - - var topSuite = new j$.Suite({ - env: this, - id: getNextSuiteId(), - description: 'Jasmine__TopLevel__Suite', - queueRunner: queueRunnerFactory, - resultCallback: function() {} // TODO - hook this up - }); - runnableLookupTable[topSuite.id] = topSuite; - currentSuite = topSuite; - - this.topSuite = function() { - return topSuite; - }; - - this.execute = function(runnablesToRun) { - runnablesToRun = runnablesToRun || [topSuite.id]; - - var allFns = []; - for(var i = 0; i < runnablesToRun.length; i++) { - var runnable = runnableLookupTable[runnablesToRun[i]]; - allFns.push((function(runnable) { return function(done) { runnable.execute(done); }; })(runnable)); - } - - reporter.jasmineStarted({ - totalSpecsDefined: totalSpecsDefined - }); - - queueRunnerFactory({fns: allFns, onComplete: reporter.jasmineDone}); - }; - - this.addReporter = function(reporterToAdd) { - reporter.addReporter(reporterToAdd); - }; - - this.addMatchers = function(matchersToAdd) { - j$.Expectation.addMatchers(matchersToAdd); - }; - - this.spyOn = function(obj, methodName) { - if (j$.util.isUndefined(obj)) { - throw new Error('spyOn could not find an object to spy upon for ' + methodName + '()'); - } - - if (j$.util.isUndefined(obj[methodName])) { - throw new Error(methodName + '() method does not exist'); - } - - if (obj[methodName] && j$.isSpy(obj[methodName])) { - //TODO?: should this return the current spy? Downside: may cause user confusion about spy state - throw new Error(methodName + ' has already been spied upon'); - } - - var spy = j$.createSpy(methodName, obj[methodName]); - - spies.push({ - spy: spy, - baseObj: obj, - methodName: methodName, - originalValue: obj[methodName] - }); - - obj[methodName] = spy; - - return spy; - }; - - var suiteFactory = function(description) { - var suite = new j$.Suite({ - env: self, - id: getNextSuiteId(), - description: description, - parentSuite: currentSuite, - queueRunner: queueRunnerFactory, - onStart: suiteStarted, - resultCallback: function(attrs) { - reporter.suiteDone(attrs); - } - }); - - runnableLookupTable[suite.id] = suite; - return suite; - }; - - this.describe = function(description, specDefinitions) { - var suite = suiteFactory(description); - - var parentSuite = currentSuite; - parentSuite.addChild(suite); - currentSuite = suite; - - var declarationError = null; - try { - specDefinitions.call(suite); - } catch (e) { - declarationError = e; - } - - if (declarationError) { - this.it('encountered a declaration exception', function() { - throw declarationError; - }); - } - - currentSuite = parentSuite; - - return suite; - }; - - this.xdescribe = function(description, specDefinitions) { - var suite = this.describe(description, specDefinitions); - suite.disable(); - return suite; - }; - - var specFactory = function(description, fn, suite) { - totalSpecsDefined++; - - var spec = new j$.Spec({ - id: getNextSpecId(), - beforeFns: beforeFns(suite), - afterFns: afterFns(suite), - expectationFactory: expectationFactory, - exceptionFormatter: exceptionFormatter, - resultCallback: specResultCallback, - getSpecName: function(spec) { - return getSpecName(spec, suite); - }, - onStart: specStarted, - description: description, - expectationResultFactory: expectationResultFactory, - queueRunnerFactory: queueRunnerFactory, - fn: fn - }); - - runnableLookupTable[spec.id] = spec; - - if (!self.specFilter(spec)) { - spec.disable(); - } - - return spec; - - function removeAllSpies() { - for (var i = 0; i < spies.length; i++) { - var spyEntry = spies[i]; - spyEntry.baseObj[spyEntry.methodName] = spyEntry.originalValue; - } - spies = []; - } - - function specResultCallback(result) { - removeAllSpies(); - j$.Expectation.resetMatchers(); - customEqualityTesters = []; - currentSpec = null; - reporter.specDone(result); - } - }; - - var suiteStarted = function(suite) { - reporter.suiteStarted(suite.result); - }; - - this.it = function(description, fn) { - var spec = specFactory(description, fn, currentSuite); - currentSuite.addChild(spec); - return spec; - }; - - this.xit = function(description, fn) { - var spec = this.it(description, fn); - spec.pend(); - return spec; - }; - - this.expect = function(actual) { - if (!currentSpec) { - throw new Error('\'expect\' was used when there was no current spec, this could be because an asynchronous test timed out'); - } - - return currentSpec.expect(actual); - }; - - this.beforeEach = function(beforeEachFunction) { - currentSuite.beforeEach(beforeEachFunction); - }; - - this.afterEach = function(afterEachFunction) { - currentSuite.afterEach(afterEachFunction); - }; - - this.pending = function() { - throw j$.Spec.pendingSpecExceptionMessage; - }; - } - - return Env; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/ExceptionFormatter.js b/collections/transformations/bower_components/jasmine/src/core/ExceptionFormatter.js deleted file mode 100644 index 74361a9..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/ExceptionFormatter.js +++ /dev/null @@ -1,29 +0,0 @@ -getJasmineRequireObj().ExceptionFormatter = function() { - function ExceptionFormatter() { - this.message = function(error) { - var message = ''; - - if (error.name && error.message) { - message += error.name + ': ' + error.message; - } else { - message += error.toString() + ' thrown'; - } - - if (error.fileName || error.sourceURL) { - message += ' in ' + (error.fileName || error.sourceURL); - } - - if (error.line || error.lineNumber) { - message += ' (line ' + (error.line || error.lineNumber) + ')'; - } - - return message; - }; - - this.stack = function(error) { - return error ? error.stack : null; - }; - } - - return ExceptionFormatter; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/Expectation.js b/collections/transformations/bower_components/jasmine/src/core/Expectation.js deleted file mode 100644 index 626a5ce..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Expectation.js +++ /dev/null @@ -1,107 +0,0 @@ -getJasmineRequireObj().Expectation = function() { - - var matchers = {}; - - function Expectation(options) { - this.util = options.util || { buildFailureMessage: function() {} }; - this.customEqualityTesters = options.customEqualityTesters || []; - this.actual = options.actual; - this.addExpectationResult = options.addExpectationResult || function(){}; - this.isNot = options.isNot; - - for (var matcherName in matchers) { - this[matcherName] = matchers[matcherName]; - } - } - - Expectation.prototype.wrapCompare = function(name, matcherFactory) { - return function() { - var args = Array.prototype.slice.call(arguments, 0), - expected = args.slice(0), - message = ''; - - args.unshift(this.actual); - - var matcher = matcherFactory(this.util, this.customEqualityTesters), - matcherCompare = matcher.compare; - - function defaultNegativeCompare() { - var result = matcher.compare.apply(null, args); - result.pass = !result.pass; - return result; - } - - if (this.isNot) { - matcherCompare = matcher.negativeCompare || defaultNegativeCompare; - } - - var result = matcherCompare.apply(null, args); - - if (!result.pass) { - if (!result.message) { - args.unshift(this.isNot); - args.unshift(name); - message = this.util.buildFailureMessage.apply(null, args); - } else { - if (Object.prototype.toString.apply(result.message) === '[object Function]') { - message = result.message(); - } else { - message = result.message; - } - } - } - - if (expected.length == 1) { - expected = expected[0]; - } - - // TODO: how many of these params are needed? - this.addExpectationResult( - result.pass, - { - matcherName: name, - passed: result.pass, - message: message, - actual: this.actual, - expected: expected // TODO: this may need to be arrayified/sliced - } - ); - }; - }; - - Expectation.addCoreMatchers = function(matchers) { - var prototype = Expectation.prototype; - for (var matcherName in matchers) { - var matcher = matchers[matcherName]; - prototype[matcherName] = prototype.wrapCompare(matcherName, matcher); - } - }; - - Expectation.addMatchers = function(matchersToAdd) { - for (var name in matchersToAdd) { - var matcher = matchersToAdd[name]; - matchers[name] = Expectation.prototype.wrapCompare(name, matcher); - } - }; - - Expectation.resetMatchers = function() { - for (var name in matchers) { - delete matchers[name]; - } - }; - - Expectation.Factory = function(options) { - options = options || {}; - - var expect = new Expectation(options); - - // TODO: this would be nice as its own Object - NegativeExpectation - // TODO: copy instead of mutate options - options.isNot = true; - expect.not = new Expectation(options); - - return expect; - }; - - return Expectation; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/ExpectationResult.js b/collections/transformations/bower_components/jasmine/src/core/ExpectationResult.js deleted file mode 100644 index 66dfdb6..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/ExpectationResult.js +++ /dev/null @@ -1,45 +0,0 @@ -//TODO: expectation result may make more sense as a presentation of an expectation. -getJasmineRequireObj().buildExpectationResult = function() { - function buildExpectationResult(options) { - var messageFormatter = options.messageFormatter || function() {}, - stackFormatter = options.stackFormatter || function() {}; - - return { - matcherName: options.matcherName, - expected: options.expected, - actual: options.actual, - message: message(), - stack: stack(), - passed: options.passed - }; - - function message() { - if (options.passed) { - return 'Passed.'; - } else if (options.message) { - return options.message; - } else if (options.error) { - return messageFormatter(options.error); - } - return ''; - } - - function stack() { - if (options.passed) { - return ''; - } - - var error = options.error; - if (!error) { - try { - throw new Error(message()); - } catch (e) { - error = e; - } - } - return stackFormatter(error); - } - } - - return buildExpectationResult; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/JsApiReporter.js b/collections/transformations/bower_components/jasmine/src/core/JsApiReporter.js deleted file mode 100644 index dfb7a03..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/JsApiReporter.js +++ /dev/null @@ -1,73 +0,0 @@ -getJasmineRequireObj().JsApiReporter = function() { - - var noopTimer = { - start: function(){}, - elapsed: function(){ return 0; } - }; - - function JsApiReporter(options) { - var timer = options.timer || noopTimer, - status = 'loaded'; - - this.started = false; - this.finished = false; - - this.jasmineStarted = function() { - this.started = true; - status = 'started'; - timer.start(); - }; - - var executionTime; - - this.jasmineDone = function() { - this.finished = true; - executionTime = timer.elapsed(); - status = 'done'; - }; - - this.status = function() { - return status; - }; - - var suites = {}; - - this.suiteStarted = function(result) { - storeSuite(result); - }; - - this.suiteDone = function(result) { - storeSuite(result); - }; - - function storeSuite(result) { - suites[result.id] = result; - } - - this.suites = function() { - return suites; - }; - - var specs = []; - this.specStarted = function(result) { }; - - this.specDone = function(result) { - specs.push(result); - }; - - this.specResults = function(index, length) { - return specs.slice(index, index + length); - }; - - this.specs = function() { - return specs; - }; - - this.executionTime = function() { - return executionTime; - }; - - } - - return JsApiReporter; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/MockDate.js b/collections/transformations/bower_components/jasmine/src/core/MockDate.js deleted file mode 100644 index db347bb..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/MockDate.js +++ /dev/null @@ -1,81 +0,0 @@ -getJasmineRequireObj().MockDate = function() { - function MockDate(global) { - var self = this; - var currentTime = 0; - - if (!global || !global.Date) { - self.install = function() {}; - self.tick = function() {}; - self.uninstall = function() {}; - return self; - } - - var GlobalDate = global.Date; - - self.install = function(mockDate) { - if (mockDate instanceof GlobalDate) { - currentTime = mockDate.getTime(); - } else { - currentTime = new GlobalDate().getTime(); - } - - global.Date = FakeDate; - }; - - self.tick = function(millis) { - millis = millis || 0; - currentTime = currentTime + millis; - }; - - self.uninstall = function() { - currentTime = 0; - global.Date = GlobalDate; - }; - - createDateProperties(); - - return self; - - function FakeDate() { - switch(arguments.length) { - case 0: - return new GlobalDate(currentTime); - case 1: - return new GlobalDate(arguments[0]); - case 2: - return new GlobalDate(arguments[0], arguments[1]); - case 3: - return new GlobalDate(arguments[0], arguments[1], arguments[2]); - case 4: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3]); - case 5: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], - arguments[4]); - case 6: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], - arguments[4], arguments[5]); - case 7: - return new GlobalDate(arguments[0], arguments[1], arguments[2], arguments[3], - arguments[4], arguments[5], arguments[6]); - } - } - - function createDateProperties() { - - FakeDate.now = function() { - if (GlobalDate.now) { - return currentTime; - } else { - throw new Error('Browser does not support Date.now()'); - } - }; - - FakeDate.toSource = GlobalDate.toSource; - FakeDate.toString = GlobalDate.toString; - FakeDate.parse = GlobalDate.parse; - FakeDate.UTC = GlobalDate.UTC; - } - } - - return MockDate; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/ObjectContaining.js b/collections/transformations/bower_components/jasmine/src/core/ObjectContaining.js deleted file mode 100644 index a9d0518..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/ObjectContaining.js +++ /dev/null @@ -1,34 +0,0 @@ -getJasmineRequireObj().ObjectContaining = function(j$) { - - function ObjectContaining(sample) { - this.sample = sample; - } - - ObjectContaining.prototype.jasmineMatches = function(other, mismatchKeys, mismatchValues) { - if (typeof(this.sample) !== 'object') { throw new Error('You must provide an object to objectContaining, not \''+this.sample+'\'.'); } - - mismatchKeys = mismatchKeys || []; - mismatchValues = mismatchValues || []; - - var hasKey = function(obj, keyName) { - return obj !== null && !j$.util.isUndefined(obj[keyName]); - }; - - for (var property in this.sample) { - if (!hasKey(other, property) && hasKey(this.sample, property)) { - mismatchKeys.push('expected has key \'' + property + '\', but missing from actual.'); - } - else if (!j$.matchersUtil.equals(other[property], this.sample[property])) { - mismatchValues.push('\'' + property + '\' was \'' + (other[property] ? j$.util.htmlEscape(other[property].toString()) : other[property]) + '\' in actual, but was \'' + (this.sample[property] ? j$.util.htmlEscape(this.sample[property].toString()) : this.sample[property]) + '\' in expected.'); - } - } - - return (mismatchKeys.length === 0 && mismatchValues.length === 0); - }; - - ObjectContaining.prototype.jasmineToString = function() { - return ''; - }; - - return ObjectContaining; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/PrettyPrinter.js b/collections/transformations/bower_components/jasmine/src/core/PrettyPrinter.js deleted file mode 100644 index 2c11bc6..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/PrettyPrinter.js +++ /dev/null @@ -1,137 +0,0 @@ -getJasmineRequireObj().pp = function(j$) { - - function PrettyPrinter() { - this.ppNestLevel_ = 0; - this.seen = []; - } - - PrettyPrinter.prototype.format = function(value) { - this.ppNestLevel_++; - try { - if (j$.util.isUndefined(value)) { - this.emitScalar('undefined'); - } else if (value === null) { - this.emitScalar('null'); - } else if (value === 0 && 1/value === -Infinity) { - this.emitScalar('-0'); - } else if (value === j$.getGlobal()) { - this.emitScalar(''); - } else if (value.jasmineToString) { - this.emitScalar(value.jasmineToString()); - } else if (typeof value === 'string') { - this.emitString(value); - } else if (j$.isSpy(value)) { - this.emitScalar('spy on ' + value.and.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 (j$.util.arrayContains(this.seen, value)) { - this.emitScalar(''); - } else if (j$.isArray_(value) || j$.isA_('Object', value)) { - this.seen.push(value); - if (j$.isArray_(value)) { - this.emitArray(value); - } else { - this.emitObject(value); - } - this.seen.pop(); - } else { - this.emitScalar(value.toString()); - } - } finally { - this.ppNestLevel_--; - } - }; - - PrettyPrinter.prototype.iterateObject = function(obj, fn) { - for (var property in obj) { - if (!Object.prototype.hasOwnProperty.call(obj, property)) { continue; } - fn(property, obj.__lookupGetter__ ? (!j$.util.isUndefined(obj.__lookupGetter__(property)) && - obj.__lookupGetter__(property) !== null) : false); - } - }; - - PrettyPrinter.prototype.emitArray = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitObject = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitScalar = j$.unimplementedMethod_; - PrettyPrinter.prototype.emitString = j$.unimplementedMethod_; - - function StringPrettyPrinter() { - PrettyPrinter.call(this); - - this.string = ''; - } - - j$.util.inherit(StringPrettyPrinter, PrettyPrinter); - - StringPrettyPrinter.prototype.emitScalar = function(value) { - this.append(value); - }; - - StringPrettyPrinter.prototype.emitString = function(value) { - this.append('\'' + value + '\''); - }; - - StringPrettyPrinter.prototype.emitArray = function(array) { - if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { - this.append('Array'); - return; - } - var length = Math.min(array.length, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH); - this.append('[ '); - for (var i = 0; i < length; i++) { - if (i > 0) { - this.append(', '); - } - this.format(array[i]); - } - if(array.length > length){ - this.append(', ...'); - } - this.append(' ]'); - }; - - StringPrettyPrinter.prototype.emitObject = function(obj) { - if (this.ppNestLevel_ > j$.MAX_PRETTY_PRINT_DEPTH) { - this.append('Object'); - return; - } - - var self = this; - this.append('{ '); - var first = true; - - this.iterateObject(obj, function(property, isGetter) { - if (first) { - first = false; - } else { - self.append(', '); - } - - self.append(property); - self.append(': '); - if (isGetter) { - self.append(''); - } else { - self.format(obj[property]); - } - }); - - this.append(' }'); - }; - - StringPrettyPrinter.prototype.append = function(value) { - this.string += value; - }; - - return function(value) { - var stringPrettyPrinter = new StringPrettyPrinter(); - stringPrettyPrinter.format(value); - return stringPrettyPrinter.string; - }; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/QueueRunner.js b/collections/transformations/bower_components/jasmine/src/core/QueueRunner.js deleted file mode 100644 index 4a0e66f..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/QueueRunner.js +++ /dev/null @@ -1,92 +0,0 @@ -getJasmineRequireObj().QueueRunner = function(j$) { - - function once(fn) { - var called = false; - return function() { - if (!called) { - called = true; - fn(); - } - }; - } - - function QueueRunner(attrs) { - this.fns = attrs.fns || []; - this.onComplete = attrs.onComplete || function() {}; - this.clearStack = attrs.clearStack || function(fn) {fn();}; - this.onException = attrs.onException || function() {}; - this.catchException = attrs.catchException || function() { return true; }; - this.enforceTimeout = attrs.enforceTimeout || function() { return false; }; - this.userContext = {}; - this.timer = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout}; - } - - QueueRunner.prototype.execute = function() { - this.run(this.fns, 0); - }; - - QueueRunner.prototype.run = function(fns, recursiveIndex) { - var length = fns.length, - self = this, - iterativeIndex; - - for(iterativeIndex = recursiveIndex; iterativeIndex < length; iterativeIndex++) { - var fn = fns[iterativeIndex]; - if (fn.length > 0) { - return attemptAsync(fn); - } else { - attemptSync(fn); - } - } - - var runnerDone = iterativeIndex >= length; - - if (runnerDone) { - this.clearStack(this.onComplete); - } - - function attemptSync(fn) { - try { - fn.call(self.userContext); - } catch (e) { - handleException(e); - } - } - - function attemptAsync(fn) { - var clearTimeout = function () { - Function.prototype.apply.apply(self.timer.clearTimeout, [j$.getGlobal(), [timeoutId]]); - }, - next = once(function () { - clearTimeout(timeoutId); - self.run(fns, iterativeIndex + 1); - }), - timeoutId; - - if (self.enforceTimeout()) { - timeoutId = Function.prototype.apply.apply(self.timer.setTimeout, [j$.getGlobal(), [function() { - self.onException(new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.')); - next(); - }, j$.DEFAULT_TIMEOUT_INTERVAL]]); - } - - try { - fn.call(self.userContext, next); - } catch (e) { - handleException(e); - next(); - } - } - - function handleException(e) { - self.onException(e); - if (!self.catchException(e)) { - //TODO: set a var when we catch an exception and - //use a finally block to close the loop in a nice way.. - throw e; - } - } - }; - - return QueueRunner; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/ReportDispatcher.js b/collections/transformations/bower_components/jasmine/src/core/ReportDispatcher.js deleted file mode 100644 index 64454f0..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/ReportDispatcher.js +++ /dev/null @@ -1,35 +0,0 @@ -getJasmineRequireObj().ReportDispatcher = function() { - function ReportDispatcher(methods) { - - var dispatchedMethods = methods || []; - - for (var i = 0; i < dispatchedMethods.length; i++) { - var method = dispatchedMethods[i]; - this[method] = (function(m) { - return function() { - dispatch(m, arguments); - }; - }(method)); - } - - var reporters = []; - - this.addReporter = function(reporter) { - reporters.push(reporter); - }; - - return this; - - function dispatch(method, args) { - for (var i = 0; i < reporters.length; i++) { - var reporter = reporters[i]; - if (reporter[method]) { - reporter[method].apply(reporter, args); - } - } - } - } - - return ReportDispatcher; -}; - diff --git a/collections/transformations/bower_components/jasmine/src/core/Spec.js b/collections/transformations/bower_components/jasmine/src/core/Spec.js deleted file mode 100644 index c85e67d..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Spec.js +++ /dev/null @@ -1,126 +0,0 @@ -getJasmineRequireObj().Spec = function(j$) { - function Spec(attrs) { - this.expectationFactory = attrs.expectationFactory; - this.resultCallback = attrs.resultCallback || function() {}; - this.id = attrs.id; - this.description = attrs.description || ''; - this.fn = attrs.fn; - this.beforeFns = attrs.beforeFns || function() { return []; }; - this.afterFns = attrs.afterFns || function() { return []; }; - this.onStart = attrs.onStart || function() {}; - this.exceptionFormatter = attrs.exceptionFormatter || function() {}; - this.getSpecName = attrs.getSpecName || function() { return ''; }; - this.expectationResultFactory = attrs.expectationResultFactory || function() { }; - this.queueRunnerFactory = attrs.queueRunnerFactory || function() {}; - this.catchingExceptions = attrs.catchingExceptions || function() { return true; }; - - if (!this.fn) { - this.pend(); - } - - this.result = { - id: this.id, - description: this.description, - fullName: this.getFullName(), - failedExpectations: [], - passedExpectations: [] - }; - } - - Spec.prototype.addExpectationResult = function(passed, data) { - var expectationResult = this.expectationResultFactory(data); - if (passed) { - this.result.passedExpectations.push(expectationResult); - } else { - this.result.failedExpectations.push(expectationResult); - } - }; - - Spec.prototype.expect = function(actual) { - return this.expectationFactory(actual, this); - }; - - Spec.prototype.execute = function(onComplete) { - var self = this; - - this.onStart(this); - - if (this.markedPending || this.disabled) { - complete(); - return; - } - - var allFns = this.beforeFns().concat(this.fn).concat(this.afterFns()); - - this.queueRunnerFactory({ - fns: allFns, - onException: onException, - onComplete: complete, - enforceTimeout: function() { return true; } - }); - - function onException(e) { - if (Spec.isPendingSpecException(e)) { - self.pend(); - return; - } - - self.addExpectationResult(false, { - matcherName: '', - passed: false, - expected: '', - actual: '', - error: e - }); - } - - function complete() { - self.result.status = self.status(); - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); - } - } - }; - - Spec.prototype.disable = function() { - this.disabled = true; - }; - - Spec.prototype.pend = function() { - this.markedPending = true; - }; - - Spec.prototype.status = function() { - if (this.disabled) { - return 'disabled'; - } - - if (this.markedPending) { - return 'pending'; - } - - if (this.result.failedExpectations.length > 0) { - return 'failed'; - } else { - return 'passed'; - } - }; - - Spec.prototype.getFullName = function() { - return this.getSpecName(this); - }; - - Spec.pendingSpecExceptionMessage = '=> marked Pending'; - - Spec.isPendingSpecException = function(e) { - return !!(e && e.toString && e.toString().indexOf(Spec.pendingSpecExceptionMessage) !== -1); - }; - - return Spec; -}; - -if (typeof window == void 0 && typeof exports == 'object') { - exports.Spec = jasmineRequire.Spec; -} diff --git a/collections/transformations/bower_components/jasmine/src/core/SpyStrategy.js b/collections/transformations/bower_components/jasmine/src/core/SpyStrategy.js deleted file mode 100644 index e58438e..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/SpyStrategy.js +++ /dev/null @@ -1,51 +0,0 @@ -getJasmineRequireObj().SpyStrategy = function() { - - function SpyStrategy(options) { - options = options || {}; - - var identity = options.name || 'unknown', - originalFn = options.fn || function() {}, - getSpy = options.getSpy || function() {}, - plan = function() {}; - - this.identity = function() { - return identity; - }; - - this.exec = function() { - return plan.apply(this, arguments); - }; - - this.callThrough = function() { - plan = originalFn; - return getSpy(); - }; - - this.returnValue = function(value) { - plan = function() { - return value; - }; - return getSpy(); - }; - - this.throwError = function(something) { - var error = (something instanceof Error) ? something : new Error(something); - plan = function() { - throw error; - }; - return getSpy(); - }; - - this.callFake = function(fn) { - plan = fn; - return getSpy(); - }; - - this.stub = function(fn) { - plan = function() {}; - return getSpy(); - }; - } - - return SpyStrategy; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/Suite.js b/collections/transformations/bower_components/jasmine/src/core/Suite.js deleted file mode 100644 index 4d5e393..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Suite.js +++ /dev/null @@ -1,92 +0,0 @@ -getJasmineRequireObj().Suite = function() { - function Suite(attrs) { - this.env = attrs.env; - this.id = attrs.id; - this.parentSuite = attrs.parentSuite; - this.description = attrs.description; - this.onStart = attrs.onStart || function() {}; - this.resultCallback = attrs.resultCallback || function() {}; - this.clearStack = attrs.clearStack || function(fn) {fn();}; - - this.beforeFns = []; - this.afterFns = []; - this.queueRunner = attrs.queueRunner || function() {}; - this.disabled = false; - - this.children = []; - - this.result = { - id: this.id, - status: this.disabled ? 'disabled' : '', - description: this.description, - fullName: this.getFullName() - }; - } - - Suite.prototype.getFullName = function() { - var fullName = this.description; - for (var parentSuite = this.parentSuite; parentSuite; parentSuite = parentSuite.parentSuite) { - if (parentSuite.parentSuite) { - fullName = parentSuite.description + ' ' + fullName; - } - } - return fullName; - }; - - Suite.prototype.disable = function() { - this.disabled = true; - this.result.status = 'disabled'; - }; - - Suite.prototype.beforeEach = function(fn) { - this.beforeFns.unshift(fn); - }; - - Suite.prototype.afterEach = function(fn) { - this.afterFns.unshift(fn); - }; - - Suite.prototype.addChild = function(child) { - this.children.push(child); - }; - - Suite.prototype.execute = function(onComplete) { - var self = this; - - this.onStart(this); - - if (this.disabled) { - complete(); - return; - } - - var allFns = []; - - for (var i = 0; i < this.children.length; i++) { - allFns.push(wrapChildAsAsync(this.children[i])); - } - - this.queueRunner({ - fns: allFns, - onComplete: complete - }); - - function complete() { - self.resultCallback(self.result); - - if (onComplete) { - onComplete(); - } - } - - function wrapChildAsAsync(child) { - return function(done) { child.execute(done); }; - } - }; - - return Suite; -}; - -if (typeof window == void 0 && typeof exports == 'object') { - exports.Suite = jasmineRequire.Suite; -} diff --git a/collections/transformations/bower_components/jasmine/src/core/Timer.js b/collections/transformations/bower_components/jasmine/src/core/Timer.js deleted file mode 100644 index f8270f4..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/Timer.js +++ /dev/null @@ -1,22 +0,0 @@ -getJasmineRequireObj().Timer = function() { - var defaultNow = (function(Date) { - return function() { return new Date().getTime(); }; - })(Date); - - function Timer(options) { - options = options || {}; - - var now = options.now || defaultNow, - startTime; - - this.start = function() { - startTime = now(); - }; - - this.elapsed = function() { - return now() - startTime; - }; - } - - return Timer; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/base.js b/collections/transformations/bower_components/jasmine/src/core/base.js deleted file mode 100644 index d895ceb..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/base.js +++ /dev/null @@ -1,102 +0,0 @@ -getJasmineRequireObj().base = (function (jasmineGlobal) { - if (typeof module !== 'undefined' && module.exports) { - jasmineGlobal = global; - } - - return function(j$) { - j$.unimplementedMethod_ = function() { - throw new Error('unimplemented method'); - }; - - j$.MAX_PRETTY_PRINT_DEPTH = 40; - j$.MAX_PRETTY_PRINT_ARRAY_LENGTH = 100; - j$.DEFAULT_TIMEOUT_INTERVAL = 5000; - - j$.getGlobal = function() { - return jasmineGlobal; - }; - - j$.getEnv = function(options) { - var env = j$.currentEnv_ = j$.currentEnv_ || new j$.Env(options); - //jasmine. singletons in here (setTimeout blah blah). - return env; - }; - - j$.isArray_ = function(value) { - return j$.isA_('Array', value); - }; - - j$.isString_ = function(value) { - return j$.isA_('String', value); - }; - - j$.isNumber_ = function(value) { - return j$.isA_('Number', value); - }; - - j$.isA_ = function(typeName, value) { - return Object.prototype.toString.apply(value) === '[object ' + typeName + ']'; - }; - - j$.isDomNode = function(obj) { - return obj.nodeType > 0; - }; - - j$.any = function(clazz) { - return new j$.Any(clazz); - }; - - j$.objectContaining = function(sample) { - return new j$.ObjectContaining(sample); - }; - - j$.createSpy = function(name, originalFn) { - - var spyStrategy = new j$.SpyStrategy({ - name: name, - fn: originalFn, - getSpy: function() { return spy; } - }), - callTracker = new j$.CallTracker(), - spy = function() { - callTracker.track({ - object: this, - args: Array.prototype.slice.apply(arguments) - }); - return spyStrategy.exec.apply(this, arguments); - }; - - for (var prop in originalFn) { - if (prop === 'and' || prop === 'calls') { - throw new Error('Jasmine spies would overwrite the \'and\' and \'calls\' properties on the object being spied upon'); - } - - spy[prop] = originalFn[prop]; - } - - spy.and = spyStrategy; - spy.calls = callTracker; - - return spy; - }; - - j$.isSpy = function(putativeSpy) { - if (!putativeSpy) { - return false; - } - return putativeSpy.and instanceof j$.SpyStrategy && - putativeSpy.calls instanceof j$.CallTracker; - }; - - j$.createSpyObj = function(baseName, methodNames) { - if (!j$.isArray_(methodNames) || methodNames.length === 0) { - throw 'createSpyObj requires a non-empty array of method names to create spies for'; - } - var obj = {}; - for (var i = 0; i < methodNames.length; i++) { - obj[methodNames[i]] = j$.createSpy(baseName + '.' + methodNames[i]); - } - return obj; - }; - }; -})(this); diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/matchersUtil.js b/collections/transformations/bower_components/jasmine/src/core/matchers/matchersUtil.js deleted file mode 100644 index b6fb838..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/matchersUtil.js +++ /dev/null @@ -1,181 +0,0 @@ -getJasmineRequireObj().matchersUtil = function(j$) { - // TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter? - - return { - equals: function(a, b, customTesters) { - customTesters = customTesters || []; - - return eq(a, b, [], [], customTesters); - }, - - contains: function(haystack, needle, customTesters) { - customTesters = customTesters || []; - - if (Object.prototype.toString.apply(haystack) === '[object Array]') { - for (var i = 0; i < haystack.length; i++) { - if (eq(haystack[i], needle, [], [], customTesters)) { - return true; - } - } - return false; - } - return !!haystack && haystack.indexOf(needle) >= 0; - }, - - buildFailureMessage: function() { - var args = Array.prototype.slice.call(arguments, 0), - matcherName = args[0], - isNot = args[1], - actual = args[2], - expected = args.slice(3), - englishyPredicate = matcherName.replace(/[A-Z]/g, function(s) { return ' ' + s.toLowerCase(); }); - - var message = 'Expected ' + - j$.pp(actual) + - (isNot ? ' not ' : ' ') + - englishyPredicate; - - if (expected.length > 0) { - for (var i = 0; i < expected.length; i++) { - if (i > 0) { - message += ','; - } - message += ' ' + j$.pp(expected[i]); - } - } - - return message + '.'; - } - }; - - // Equality function lovingly adapted from isEqual in - // [Underscore](http://underscorejs.org) - function eq(a, b, aStack, bStack, customTesters) { - var result = true; - - for (var i = 0; i < customTesters.length; i++) { - var customTesterResult = customTesters[i](a, b); - if (!j$.util.isUndefined(customTesterResult)) { - return customTesterResult; - } - } - - if (a instanceof j$.Any) { - result = a.jasmineMatches(b); - if (result) { - return true; - } - } - - if (b instanceof j$.Any) { - result = b.jasmineMatches(a); - if (result) { - return true; - } - } - - if (b instanceof j$.ObjectContaining) { - result = b.jasmineMatches(a); - if (result) { - return true; - } - } - - if (a instanceof Error && b instanceof Error) { - return a.message == b.message; - } - - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). - if (a === b) { return a !== 0 || 1 / a == 1 / b; } - // A strict comparison is necessary because `null == undefined`. - if (a === null || b === null) { return a === b; } - var className = Object.prototype.toString.call(a); - if (className != Object.prototype.toString.call(b)) { return false; } - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return a == String(b); - case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a === 0 ? 1 / a == 1 / b : a == +b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') { return false; } - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = aStack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (aStack[length] == a) { return bStack[length] == b; } - } - // Add the first object to the stack of traversed objects. - aStack.push(a); - bStack.push(b); - var size = 0; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - if (!(result = eq(a[size], b[size], aStack, bStack, customTesters))) { break; } - } - } - } else { - // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(isFunction(aCtor) && (aCtor instanceof aCtor) && - isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; - } - // Deep compare objects. - for (var key in a) { - if (has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = has(b, key) && eq(a[key], b[key], aStack, bStack, customTesters))) { break; } - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (has(b, key) && !(size--)) { break; } - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - aStack.pop(); - bStack.pop(); - - return result; - - function has(obj, key) { - return obj.hasOwnProperty(key); - } - - function isFunction(obj) { - return typeof obj === 'function'; - } - } -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/requireMatchers.js b/collections/transformations/bower_components/jasmine/src/core/matchers/requireMatchers.js deleted file mode 100644 index 2b21a7a..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/requireMatchers.js +++ /dev/null @@ -1,29 +0,0 @@ -getJasmineRequireObj().requireMatchers = function(jRequire, j$) { - var availableMatchers = [ - 'toBe', - 'toBeCloseTo', - 'toBeDefined', - 'toBeFalsy', - 'toBeGreaterThan', - 'toBeLessThan', - 'toBeNaN', - 'toBeNull', - 'toBeTruthy', - 'toBeUndefined', - 'toContain', - 'toEqual', - 'toHaveBeenCalled', - 'toHaveBeenCalledWith', - 'toMatch', - 'toThrow', - 'toThrowError' - ], - matchers = {}; - - for (var i = 0; i < availableMatchers.length; i++) { - var name = availableMatchers[i]; - matchers[name] = jRequire[name](j$); - } - - return matchers; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBe.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBe.js deleted file mode 100644 index f0bf88f..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBe.js +++ /dev/null @@ -1,13 +0,0 @@ -getJasmineRequireObj().toBe = function() { - function toBe() { - return { - compare: function(actual, expected) { - return { - pass: actual === expected - }; - } - }; - } - - return toBe; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeCloseTo.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeCloseTo.js deleted file mode 100644 index 52e6312..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeCloseTo.js +++ /dev/null @@ -1,18 +0,0 @@ -getJasmineRequireObj().toBeCloseTo = function() { - - function toBeCloseTo() { - return { - compare: function(actual, expected, precision) { - if (precision !== 0) { - precision = precision || 2; - } - - return { - pass: Math.abs(expected - actual) < (Math.pow(10, -precision) / 2) - }; - } - }; - } - - return toBeCloseTo; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeDefined.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeDefined.js deleted file mode 100644 index 68bca65..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeDefined.js +++ /dev/null @@ -1,13 +0,0 @@ -getJasmineRequireObj().toBeDefined = function() { - function toBeDefined() { - return { - compare: function(actual) { - return { - pass: (void 0 !== actual) - }; - } - }; - } - - return toBeDefined; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeFalsy.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeFalsy.js deleted file mode 100644 index 663c84e..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeFalsy.js +++ /dev/null @@ -1,13 +0,0 @@ -getJasmineRequireObj().toBeFalsy = function() { - function toBeFalsy() { - return { - compare: function(actual) { - return { - pass: !!!actual - }; - } - }; - } - - return toBeFalsy; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeGreaterThan.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeGreaterThan.js deleted file mode 100644 index 6196159..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeGreaterThan.js +++ /dev/null @@ -1,15 +0,0 @@ -getJasmineRequireObj().toBeGreaterThan = function() { - - function toBeGreaterThan() { - return { - compare: function(actual, expected) { - return { - pass: actual > expected - }; - } - }; - } - - return toBeGreaterThan; -}; - diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeLessThan.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeLessThan.js deleted file mode 100644 index 2c29be3..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeLessThan.js +++ /dev/null @@ -1,14 +0,0 @@ -getJasmineRequireObj().toBeLessThan = function() { - function toBeLessThan() { - return { - - compare: function(actual, expected) { - return { - pass: actual < expected - }; - } - }; - } - - return toBeLessThan; -}; \ No newline at end of file diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeNaN.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeNaN.js deleted file mode 100644 index f00eee2..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeNaN.js +++ /dev/null @@ -1,22 +0,0 @@ -getJasmineRequireObj().toBeNaN = function(j$) { - - function toBeNaN() { - return { - compare: function(actual) { - var result = { - pass: (actual !== actual) - }; - - if (result.pass) { - result.message = 'Expected actual not to be NaN.'; - } else { - result.message = function() { return 'Expected ' + j$.pp(actual) + ' to be NaN.'; }; - } - - return result; - } - }; - } - - return toBeNaN; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeNull.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeNull.js deleted file mode 100644 index 47ba8ea..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeNull.js +++ /dev/null @@ -1,14 +0,0 @@ -getJasmineRequireObj().toBeNull = function() { - - function toBeNull() { - return { - compare: function(actual) { - return { - pass: actual === null - }; - } - }; - } - - return toBeNull; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeTruthy.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeTruthy.js deleted file mode 100644 index 5ab044b..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeTruthy.js +++ /dev/null @@ -1,14 +0,0 @@ -getJasmineRequireObj().toBeTruthy = function() { - - function toBeTruthy() { - return { - compare: function(actual) { - return { - pass: !!actual - }; - } - }; - } - - return toBeTruthy; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeUndefined.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toBeUndefined.js deleted file mode 100644 index dfae8f4..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toBeUndefined.js +++ /dev/null @@ -1,14 +0,0 @@ -getJasmineRequireObj().toBeUndefined = function() { - - function toBeUndefined() { - return { - compare: function(actual) { - return { - pass: void 0 === actual - }; - } - }; - } - - return toBeUndefined; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toContain.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toContain.js deleted file mode 100644 index ac05cd2..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toContain.js +++ /dev/null @@ -1,16 +0,0 @@ -getJasmineRequireObj().toContain = function() { - function toContain(util, customEqualityTesters) { - customEqualityTesters = customEqualityTesters || []; - - return { - compare: function(actual, expected) { - - return { - pass: util.contains(actual, expected, customEqualityTesters) - }; - } - }; - } - - return toContain; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toEqual.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toEqual.js deleted file mode 100644 index 653541b..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toEqual.js +++ /dev/null @@ -1,20 +0,0 @@ -getJasmineRequireObj().toEqual = function() { - - function toEqual(util, customEqualityTesters) { - customEqualityTesters = customEqualityTesters || []; - - return { - compare: function(actual, expected) { - var result = { - pass: false - }; - - result.pass = util.equals(actual, expected, customEqualityTesters); - - return result; - } - }; - } - - return toEqual; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalled.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalled.js deleted file mode 100644 index 5c7a1a9..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalled.js +++ /dev/null @@ -1,28 +0,0 @@ -getJasmineRequireObj().toHaveBeenCalled = function(j$) { - - function toHaveBeenCalled() { - return { - compare: function(actual) { - var result = {}; - - if (!j$.isSpy(actual)) { - throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.'); - } - - if (arguments.length > 1) { - throw new Error('toHaveBeenCalled does not take arguments, use toHaveBeenCalledWith'); - } - - result.pass = actual.calls.any(); - - result.message = result.pass ? - 'Expected spy ' + actual.and.identity() + ' not to have been called.' : - 'Expected spy ' + actual.and.identity() + ' to have been called.'; - - return result; - } - }; - } - - return toHaveBeenCalled; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalledWith.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalledWith.js deleted file mode 100644 index 18a6c5b..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toHaveBeenCalledWith.js +++ /dev/null @@ -1,33 +0,0 @@ -getJasmineRequireObj().toHaveBeenCalledWith = function(j$) { - - function toHaveBeenCalledWith(util, customEqualityTesters) { - return { - compare: function() { - var args = Array.prototype.slice.call(arguments, 0), - actual = args[0], - expectedArgs = args.slice(1), - result = { pass: false }; - - if (!j$.isSpy(actual)) { - throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.'); - } - - if (!actual.calls.any()) { - result.message = function() { return 'Expected spy ' + actual.and.identity() + ' to have been called with ' + j$.pp(expectedArgs) + ' but it was never called.'; }; - return result; - } - - if (util.contains(actual.calls.allArgs(), expectedArgs, customEqualityTesters)) { - result.pass = true; - result.message = function() { return 'Expected spy ' + actual.and.identity() + ' not to have been called with ' + j$.pp(expectedArgs) + ' but it was.'; }; - } else { - result.message = function() { return 'Expected spy ' + actual.and.identity() + ' to have been called with ' + j$.pp(expectedArgs) + ' but actual calls were ' + j$.pp(actual.calls.allArgs()).replace(/^\[ | \]$/g, '') + '.'; }; - } - - return result; - } - }; - } - - return toHaveBeenCalledWith; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toMatch.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toMatch.js deleted file mode 100644 index 38309fd..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toMatch.js +++ /dev/null @@ -1,16 +0,0 @@ -getJasmineRequireObj().toMatch = function() { - - function toMatch() { - return { - compare: function(actual, expected) { - var regexp = new RegExp(expected); - - return { - pass: regexp.test(actual) - }; - } - }; - } - - return toMatch; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toThrow.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toThrow.js deleted file mode 100644 index ae0ea12..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toThrow.js +++ /dev/null @@ -1,46 +0,0 @@ -getJasmineRequireObj().toThrow = function(j$) { - - function toThrow(util) { - return { - compare: function(actual, expected) { - var result = { pass: false }, - threw = false, - thrown; - - if (typeof actual != 'function') { - throw new Error('Actual is not a Function'); - } - - try { - actual(); - } catch (e) { - threw = true; - thrown = e; - } - - if (!threw) { - result.message = 'Expected function to throw an exception.'; - return result; - } - - if (arguments.length == 1) { - result.pass = true; - result.message = function() { return 'Expected function not to throw, but it threw ' + j$.pp(thrown) + '.'; }; - - return result; - } - - if (util.equals(thrown, expected)) { - result.pass = true; - result.message = function() { return 'Expected function not to throw ' + j$.pp(expected) + '.'; }; - } else { - result.message = function() { return 'Expected function to throw ' + j$.pp(expected) + ', but it threw ' + j$.pp(thrown) + '.'; }; - } - - return result; - } - }; - } - - return toThrow; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/matchers/toThrowError.js b/collections/transformations/bower_components/jasmine/src/core/matchers/toThrowError.js deleted file mode 100644 index e8f220d..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/matchers/toThrowError.js +++ /dev/null @@ -1,156 +0,0 @@ -getJasmineRequireObj().toThrowError = function(j$) { - function toThrowError (util) { - return { - compare: function(actual) { - var threw = false, - pass = {pass: true}, - fail = {pass: false}, - thrown, - errorType, - message, - regexp, - name, - constructorName; - - if (typeof actual != 'function') { - throw new Error('Actual is not a Function'); - } - - extractExpectedParams.apply(null, arguments); - - try { - actual(); - } catch (e) { - threw = true; - thrown = e; - } - - if (!threw) { - fail.message = 'Expected function to throw an Error.'; - return fail; - } - - if (!(thrown instanceof Error)) { - fail.message = function() { return 'Expected function to throw an Error, but it threw ' + j$.pp(thrown) + '.'; }; - return fail; - } - - if (arguments.length == 1) { - pass.message = 'Expected function not to throw an Error, but it threw ' + fnNameFor(thrown) + '.'; - return pass; - } - - if (errorType) { - name = fnNameFor(errorType); - constructorName = fnNameFor(thrown.constructor); - } - - if (errorType && message) { - if (thrown.constructor == errorType && util.equals(thrown.message, message)) { - pass.message = function() { return 'Expected function not to throw ' + name + ' with message ' + j$.pp(message) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw ' + name + ' with message ' + j$.pp(message) + - ', but it threw ' + constructorName + ' with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } - } - - if (errorType && regexp) { - if (thrown.constructor == errorType && regexp.test(thrown.message)) { - pass.message = function() { return 'Expected function not to throw ' + name + ' with message matching ' + j$.pp(regexp) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw ' + name + ' with message matching ' + j$.pp(regexp) + - ', but it threw ' + constructorName + ' with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } - } - - if (errorType) { - if (thrown.constructor == errorType) { - pass.message = 'Expected function not to throw ' + name + '.'; - return pass; - } else { - fail.message = 'Expected function to throw ' + name + ', but it threw ' + constructorName + '.'; - return fail; - } - } - - if (message) { - if (thrown.message == message) { - pass.message = function() { return 'Expected function not to throw an exception with message ' + j$.pp(message) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw an exception with message ' + j$.pp(message) + - ', but it threw an exception with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } - } - - if (regexp) { - if (regexp.test(thrown.message)) { - pass.message = function() { return 'Expected function not to throw an exception with a message matching ' + j$.pp(regexp) + '.'; }; - return pass; - } else { - fail.message = function() { return 'Expected function to throw an exception with a message matching ' + j$.pp(regexp) + - ', but it threw an exception with message ' + j$.pp(thrown.message) + '.'; }; - return fail; - } - } - - function fnNameFor(func) { - return func.name || func.toString().match(/^\s*function\s*(\w*)\s*\(/)[1]; - } - - function extractExpectedParams() { - if (arguments.length == 1) { - return; - } - - if (arguments.length == 2) { - var expected = arguments[1]; - - if (expected instanceof RegExp) { - regexp = expected; - } else if (typeof expected == 'string') { - message = expected; - } else if (checkForAnErrorType(expected)) { - errorType = expected; - } - - if (!(errorType || message || regexp)) { - throw new Error('Expected is not an Error, string, or RegExp.'); - } - } else { - if (checkForAnErrorType(arguments[1])) { - errorType = arguments[1]; - } else { - throw new Error('Expected error type is not an Error.'); - } - - if (arguments[2] instanceof RegExp) { - regexp = arguments[2]; - } else if (typeof arguments[2] == 'string') { - message = arguments[2]; - } else { - throw new Error('Expected error message is not a string or RegExp.'); - } - } - } - - function checkForAnErrorType(type) { - if (typeof type !== 'function') { - return false; - } - - var Surrogate = function() {}; - Surrogate.prototype = type.prototype; - return (new Surrogate()) instanceof Error; - } - } - }; - } - - return toThrowError; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/requireCore.js b/collections/transformations/bower_components/jasmine/src/core/requireCore.js deleted file mode 100644 index 528489b..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/requireCore.js +++ /dev/null @@ -1,39 +0,0 @@ -function getJasmineRequireObj() { - if (typeof module !== 'undefined' && module.exports) { - return exports; - } else { - window.jasmineRequire = window.jasmineRequire || {}; - return window.jasmineRequire; - } -} - -getJasmineRequireObj().core = function(jRequire) { - var j$ = {}; - - jRequire.base(j$); - j$.util = jRequire.util(); - j$.Any = jRequire.Any(); - j$.CallTracker = jRequire.CallTracker(); - j$.MockDate = jRequire.MockDate(); - j$.Clock = jRequire.Clock(); - j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler(); - j$.Env = jRequire.Env(j$); - j$.ExceptionFormatter = jRequire.ExceptionFormatter(); - j$.Expectation = jRequire.Expectation(); - j$.buildExpectationResult = jRequire.buildExpectationResult(); - j$.JsApiReporter = jRequire.JsApiReporter(); - j$.matchersUtil = jRequire.matchersUtil(j$); - j$.ObjectContaining = jRequire.ObjectContaining(j$); - j$.pp = jRequire.pp(j$); - j$.QueueRunner = jRequire.QueueRunner(j$); - j$.ReportDispatcher = jRequire.ReportDispatcher(); - j$.Spec = jRequire.Spec(j$); - j$.SpyStrategy = jRequire.SpyStrategy(); - j$.Suite = jRequire.Suite(); - j$.Timer = jRequire.Timer(); - j$.version = jRequire.version(); - - j$.matchers = jRequire.requireMatchers(jRequire, j$); - - return j$; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/requireInterface.js b/collections/transformations/bower_components/jasmine/src/core/requireInterface.js deleted file mode 100644 index 85b87ef..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/requireInterface.js +++ /dev/null @@ -1,59 +0,0 @@ -getJasmineRequireObj().interface = function(jasmine, env) { - var jasmineInterface = { - describe: function(description, specDefinitions) { - return env.describe(description, specDefinitions); - }, - - xdescribe: function(description, specDefinitions) { - return env.xdescribe(description, specDefinitions); - }, - - it: function(desc, func) { - return env.it(desc, func); - }, - - xit: function(desc, func) { - return env.xit(desc, func); - }, - - beforeEach: function(beforeEachFunction) { - return env.beforeEach(beforeEachFunction); - }, - - afterEach: function(afterEachFunction) { - return env.afterEach(afterEachFunction); - }, - - expect: function(actual) { - return env.expect(actual); - }, - - pending: function() { - return env.pending(); - }, - - spyOn: function(obj, methodName) { - return env.spyOn(obj, methodName); - }, - - jsApiReporter: new jasmine.JsApiReporter({ - timer: new jasmine.Timer() - }), - - jasmine: jasmine - }; - - jasmine.addCustomEqualityTester = function(tester) { - env.addCustomEqualityTester(tester); - }; - - jasmine.addMatchers = function(matchers) { - return env.addMatchers(matchers); - }; - - jasmine.clock = function() { - return env.clock; - }; - - return jasmineInterface; -}; diff --git a/collections/transformations/bower_components/jasmine/src/core/util.js b/collections/transformations/bower_components/jasmine/src/core/util.js deleted file mode 100644 index fa9ef13..0000000 --- a/collections/transformations/bower_components/jasmine/src/core/util.js +++ /dev/null @@ -1,44 +0,0 @@ -getJasmineRequireObj().util = function() { - - var util = {}; - - util.inherit = function(childClass, parentClass) { - var Subclass = function() { - }; - Subclass.prototype = parentClass.prototype; - childClass.prototype = new Subclass(); - }; - - util.htmlEscape = function(str) { - if (!str) { - return str; - } - return str.replace(/&/g, '&') - .replace(//g, '>'); - }; - - util.argsToArray = function(args) { - var arrayOfArgs = []; - for (var i = 0; i < args.length; i++) { - arrayOfArgs.push(args[i]); - } - return arrayOfArgs; - }; - - util.isUndefined = function(obj) { - return obj === void 0; - }; - - util.arrayContains = function(array, search) { - var i = array.length; - while (i--) { - if (array[i] == search) { - return true; - } - } - return false; - }; - - return util; -}; diff --git a/collections/transformations/bower_components/jasmine/src/html/HtmlReporter.js b/collections/transformations/bower_components/jasmine/src/html/HtmlReporter.js deleted file mode 100644 index 3322a1d..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/HtmlReporter.js +++ /dev/null @@ -1,280 +0,0 @@ -jasmineRequire.HtmlReporter = function(j$) { - - var noopTimer = { - start: function() {}, - elapsed: function() { return 0; } - }; - - function HtmlReporter(options) { - var env = options.env || {}, - getContainer = options.getContainer, - createElement = options.createElement, - createTextNode = options.createTextNode, - onRaiseExceptionsClick = options.onRaiseExceptionsClick || function() {}, - timer = options.timer || noopTimer, - results = [], - specsExecuted = 0, - failureCount = 0, - pendingSpecCount = 0, - htmlReporterMain, - symbols; - - this.initialize = function() { - clearPrior(); - htmlReporterMain = createDom('div', {className: 'jasmine_html-reporter'}, - createDom('div', {className: 'banner'}, - createDom('a', {className: 'title', href: 'http://jasmine.github.io/', target: '_blank'}), - createDom('span', {className: 'version'}, j$.version) - ), - createDom('ul', {className: 'symbol-summary'}), - createDom('div', {className: 'alert'}), - createDom('div', {className: 'results'}, - createDom('div', {className: 'failures'}) - ) - ); - getContainer().appendChild(htmlReporterMain); - - symbols = find('.symbol-summary'); - }; - - var totalSpecsDefined; - this.jasmineStarted = function(options) { - totalSpecsDefined = options.totalSpecsDefined || 0; - timer.start(); - }; - - var summary = createDom('div', {className: 'summary'}); - - var topResults = new j$.ResultsNode({}, '', null), - currentParent = topResults; - - this.suiteStarted = function(result) { - currentParent.addChild(result, 'suite'); - currentParent = currentParent.last(); - }; - - this.suiteDone = function(result) { - if (currentParent == topResults) { - return; - } - - currentParent = currentParent.parent; - }; - - this.specStarted = function(result) { - currentParent.addChild(result, 'spec'); - }; - - var failures = []; - this.specDone = function(result) { - if(noExpectations(result) && console && console.error) { - console.error('Spec \'' + result.fullName + '\' has no expectations.'); - } - - if (result.status != 'disabled') { - specsExecuted++; - } - - symbols.appendChild(createDom('li', { - className: noExpectations(result) ? 'empty' : result.status, - id: 'spec_' + result.id, - title: result.fullName - } - )); - - if (result.status == 'failed') { - failureCount++; - - var failure = - createDom('div', {className: 'spec-detail failed'}, - createDom('div', {className: 'description'}, - createDom('a', {title: result.fullName, href: specHref(result)}, result.fullName) - ), - createDom('div', {className: 'messages'}) - ); - var messages = failure.childNodes[1]; - - for (var i = 0; i < result.failedExpectations.length; i++) { - var expectation = result.failedExpectations[i]; - messages.appendChild(createDom('div', {className: 'result-message'}, expectation.message)); - messages.appendChild(createDom('div', {className: 'stack-trace'}, expectation.stack)); - } - - failures.push(failure); - } - - if (result.status == 'pending') { - pendingSpecCount++; - } - }; - - this.jasmineDone = function() { - var banner = find('.banner'); - banner.appendChild(createDom('span', {className: 'duration'}, 'finished in ' + timer.elapsed() / 1000 + 's')); - - var alert = find('.alert'); - - alert.appendChild(createDom('span', { className: 'exceptions' }, - createDom('label', { className: 'label', 'for': 'raise-exceptions' }, 'raise exceptions'), - createDom('input', { - className: 'raise', - id: 'raise-exceptions', - type: 'checkbox' - }) - )); - var checkbox = find('#raise-exceptions'); - - checkbox.checked = !env.catchingExceptions(); - checkbox.onclick = onRaiseExceptionsClick; - - if (specsExecuted < totalSpecsDefined) { - var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all'; - alert.appendChild( - createDom('span', {className: 'bar skipped'}, - createDom('a', {href: '?', title: 'Run all specs'}, skippedMessage) - ) - ); - } - var statusBarMessage = ''; - var statusBarClassName = 'bar '; - - if (totalSpecsDefined > 0) { - statusBarMessage += pluralize('spec', specsExecuted) + ', ' + pluralize('failure', failureCount); - if (pendingSpecCount) { statusBarMessage += ', ' + pluralize('pending spec', pendingSpecCount); } - statusBarClassName += (failureCount > 0) ? 'failed' : 'passed'; - } else { - statusBarClassName += 'skipped'; - statusBarMessage += 'No specs found'; - } - - alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage)); - - var results = find('.results'); - results.appendChild(summary); - - summaryList(topResults, summary); - - function summaryList(resultsTree, domParent) { - var specListNode; - for (var i = 0; i < resultsTree.children.length; i++) { - var resultNode = resultsTree.children[i]; - if (resultNode.type == 'suite') { - var suiteListNode = createDom('ul', {className: 'suite', id: 'suite-' + resultNode.result.id}, - createDom('li', {className: 'suite-detail'}, - createDom('a', {href: specHref(resultNode.result)}, resultNode.result.description) - ) - ); - - summaryList(resultNode, suiteListNode); - domParent.appendChild(suiteListNode); - } - if (resultNode.type == 'spec') { - if (domParent.getAttribute('class') != 'specs') { - specListNode = createDom('ul', {className: 'specs'}); - domParent.appendChild(specListNode); - } - var specDescription = resultNode.result.description; - if(noExpectations(resultNode.result)) { - specDescription = 'SPEC HAS NO EXPECTATIONS ' + specDescription; - } - specListNode.appendChild( - createDom('li', { - className: resultNode.result.status, - id: 'spec-' + resultNode.result.id - }, - createDom('a', {href: specHref(resultNode.result)}, specDescription) - ) - ); - } - } - } - - if (failures.length) { - alert.appendChild( - createDom('span', {className: 'menu bar spec-list'}, - createDom('span', {}, 'Spec List | '), - createDom('a', {className: 'failures-menu', href: '#'}, 'Failures'))); - alert.appendChild( - createDom('span', {className: 'menu bar failure-list'}, - createDom('a', {className: 'spec-list-menu', href: '#'}, 'Spec List'), - createDom('span', {}, ' | Failures '))); - - find('.failures-menu').onclick = function() { - setMenuModeTo('failure-list'); - }; - find('.spec-list-menu').onclick = function() { - setMenuModeTo('spec-list'); - }; - - setMenuModeTo('failure-list'); - - var failureNode = find('.failures'); - for (var i = 0; i < failures.length; i++) { - failureNode.appendChild(failures[i]); - } - } - }; - - return this; - - function find(selector) { - return getContainer().querySelector('.jasmine_html-reporter ' + selector); - } - - function clearPrior() { - // return the reporter - var oldReporter = find(''); - - if(oldReporter) { - getContainer().removeChild(oldReporter); - } - } - - function createDom(type, attrs, childrenVarArgs) { - var el = createElement(type); - - for (var i = 2; i < arguments.length; i++) { - var child = arguments[i]; - - if (typeof child === 'string') { - el.appendChild(createTextNode(child)); - } else { - if (child) { - el.appendChild(child); - } - } - } - - for (var attr in attrs) { - if (attr == 'className') { - el[attr] = attrs[attr]; - } else { - el.setAttribute(attr, attrs[attr]); - } - } - - return el; - } - - function pluralize(singular, count) { - var word = (count == 1 ? singular : singular + 's'); - - return '' + count + ' ' + word; - } - - function specHref(result) { - return '?spec=' + encodeURIComponent(result.fullName); - } - - function setMenuModeTo(mode) { - htmlReporterMain.setAttribute('class', 'jasmine_html-reporter ' + mode); - } - - function noExpectations(result) { - return (result.failedExpectations.length + result.passedExpectations.length) === 0 && - result.status === 'passed'; - } - } - - return HtmlReporter; -}; diff --git a/collections/transformations/bower_components/jasmine/src/html/HtmlSpecFilter.js b/collections/transformations/bower_components/jasmine/src/html/HtmlSpecFilter.js deleted file mode 100644 index 3d0a6c2..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/HtmlSpecFilter.js +++ /dev/null @@ -1,12 +0,0 @@ -jasmineRequire.HtmlSpecFilter = function() { - function HtmlSpecFilter(options) { - var filterString = options && options.filterString() && options.filterString().replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); - var filterPattern = new RegExp(filterString); - - this.matches = function(specName) { - return filterPattern.test(specName); - }; - } - - return HtmlSpecFilter; -}; diff --git a/collections/transformations/bower_components/jasmine/src/html/QueryString.js b/collections/transformations/bower_components/jasmine/src/html/QueryString.js deleted file mode 100644 index 13d6855..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/QueryString.js +++ /dev/null @@ -1,47 +0,0 @@ -jasmineRequire.QueryString = function() { - function QueryString(options) { - - this.setParam = function(key, value) { - var paramMap = queryStringToParamMap(); - paramMap[key] = value; - options.getWindowLocation().search = toQueryString(paramMap); - }; - - this.getParam = function(key) { - return queryStringToParamMap()[key]; - }; - - return this; - - function toQueryString(paramMap) { - var qStrPairs = []; - for (var prop in paramMap) { - qStrPairs.push(encodeURIComponent(prop) + '=' + encodeURIComponent(paramMap[prop])); - } - return '?' + qStrPairs.join('&'); - } - - function queryStringToParamMap() { - var paramStr = options.getWindowLocation().search.substring(1), - params = [], - paramMap = {}; - - if (paramStr.length > 0) { - params = paramStr.split('&'); - for (var i = 0; i < params.length; i++) { - var p = params[i].split('='); - var value = decodeURIComponent(p[1]); - if (value === 'true' || value === 'false') { - value = JSON.parse(value); - } - paramMap[decodeURIComponent(p[0])] = value; - } - } - - return paramMap; - } - - } - - return QueryString; -}; diff --git a/collections/transformations/bower_components/jasmine/src/html/ResultsNode.js b/collections/transformations/bower_components/jasmine/src/html/ResultsNode.js deleted file mode 100644 index 24cea25..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/ResultsNode.js +++ /dev/null @@ -1,19 +0,0 @@ -jasmineRequire.ResultsNode = function() { - function ResultsNode(result, type, parent) { - this.result = result; - this.type = type; - this.parent = parent; - - this.children = []; - - this.addChild = function(result, type) { - this.children.push(new ResultsNode(result, type, this)); - }; - - this.last = function() { - return this.children[this.children.length - 1]; - }; - } - - return ResultsNode; -}; diff --git a/collections/transformations/bower_components/jasmine/src/html/_HTMLReporter.scss b/collections/transformations/bower_components/jasmine/src/html/_HTMLReporter.scss deleted file mode 100644 index a481d7d..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/_HTMLReporter.scss +++ /dev/null @@ -1,355 +0,0 @@ -@import "compass"; - -$line-height: 14px; -$margin-unit: 14px; - -$faint-text-color: #aaa; -$light-text-color: #666; -$text-color: #333; - -$page-background-color: #eee; - -$passing-color: #007069; -$failing-color: #ca3a11; -$pending-color: #ba9d37; -$empty-color: #eff543; -$neutral-color: #bababa; - -$font-size: 11px; -$large-font-size: 14px; - -body { - overflow-y: scroll; -} - -.jasmine_html-reporter { - background-color: $page-background-color; - padding: 5px; - margin: -8px; - - font-size: $font-size; - font-family: Monaco, "Lucida Console", monospace; - line-height: $line-height; - color: $text-color; - - a { - text-decoration: none; - - &:hover { - text-decoration: underline; - } - } - - p, h1, h2, h3, h4, h5, h6 { - margin: 0; - line-height: $line-height; - } - - .banner, - .symbol-summary, - .summary, - .result-message, - .spec .description, - .spec-detail .description, - .alert .bar, - .stack-trace { - padding-left: $margin-unit - 5px; - padding-right: $margin-unit - 5px; - } - - .banner { - position: relative; - } - - .banner .title { - background: inline-image('jasmine-horizontal.png') no-repeat; - background: inline-image('jasmine-horizontal.svg') no-repeat, none; - @include background-size(100%); - display: block; - float: left; - width: 90px; - height: 25px; - } - - .banner .version { - margin-left: $margin-unit; - position: relative; - top: 6px; - } - - .banner .duration { - position: absolute; - right: 14px; - top: 6px; - } - - // This div is available for testing elements that must be added to the DOM. - // We position it out of view, so it doesn't obstruct the runner. - #jasmine_content { - position: fixed; - right: 100%; - } - - .version { - color: $faint-text-color; - } - - //--- Banner ---// - - .banner { - margin-top: $line-height; - } - - .duration { - color: $faint-text-color; - float: right; - } - - //--- Symbol summary ---// - - .symbol-summary { - @include clearfix; - margin: $line-height 0; - - li { - display: inline-block; - height: ($line-height / 2) + 1; - width: $line-height; - - font-size: 16px; - - &.passed { - font-size: 14px; - - &:before { - color: $passing-color; - content: "\02022"; - } - } - - &.failed { - line-height: ($line-height / 2) + 2; - - &:before { - color: $failing-color; - content: "\d7"; - font-weight: bold; - margin-left: -1px; - } - } - - &.disabled { - font-size: 14px; - - &:before { - color: $neutral-color; - content: "\02022"; - } - } - - &.pending { - line-height: 17px; - &:before { - color: $pending-color; - content: "*"; - } - } - - &.empty { - font-size: 14px; - - &:before { - color: $pending-color; - content: "\02022"; - } - } - } - } - - .exceptions { - color: #fff; - float: right; - margin-top: 5px; - margin-right: 5px; - } - - //--- Alerts: status bars ---// - - .bar { - line-height: $line-height * 2; - font-size: $large-font-size; - - display: block; - color: #eee; - - &.failed { - background-color: $failing-color; - } - - &.passed { - background-color: $passing-color; - } - - &.skipped { - background-color: $neutral-color; - } - - &.menu { - background-color: #fff; - color: $faint-text-color; - - a { - color: $text-color; - } - } - - a { - color: white; - } - } - - // simplify toggle control between the two menu bars - &.spec-list { - .bar.menu.failure-list, - .results .failures { - display: none; - } - } - - &.failure-list { - .bar.menu.spec-list, - .summary { - display: none; - } - } - - .running-alert { - background-color: $light-text-color; - } - - //--- Results ---// - - .results { - margin-top: $line-height; - } - - //--- Results menu ---// - - &.showDetails { - - .summaryMenuItem { - font-weight: normal; - text-decoration: inherit; - - &:hover { - text-decoration: underline; - } - } - - .detailsMenuItem { - font-weight: bold; - text-decoration: underline; - } - - .summary { - display: none; - } - - #details { - display: block; - } - } - - .summaryMenuItem { - font-weight: bold; - text-decoration: underline; - } - - //--- Results summary: Suites and Specs names/links ---// - - .summary { - margin-top: $margin-unit; - - ul { - list-style-type: none; - margin-left: $margin-unit; - padding-top: 0; - padding-left: 0; - - &.suite { - margin-top: $margin-unit/2; - margin-bottom: $margin-unit/2 - } - } - - li { - &.passed a { - color: $passing-color; - } - - &.failed a { - color: $failing-color; - } - - &.empty a { - color: $pending-color; - } - - &.pending a { - color: $pending-color; - } - } - } - - .description+.suite { - margin-top: 0; - } - - .suite { - margin-top: $margin-unit; - - a { - color: $text-color; - } - } - - //--- Failure details ---// - - .failures { - .spec-detail { - margin-bottom: $line-height * 2; - - .description { - background-color: $failing-color; - - a { - color: white; - } - } - } - } - - .result-message { - padding-top: $line-height; - - color: $text-color; - - white-space: pre; - } - - .result-message span.result { - display: block; - } - - .stack-trace { - margin: 5px 0 0 0; - max-height: $line-height * 16; - overflow: auto; - line-height: 18px; - - color: $light-text-color; - border: 1px solid #ddd; - background: white; - white-space: pre; - } -} diff --git a/collections/transformations/bower_components/jasmine/src/html/jasmine.scss b/collections/transformations/bower_components/jasmine/src/html/jasmine.scss deleted file mode 100644 index d1aa2a8..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/jasmine.scss +++ /dev/null @@ -1 +0,0 @@ -@import "HTMLReporter"; diff --git a/collections/transformations/bower_components/jasmine/src/html/requireHtml.js b/collections/transformations/bower_components/jasmine/src/html/requireHtml.js deleted file mode 100644 index b60c3ba..0000000 --- a/collections/transformations/bower_components/jasmine/src/html/requireHtml.js +++ /dev/null @@ -1,6 +0,0 @@ -jasmineRequire.html = function(j$) { - j$.ResultsNode = jasmineRequire.ResultsNode(); - j$.HtmlReporter = jasmineRequire.HtmlReporter(j$); - j$.QueryString = jasmineRequire.QueryString(); - j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter(); -}; diff --git a/collections/transformations/bower_components/jasmine/src/templates/example_project_jasmine_tags.html.erb b/collections/transformations/bower_components/jasmine/src/templates/example_project_jasmine_tags.html.erb deleted file mode 100644 index 0d423f2..0000000 --- a/collections/transformations/bower_components/jasmine/src/templates/example_project_jasmine_tags.html.erb +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/collections/transformations/bower_components/jasmine/src/templates/version.js.erb b/collections/transformations/bower_components/jasmine/src/templates/version.js.erb deleted file mode 100644 index ad5eddb..0000000 --- a/collections/transformations/bower_components/jasmine/src/templates/version.js.erb +++ /dev/null @@ -1,7 +0,0 @@ - -jasmine.version_= { - "major": <%= major %>, - "minor": <%= minor %>, - "build": <%= build %>, - "revision": <%= revision %><%= %Q{,\n "release_candidate": #{release_candidate}} if release_candidate %> -}; diff --git a/collections/transformations/bower_components/jasmine/src/templates/version.rb.erb b/collections/transformations/bower_components/jasmine/src/templates/version.rb.erb deleted file mode 100644 index 7fb8433..0000000 --- a/collections/transformations/bower_components/jasmine/src/templates/version.rb.erb +++ /dev/null @@ -1,6 +0,0 @@ -module Jasmine - module Core - VERSION = "<%= "#{major}.#{minor}.#{build}" %><%= ".rc#{release_candidate}" if release_candidate %>" - end -end - diff --git a/collections/transformations/bower_components/jasmine/src/version.js b/collections/transformations/bower_components/jasmine/src/version.js deleted file mode 100644 index 5b2223b..0000000 --- a/collections/transformations/bower_components/jasmine/src/version.js +++ /dev/null @@ -1,3 +0,0 @@ -getJasmineRequireObj().version = function() { - return '<%= version %>'; -}; diff --git a/collections/transformations/bower_components/jasmine/travis-core-script.sh b/collections/transformations/bower_components/jasmine/travis-core-script.sh deleted file mode 100644 index 414fe93..0000000 --- a/collections/transformations/bower_components/jasmine/travis-core-script.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -e - -if [ $USE_SAUCE == true ] -then - if [ $TRAVIS_SECURE_ENV_VARS == true ] - then - curl -L https://gist.github.com/santiycr/5139565/raw/sauce_connect_setup.sh | bash - else - echo "skipping tests since we can't use sauce" - exit 0 - fi -fi - -bundle exec rake jasmine:ci diff --git a/collections/transformations/bower_components/jasmine/travis-docs-script.sh b/collections/transformations/bower_components/jasmine/travis-docs-script.sh deleted file mode 100644 index 65d7905..0000000 --- a/collections/transformations/bower_components/jasmine/travis-docs-script.sh +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/bash -e - -git clone https://github.com/jasmine/jasmine.github.io.git - -bundle exec rake jasmine:ci JASMINE_CONFIG_PATH=jasmine.github.io/edge/spec/support/jasmine.yml diff --git a/collections/transformations/bower_components/jasmine/travis-node-script.sh b/collections/transformations/bower_components/jasmine/travis-node-script.sh deleted file mode 100644 index 5327502..0000000 --- a/collections/transformations/bower_components/jasmine/travis-node-script.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -e - -npm install -g grunt-cli -npm install - -grunt execSpecsInNode diff --git a/collections/transformations/bower_components/jquery/.bower.json b/collections/transformations/bower_components/jquery/.bower.json index d84a154..b397216 100644 --- a/collections/transformations/bower_components/jquery/.bower.json +++ b/collections/transformations/bower_components/jquery/.bower.json @@ -1,11 +1,12 @@ { "name": "jquery", - "version": "1.11.1", + "version": "2.1.4", "main": "dist/jquery.js", "license": "MIT", "ignore": [ "**/.*", "build", + "dist/cdn", "speed", "test", "*.md", @@ -14,7 +15,7 @@ "package.json" ], "devDependencies": { - "sizzle": "1.10.19", + "sizzle": "2.1.1-jquery.2.1.2", "requirejs": "2.1.10", "qunit": "1.14.0", "sinon": "1.8.1" @@ -25,14 +26,13 @@ "library" ], "homepage": "https://github.com/jquery/jquery", - "_release": "1.11.1", + "_release": "2.1.4", "_resolution": { "type": "version", - "tag": "1.11.1", - "commit": "0d5ec2d8ac94a419ee47a39319c43ff9a7326b50" + "tag": "2.1.4", + "commit": "7751e69b615c6eca6f783a81e292a55725af6b85" }, "_source": "git://github.com/jquery/jquery.git", - "_target": "1.11.1", - "_originalSource": "jquery", - "_direct": true + "_target": "2.1.4", + "_originalSource": "jquery" } \ No newline at end of file diff --git a/collections/transformations/bower_components/jquery/bower.json b/collections/transformations/bower_components/jquery/bower.json index 03fad08..0c80cd5 100644 --- a/collections/transformations/bower_components/jquery/bower.json +++ b/collections/transformations/bower_components/jquery/bower.json @@ -1,11 +1,12 @@ { "name": "jquery", - "version": "1.11.1", + "version": "2.1.4", "main": "dist/jquery.js", "license": "MIT", "ignore": [ "**/.*", "build", + "dist/cdn", "speed", "test", "*.md", @@ -14,7 +15,7 @@ "package.json" ], "devDependencies": { - "sizzle": "1.10.19", + "sizzle": "2.1.1-jquery.2.1.2", "requirejs": "2.1.10", "qunit": "1.14.0", "sinon": "1.8.1" diff --git a/collections/transformations/bower_components/jquery/dist/jquery.js b/collections/transformations/bower_components/jquery/dist/jquery.js index d4b67f7..eed1777 100644 --- a/collections/transformations/bower_components/jquery/dist/jquery.js +++ b/collections/transformations/bower_components/jquery/dist/jquery.js @@ -1,5 +1,5 @@ /*! - * jQuery JavaScript Library v1.11.1 + * jQuery JavaScript Library v2.1.4 * http://jquery.com/ * * Includes Sizzle.js @@ -9,19 +9,19 @@ * Released under the MIT license * http://jquery.org/license * - * Date: 2014-05-01T17:42Z + * Date: 2015-04-28T16:01Z */ (function( global, factory ) { if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper window is present, - // execute the factory and get jQuery - // For environments that do not inherently posses a window with a document - // (such as Node.js), expose a jQuery-making factory as module.exports - // This accentuates the need for the creation of a real window + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info + // See ticket #14549 for more info. module.exports = global.document ? factory( global, true ) : function( w ) { @@ -37,21 +37,21 @@ // Pass this if window is not defined yet }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { -// Can't do this because several apps including ASP.NET trace +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace // the stack via arguments.caller.callee and Firefox dies if // you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ // -var deletedIds = []; +var arr = []; -var slice = deletedIds.slice; +var slice = arr.slice; -var concat = deletedIds.concat; +var concat = arr.concat; -var push = deletedIds.push; +var push = arr.push; -var indexOf = deletedIds.indexOf; +var indexOf = arr.indexOf; var class2type = {}; @@ -64,7 +64,10 @@ var support = {}; var - version = "1.11.1", + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.4", // Define a local copy of jQuery jQuery = function( selector, context ) { @@ -73,7 +76,7 @@ var return new jQuery.fn.init( selector, context ); }, - // Support: Android<4.1, IE<9 + // Support: Android<4.1 // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, @@ -167,12 +170,12 @@ jQuery.fn = jQuery.prototype = { // For internal use only. // Behaves like an Array's method, not like a jQuery method. push: push, - sort: deletedIds.sort, - splice: deletedIds.splice + sort: arr.sort, + splice: arr.splice }; jQuery.extend = jQuery.fn.extend = function() { - var src, copyIsArray, copy, name, options, clone, + var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, @@ -182,7 +185,7 @@ jQuery.extend = jQuery.fn.extend = function() { if ( typeof target === "boolean" ) { deep = target; - // skip the boolean and the target + // Skip the boolean and the target target = arguments[ i ] || {}; i++; } @@ -192,7 +195,7 @@ jQuery.extend = jQuery.fn.extend = function() { target = {}; } - // extend jQuery itself if only one argument is passed + // Extend jQuery itself if only one argument is passed if ( i === length ) { target = this; i--; @@ -249,98 +252,86 @@ jQuery.extend({ noop: function() {}, - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). isFunction: function( obj ) { return jQuery.type(obj) === "function"; }, - isArray: Array.isArray || function( obj ) { - return jQuery.type(obj) === "array"; - }, + isArray: Array.isArray, isWindow: function( obj ) { - /* jshint eqeqeq: false */ - return obj != null && obj == obj.window; + return obj != null && obj === obj.window; }, isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false positives (null|true|false|"") // ...but misinterprets leading-number strings, particularly hex literals ("0x...") // subtraction forces infinities to NaN - return !jQuery.isArray( obj ) && obj - parseFloat( obj ) >= 0; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; }, isPlainObject: function( obj ) { - var key; - - // Must be an Object. - // Because of IE, we also have to check the presence of the constructor property. - // Make sure that DOM nodes and window objects don't pass through, as well - if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { return false; } - try { - // Not own constructor property must be Object - if ( obj.constructor && - !hasOwn.call(obj, "constructor") && - !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) { - return false; - } - } catch ( e ) { - // IE8,9 Will throw exceptions on certain host objects #9897 + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { return false; } - // Support: IE<9 - // Handle iteration over inherited properties before own properties. - if ( support.ownLast ) { - for ( key in obj ) { - return hasOwn.call( obj, key ); - } - } - - // Own properties are enumerated firstly, so to speed up, - // if last one is own, then all properties are own. - for ( key in obj ) {} + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, - return key === undefined || hasOwn.call( obj, key ); + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; }, type: function( obj ) { if ( obj == null ) { return obj + ""; } + // Support: Android<4.0, iOS<6 (functionish RegExp) return typeof obj === "object" || typeof obj === "function" ? class2type[ toString.call(obj) ] || "object" : typeof obj; }, // Evaluates a script in a global context - // Workarounds based on findings by Jim Driscoll - // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context - globalEval: function( data ) { - if ( data && jQuery.trim( data ) ) { - // We use execScript on Internet Explorer - // We use an anonymous function so that context is window - // rather than jQuery in Firefox - ( window.execScript || function( data ) { - window[ "eval" ].call( window, data ); - } )( data ); + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } } }, // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ // Microsoft forgot to hump their vendor prefix (#9572) camelCase: function( string ) { return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); @@ -400,7 +391,7 @@ jQuery.extend({ return obj; }, - // Support: Android<4.1, IE<9 + // Support: Android<4.1 trim: function( text ) { return text == null ? "" : @@ -426,25 +417,7 @@ jQuery.extend({ }, inArray: function( elem, arr, i ) { - var len; - - if ( arr ) { - if ( indexOf ) { - return indexOf.call( arr, elem, i ); - } - - len = arr.length; - i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; - - for ( ; i < len; i++ ) { - // Skip accessing in sparse arrays - if ( i in arr && arr[ i ] === elem ) { - return i; - } - } - } - - return -1; + return arr == null ? -1 : indexOf.call( arr, elem, i ); }, merge: function( first, second ) { @@ -452,16 +425,8 @@ jQuery.extend({ j = 0, i = first.length; - while ( j < len ) { - first[ i++ ] = second[ j++ ]; - } - - // Support: IE<9 - // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) - if ( len !== len ) { - while ( second[j] !== undefined ) { - first[ i++ ] = second[ j++ ]; - } + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; } first.length = i; @@ -527,7 +492,7 @@ jQuery.extend({ // Bind a function to a context, optionally partially applying any // arguments. proxy: function( fn, context ) { - var args, proxy, tmp; + var tmp, args, proxy; if ( typeof context === "string" ) { tmp = fn[ context ]; @@ -553,9 +518,7 @@ jQuery.extend({ return proxy; }, - now: function() { - return +( new Date() ); - }, + now: Date.now, // jQuery.support is not used in Core but other projects attach their // properties to it so it needs to exist. @@ -568,7 +531,12 @@ jQuery.each("Boolean Number String Function Array Date RegExp Object Error".spli }); function isArraylike( obj ) { - var length = obj.length, + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = "length" in obj && obj.length, type = jQuery.type( obj ); if ( type === "function" || jQuery.isWindow( obj ) ) { @@ -584,14 +552,14 @@ function isArraylike( obj ) { } var Sizzle = /*! - * Sizzle CSS Selector Engine v1.10.19 + * Sizzle CSS Selector Engine v2.2.0-pre * http://sizzlejs.com/ * - * Copyright 2013 jQuery Foundation, Inc. and other contributors + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors * Released under the MIT license * http://jquery.org/license * - * Date: 2014-04-18 + * Date: 2014-12-16 */ (function( window ) { @@ -618,7 +586,7 @@ var i, contains, // Instance-specific data - expando = "sizzle" + -(new Date()), + expando = "sizzle" + 1 * new Date(), preferredDoc = window.document, dirruns = 0, done = 0, @@ -633,7 +601,6 @@ var i, }, // General-purpose constants - strundefined = typeof undefined, MAX_NEGATIVE = 1 << 31, // Instance methods @@ -643,12 +610,13 @@ var i, push_native = arr.push, push = arr.push, slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { var i = 0, - len = this.length; + len = list.length; for ( ; i < len; i++ ) { - if ( this[i] === elem ) { + if ( list[i] === elem ) { return i; } } @@ -688,6 +656,7 @@ var i, ")\\)|)", // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), @@ -739,6 +708,14 @@ var i, String.fromCharCode( high + 0x10000 ) : // Supplemental Plane codepoint (surrogate pair) String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); }; // Optimize for push.apply( _, NodeList ) @@ -781,19 +758,18 @@ function Sizzle( selector, context, results, seed ) { context = context || document; results = results || []; + nodeType = context.nodeType; - if ( !selector || typeof selector !== "string" ) { - return results; - } + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; + return results; } - if ( documentIsHTML && !seed ) { + if ( !seed && documentIsHTML ) { - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { // Speed-up: Sizzle("#ID") if ( (m = match[1]) ) { if ( nodeType === 9 ) { @@ -825,7 +801,7 @@ function Sizzle( selector, context, results, seed ) { return results; // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { + } else if ( (m = match[3]) && support.getElementsByClassName ) { push.apply( results, context.getElementsByClassName( m ) ); return results; } @@ -835,7 +811,7 @@ function Sizzle( selector, context, results, seed ) { if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { nid = old = expando; newContext = context; - newSelector = nodeType === 9 && selector; + newSelector = nodeType !== 1 && selector; // qSA works strangely on Element-rooted queries // We can work around this by specifying an extra ID on the root @@ -1022,7 +998,7 @@ function createPositionalPseudo( fn ) { * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value */ function testContext( context ) { - return context && typeof context.getElementsByTagName !== strundefined && context; + return context && typeof context.getElementsByTagName !== "undefined" && context; } // Expose support vars for convenience @@ -1046,9 +1022,8 @@ isXML = Sizzle.isXML = function( elem ) { * @returns {Object} Returns the current document */ setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, - doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; // If no document and documentElement is available, return if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { @@ -1058,9 +1033,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Set our document document = doc; docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); + parent = doc.defaultView; // Support: IE>8 // If iframe document is assigned to "document" variable and if iframe has been reloaded, @@ -1069,21 +1042,22 @@ setDocument = Sizzle.setDocument = function( node ) { if ( parent && parent !== parent.top ) { // IE11 does not have attachEvent, so all must suffer if ( parent.addEventListener ) { - parent.addEventListener( "unload", function() { - setDocument(); - }, false ); + parent.addEventListener( "unload", unloadHandler, false ); } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", function() { - setDocument(); - }); + parent.attachEvent( "onunload", unloadHandler ); } } + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + /* Attributes ---------------------------------------------------------------------- */ // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) support.attributes = assert(function( div ) { div.className = "i"; return !div.getAttribute("className"); @@ -1098,17 +1072,8 @@ setDocument = Sizzle.setDocument = function( node ) { return !div.getElementsByTagName("*").length; }); - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); // Support: IE<10 // Check if getElementById returns elements by name @@ -1122,7 +1087,7 @@ setDocument = Sizzle.setDocument = function( node ) { // ID find and filter if ( support.getById ) { Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { var m = context.getElementById( id ); // Check parentNode to catch when Blackberry 4.6 returns // nodes that are no longer in the document #6963 @@ -1143,7 +1108,7 @@ setDocument = Sizzle.setDocument = function( node ) { Expr.filter["ID"] = function( id ) { var attrId = id.replace( runescape, funescape ); return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); return node && node.value === attrId; }; }; @@ -1152,14 +1117,20 @@ setDocument = Sizzle.setDocument = function( node ) { // Tag Expr.find["TAG"] = support.getElementsByTagName ? function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); } } : + function( tag, context ) { var elem, tmp = [], i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too results = context.getElementsByTagName( tag ); // Filter out possible comments @@ -1177,7 +1148,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Class Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { + if ( documentIsHTML ) { return context.getElementsByClassName( className ); } }; @@ -1206,13 +1177,15 @@ setDocument = Sizzle.setDocument = function( node ) { // setting a boolean content attribute, // since its presence should be enough // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; + docElem.appendChild( div ).innerHTML = "" + + ""; // Support: IE8, Opera 11-12.16 // Nothing should be selected when empty strings follow ^= or $= or *= // The test attribute must be unknown in Opera but "safe" for WinRT // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( div.querySelectorAll("[msallowclip^='']").length ) { + if ( div.querySelectorAll("[msallowcapture^='']").length ) { rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); } @@ -1222,12 +1195,24 @@ setDocument = Sizzle.setDocument = function( node ) { rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); } + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + // Webkit/Opera - :checked should return selected option elements // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked // IE8 throws error here and will not see later tests if ( !div.querySelectorAll(":checked").length ) { rbuggyQSA.push(":checked"); } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } }); assert(function( div ) { @@ -1344,7 +1329,7 @@ setDocument = Sizzle.setDocument = function( node ) { // Maintain original order return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; } @@ -1371,7 +1356,7 @@ setDocument = Sizzle.setDocument = function( node ) { aup ? -1 : bup ? 1 : sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 0; // If the nodes are siblings, we can do a quick check @@ -1434,7 +1419,7 @@ Sizzle.matchesSelector = function( elem, expr ) { elem.document && elem.document.nodeType !== 11 ) { return ret; } - } catch(e) {} + } catch (e) {} } return Sizzle( expr, document, null, [ elem ] ).length > 0; @@ -1653,7 +1638,7 @@ Expr = Sizzle.selectors = { return pattern || (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); }); }, @@ -1675,7 +1660,7 @@ Expr = Sizzle.selectors = { operator === "^=" ? check && result.indexOf( check ) === 0 : operator === "*=" ? check && result.indexOf( check ) > -1 : operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : false; }; @@ -1795,7 +1780,7 @@ Expr = Sizzle.selectors = { matched = fn( seed, argument ), i = matched.length; while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); + idx = indexOf( seed, matched[i] ); seed[ idx ] = !( matches[ idx ] = matched[i] ); } }) : @@ -1834,6 +1819,8 @@ Expr = Sizzle.selectors = { function( elem, context, xml ) { input[0] = elem; matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; return !results.pop(); }; }), @@ -1845,6 +1832,7 @@ Expr = Sizzle.selectors = { }), "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); return function( elem ) { return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; }; @@ -2266,7 +2254,7 @@ function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postS i = matcherOut.length; while ( i-- ) { if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { seed[temp] = !(results[temp] = elem); } @@ -2301,13 +2289,16 @@ function matcherFromTokens( tokens ) { return elem === checkContext; }, implicitRelative, true ), matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; + return indexOf( checkContext, elem ) > -1; }, implicitRelative, true ), matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( (checkContext = context).nodeType ? matchContext( elem, context, xml ) : matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; } ]; for ( ; i < len; i++ ) { @@ -2557,7 +2548,7 @@ select = Sizzle.select = function( selector, context, results, seed ) { // Sort stability support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; -// Support: Chrome<14 +// Support: Chrome 14-35+ // Always assume duplicates if they aren't passed to the comparison function support.detectDuplicates = !!hasDuplicate; @@ -2665,7 +2656,7 @@ function winnow( elements, qualifier, not ) { } return jQuery.grep( elements, function( elem ) { - return ( jQuery.inArray( elem, qualifier ) >= 0 ) !== not; + return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; }); } @@ -2686,9 +2677,9 @@ jQuery.filter = function( expr, elems, not ) { jQuery.fn.extend({ find: function( selector ) { var i, + len = this.length, ret = [], - self = this, - len = self.length; + self = this; if ( typeof selector !== "string" ) { return this.pushStack( jQuery( selector ).filter(function() { @@ -2736,9 +2727,6 @@ jQuery.fn.extend({ // A central reference to the root jQuery(document) var rootjQuery, - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - // A simple way to check for HTML strings // Prioritize #id over to avoid XSS via location.hash (#9521) // Strict HTML recognition (#11290: must start with <) @@ -2754,7 +2742,7 @@ var rootjQuery, // Handle HTML strings if ( typeof selector === "string" ) { - if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) { + if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { // Assume that strings that start and end with <> are HTML and skip the regex check match = [ null, selector, null ]; @@ -2769,7 +2757,7 @@ var rootjQuery, if ( match[1] ) { context = context instanceof jQuery ? context[0] : context; - // scripts is true for back-compat + // Option to run scripts is true for back-compat // Intentionally let the error be thrown if parseHTML is not present jQuery.merge( this, jQuery.parseHTML( match[1], @@ -2797,16 +2785,10 @@ var rootjQuery, } else { elem = document.getElementById( match[2] ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 + // Support: Blackberry 4.6 + // gEBID returns nodes no longer in the document (#6963) if ( elem && elem.parentNode ) { - // Handle the case where IE and Opera return items - // by name instead of ID - if ( elem.id !== match[2] ) { - return rootjQuery.find( selector ); - } - - // Otherwise, we inject the element directly into the jQuery object + // Inject the element directly into the jQuery object this.length = 1; this[0] = elem; } @@ -2857,7 +2839,7 @@ rootjQuery = jQuery( document ); var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set + // Methods guaranteed to produce a unique set when starting from a unique set guaranteedUnique = { children: true, contents: true, @@ -2868,38 +2850,40 @@ var rparentsprev = /^(?:parents|prev(?:Until|All))/, jQuery.extend({ dir: function( elem, dir, until ) { var matched = [], - cur = elem[ dir ]; + truncate = until !== undefined; - while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) { - if ( cur.nodeType === 1 ) { - matched.push( cur ); + while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); } - cur = cur[dir]; } return matched; }, sibling: function( n, elem ) { - var r = []; + var matched = []; for ( ; n; n = n.nextSibling ) { if ( n.nodeType === 1 && n !== elem ) { - r.push( n ); + matched.push( n ); } } - return r; + return matched; } }); jQuery.fn.extend({ has: function( target ) { - var i, - targets = jQuery( target, this ), - len = targets.length; + var targets = jQuery( target, this ), + l = targets.length; return this.filter(function() { - for ( i = 0; i < len; i++ ) { + var i = 0; + for ( ; i < l; i++ ) { if ( jQuery.contains( this, targets[i] ) ) { return true; } @@ -2935,24 +2919,25 @@ jQuery.fn.extend({ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); }, - // Determine the position of an element within - // the matched set of elements + // Determine the position of an element within the set index: function( elem ) { // No argument, return index in parent if ( !elem ) { - return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1; + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; } - // index in selector + // Index in selector if ( typeof elem === "string" ) { - return jQuery.inArray( this[0], jQuery( elem ) ); + return indexOf.call( jQuery( elem ), this[ 0 ] ); } // Locate the position of the desired element - return jQuery.inArray( + return indexOf.call( this, + // If it receives a jQuery object, the first element is used - elem.jquery ? elem[0] : elem, this ); + elem.jquery ? elem[ 0 ] : elem + ); }, add: function( selector, context ) { @@ -2971,10 +2956,7 @@ jQuery.fn.extend({ }); function sibling( cur, dir ) { - do { - cur = cur[ dir ]; - } while ( cur && cur.nodeType !== 1 ); - + while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} return cur; } @@ -3014,35 +2996,33 @@ jQuery.each({ return jQuery.sibling( elem.firstChild ); }, contents: function( elem ) { - return jQuery.nodeName( elem, "iframe" ) ? - elem.contentDocument || elem.contentWindow.document : - jQuery.merge( [], elem.childNodes ); + return elem.contentDocument || jQuery.merge( [], elem.childNodes ); } }, function( name, fn ) { jQuery.fn[ name ] = function( until, selector ) { - var ret = jQuery.map( this, fn, until ); + var matched = jQuery.map( this, fn, until ); if ( name.slice( -5 ) !== "Until" ) { selector = until; } if ( selector && typeof selector === "string" ) { - ret = jQuery.filter( selector, ret ); + matched = jQuery.filter( selector, matched ); } if ( this.length > 1 ) { // Remove duplicates if ( !guaranteedUnique[ name ] ) { - ret = jQuery.unique( ret ); + jQuery.unique( matched ); } // Reverse order for parents* and prev-derivatives if ( rparentsprev.test( name ) ) { - ret = ret.reverse(); + matched.reverse(); } } - return this.pushStack( ret ); + return this.pushStack( matched ); }; }); var rnotwhite = (/\S+/g); @@ -3091,18 +3071,18 @@ jQuery.Callbacks = function( options ) { ( optionsCache[ options ] || createOptions( options ) ) : jQuery.extend( {}, options ); - var // Flag to know if list is currently firing - firing, - // Last fire value (for non-forgettable lists) + var // Last fire value (for non-forgettable lists) memory, // Flag to know if list was already fired fired, + // Flag to know if list is currently firing + firing, + // First callback to fire (used internally by add and fireWith) + firingStart, // End of the loop when firing firingLength, // Index of currently firing callback (modified by remove if needed) firingIndex, - // First callback to fire (used internally by add and fireWith) - firingStart, // Actual callback list list = [], // Stack of fire calls for repeatable lists @@ -3355,8 +3335,7 @@ jQuery.extend({ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; if ( values === progressValues ) { deferred.notifyWith( contexts, values ); - - } else if ( !(--remaining) ) { + } else if ( !( --remaining ) ) { deferred.resolveWith( contexts, values ); } }; @@ -3364,7 +3343,7 @@ jQuery.extend({ progressValues, progressContexts, resolveContexts; - // add listeners to Deferred subordinates; treat others as resolved + // Add listeners to Deferred subordinates; treat others as resolved if ( length > 1 ) { progressValues = new Array( length ); progressContexts = new Array( length ); @@ -3381,7 +3360,7 @@ jQuery.extend({ } } - // if we're not waiting on anything, resolve the master + // If we're not waiting on anything, resolve the master if ( !remaining ) { deferred.resolveWith( resolveContexts, resolveValues ); } @@ -3426,11 +3405,6 @@ jQuery.extend({ return; } - // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443). - if ( !document.body ) { - return setTimeout( jQuery.ready ); - } - // Remember that the DOM is ready jQuery.isReady = true; @@ -3450,29 +3424,13 @@ jQuery.extend({ } }); -/** - * Clean-up method for dom ready events - */ -function detach() { - if ( document.addEventListener ) { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - - } else { - document.detachEvent( "onreadystatechange", completed ); - window.detachEvent( "onload", completed ); - } -} - /** * The ready event handler and self cleanup method */ function completed() { - // readyState === "complete" is good enough for us to call the dom ready in oldIE - if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) { - detach(); - jQuery.ready(); - } + document.removeEventListener( "DOMContentLoaded", completed, false ); + window.removeEventListener( "load", completed, false ); + jQuery.ready(); } jQuery.ready.promise = function( obj ) { @@ -3481,162 +3439,297 @@ jQuery.ready.promise = function( obj ) { readyList = jQuery.Deferred(); // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one + // We once tried to use readyState "interactive" here, but it caused issues like the one // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 if ( document.readyState === "complete" ) { // Handle it asynchronously to allow scripts the opportunity to delay ready setTimeout( jQuery.ready ); - // Standards-based browsers support DOMContentLoaded - } else if ( document.addEventListener ) { + } else { + // Use the handy event callback document.addEventListener( "DOMContentLoaded", completed, false ); // A fallback to window.onload, that will always work window.addEventListener( "load", completed, false ); + } + } + return readyList.promise( obj ); +}; - // If IE event model is used - } else { - // Ensure firing before onload, maybe late but safe also for iframes - document.attachEvent( "onreadystatechange", completed ); +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); - // A fallback to window.onload, that will always work - window.attachEvent( "onload", completed ); - // If IE and not a frame - // continually check to see if the document is ready - var top = false; - try { - top = window.frameElement == null && document.documentElement; - } catch(e) {} - if ( top && top.doScroll ) { - (function doScrollCheck() { - if ( !jQuery.isReady ) { +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; - try { - // Use the trick by Diego Perini - // http://javascript.nwbox.com/IEContentLoaded/ - top.doScroll("left"); - } catch(e) { - return setTimeout( doScrollCheck, 50 ); - } + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); + } - // detach all dom ready events - detach(); + // Sets one value + } else if ( value !== undefined ) { + chainable = true; - // and execute any waiting functions - jQuery.ready(); - } - })(); + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); } } } - return readyList.promise( obj ); + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + len ? fn( elems[0], key ) : emptyGet; }; -var strundefined = typeof undefined; +/** + * Determines whether an object can have data + */ +jQuery.acceptData = function( owner ) { + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + /* jshint -W018 */ + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; +function Data() { + // Support: Android<4, + // Old WebKit does not have Object.preventExtensions/freeze method, + // return new empty object instead with no [[set]] accessor + Object.defineProperty( this.cache = {}, 0, { + get: function() { + return {}; + } + }); -// Support: IE<9 -// Iteration over object's inherited properties before its own -var i; -for ( i in jQuery( support ) ) { - break; + this.expando = jQuery.expando + Data.uid++; } -support.ownLast = i !== "0"; -// Note: most support tests are defined in their respective modules. -// false until the test is run -support.inlineBlockNeedsLayout = false; +Data.uid = 1; +Data.accepts = jQuery.acceptData; + +Data.prototype = { + key: function( owner ) { + // We can accept data for non-element nodes in modern browsers, + // but we should not, see #8335. + // Always return the key for a frozen object. + if ( !Data.accepts( owner ) ) { + return 0; + } -// Execute ASAP in case we need to set body.style.zoom -jQuery(function() { - // Minified: var a,b,c,d - var val, div, body, container; + var descriptor = {}, + // Check if the owner object already has a cache key + unlock = owner[ this.expando ]; - body = document.getElementsByTagName( "body" )[ 0 ]; - if ( !body || !body.style ) { - // Return for frameset docs that don't have a body - return; - } + // If not, create one + if ( !unlock ) { + unlock = Data.uid++; - // Setup - div = document.createElement( "div" ); - container = document.createElement( "div" ); - container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; - body.appendChild( container ).appendChild( div ); + // Secure it in a non-enumerable, non-writable property + try { + descriptor[ this.expando ] = { value: unlock }; + Object.defineProperties( owner, descriptor ); - if ( typeof div.style.zoom !== strundefined ) { - // Support: IE<8 - // Check if natively block-level elements act like inline-block - // elements when setting their display to 'inline' and giving - // them layout - div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + // Support: Android<4 + // Fallback to a less secure definition + } catch ( e ) { + descriptor[ this.expando ] = unlock; + jQuery.extend( owner, descriptor ); + } + } - support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; - if ( val ) { - // Prevent IE 6 from affecting layout for positioned elements #11048 - // Prevent IE from shrinking the body in IE 7 mode #12869 - // Support: IE<8 - body.style.zoom = 1; + // Ensure the cache object + if ( !this.cache[ unlock ] ) { + this.cache[ unlock ] = {}; } - } - body.removeChild( container ); -}); + return unlock; + }, + set: function( owner, data, value ) { + var prop, + // There may be an unlock assigned to this node, + // if there is no entry for this "owner", create one inline + // and set the unlock as though an owner entry had always existed + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + // Handle: [ owner, key, value ] args + if ( typeof data === "string" ) { + cache[ data ] = value; + // Handle: [ owner, { properties } ] args + } else { + // Fresh assignments by object are shallow copied + if ( jQuery.isEmptyObject( cache ) ) { + jQuery.extend( this.cache[ unlock ], data ); + // Otherwise, copy the properties one-by-one to the cache object + } else { + for ( prop in data ) { + cache[ prop ] = data[ prop ]; + } + } + } + return cache; + }, + get: function( owner, key ) { + // Either a valid cache is found, or will be created. + // New caches will be created and the unlock returned, + // allowing direct access to the newly created + // empty data object. A valid owner object must be provided. + var cache = this.cache[ this.key( owner ) ]; + + return key === undefined ? + cache : cache[ key ]; + }, + access: function( owner, key, value ) { + var stored; + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ((key && typeof key === "string") && value === undefined) ) { + + stored = this.get( owner, key ); + + return stored !== undefined ? + stored : this.get( owner, jQuery.camelCase(key) ); + } + + // [*]When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, name, camel, + unlock = this.key( owner ), + cache = this.cache[ unlock ]; + if ( key === undefined ) { + this.cache[ unlock ] = {}; -(function() { - var div = document.createElement( "div" ); + } else { + // Support array or space separated string of keys + if ( jQuery.isArray( key ) ) { + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = key.concat( key.map( jQuery.camelCase ) ); + } else { + camel = jQuery.camelCase( key ); + // Try the string as a key before any manipulation + if ( key in cache ) { + name = [ key, camel ]; + } else { + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + name = camel; + name = name in cache ? + [ name ] : ( name.match( rnotwhite ) || [] ); + } + } - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; + i = name.length; + while ( i-- ) { + delete cache[ name[ i ] ]; + } + } + }, + hasData: function( owner ) { + return !jQuery.isEmptyObject( + this.cache[ owner[ this.expando ] ] || {} + ); + }, + discard: function( owner ) { + if ( owner[ this.expando ] ) { + delete this.cache[ owner[ this.expando ] ]; } } +}; +var data_priv = new Data(); - // Null elements to avoid leaks in IE. - div = null; -})(); - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( elem ) { - var noData = jQuery.noData[ (elem.nodeName + " ").toLowerCase() ], - nodeType = +elem.nodeType || 1; +var data_user = new Data(); - // Do not set data on non-element DOM nodes because it will not be cleared (#8335). - return nodeType !== 1 && nodeType !== 9 ? - false : - // Nodes accept data unless otherwise specified; rejection can be conditional - !noData || noData !== true && elem.getAttribute("classid") === noData; -}; +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, rmultiDash = /([A-Z])/g; function dataAttr( elem, key, data ) { + var name; + // If nothing was found internally, try to fetch any // data from the HTML5 data-* attribute if ( data === undefined && elem.nodeType === 1 ) { - - var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - + name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); data = elem.getAttribute( name ); if ( typeof data === "string" ) { @@ -3651,262 +3744,50 @@ function dataAttr( elem, key, data ) { } catch( e ) {} // Make sure we set the data so it isn't changed later - jQuery.data( elem, key, data ); - + data_user.set( elem, key, data ); } else { data = undefined; } } - return data; } -// checks a cache object for emptiness -function isEmptyDataObject( obj ) { - var name; - for ( name in obj ) { - - // if the public data object is empty, the private is still empty - if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) { - continue; - } - if ( name !== "toJSON" ) { - return false; - } - } - - return true; -} - -function internalData( elem, name, data, pvt /* Internal Use Only */ ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var ret, thisCache, - internalKey = jQuery.expando, +jQuery.extend({ + hasData: function( elem ) { + return data_user.hasData( elem ) || data_priv.hasData( elem ); + }, - // We have to handle DOM nodes and JS objects differently because IE6-7 - // can't GC object references properly across the DOM-JS boundary - isNode = elem.nodeType, + data: function( elem, name, data ) { + return data_user.access( elem, name, data ); + }, - // Only DOM nodes need the global jQuery cache; JS object data is - // attached directly to the object so GC can occur automatically - cache = isNode ? jQuery.cache : elem, + removeData: function( elem, name ) { + data_user.remove( elem, name ); + }, - // Only defining an ID for JS objects if its cache already exists allows - // the code to shortcut on the same path as a DOM node with no cache - id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to data_priv methods, these can be deprecated. + _data: function( elem, name, data ) { + return data_priv.access( elem, name, data ); + }, - // Avoid doing any more work than we need to when trying to get data on an - // object that has no data at all - if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && data === undefined && typeof name === "string" ) { - return; + _removeData: function( elem, name ) { + data_priv.remove( elem, name ); } - - if ( !id ) { - // Only DOM nodes need a new unique ID for each element since their data - // ends up in the global cache - if ( isNode ) { - id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; - } else { - id = internalKey; - } - } - - if ( !cache[ id ] ) { - // Avoid exposing jQuery metadata on plain JS objects when the object - // is serialized using JSON.stringify - cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; - } - - // An object can be passed to jQuery.data instead of a key/value pair; this gets - // shallow copied over onto the existing cache - if ( typeof name === "object" || typeof name === "function" ) { - if ( pvt ) { - cache[ id ] = jQuery.extend( cache[ id ], name ); - } else { - cache[ id ].data = jQuery.extend( cache[ id ].data, name ); - } - } - - thisCache = cache[ id ]; - - // jQuery data() is stored in a separate object inside the object's internal data - // cache in order to avoid key collisions between internal data and user-defined - // data. - if ( !pvt ) { - if ( !thisCache.data ) { - thisCache.data = {}; - } - - thisCache = thisCache.data; - } - - if ( data !== undefined ) { - thisCache[ jQuery.camelCase( name ) ] = data; - } - - // Check for both converted-to-camel and non-converted data property names - // If a data property was specified - if ( typeof name === "string" ) { - - // First Try to find as-is property data - ret = thisCache[ name ]; - - // Test for null|undefined property data - if ( ret == null ) { - - // Try to find the camelCased property - ret = thisCache[ jQuery.camelCase( name ) ]; - } - } else { - ret = thisCache; - } - - return ret; -} - -function internalRemoveData( elem, name, pvt ) { - if ( !jQuery.acceptData( elem ) ) { - return; - } - - var thisCache, i, - isNode = elem.nodeType, - - // See jQuery.data for more information - cache = isNode ? jQuery.cache : elem, - id = isNode ? elem[ jQuery.expando ] : jQuery.expando; - - // If there is already no cache entry for this object, there is no - // purpose in continuing - if ( !cache[ id ] ) { - return; - } - - if ( name ) { - - thisCache = pvt ? cache[ id ] : cache[ id ].data; - - if ( thisCache ) { - - // Support array or space separated string names for data keys - if ( !jQuery.isArray( name ) ) { - - // try the string as a key before any manipulation - if ( name in thisCache ) { - name = [ name ]; - } else { - - // split the camel cased version by spaces unless a key with the spaces exists - name = jQuery.camelCase( name ); - if ( name in thisCache ) { - name = [ name ]; - } else { - name = name.split(" "); - } - } - } else { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = name.concat( jQuery.map( name, jQuery.camelCase ) ); - } - - i = name.length; - while ( i-- ) { - delete thisCache[ name[i] ]; - } - - // If there is no data left in the cache, we want to continue - // and let the cache object itself get destroyed - if ( pvt ? !isEmptyDataObject(thisCache) : !jQuery.isEmptyObject(thisCache) ) { - return; - } - } - } - - // See jQuery.data for more information - if ( !pvt ) { - delete cache[ id ].data; - - // Don't destroy the parent cache unless the internal data object - // had been the only thing left in it - if ( !isEmptyDataObject( cache[ id ] ) ) { - return; - } - } - - // Destroy the cache - if ( isNode ) { - jQuery.cleanData( [ elem ], true ); - - // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) - /* jshint eqeqeq: false */ - } else if ( support.deleteExpando || cache != cache.window ) { - /* jshint eqeqeq: true */ - delete cache[ id ]; - - // When all else fails, null - } else { - cache[ id ] = null; - } -} - -jQuery.extend({ - cache: {}, - - // The following elements (space-suffixed to avoid Object.prototype collisions) - // throw uncatchable exceptions if you attempt to set expando properties - noData: { - "applet ": true, - "embed ": true, - // ...but Flash objects (which have this classid) *can* handle expandos - "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" - }, - - hasData: function( elem ) { - elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ]; - return !!elem && !isEmptyDataObject( elem ); - }, - - data: function( elem, name, data ) { - return internalData( elem, name, data ); - }, - - removeData: function( elem, name ) { - return internalRemoveData( elem, name ); - }, - - // For internal use only. - _data: function( elem, name, data ) { - return internalData( elem, name, data, true ); - }, - - _removeData: function( elem, name ) { - return internalRemoveData( elem, name, true ); - } -}); +}); jQuery.fn.extend({ data: function( key, value ) { var i, name, data, - elem = this[0], + elem = this[ 0 ], attrs = elem && elem.attributes; - // Special expections of .data basically thwart jQuery.access, - // so implement the relevant behavior ourselves - // Gets all values if ( key === undefined ) { if ( this.length ) { - data = jQuery.data( elem ); + data = data_user.get( elem ); - if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { i = attrs.length; while ( i-- ) { @@ -3920,7 +3801,7 @@ jQuery.fn.extend({ } } } - jQuery._data( elem, "parsedAttrs", true ); + data_priv.set( elem, "hasDataAttrs", true ); } } @@ -3930,25 +3811,69 @@ jQuery.fn.extend({ // Sets multiple values if ( typeof key === "object" ) { return this.each(function() { - jQuery.data( this, key ); + data_user.set( this, key ); }); } - return arguments.length > 1 ? + return access( this, function( value ) { + var data, + camelKey = jQuery.camelCase( key ); + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + // Attempt to get data from the cache + // with the key as-is + data = data_user.get( elem, key ); + if ( data !== undefined ) { + return data; + } - // Sets one value - this.each(function() { - jQuery.data( this, key, value ); - }) : + // Attempt to get data from the cache + // with the key camelized + data = data_user.get( elem, camelKey ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, camelKey, undefined ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } - // Gets one value - // Try to fetch any internally stored data first - elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + // Set the data... + this.each(function() { + // First, attempt to store a copy or reference of any + // data that might've been store with a camelCased key. + var data = data_user.get( this, camelKey ); + + // For HTML5 data-* attribute interop, we have to + // store property names with dashes in a camelCase form. + // This might not apply to all properties...* + data_user.set( this, camelKey, value ); + + // *... In the case of properties that might _actually_ + // have dashes, we need to also store a copy of that + // unchanged property. + if ( key.indexOf("-") !== -1 && data !== undefined ) { + data_user.set( this, key, value ); + } + }); + }, null, value, arguments.length > 1, null, true ); }, removeData: function( key ) { return this.each(function() { - jQuery.removeData( this, key ); + data_user.remove( this, key ); }); } }); @@ -3960,12 +3885,12 @@ jQuery.extend({ if ( elem ) { type = ( type || "fx" ) + "queue"; - queue = jQuery._data( elem, type ); + queue = data_priv.get( elem, type ); // Speed up dequeue by getting out quickly if this is just a lookup if ( data ) { - if ( !queue || jQuery.isArray(data) ) { - queue = jQuery._data( elem, type, jQuery.makeArray(data) ); + if ( !queue || jQuery.isArray( data ) ) { + queue = data_priv.access( elem, type, jQuery.makeArray(data) ); } else { queue.push( data ); } @@ -3999,7 +3924,7 @@ jQuery.extend({ queue.unshift( "inprogress" ); } - // clear up the last queue stop function + // Clear up the last queue stop function delete hooks.stop; fn.call( elem, next, hooks ); } @@ -4009,13 +3934,12 @@ jQuery.extend({ } }, - // not intended for public consumption - generates a queueHooks object, or returns the current one + // Not public - generate a queueHooks object, or return the current one _queueHooks: function( elem, type ) { var key = type + "queueHooks"; - return jQuery._data( elem, key ) || jQuery._data( elem, key, { + return data_priv.get( elem, key ) || data_priv.access( elem, key, { empty: jQuery.Callbacks("once memory").add(function() { - jQuery._removeData( elem, type + "queue" ); - jQuery._removeData( elem, key ); + data_priv.remove( elem, [ type + "queue", key ] ); }) }); } @@ -4040,7 +3964,7 @@ jQuery.fn.extend({ this.each(function() { var queue = jQuery.queue( this, type, data ); - // ensure a hooks for this queue + // Ensure a hooks for this queue jQuery._queueHooks( this, type ); if ( type === "fx" && queue[0] !== "inprogress" ) { @@ -4077,7 +4001,7 @@ jQuery.fn.extend({ type = type || "fx"; while ( i-- ) { - tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + tmp = data_priv.get( elements[ i ], type + "queueHooks" ); if ( tmp && tmp.empty ) { count++; tmp.empty.add( resolve ); @@ -4098,155 +4022,42 @@ var isHidden = function( elem, el ) { return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); }; - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - length = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < length; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - length ? fn( elems[0], key ) : emptyGet; -}; var rcheckableType = (/^(?:checkbox|radio)$/i); (function() { - // Minified: var a,b,c - var input = document.createElement( "input" ), - div = document.createElement( "div" ), - fragment = document.createDocumentFragment(); - - // Setup - div.innerHTML = "
a"; - - // IE strips leading whitespace when .innerHTML is used - support.leadingWhitespace = div.firstChild.nodeType === 3; - - // Make sure that tbody elements aren't automatically inserted - // IE will insert them into empty tables - support.tbody = !div.getElementsByTagName( "tbody" ).length; - - // Make sure that link elements get serialized correctly by innerHTML - // This requires a wrapper element in IE - support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Safari<=5.1 + // Check state lost if the name is set (#11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); - // Makes sure cloning an html5 element does not cause problems - // Where outerHTML is undefined, this still works - support.html5Clone = - document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + div.appendChild( input ); - // Check if a disconnected checkbox will retain its checked - // value of true after appended to the DOM (IE6/7) - input.type = "checkbox"; - input.checked = true; - fragment.appendChild( input ); - support.appendChecked = input.checked; + // Support: Safari<=5.1, Android<4.2 + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + // Support: IE<=11+ // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE6-IE11+ div.innerHTML = ""; support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // #11217 - WebKit loses check when the name is after the checked attribute - fragment.appendChild( div ); - div.innerHTML = ""; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE<9 - // Opera does not clone events (and typeof div.attachEvent === undefined). - // IE9-10 clones events bound via attachEvent, but they don't trigger with .click() - support.noCloneEvent = true; - if ( div.attachEvent ) { - div.attachEvent( "onclick", function() { - support.noCloneEvent = false; - }); - - div.cloneNode( true ).click(); - } - - // Execute the test only if not already executed in another module. - if (support.deleteExpando == null) { - // Support: IE<9 - support.deleteExpando = true; - try { - delete div.test; - } catch( e ) { - support.deleteExpando = false; - } - } })(); +var strundefined = typeof undefined; -(function() { - var i, eventName, - div = document.createElement( "div" ); - - // Support: IE<9 (lack submit/change bubble), Firefox 23+ (lack focusin event) - for ( i in { submit: true, change: true, focusin: true }) { - eventName = "on" + i; - - if ( !(support[ i + "Bubbles" ] = eventName in window) ) { - // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) - div.setAttribute( eventName, "t" ); - support[ i + "Bubbles" ] = div.attributes[ eventName ].expando === false; - } - } - // Null elements to avoid leaks in IE. - div = null; -})(); +support.focusinBubbles = "onfocusin" in window; -var rformElems = /^(?:input|select|textarea)$/i, +var rkeyEvent = /^key/, rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/, rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, @@ -4275,10 +4086,11 @@ jQuery.event = { global: {}, add: function( elem, types, handler, data, selector ) { - var tmp, events, t, handleObjIn, - special, eventHandle, handleObj, - handlers, type, namespaces, origType, - elemData = jQuery._data( elem ); + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.get( elem ); // Don't attach events to noData or text/comment nodes (but allow plain objects) if ( !elemData ) { @@ -4305,12 +4117,9 @@ jQuery.event = { eventHandle = elemData.handle = function( e ) { // Discard the second event of a jQuery.event.trigger() and // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && (!e || jQuery.event.triggered !== e.type) ? - jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : - undefined; + return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; }; - // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events - eventHandle.elem = elem; } // Handle multiple events separated by a space @@ -4352,14 +4161,10 @@ jQuery.event = { handlers = events[ type ] = []; handlers.delegateCount = 0; - // Only use addEventListener/attachEvent if the special events handler returns false + // Only use addEventListener if the special events handler returns false if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - // Bind the global event handler to the element if ( elem.addEventListener ) { elem.addEventListener( type, eventHandle, false ); - - } else if ( elem.attachEvent ) { - elem.attachEvent( "on" + type, eventHandle ); } } } @@ -4383,17 +4188,15 @@ jQuery.event = { jQuery.event.global[ type ] = true; } - // Nullify elem to prevent memory leaks in IE - elem = null; }, // Detach an event or set of events from an element remove: function( elem, types, handler, selector, mappedTypes ) { - var j, handleObj, tmp, - origCount, t, events, - special, handlers, type, - namespaces, origType, - elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = data_priv.hasData( elem ) && data_priv.get( elem ); if ( !elemData || !(events = elemData.events) ) { return; @@ -4454,16 +4257,13 @@ jQuery.event = { // Remove the expando if it's no longer used if ( jQuery.isEmptyObject( events ) ) { delete elemData.handle; - - // removeData also checks for emptiness and clears the expando if empty - // so use it instead of delete - jQuery._removeData( elem, "events" ); + data_priv.remove( elem, "events" ); } }, trigger: function( event, data, elem, onlyHandlers ) { - var handle, ontype, cur, - bubbleType, special, tmp, i, + + var i, cur, tmp, bubbleType, ontype, handle, special, eventPath = [ elem || document ], type = hasOwn.call( event, "type" ) ? event.type : event, namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; @@ -4545,7 +4345,7 @@ jQuery.event = { special.bindType || type; // jQuery handler - handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" ); + handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); if ( handle ) { handle.apply( cur, data ); } @@ -4568,9 +4368,8 @@ jQuery.event = { jQuery.acceptData( elem ) ) { // Call a native DOM method on the target with the same name name as the event. - // Can't use an .isFunction() check here because IE6/7 fails that test. // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { // Don't re-trigger an onFOO event when we call its FOO() method tmp = elem[ ontype ]; @@ -4581,12 +4380,7 @@ jQuery.event = { // Prevent re-triggering of the same event, since we already bubbled it above jQuery.event.triggered = type; - try { - elem[ type ](); - } catch ( e ) { - // IE<9 dies on focus/blur to hidden element (#1486,#12518) - // only reproducible on winXP IE8 native, not IE9 in IE8 mode - } + elem[ type ](); jQuery.event.triggered = undefined; if ( tmp ) { @@ -4604,10 +4398,10 @@ jQuery.event = { // Make a writable jQuery.Event from the native event object event = jQuery.event.fix( event ); - var i, ret, handleObj, matched, j, + var i, j, ret, matched, handleObj, handlerQueue = [], args = slice.call( arguments ), - handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], special = jQuery.event.special[ event.type ] || {}; // Use the fix-ed jQuery.Event rather than the (read-only) native event @@ -4630,8 +4424,8 @@ jQuery.event = { j = 0; while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { event.handleObj = handleObj; @@ -4659,7 +4453,7 @@ jQuery.event = { }, handlers: function( event, handlers ) { - var sel, handleObj, matches, i, + var i, matches, sel, handleObj, handlerQueue = [], delegateCount = handlers.delegateCount, cur = event.target; @@ -4669,13 +4463,10 @@ jQuery.event = { // Avoid non-left-click bubbling in Firefox (#3861) if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - /* jshint eqeqeq: false */ - for ( ; cur != this; cur = cur.parentNode || this ) { - /* jshint eqeqeq: true */ + for ( ; cur !== this; cur = cur.parentNode || this ) { - // Don't check non-elements (#13208) // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) { + if ( cur.disabled !== true || event.type !== "click" ) { matches = []; for ( i = 0; i < delegateCount; i++ ) { handleObj = handlers[ i ]; @@ -4707,52 +4498,6 @@ jQuery.event = { return handlerQueue; }, - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: IE<9 - // Fix target property (#1925) - if ( !event.target ) { - event.target = originalEvent.srcElement || document; - } - - // Support: Chrome 23+, Safari? - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - // Support: IE<9 - // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) - event.metaKey = !!event.metaKey; - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - // Includes some event props shared by KeyEvent and MouseEvent props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), @@ -4772,11 +4517,10 @@ jQuery.event = { }, mouseHooks: { - props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "), + props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), filter: function( event, original ) { - var body, eventDoc, doc, - button = original.button, - fromElement = original.fromElement; + var eventDoc, doc, body, + button = original.button; // Calculate pageX/Y if missing and clientX/Y available if ( event.pageX == null && original.clientX != null ) { @@ -4788,11 +4532,6 @@ jQuery.event = { event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); } - // Add relatedTarget, if necessary - if ( !event.relatedTarget && fromElement ) { - event.relatedTarget = fromElement === event.target ? original.toElement : fromElement; - } - // Add which for click: 1 === left; 2 === middle; 3 === right // Note: button is not normalized, so don't use it if ( !event.which && button !== undefined ) { @@ -4803,30 +4542,66 @@ jQuery.event = { } }, - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - try { - this.focus(); - return false; - } catch ( e ) { - // Support: IE<9 - // If we error on focus to hidden element (#1486, #12518), - // let .trigger() run the handlers - } - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: Cordova 2.5 (WebKit) (#13255) + // All events should have a target; Cordova deviceready doesn't + if ( !event.target ) { + event.target = document; + } + + // Support: Safari 6.0+, Chrome<28 + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + special: { + load: { + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + this.focus(); + return false; + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { this.blur(); return false; } @@ -4836,7 +4611,7 @@ jQuery.event = { click: { // For checkbox, fire native event so checked state will be right trigger: function() { - if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { this.click(); return false; } @@ -4884,26 +4659,11 @@ jQuery.event = { } }; -jQuery.removeEvent = document.removeEventListener ? - function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } - } : - function( elem, type, handle ) { - var name = "on" + type; - - if ( elem.detachEvent ) { - - // #8545, #7054, preventing memory leaks for custom events in IE6-8 - // detachEvent needed property on element, by name of that event, to properly expose it to GC - if ( typeof elem[ name ] === strundefined ) { - elem[ name ] = null; - } - - elem.detachEvent( name, handle ); - } - }; +jQuery.removeEvent = function( elem, type, handle ) { + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle, false ); + } +}; jQuery.Event = function( src, props ) { // Allow instantiation without the 'new' keyword @@ -4920,7 +4680,7 @@ jQuery.Event = function( src, props ) { // by a handler lower down the tree; reflect the correct value. this.isDefaultPrevented = src.defaultPrevented || src.defaultPrevented === undefined && - // Support: IE < 9, Android < 4.0 + // Support: Android<4.0 src.returnValue === false ? returnTrue : returnFalse; @@ -4953,35 +4713,19 @@ jQuery.Event.prototype = { var e = this.originalEvent; this.isDefaultPrevented = returnTrue; - if ( !e ) { - return; - } - // If preventDefault exists, run it on the original event - if ( e.preventDefault ) { + if ( e && e.preventDefault ) { e.preventDefault(); - - // Support: IE - // Otherwise set the returnValue property of the original event to false - } else { - e.returnValue = false; } }, stopPropagation: function() { var e = this.originalEvent; this.isPropagationStopped = returnTrue; - if ( !e ) { - return; - } - // If stopPropagation exists, run it on the original event - if ( e.stopPropagation ) { + + if ( e && e.stopPropagation ) { e.stopPropagation(); } - - // Support: IE - // Set the cancelBubble property of the original event to true - e.cancelBubble = true; }, stopImmediatePropagation: function() { var e = this.originalEvent; @@ -4997,6 +4741,7 @@ jQuery.Event.prototype = { }; // Create mouseenter/leave events using mouseover/out and event-time checks +// Support: Chrome 15+ jQuery.each({ mouseenter: "mouseover", mouseleave: "mouseout", @@ -5025,112 +4770,7 @@ jQuery.each({ }; }); -// IE submit delegation -if ( !support.submitBubbles ) { - - jQuery.event.special.submit = { - setup: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Lazy-add a submit handler when a descendant form may potentially be submitted - jQuery.event.add( this, "click._submit keypress._submit", function( e ) { - // Node name check avoids a VML-related crash in IE (#9807) - var elem = e.target, - form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined; - if ( form && !jQuery._data( form, "submitBubbles" ) ) { - jQuery.event.add( form, "submit._submit", function( event ) { - event._submit_bubble = true; - }); - jQuery._data( form, "submitBubbles", true ); - } - }); - // return undefined since we don't need an event listener - }, - - postDispatch: function( event ) { - // If form was submitted by the user, bubble the event up the tree - if ( event._submit_bubble ) { - delete event._submit_bubble; - if ( this.parentNode && !event.isTrigger ) { - jQuery.event.simulate( "submit", this.parentNode, event, true ); - } - } - }, - - teardown: function() { - // Only need this for delegated form submit events - if ( jQuery.nodeName( this, "form" ) ) { - return false; - } - - // Remove delegated handlers; cleanData eventually reaps submit handlers attached above - jQuery.event.remove( this, "._submit" ); - } - }; -} - -// IE change delegation and checkbox/radio fix -if ( !support.changeBubbles ) { - - jQuery.event.special.change = { - - setup: function() { - - if ( rformElems.test( this.nodeName ) ) { - // IE doesn't fire change on a check/radio until blur; trigger it on click - // after a propertychange. Eat the blur-change in special.change.handle. - // This still fires onchange a second time for check/radio after blur. - if ( this.type === "checkbox" || this.type === "radio" ) { - jQuery.event.add( this, "propertychange._change", function( event ) { - if ( event.originalEvent.propertyName === "checked" ) { - this._just_changed = true; - } - }); - jQuery.event.add( this, "click._change", function( event ) { - if ( this._just_changed && !event.isTrigger ) { - this._just_changed = false; - } - // Allow triggered, simulated change events (#11500) - jQuery.event.simulate( "change", this, event, true ); - }); - } - return false; - } - // Delegated event; lazy-add a change handler on descendant inputs - jQuery.event.add( this, "beforeactivate._change", function( e ) { - var elem = e.target; - - if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) { - jQuery.event.add( elem, "change._change", function( event ) { - if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { - jQuery.event.simulate( "change", this.parentNode, event, true ); - } - }); - jQuery._data( elem, "changeBubbles", true ); - } - }); - }, - - handle: function( event ) { - var elem = event.target; - - // Swallow native change events from checkbox/radio, we already triggered them above - if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) { - return event.handleObj.handler.apply( this, arguments ); - } - }, - - teardown: function() { - jQuery.event.remove( this, "._change" ); - - return !rformElems.test( this.nodeName ); - } - }; -} - +// Support: Firefox, Chrome, Safari // Create "bubbling" focus and blur events if ( !support.focusinBubbles ) { jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { @@ -5143,22 +4783,23 @@ if ( !support.focusinBubbles ) { jQuery.event.special[ fix ] = { setup: function() { var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ); + attaches = data_priv.access( doc, fix ); if ( !attaches ) { doc.addEventListener( orig, handler, true ); } - jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); }, teardown: function() { var doc = this.ownerDocument || this, - attaches = jQuery._data( doc, fix ) - 1; + attaches = data_priv.access( doc, fix ) - 1; if ( !attaches ) { doc.removeEventListener( orig, handler, true ); - jQuery._removeData( doc, fix ); + data_priv.remove( doc, fix ); + } else { - jQuery._data( doc, fix, attaches ); + data_priv.access( doc, fix, attaches ); } } }; @@ -5168,7 +4809,7 @@ if ( !support.focusinBubbles ) { jQuery.fn.extend({ on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var type, origFn; + var origFn, type; // Types can be a map of types/handlers if ( typeof types === "object" ) { @@ -5269,28 +4910,9 @@ jQuery.fn.extend({ }); -function createSafeFragment( document ) { - var list = nodeNames.split( "|" ), - safeFrag = document.createDocumentFragment(); - - if ( safeFrag.createElement ) { - while ( list.length ) { - safeFrag.createElement( - list.pop() - ); - } - } - return safeFrag; -} - -var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" + - "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video", - rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, - rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"), - rleadingWhitespace = /^\s+/, +var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, rtagName = /<([\w:]+)/, - rtbody = /", "" ], - legend: [ 1, "
", "
" ], - area: [ 1, "", "" ], - param: [ 1, "", "" ], + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], tr: [ 2, "", "
" ], - col: [ 2, "", "
" ], td: [ 3, "", "
" ], - // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, - // unless wrapped in a div with non-breaking characters in front of it. - _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
", "
" ] - }, - safeFragment = createSafeFragment( document ), - fragmentDiv = safeFragment.appendChild( document.createElement("div") ); + _default: [ 0, "", "" ] + }; +// Support: IE9 wrapMap.optgroup = wrapMap.option; + wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; wrapMap.th = wrapMap.td; -function getAll( context, tag ) { - var elems, elem, - i = 0, - found = typeof context.getElementsByTagName !== strundefined ? context.getElementsByTagName( tag || "*" ) : - typeof context.querySelectorAll !== strundefined ? context.querySelectorAll( tag || "*" ) : - undefined; - - if ( !found ) { - for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) { - if ( !tag || jQuery.nodeName( elem, tag ) ) { - found.push( elem ); - } else { - jQuery.merge( found, getAll( elem, tag ) ); - } - } - } - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], found ) : - found; -} - -// Used in buildFragment, fixes the defaultChecked property -function fixDefaultChecked( elem ) { - if ( rcheckableType.test( elem.type ) ) { - elem.defaultChecked = elem.checked; - } -} - -// Support: IE<8 +// Support: 1.x compatibility // Manipulating tables requires a tbody function manipulationTarget( elem, content ) { return jQuery.nodeName( elem, "table" ) && @@ -5363,118 +4954,86 @@ function manipulationTarget( elem, content ) { // Replace/restore the type attribute of script elements for safe DOM manipulation function disableScript( elem ) { - elem.type = (jQuery.find.attr( elem, "type" ) !== null) + "/" + elem.type; + elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; return elem; } function restoreScript( elem ) { var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { - elem.type = match[1]; + elem.type = match[ 1 ]; } else { elem.removeAttribute("type"); } + return elem; } // Mark scripts as having already been evaluated function setGlobalEval( elems, refElements ) { - var elem, - i = 0; - for ( ; (elem = elems[i]) != null; i++ ) { - jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) ); + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + data_priv.set( + elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) + ); } } function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + if ( dest.nodeType !== 1 ) { return; } - var type, i, l, - oldData = jQuery._data( src ), - curData = jQuery._data( dest, oldData ), - events = oldData.events; + // 1. Copy private data: events, handlers, etc. + if ( data_priv.hasData( src ) ) { + pdataOld = data_priv.access( src ); + pdataCur = data_priv.set( dest, pdataOld ); + events = pdataOld.events; - if ( events ) { - delete curData.handle; - curData.events = {}; + if ( events ) { + delete pdataCur.handle; + pdataCur.events = {}; - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } } } } - // make the cloned public data object a copy from the original - if ( curData.data ) { - curData.data = jQuery.extend( {}, curData.data ); - } -} - -function fixCloneNodeIssues( src, dest ) { - var nodeName, e, data; - - // We do not need to do anything for non-Elements - if ( dest.nodeType !== 1 ) { - return; - } - - nodeName = dest.nodeName.toLowerCase(); + // 2. Copy user data + if ( data_user.hasData( src ) ) { + udataOld = data_user.access( src ); + udataCur = jQuery.extend( {}, udataOld ); - // IE6-8 copies events bound via attachEvent when using cloneNode. - if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { - data = jQuery._data( dest ); - - for ( e in data.events ) { - jQuery.removeEvent( dest, e, data.handle ); - } - - // Event data gets referenced instead of copied if the expando gets copied too - dest.removeAttribute( jQuery.expando ); + data_user.set( dest, udataCur ); } +} - // IE blanks contents when cloning scripts, and tries to evaluate newly-set text - if ( nodeName === "script" && dest.text !== src.text ) { - disableScript( dest ).text = src.text; - restoreScript( dest ); - - // IE6-10 improperly clones children of object elements using classid. - // IE10 throws NoModificationAllowedError if parent is null, #12132. - } else if ( nodeName === "object" ) { - if ( dest.parentNode ) { - dest.outerHTML = src.outerHTML; - } - - // This path appears unavoidable for IE9. When cloning an object - // element in IE9, the outerHTML strategy above is not sufficient. - // If the src has innerHTML and the destination does not, - // copy the src.innerHTML into the dest.innerHTML. #10324 - if ( support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) { - dest.innerHTML = src.innerHTML; - } - - } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - // IE6-8 fails to persist the checked state of a cloned checkbox - // or radio button. Worse, IE6-7 fail to give the cloned element - // a checked appearance if the defaultChecked value isn't also set +function getAll( context, tag ) { + var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : + context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : + []; - dest.defaultChecked = dest.checked = src.checked; + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], ret ) : + ret; +} - // IE6-7 get confused and end up setting the value of a cloned - // checkbox/radio button to an empty string instead of "on" - if ( dest.value !== src.value ) { - dest.value = src.value; - } +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); - // IE6-8 fails to return the selected option to the default selected - // state when cloning options - } else if ( nodeName === "option" ) { - dest.defaultSelected = dest.selected = src.defaultSelected; + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; - // IE6-8 fails to set the defaultValue to the correct value when - // cloning other types of input fields + // Fails to return the selected option to the default selected state when cloning options } else if ( nodeName === "input" || nodeName === "textarea" ) { dest.defaultValue = src.defaultValue; } @@ -5482,31 +5041,20 @@ function fixCloneNodeIssues( src, dest ) { jQuery.extend({ clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var destElements, node, clone, i, srcElements, + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), inPage = jQuery.contains( elem.ownerDocument, elem ); - if ( support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { - clone = elem.cloneNode( true ); - - // IE<=8 does not properly clone detached, unknown element nodes - } else { - fragmentDiv.innerHTML = elem.outerHTML; - fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); - } - - if ( (!support.noCloneEvent || !support.noCloneChecked) && - (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) { + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 destElements = getAll( clone ); srcElements = getAll( elem ); - // Fix all IE cloning issues - for ( i = 0; (node = srcElements[i]) != null; ++i ) { - // Ensure that the destination node is not null; Fixes #9587 - if ( destElements[i] ) { - fixCloneNodeIssues( node, destElements[i] ); - } + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); } } @@ -5516,8 +5064,8 @@ jQuery.extend({ srcElements = srcElements || getAll( elem ); destElements = destElements || getAll( clone ); - for ( i = 0; (node = srcElements[i]) != null; i++ ) { - cloneCopyEvent( node, destElements[i] ); + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); } } else { cloneCopyEvent( elem, clone ); @@ -5530,22 +5078,16 @@ jQuery.extend({ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); } - destElements = srcElements = node = null; - // Return the cloned set return clone; }, buildFragment: function( elems, context, scripts, selection ) { - var j, elem, contains, - tmp, tag, tbody, wrap, - l = elems.length, - - // Ensure a safe fragment - safe = createSafeFragment( context ), - + var elem, tmp, tag, wrap, contains, j, + fragment = context.createDocumentFragment(), nodes = [], - i = 0; + i = 0, + l = elems.length; for ( ; i < l; i++ ) { elem = elems[ i ]; @@ -5554,6 +5096,8 @@ jQuery.extend({ // Add nodes directly if ( jQuery.type( elem ) === "object" ) { + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); // Convert non-html into a text node @@ -5562,71 +5106,34 @@ jQuery.extend({ // Convert html into DOM nodes } else { - tmp = tmp || safe.appendChild( context.createElement("div") ); + tmp = tmp || fragment.appendChild( context.createElement("div") ); // Deserialize a standard representation - tag = (rtagName.exec( elem ) || [ "", "" ])[ 1 ].toLowerCase(); + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); wrap = wrapMap[ tag ] || wrapMap._default; - - tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[2]; + tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; // Descend through wrappers to the right content - j = wrap[0]; + j = wrap[ 0 ]; while ( j-- ) { tmp = tmp.lastChild; } - // Manually add leading whitespace removed by IE - if ( !support.leadingWhitespace && rleadingWhitespace.test( elem ) ) { - nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) ); - } - - // Remove IE's autoinserted from table fragments - if ( !support.tbody ) { - - // String was a , *may* have spurious - elem = tag === "table" && !rtbody.test( elem ) ? - tmp.firstChild : - - // String was a bare or - wrap[1] === "
" && !rtbody.test( elem ) ? - tmp : - 0; - - j = elem && elem.childNodes.length; - while ( j-- ) { - if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) { - elem.removeChild( tbody ); - } - } - } - + // Support: QtWebKit, PhantomJS + // push.apply(_, arraylike) throws on ancient WebKit jQuery.merge( nodes, tmp.childNodes ); - // Fix #12392 for WebKit and IE > 9 - tmp.textContent = ""; - - // Fix #12392 for oldIE - while ( tmp.firstChild ) { - tmp.removeChild( tmp.firstChild ); - } + // Remember the top-level container + tmp = fragment.firstChild; - // Remember the top-level container for proper cleanup - tmp = safe.lastChild; + // Ensure the created nodes are orphaned (#12392) + tmp.textContent = ""; } } } - // Fix #11356: Clear elements from fragment - if ( tmp ) { - safe.removeChild( tmp ); - } - - // Reset defaultChecked for any radios and checkboxes - // about to be appended to the DOM in IE 6/7 (#8060) - if ( !support.appendChecked ) { - jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); - } + // Remove wrapper from fragment + fragment.textContent = ""; i = 0; while ( (elem = nodes[ i++ ]) ) { @@ -5640,7 +5147,7 @@ jQuery.extend({ contains = jQuery.contains( elem.ownerDocument, elem ); // Append to fragment - tmp = getAll( safe.appendChild( elem ), "script" ); + tmp = getAll( fragment.appendChild( elem ), "script" ); // Preserve script evaluation history if ( contains ) { @@ -5658,26 +5165,19 @@ jQuery.extend({ } } - tmp = null; - - return safe; + return fragment; }, - cleanData: function( elems, /* internal */ acceptData ) { - var elem, type, id, data, - i = 0, - internalKey = jQuery.expando, - cache = jQuery.cache, - deleteExpando = support.deleteExpando, - special = jQuery.event.special; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( acceptData || jQuery.acceptData( elem ) ) { + cleanData: function( elems ) { + var data, elem, type, key, + special = jQuery.event.special, + i = 0; - id = elem[ internalKey ]; - data = id && cache[ id ]; + for ( ; (elem = elems[ i ]) !== undefined; i++ ) { + if ( jQuery.acceptData( elem ) ) { + key = elem[ data_priv.expando ]; - if ( data ) { + if ( key && (data = data_priv.cache[ key ]) ) { if ( data.events ) { for ( type in data.events ) { if ( special[ type ] ) { @@ -5689,29 +5189,14 @@ jQuery.extend({ } } } - - // Remove cache only if it was not already removed by jQuery.event.remove - if ( cache[ id ] ) { - - delete cache[ id ]; - - // IE does not allow us to delete expando properties from nodes, - // nor does it have a removeAttribute function on Document nodes; - // we must handle all of these cases - if ( deleteExpando ) { - delete elem[ internalKey ]; - - } else if ( typeof elem.removeAttribute !== strundefined ) { - elem.removeAttribute( internalKey ); - - } else { - elem[ internalKey ] = null; - } - - deletedIds.push( id ); + if ( data_priv.cache[ key ] ) { + // Discard any remaining `private` data + delete data_priv.cache[ key ]; } } } + // Discard any remaining `user` data + delete data_user.cache[ elem[ data_user.expando ] ]; } } }); @@ -5721,7 +5206,11 @@ jQuery.fn.extend({ return access( this, function( value ) { return value === undefined ? jQuery.text( this ) : - this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) ); + this.empty().each(function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + }); }, null, value, arguments.length ); }, @@ -5765,7 +5254,6 @@ jQuery.fn.extend({ i = 0; for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem ) ); } @@ -5786,20 +5274,13 @@ jQuery.fn.extend({ i = 0; for ( ; (elem = this[i]) != null; i++ ) { - // Remove element nodes and prevent memory leaks if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - } - // Remove any remaining nodes - while ( elem.firstChild ) { - elem.removeChild( elem.firstChild ); - } + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); - // If this is a select, ensure that it displays empty (#12336) - // Support: IE<9 - if ( elem.options && jQuery.nodeName( elem, "select" ) ) { - elem.options.length = 0; + // Remove any remaining nodes + elem.textContent = ""; } } @@ -5821,24 +5302,21 @@ jQuery.fn.extend({ i = 0, l = this.length; - if ( value === undefined ) { - return elem.nodeType === 1 ? - elem.innerHTML.replace( rinlinejQuery, "" ) : - undefined; + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; } // See if we can take a shortcut and just use innerHTML if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - ( support.htmlSerialize || !rnoshimcache.test( value ) ) && - ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && - !wrapMap[ (rtagName.exec( value ) || [ "", "" ])[ 1 ].toLowerCase() ] ) { + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { value = value.replace( rxhtmlTag, "<$1>" ); try { - for (; i < l; i++ ) { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + // Remove element nodes and prevent memory leaks - elem = this[i] || {}; if ( elem.nodeType === 1 ) { jQuery.cleanData( getAll( elem, false ) ); elem.innerHTML = value; @@ -5848,7 +5326,7 @@ jQuery.fn.extend({ elem = 0; // If using innerHTML throws an exception, use the fallback method - } catch(e) {} + } catch( e ) {} } if ( elem ) { @@ -5884,13 +5362,12 @@ jQuery.fn.extend({ // Flatten any nested arrays args = concat.apply( [], args ); - var first, node, hasScripts, - scripts, doc, fragment, + var fragment, first, scripts, hasScripts, node, doc, i = 0, l = this.length, set = this, iNoClone = l - 1, - value = args[0], + value = args[ 0 ], isFunction = jQuery.isFunction( value ); // We can't cloneNode fragments that contain checked, in WebKit @@ -5900,7 +5377,7 @@ jQuery.fn.extend({ return this.each(function( index ) { var self = set.eq( index ); if ( isFunction ) { - args[0] = value.call( this, index, self.html() ); + args[ 0 ] = value.call( this, index, self.html() ); } self.domManip( args, callback ); }); @@ -5928,11 +5405,13 @@ jQuery.fn.extend({ // Keep references to cloned scripts for later restoration if ( hasScripts ) { + // Support: QtWebKit + // jQuery.merge because push.apply(_, arraylike) throws jQuery.merge( scripts, getAll( node, "script" ) ); } } - callback.call( this[i], node, i ); + callback.call( this[ i ], node, i ); } if ( hasScripts ) { @@ -5945,7 +5424,7 @@ jQuery.fn.extend({ for ( i = 0; i < hasScripts; i++ ) { node = scripts[ i ]; if ( rscriptType.test( node.type || "" ) && - !jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) { + !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { if ( node.src ) { // Optional AJAX dependency, but won't run scripts if not present @@ -5953,14 +5432,11 @@ jQuery.fn.extend({ jQuery._evalUrl( node.src ); } } else { - jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) ); + jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); } } } } - - // Fix #11809: Avoid leaking memory - fragment = first = null; } } @@ -5977,16 +5453,17 @@ jQuery.each({ }, function( name, original ) { jQuery.fn[ name ] = function( selector ) { var elems, - i = 0, ret = [], insert = jQuery( selector ), - last = insert.length - 1; + last = insert.length - 1, + i = 0; for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone(true); - jQuery( insert[i] )[ original ]( elems ); + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); - // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + // Support: QtWebKit + // .get() because push.apply(_, arraylike) throws push.apply( ret, elems.get() ); } @@ -6011,7 +5488,7 @@ function actualDisplay( name, doc ) { // getDefaultComputedStyle might be reliably used only on attached element display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ? - // Use of this method is a temporary fix (more like optmization) until something better comes along, + // Use of this method is a temporary fix (more like optimization) until something better comes along, // since it was removed from specification and supported only in FF style.display : jQuery.css( elem[ 0 ], "display" ); @@ -6040,7 +5517,7 @@ function defaultDisplay( nodeName ) { iframe = (iframe || jQuery( "