Compare commits
81 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
12f56fdb7d | ||
|
|
afa18e554c | ||
|
|
7205d07c67 | ||
|
|
83ba2eb4d6 | ||
|
|
87865f00a3 | ||
|
|
112672c4a9 | ||
|
|
f05ab79731 | ||
|
|
3a52c444f8 | ||
|
|
f62eb3b1a8 | ||
|
|
110c092c9e | ||
|
|
8bb0e2d494 | ||
|
|
8c1b80daae | ||
|
|
e2895a92dc | ||
|
|
03998c1b20 | ||
|
|
9472df0db4 | ||
|
|
8f7327cb4d | ||
|
|
3636014917 | ||
|
|
92d33c79c7 | ||
|
|
e2d9eefccd | ||
|
|
ced2b114e4 | ||
|
|
f7097281c9 | ||
|
|
01a1113387 | ||
|
|
4d0b47ac4c | ||
|
|
d6cfc4a9b5 | ||
|
|
fbcdbf5ab1 | ||
|
|
7e14a97371 | ||
|
|
c440d13754 | ||
|
|
8e8f09b41f | ||
|
|
1decb14807 | ||
|
|
a978f50f1d | ||
|
|
74287c578c | ||
|
|
7f1cdc2d02 | ||
|
|
847a959b13 | ||
|
|
05015a8b3e | ||
|
|
6f960d8662 | ||
|
|
11b8b59e03 | ||
|
|
f1ebe05f1d | ||
|
|
85b2a8c6c4 | ||
|
|
557fb4ed72 | ||
|
|
ee52023b3d | ||
|
|
91296a44f2 | ||
|
|
1923461b09 | ||
|
|
71116d3957 | ||
|
|
63cc7cafc8 | ||
|
|
fdecf02472 | ||
|
|
11f4d894a6 | ||
|
|
1149d4edde | ||
|
|
9ee85c35d2 | ||
|
|
0367ca5294 | ||
|
|
763a83c833 | ||
|
|
7fb53dcdfa | ||
|
|
a9a112e88f | ||
|
|
0184808a86 | ||
|
|
1ac2a6f608 | ||
|
|
785f62c7a0 | ||
|
|
d8c154a2c6 | ||
|
|
c974c4740c | ||
|
|
2b27bd393f | ||
|
|
3b77f38188 | ||
|
|
11827572d3 | ||
|
|
8326ecf919 | ||
|
|
cd6a0de852 | ||
|
|
148d94558d | ||
|
|
83beca6899 | ||
|
|
3c6308f1dc | ||
|
|
6193bc113b | ||
|
|
fa6a80b76e | ||
|
|
c861f6c6c2 | ||
|
|
4fcd4099ad | ||
|
|
1d495587ff | ||
|
|
c859128537 | ||
|
|
a8a5b839ab | ||
|
|
4e5d947faa | ||
|
|
c2603efeb4 | ||
|
|
fbec3cc230 | ||
|
|
1acbd1ef96 | ||
|
|
3d8e379fa6 | ||
|
|
55267e11f6 | ||
|
|
09a6e3714a | ||
|
|
8ec4d54685 | ||
|
|
d90e20eb15 |
12
.jshintrc
12
.jshintrc
@@ -1,9 +1,17 @@
|
|||||||
{
|
{
|
||||||
"bitwise": true,
|
"bitwise": true,
|
||||||
"curly": true,
|
"curly": true,
|
||||||
|
"globals": {
|
||||||
|
"clearTimeout": false,
|
||||||
|
"console": false,
|
||||||
|
"getJasmineRequireObj": true,
|
||||||
|
"jasmineRequire": true,
|
||||||
|
"setTimeout": false
|
||||||
|
},
|
||||||
"immed": true,
|
"immed": true,
|
||||||
"newcap": true,
|
"newcap": true,
|
||||||
"trailing": true,
|
"trailing": true,
|
||||||
"loopfunc": true,
|
"loopfunc": true,
|
||||||
"quotmark": "single"
|
"quotmark": "single",
|
||||||
}
|
"undef": true
|
||||||
|
}
|
||||||
|
|||||||
20
.travis.yml
20
.travis.yml
@@ -2,8 +2,11 @@ language: ruby
|
|||||||
cache: bundler
|
cache: bundler
|
||||||
sudo: false
|
sudo: false
|
||||||
|
|
||||||
rvm: 2.2.2
|
rvm: 2.5
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- gem update --system
|
||||||
|
- gem install bundler
|
||||||
script: $TEST_COMMAND
|
script: $TEST_COMMAND
|
||||||
|
|
||||||
env:
|
env:
|
||||||
@@ -11,9 +14,6 @@ env:
|
|||||||
- USE_SAUCE=true
|
- USE_SAUCE=true
|
||||||
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
- NOKOGIRI_USE_SYSTEM_LIBRARIES=true
|
||||||
- TEST_COMMAND="bash travis-core-script.sh"
|
- TEST_COMMAND="bash travis-core-script.sh"
|
||||||
- JASMINE_BROWSER="firefox"
|
|
||||||
- SAUCE_OS="Linux"
|
|
||||||
- SAUCE_BROWSER_VERSION=''
|
|
||||||
- secure: WSPWhlnC4mWSnSPquX+m1/BCu5ch5NygkaHuM2Nea7lD8oS3XLX8QncZZAsQ4lnNfqoDDuBOizG0AESiqNvE4y6x5qvLLTS6q+ce255ZEMZ71TBdZgDEEvGMEjOPPsVXiXyTQOP1lwOPlrbZvaPgWV7e11KIBab6DfFcQpnvDgo=
|
- secure: WSPWhlnC4mWSnSPquX+m1/BCu5ch5NygkaHuM2Nea7lD8oS3XLX8QncZZAsQ4lnNfqoDDuBOizG0AESiqNvE4y6x5qvLLTS6q+ce255ZEMZ71TBdZgDEEvGMEjOPPsVXiXyTQOP1lwOPlrbZvaPgWV7e11KIBab6DfFcQpnvDgo=
|
||||||
- secure: SW7CJhZnwaNT749Gdnhvqb5rbXlAOsygUAzh9qhtyvbqXKkmJdBIEsO01YF6pbju1X2twE9JvWCOxeZju43NgQChJlPsGbjY2j3k/TdQeTAJesQe2K7ytwghunI30gjEovtRH0T3w1EmcKPH8yj5eBIcB2OYoJHx8KEC7e68q1g=
|
- secure: SW7CJhZnwaNT749Gdnhvqb5rbXlAOsygUAzh9qhtyvbqXKkmJdBIEsO01YF6pbju1X2twE9JvWCOxeZju43NgQChJlPsGbjY2j3k/TdQeTAJesQe2K7ytwghunI30gjEovtRH0T3w1EmcKPH8yj5eBIcB2OYoJHx8KEC7e68q1g=
|
||||||
|
|
||||||
@@ -31,6 +31,10 @@ matrix:
|
|||||||
- env:
|
- env:
|
||||||
- USE_SAUCE=false
|
- USE_SAUCE=false
|
||||||
- TEST_COMMAND="bash travis-node-script.sh v9"
|
- TEST_COMMAND="bash travis-node-script.sh v9"
|
||||||
|
- env:
|
||||||
|
- JASMINE_BROWSER="firefox"
|
||||||
|
- SAUCE_OS="Linux"
|
||||||
|
- SAUCE_BROWSER_VERSION=''
|
||||||
- env:
|
- env:
|
||||||
- JASMINE_BROWSER="safari"
|
- JASMINE_BROWSER="safari"
|
||||||
- SAUCE_OS="OS X 10.12"
|
- SAUCE_OS="OS X 10.12"
|
||||||
@@ -43,10 +47,6 @@ matrix:
|
|||||||
- JASMINE_BROWSER="safari"
|
- JASMINE_BROWSER="safari"
|
||||||
- SAUCE_OS="OS X 10.10"
|
- SAUCE_OS="OS X 10.10"
|
||||||
- SAUCE_BROWSER_VERSION=8
|
- SAUCE_BROWSER_VERSION=8
|
||||||
- env:
|
|
||||||
- JASMINE_BROWSER="safari"
|
|
||||||
- SAUCE_OS="OS X 10.9"
|
|
||||||
- SAUCE_BROWSER_VERSION=7
|
|
||||||
- env:
|
- env:
|
||||||
- JASMINE_BROWSER="MicrosoftEdge"
|
- JASMINE_BROWSER="MicrosoftEdge"
|
||||||
- SAUCE_OS="Windows 10"
|
- SAUCE_OS="Windows 10"
|
||||||
@@ -66,7 +66,3 @@ matrix:
|
|||||||
- env:
|
- env:
|
||||||
- JASMINE_BROWSER="phantomjs"
|
- JASMINE_BROWSER="phantomjs"
|
||||||
- USE_SAUCE=false
|
- USE_SAUCE=false
|
||||||
- env:
|
|
||||||
- USE_SAUCE=false
|
|
||||||
- JASMINE_BROWSER="phantomjs"
|
|
||||||
- TEST_COMMAND="bash travis-docs-script.sh"
|
|
||||||
|
|||||||
12
README.md
12
README.md
@@ -1,15 +1,17 @@
|
|||||||
<a name="README">[<img src="https://rawgithub.com/jasmine/jasmine/master/images/jasmine-horizontal.svg" width="400px" />](http://jasmine.github.io)</a>
|
<a name="README">[<img src="https://rawgithub.com/jasmine/jasmine/master/images/jasmine-horizontal.svg" width="400px" />](http://jasmine.github.io)</a>
|
||||||
|
|
||||||
[](https://travis-ci.org/jasmine/jasmine)
|
[](https://travis-ci.org/jasmine/jasmine)
|
||||||
|
[](https://www.codetriage.com/jasmine/jasmine)
|
||||||
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fjasmine%2Fjasmine?ref=badge_shield)
|
||||||
|
|
||||||
# A JavaScript Testing Framework
|
# A JavaScript Testing Framework
|
||||||
|
|
||||||
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.
|
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.
|
||||||
|
|
||||||
Documentation & guides live here: [http://jasmine.github.io](http://jasmine.github.io/)
|
Documentation & guides live here: [http://jasmine.github.io](http://jasmine.github.io/)
|
||||||
For a quick start guide of Jasmine 2.x, see the beginning of [http://jasmine.github.io/edge/introduction.html](http://jasmine.github.io/edge/introduction.html)
|
For a quick start guide of Jasmine, see the beginning of [http://jasmine.github.io/edge/introduction.html](http://jasmine.github.io/edge/introduction.html)
|
||||||
|
|
||||||
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).
|
Upgrading from Jasmine 2.x? Check out the [3.0 release notes](https://github.com/jasmine/jasmine/blob/v3.0.0/release_notes/3.0.md) for a list of what's new (including breaking changes).
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
@@ -73,4 +75,8 @@ Jasmine tests itself across many browsers (Safari, Chrome, Firefox, PhantomJS, M
|
|||||||
* [Christian Williams](mailto:antixian666@gmail.com), Cloud Foundry
|
* [Christian Williams](mailto:antixian666@gmail.com), Cloud Foundry
|
||||||
* Sheel Choksi
|
* Sheel Choksi
|
||||||
|
|
||||||
Copyright (c) 2008-2017 Pivotal Labs. This software is licensed under the MIT License.
|
Copyright (c) 2008-2018 Pivotal Labs. This software is licensed under the MIT License.
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
[](https://app.fossa.io/projects/git%2Bgithub.com%2Fjasmine%2Fjasmine?ref=badge_large)
|
||||||
@@ -14,7 +14,7 @@ Gem::Specification.new do |s|
|
|||||||
s.rubyforge_project = "jasmine-core"
|
s.rubyforge_project = "jasmine-core"
|
||||||
s.license = "MIT"
|
s.license = "MIT"
|
||||||
|
|
||||||
s.files = Dir.glob("./lib/**/*") + Dir.glob("./lib/jasmine-core/spec/**/*.js")
|
s.files = Dir.glob("./lib/**/*")
|
||||||
s.require_paths = ["lib"]
|
s.require_paths = ["lib"]
|
||||||
s.add_development_dependency "rake"
|
s.add_development_dependency "rake"
|
||||||
s.add_development_dependency "sauce-connect"
|
s.add_development_dependency "sauce-connect"
|
||||||
|
|||||||
@@ -78,6 +78,9 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||||||
|
|
||||||
var throwingExpectationFailures = queryString.getParam("throwFailures");
|
var throwingExpectationFailures = queryString.getParam("throwFailures");
|
||||||
env.throwOnExpectationFailure(throwingExpectationFailures);
|
env.throwOnExpectationFailure(throwingExpectationFailures);
|
||||||
|
|
||||||
|
var hideDisabled = queryString.getParam("hideDisabled");
|
||||||
|
env.hideDisabled(hideDisabled);
|
||||||
|
|
||||||
var random = queryString.getParam("random");
|
var random = queryString.getParam("random");
|
||||||
|
|
||||||
|
|||||||
@@ -56,6 +56,9 @@
|
|||||||
|
|
||||||
var throwingExpectationFailures = queryString.getParam("throwFailures");
|
var throwingExpectationFailures = queryString.getParam("throwFailures");
|
||||||
env.throwOnExpectationFailure(throwingExpectationFailures);
|
env.throwOnExpectationFailure(throwingExpectationFailures);
|
||||||
|
|
||||||
|
var hideDisabled = queryString.getParam("hideDisabled");
|
||||||
|
env.hideDisabled(hideDisabled);
|
||||||
|
|
||||||
var random = queryString.getParam("random");
|
var random = queryString.getParam("random");
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
module.exports = function(jasmineRequire) {
|
module.exports = function(jasmineRequire) {
|
||||||
var jasmine = jasmineRequire.core(jasmineRequire);
|
var jasmine = jasmineRequire.core(jasmineRequire);
|
||||||
|
|
||||||
var env = jasmine.getEnv();
|
var env = jasmine.getEnv({suppressLoadErrors: true});
|
||||||
|
|
||||||
var jasmineInterface = jasmineRequire.interface(jasmine, env);
|
var jasmineInterface = jasmineRequire.interface(jasmine, env);
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ jasmineRequire.html = function(j$) {
|
|||||||
j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
|
j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
|
||||||
j$.QueryString = jasmineRequire.QueryString();
|
j$.QueryString = jasmineRequire.QueryString();
|
||||||
j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
|
j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
|
||||||
j$.matchers.toHaveClass = jasmineRequire.toHaveClass(j$);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmineRequire.HtmlReporter = function(j$) {
|
jasmineRequire.HtmlReporter = function(j$) {
|
||||||
@@ -149,7 +148,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
symbols.appendChild(createDom('li', {
|
symbols.appendChild(createDom('li', {
|
||||||
className: noExpectations(result) ? 'jasmine-empty' : 'jasmine-' + result.status,
|
className: this.displaySpecInCorrectFormat(result),
|
||||||
id: 'spec_' + result.id,
|
id: 'spec_' + result.id,
|
||||||
title: result.fullName
|
title: result.fullName
|
||||||
}
|
}
|
||||||
@@ -162,10 +161,22 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
addDeprecationWarnings(result);
|
addDeprecationWarnings(result);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.displaySpecInCorrectFormat = function(result) {
|
||||||
|
return noExpectations(result) ? 'jasmine-empty' : this.resultStatus(result.status);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.resultStatus = function(status) {
|
||||||
|
if(status === 'excluded') {
|
||||||
|
return env.hidingDisabled() ? 'jasmine-excluded-no-display' : 'jasmine-excluded';
|
||||||
|
}
|
||||||
|
return 'jasmine-' + status;
|
||||||
|
};
|
||||||
|
|
||||||
this.jasmineDone = function(doneResult) {
|
this.jasmineDone = function(doneResult) {
|
||||||
var banner = find('.jasmine-banner');
|
var banner = find('.jasmine-banner');
|
||||||
var alert = find('.jasmine-alert');
|
var alert = find('.jasmine-alert');
|
||||||
var order = doneResult && doneResult.order;
|
var order = doneResult && doneResult.order;
|
||||||
|
var i;
|
||||||
alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
|
alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
|
||||||
|
|
||||||
banner.appendChild(optionsMenu(env));
|
banner.appendChild(optionsMenu(env));
|
||||||
@@ -352,7 +363,14 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
id: 'jasmine-random-order',
|
id: 'jasmine-random-order',
|
||||||
type: 'checkbox'
|
type: 'checkbox'
|
||||||
}),
|
}),
|
||||||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order'))
|
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')),
|
||||||
|
createDom('div', { className: 'jasmine-hide-disabled' },
|
||||||
|
createDom('input', {
|
||||||
|
className: 'jasmine-disabled',
|
||||||
|
id: 'jasmine-hide-disabled',
|
||||||
|
type: 'checkbox'
|
||||||
|
}),
|
||||||
|
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-hide-disabled' }, 'hide disabled tests'))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -374,6 +392,12 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
navigateWithNewParam('random', !env.randomTests());
|
navigateWithNewParam('random', !env.randomTests());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var hideDisabled = optionsMenuDom.querySelector('#jasmine-hide-disabled');
|
||||||
|
hideDisabled.checked = env.hidingDisabled();
|
||||||
|
hideDisabled.onclick = function() {
|
||||||
|
navigateWithNewParam('hideDisabled', !env.hidingDisabled());
|
||||||
|
};
|
||||||
|
|
||||||
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
||||||
optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'),
|
optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'),
|
||||||
isOpen = /\bjasmine-open\b/;
|
isOpen = /\bjasmine-open\b/;
|
||||||
@@ -600,37 +624,3 @@ jasmineRequire.QueryString = function() {
|
|||||||
|
|
||||||
return QueryString;
|
return QueryString;
|
||||||
};
|
};
|
||||||
|
|
||||||
jasmineRequire.toHaveClass = function(j$) {
|
|
||||||
/**
|
|
||||||
* {@link expect} the actual value to be a DOM element that has the expected class
|
|
||||||
* @function
|
|
||||||
* @name matchers#toHaveClass
|
|
||||||
* @param {Object} expected - The class name to test for
|
|
||||||
* @example
|
|
||||||
* var el = document.createElement('div');
|
|
||||||
* el.className = 'foo bar baz';
|
|
||||||
* expect(el).toHaveClass('bar');
|
|
||||||
*/
|
|
||||||
function toHaveClass(util, customEqualityTesters) {
|
|
||||||
return {
|
|
||||||
compare: function(actual, expected) {
|
|
||||||
if (!isElement(actual)) {
|
|
||||||
throw new Error(j$.pp(actual) + ' is not a DOM element');
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
pass: actual.classList.contains(expected)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function isElement(maybeEl) {
|
|
||||||
return maybeEl &&
|
|
||||||
maybeEl.classList &&
|
|
||||||
j$.isFunction_(maybeEl.classList.contains);
|
|
||||||
}
|
|
||||||
|
|
||||||
return toHaveClass;
|
|
||||||
};
|
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ body { overflow-y: scroll; }
|
|||||||
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "\d7"; font-weight: bold; margin-left: -1px; }
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "\d7"; font-weight: bold; margin-left: -1px; }
|
||||||
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded { font-size: 14px; }
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded { font-size: 14px; }
|
||||||
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "\02022"; }
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "\02022"; }
|
||||||
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded-no-display { font-size: 14px; display: none; }
|
||||||
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; }
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; }
|
||||||
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; }
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; }
|
||||||
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; }
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; }
|
||||||
@@ -33,13 +34,7 @@ body { overflow-y: scroll; }
|
|||||||
.jasmine_html-reporter .jasmine-bar.jasmine-passed { background-color: #007069; }
|
.jasmine_html-reporter .jasmine-bar.jasmine-passed { background-color: #007069; }
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-incomplete { background-color: #bababa; }
|
.jasmine_html-reporter .jasmine-bar.jasmine-incomplete { background-color: #bababa; }
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-skipped { background-color: #bababa; }
|
.jasmine_html-reporter .jasmine-bar.jasmine-skipped { background-color: #bababa; }
|
||||||
<<<<<<< HEAD
|
|
||||||
||||||| merged common ancestors
|
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-errored { background-color: #ca3a11; }
|
|
||||||
=======
|
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-errored { background-color: #ca3a11; }
|
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-warning { background-color: #ba9d37; color: #333; }
|
.jasmine_html-reporter .jasmine-bar.jasmine-warning { background-color: #ba9d37; color: #333; }
|
||||||
>>>>>>> master
|
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-menu { background-color: #fff; color: #aaa; }
|
.jasmine_html-reporter .jasmine-bar.jasmine-menu { background-color: #fff; color: #aaa; }
|
||||||
.jasmine_html-reporter .jasmine-bar.jasmine-menu a { color: #333; }
|
.jasmine_html-reporter .jasmine-bar.jasmine-menu a { color: #333; }
|
||||||
.jasmine_html-reporter .jasmine-bar a { color: white; }
|
.jasmine_html-reporter .jasmine-bar a { color: white; }
|
||||||
@@ -60,6 +55,6 @@ body { overflow-y: scroll; }
|
|||||||
.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail { margin-bottom: 28px; }
|
.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail { margin-bottom: 28px; }
|
||||||
.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description { background-color: #ca3a11; color: white; }
|
.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description { background-color: #ca3a11; color: white; }
|
||||||
.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description a { color: white; }
|
.jasmine_html-reporter .jasmine-failures .jasmine-spec-detail .jasmine-description a { color: white; }
|
||||||
.jasmine_html-reporter .jasmine-result-message { padding-top: 14px; color: #333; white-space: pre; }
|
.jasmine_html-reporter .jasmine-result-message { padding-top: 14px; color: #333; white-space: pre-wrap; }
|
||||||
.jasmine_html-reporter .jasmine-result-message span.jasmine-result { display: block; }
|
.jasmine_html-reporter .jasmine-result-message span.jasmine-result { display: block; }
|
||||||
.jasmine_html-reporter .jasmine-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; }
|
.jasmine_html-reporter .jasmine-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; }
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -23,7 +23,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||||||
module.exports = function(jasmineRequire) {
|
module.exports = function(jasmineRequire) {
|
||||||
var jasmine = jasmineRequire.core(jasmineRequire);
|
var jasmine = jasmineRequire.core(jasmineRequire);
|
||||||
|
|
||||||
var env = jasmine.getEnv();
|
var env = jasmine.getEnv({suppressLoadErrors: true});
|
||||||
|
|
||||||
var jasmineInterface = jasmineRequire.interface(jasmine, env);
|
var jasmineInterface = jasmineRequire.interface(jasmine, env);
|
||||||
|
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../../spec
|
|
||||||
@@ -4,6 +4,6 @@
|
|||||||
#
|
#
|
||||||
module Jasmine
|
module Jasmine
|
||||||
module Core
|
module Core
|
||||||
VERSION = "3.0.0"
|
VERSION = "3.2.1"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "jasmine-core",
|
"name": "jasmine-core",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"version": "3.0.0",
|
"version": "3.2.1",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "https://github.com/jasmine/jasmine.git"
|
"url": "https://github.com/jasmine/jasmine.git"
|
||||||
@@ -26,7 +26,8 @@
|
|||||||
"grunt-contrib-compress": "^1.3.0",
|
"grunt-contrib-compress": "^1.3.0",
|
||||||
"grunt-contrib-concat": "^1.0.1",
|
"grunt-contrib-concat": "^1.0.1",
|
||||||
"grunt-contrib-jshint": "^1.0.0",
|
"grunt-contrib-jshint": "^1.0.0",
|
||||||
"jasmine": "^2.5.0",
|
"jasmine": "^3.0.0",
|
||||||
|
"jsdom": "^9.12.0",
|
||||||
"load-grunt-tasks": "^0.4.0",
|
"load-grunt-tasks": "^0.4.0",
|
||||||
"shelljs": "^0.7.0",
|
"shelljs": "^0.7.0",
|
||||||
"temp": "~0.8.1"
|
"temp": "~0.8.1"
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ There is also a 2.99 release of Jasmine that will present deprecation warnings f
|
|||||||
|
|
||||||
* Replace old "catch exceptions" logic with proper fail fast with error reporting
|
* Replace old "catch exceptions" logic with proper fail fast with error reporting
|
||||||
- Fixes [#414](https://github.com/jasmine/jasmine/issues/414)
|
- Fixes [#414](https://github.com/jasmine/jasmine/issues/414)
|
||||||
- Fixes [jasmine/jasmine-npm#16](https://github.com/jasmine/jasmine/jasmine-npm/issues/16)
|
- Fixes [jasmine/jasmine-npm#16](https://github.com/jasmine/jasmine-npm/issues/16)
|
||||||
|
|
||||||
* Detect an Error passed to `done` and add an expectation failure
|
* Detect an Error passed to `done` and add an expectation failure
|
||||||
- Fixes [#567](https://github.com/jasmine/jasmine/issues/567)
|
- Fixes [#567](https://github.com/jasmine/jasmine/issues/567)
|
||||||
@@ -29,6 +29,13 @@ There is also a 2.99 release of Jasmine that will present deprecation warnings f
|
|||||||
|
|
||||||
* Default to running tests in random order
|
* Default to running tests in random order
|
||||||
|
|
||||||
|
* Additionally, Jasmine 3.0 drops support for older browsers and environments. Notably:
|
||||||
|
- Internet Explorer 8 and 9
|
||||||
|
- Ruby 1.x (for the Ruby gem)
|
||||||
|
- Rails 3.x (for the Ruby gem)
|
||||||
|
- Python 2.x (for the Python wheel)
|
||||||
|
- Nodejs 0.x (for the NPM package)
|
||||||
|
|
||||||
## Changes
|
## Changes
|
||||||
|
|
||||||
* Remove node modules from python wheel, and update languages
|
* Remove node modules from python wheel, and update languages
|
||||||
|
|||||||
54
release_notes/3.1.0.md
Normal file
54
release_notes/3.1.0.md
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# Jasmine-Core 3.1 Release Notes
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
This release contains a number of fixes and pull requests
|
||||||
|
|
||||||
|
## Pull Requests and Issues
|
||||||
|
|
||||||
|
* Display error properties for failed specs
|
||||||
|
- Merges [#1516](https://github.com/jasmine/jasmine/issues/1516) from @jbunton-atlassian
|
||||||
|
|
||||||
|
* Allow node to report load time errors
|
||||||
|
- Fixes [#1519](https://github.com/jasmine/jasmine/issues/1519)
|
||||||
|
|
||||||
|
* Fixing missing semi-colons
|
||||||
|
- Merges [#1512](https://github.com/jasmine/jasmine/issues/1512) from @Sylhare
|
||||||
|
|
||||||
|
* Fixed release notes link
|
||||||
|
|
||||||
|
* Added matchers: truthy, falsy, empty and notEmpty
|
||||||
|
- Merges [#1460](https://github.com/jasmine/jasmine/issues/1460) from @sjolicoeur
|
||||||
|
|
||||||
|
* Add API docs for async reporters
|
||||||
|
|
||||||
|
* Return <anonymous> for functions that have no actual words between keyword and (
|
||||||
|
- Also fixes a potential catastrophic backtracking if someone has
|
||||||
|
severely damaged their own `toString` during test execution.
|
||||||
|
|
||||||
|
* Moved toHaveClass matcher into core so that it can be used in Karma
|
||||||
|
- Fixes [#1503](https://github.com/jasmine/jasmine/issues/1503)
|
||||||
|
|
||||||
|
* allow adding a deprecation object
|
||||||
|
- Merges [#1498](https://github.com/jasmine/jasmine/issues/1498) from @UziTech
|
||||||
|
|
||||||
|
* Add CodeTriage badge to jasmine/jasmine
|
||||||
|
- Merges [#1505](https://github.com/jasmine/jasmine/issues/1505) from @codetriage-readme-bot
|
||||||
|
|
||||||
|
* Resolve merge conflict
|
||||||
|
- Merges [#1501](https://github.com/jasmine/jasmine/issues/1501) from @aptx4869
|
||||||
|
- Fixes [#1500](https://github.com/jasmine/jasmine/issues/1500)
|
||||||
|
|
||||||
|
* Fix release note typo
|
||||||
|
- Merges [#1499](https://github.com/jasmine/jasmine/issues/1499) @bcaudan
|
||||||
|
|
||||||
|
* Only show deprecation for catch exceptions if you tell Jasmine not to catch
|
||||||
|
- Fixes [#1497](https://github.com/jasmine/jasmine/issues/1497)
|
||||||
|
|
||||||
|
* Add notes for environments that have lost support
|
||||||
|
- Fixes [#1495](https://github.com/jasmine/jasmine/issues/1495)
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_
|
||||||
83
release_notes/3.2.0.md
Normal file
83
release_notes/3.2.0.md
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
# Jasmine-Core 3.2 Release Notes
|
||||||
|
|
||||||
|
## Summary
|
||||||
|
|
||||||
|
This release contains a number of fixes and pull requests
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
* Add spyOnAllFunctions function
|
||||||
|
- Merges [#1581](https://github.com/jasmine/jasmine/issues/1581) from @aeisenberg
|
||||||
|
- Fixes [#1421](https://github.com/jasmine/jasmine/issues/1421)
|
||||||
|
|
||||||
|
|
||||||
|
* Improve timeout error message
|
||||||
|
- Merges [#1567](https://github.com/jasmine/jasmine/issues/1567) from @ikonst
|
||||||
|
|
||||||
|
|
||||||
|
* Fix JSDoc naming for Env functions
|
||||||
|
- See [#1565](https://github.com/jasmine/jasmine/issues/1565)
|
||||||
|
|
||||||
|
|
||||||
|
* Add documentation for more public functions on Env
|
||||||
|
- Fixes [#1565](https://github.com/jasmine/jasmine/issues/1565)
|
||||||
|
|
||||||
|
|
||||||
|
* Added a basic set of async matchers
|
||||||
|
- Fixes [#1447](https://github.com/jasmine/jasmine/issues/1447)
|
||||||
|
- Fixes [#1547](https://github.com/jasmine/jasmine/issues/1547)
|
||||||
|
|
||||||
|
|
||||||
|
* Properly cascade StopExecutionError's up the tree
|
||||||
|
- Fixes [#1563](https://github.com/jasmine/jasmine/issues/1563)
|
||||||
|
|
||||||
|
|
||||||
|
* Implemented hiding of disabled specs
|
||||||
|
- Merges [#1561](https://github.com/jasmine/jasmine/issues/1561) from @SamFare
|
||||||
|
|
||||||
|
|
||||||
|
* Line-break long expectation failure messages
|
||||||
|
- See [#296](https://github.com/jasmine/jasmine/issues/296)
|
||||||
|
|
||||||
|
|
||||||
|
* Better detection of DOM Nodes for equality
|
||||||
|
- Fixes [#1172](https://github.com/jasmine/jasmine/issues/1172)
|
||||||
|
|
||||||
|
|
||||||
|
* Fix typo from `incimplete` to `incomplete`
|
||||||
|
- Merges [#1555](https://github.com/jasmine/jasmine/issues/1555) from @yinm
|
||||||
|
|
||||||
|
|
||||||
|
* Allow omitting the name argument: `createSpy(func)`
|
||||||
|
- Merges [#1551](https://github.com/jasmine/jasmine/issues/1551) from @riophae
|
||||||
|
|
||||||
|
|
||||||
|
* name new global status stuff correctly in API docs
|
||||||
|
|
||||||
|
|
||||||
|
* Check for accidental global variable creation
|
||||||
|
|
||||||
|
|
||||||
|
* Fixed global variable leak
|
||||||
|
- Fixes [#1534](https://github.com/jasmine/jasmine/issues/1534)
|
||||||
|
|
||||||
|
|
||||||
|
* Correctly format stack traces for errors with multiline messages
|
||||||
|
- Fixes [#1526](https://github.com/jasmine/jasmine/issues/1526)
|
||||||
|
|
||||||
|
|
||||||
|
* Change message for extra elements at end of actual array
|
||||||
|
- Merges [#1527](https://github.com/jasmine/jasmine/issues/1527) from @majidmade
|
||||||
|
- Fixes [#1485](https://github.com/jasmine/jasmine/issues/1485)
|
||||||
|
|
||||||
|
|
||||||
|
* Report unhandled rejections as globalErrors.
|
||||||
|
- Merges [#1521](https://github.com/jasmine/jasmine/issues/1521) from @johnjbarton
|
||||||
|
|
||||||
|
|
||||||
|
* add some links to more tutorials from the api docs
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_
|
||||||
11
release_notes/3.2.1.md
Normal file
11
release_notes/3.2.1.md
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
# Jasmine-Core 3.2.1 Release Notes
|
||||||
|
|
||||||
|
## Changes
|
||||||
|
|
||||||
|
* Correctly expose `spyOnAllFunctions`
|
||||||
|
- See [#1581](https://github.com/jasmine/jasmine/issues/1581)
|
||||||
|
|
||||||
|
|
||||||
|
------
|
||||||
|
|
||||||
|
_Release Notes generated with _[Anchorman](http://github.com/infews/anchorman)_
|
||||||
288
spec/core/AsyncExpectationSpec.js
Normal file
288
spec/core/AsyncExpectationSpec.js
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
describe('AsyncExpectation', function() {
|
||||||
|
describe('Factory', function() {
|
||||||
|
it('throws an Error if promises are not available', function() {
|
||||||
|
var thenable = {then: function() {}},
|
||||||
|
options = {global: {}, actual: thenable}
|
||||||
|
function f() { jasmineUnderTest.AsyncExpectation.factory(options); }
|
||||||
|
expect(f).toThrowError('expectAsync is unavailable because the environment does not support promises.');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('throws an Error if the argument is not a promise', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
function f() {
|
||||||
|
jasmineUnderTest.AsyncExpectation.factory({actual: 'not a promise'});
|
||||||
|
}
|
||||||
|
expect(f).toThrowError('Expected expectAsync to be called with a promise.');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#toBeResolved', function() {
|
||||||
|
it('passes if the actual is resolved', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = Promise.resolve(),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolved().then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(true, {
|
||||||
|
matcherName: 'toBeResolved',
|
||||||
|
passed: true,
|
||||||
|
message: '',
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('fails if the actual is rejected', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = Promise.reject('AsyncExpectationSpec rejection'),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolved().then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(false, {
|
||||||
|
matcherName: 'toBeResolved',
|
||||||
|
passed: false,
|
||||||
|
message: 'Expected a promise to be resolved.',
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#toBeRejected', function() {
|
||||||
|
it('passes if the actual is rejected', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = Promise.reject('AsyncExpectationSpec rejection'),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeRejected().then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(true, {
|
||||||
|
matcherName: 'toBeRejected',
|
||||||
|
passed: true,
|
||||||
|
message: '',
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('fails if the actual is resolved', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = Promise.resolve(),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeRejected().then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(false, {
|
||||||
|
matcherName: 'toBeRejected',
|
||||||
|
passed: false,
|
||||||
|
message: 'Expected a promise to be rejected.',
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#toBeResolvedTo', function() {
|
||||||
|
it('passes if the promise is resolved to the expected value', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var actual = Promise.resolve({foo: 42});
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolvedTo({foo: 42}).then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(true, {
|
||||||
|
matcherName: 'toBeResolvedTo',
|
||||||
|
passed: true,
|
||||||
|
message: '',
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('fails if the promise is rejected', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var actual = Promise.reject('AsyncExpectationSpec error');
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolvedTo('').then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(false, {
|
||||||
|
matcherName: 'toBeResolvedTo',
|
||||||
|
passed: false,
|
||||||
|
message: "Expected a promise to be resolved to '' but it was rejected.",
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('fails if the promise is resolved to a different value', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var actual = Promise.resolve({foo: 17});
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolvedTo({foo: 42}).then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(false, {
|
||||||
|
matcherName: 'toBeResolvedTo',
|
||||||
|
passed: false,
|
||||||
|
message: 'Expected a promise to be resolved to Object({ foo: 42 }) but it was resolved to Object({ foo: 17 }).',
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: jasmine.any(Error),
|
||||||
|
actual: actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('builds its message correctly when negated', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
expectation = jasmineUnderTest.AsyncExpectation.factory({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: Promise.resolve(true),
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.not.toBeResolvedTo(true).then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(false,
|
||||||
|
jasmine.objectContaining({
|
||||||
|
passed: false,
|
||||||
|
message: 'Expected a promise not to be resolved to true.'
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('supports custom equality testers', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
customEqualityTesters: [function() { return true; }],
|
||||||
|
actual: Promise.resolve('actual'),
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolvedTo('expected').then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(true,
|
||||||
|
jasmine.objectContaining({passed: true}));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('#not', function() {
|
||||||
|
it('converts a pass to a fail', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = Promise.resolve(),
|
||||||
|
expectation = jasmineUnderTest.AsyncExpectation.factory({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.not.toBeResolved().then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(false,
|
||||||
|
jasmine.objectContaining({
|
||||||
|
passed: false,
|
||||||
|
message: 'Expected a promise not to be resolved.'
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('converts a fail to a pass', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = Promise.reject(),
|
||||||
|
expectation = jasmineUnderTest.AsyncExpectation.factory({
|
||||||
|
util: jasmineUnderTest.matchersUtil,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.not.toBeResolved().then(function() {
|
||||||
|
expect(addExpectationResult).toHaveBeenCalledWith(true,
|
||||||
|
jasmine.objectContaining({
|
||||||
|
passed: true,
|
||||||
|
message: ''
|
||||||
|
})
|
||||||
|
);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('propagates rejections from the comparison function', function() {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
var error = new Error('AsyncExpectationSpec failure');
|
||||||
|
|
||||||
|
spyOn(jasmineUnderTest.AsyncExpectation.prototype, 'toBeResolved')
|
||||||
|
.and.returnValue(Promise.reject(error));
|
||||||
|
|
||||||
|
var addExpectationResult = jasmine.createSpy('addExpectationResult'),
|
||||||
|
actual = dummyPromise(),
|
||||||
|
expectation = new jasmineUnderTest.AsyncExpectation({
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
return expectation.toBeResolved()
|
||||||
|
.then(
|
||||||
|
function() { fail('Expected a rejection'); },
|
||||||
|
function(e) { expect(e).toBe(error); }
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
function dummyPromise() {
|
||||||
|
return new Promise(function(resolve, reject) {
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -669,7 +669,7 @@ describe("Clock (acceptance)", function() {
|
|||||||
expect(global.Date().getTime()).toEqual(baseTime.getTime() + 5);
|
expect(global.Date().getTime()).toEqual(baseTime.getTime() + 5);
|
||||||
|
|
||||||
expect(actualTimes).toEqual([baseTime.getTime(), baseTime.getTime() + 1, baseTime.getTime() + 3]);
|
expect(actualTimes).toEqual([baseTime.getTime(), baseTime.getTime() + 1, baseTime.getTime() + 3]);
|
||||||
})
|
});
|
||||||
|
|
||||||
it('correctly clears a scheduled timeout while the Clock is advancing', function () {
|
it('correctly clears a scheduled timeout while the Clock is advancing', function () {
|
||||||
var delayedFunctionScheduler = new jasmineUnderTest.DelayedFunctionScheduler(),
|
var delayedFunctionScheduler = new jasmineUnderTest.DelayedFunctionScheduler(),
|
||||||
|
|||||||
@@ -197,4 +197,24 @@ describe("Env", function() {
|
|||||||
}).not.toThrow();
|
}).not.toThrow();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('when not constructed with suppressLoadErrors: true', function() {
|
||||||
|
it('installs a global error handler on construction', function() {
|
||||||
|
var globalErrors = jasmine.createSpyObj('globalErrors', ['install', 'pushListener', 'popListener']);
|
||||||
|
spyOn(jasmineUnderTest, 'GlobalErrors').and.returnValue(globalErrors);
|
||||||
|
new jasmineUnderTest.Env();
|
||||||
|
expect(globalErrors.install).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('when constructed with suppressLoadErrors: true', function() {
|
||||||
|
it('does not install a global error handler until execute is called', function() {
|
||||||
|
var globalErrors = jasmine.createSpyObj('globalErrors', ['install', 'pushListener', 'popListener']);
|
||||||
|
spyOn(jasmineUnderTest, 'GlobalErrors').and.returnValue(globalErrors);
|
||||||
|
env = new jasmineUnderTest.Env({suppressLoadErrors: true});
|
||||||
|
expect(globalErrors.install).not.toHaveBeenCalled();
|
||||||
|
env.execute();
|
||||||
|
expect(globalErrors.install).toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ describe("ExceptionFormatter", function() {
|
|||||||
|
|
||||||
it("filters Jasmine stack frames from V8 style traces", function() {
|
it("filters Jasmine stack frames from V8 style traces", function() {
|
||||||
var error = {
|
var error = {
|
||||||
|
message: 'nope',
|
||||||
stack: 'Error: nope\n' +
|
stack: 'Error: nope\n' +
|
||||||
' at fn1 (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
' at fn1 (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
||||||
' at fn2 (http://localhost:8888/__jasmine__/jasmine.js:4320:20)\n' +
|
' at fn2 (http://localhost:8888/__jasmine__/jasmine.js:4320:20)\n' +
|
||||||
@@ -113,8 +114,38 @@ describe("ExceptionFormatter", function() {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("handles multiline error messages in this environment", function() {
|
||||||
|
var error, i, msg = "an error\nwith two lines";
|
||||||
|
try { throw new Error(msg); } catch(e) { error = e; }
|
||||||
|
|
||||||
|
if (error.stack.indexOf(msg) === -1) {
|
||||||
|
pending("Stack traces don't have messages in this environment");
|
||||||
|
}
|
||||||
|
var subject = new jasmineUnderTest.ExceptionFormatter({
|
||||||
|
jasmineFile: jasmine.util.jasmineFile()
|
||||||
|
});
|
||||||
|
var result = subject.stack(error);
|
||||||
|
var lines = result.split('\n');
|
||||||
|
|
||||||
|
expect(lines[0]).toMatch(/an error/);
|
||||||
|
expect(lines[1]).toMatch(/with two lines/);
|
||||||
|
expect(lines[2]).toMatch(/ExceptionFormatterSpec.js/);
|
||||||
|
expect(lines[3]).toMatch(/<Jasmine>/);
|
||||||
|
});
|
||||||
|
|
||||||
it("returns null if no Error provided", function() {
|
it("returns null if no Error provided", function() {
|
||||||
expect(new jasmineUnderTest.ExceptionFormatter().stack()).toBeNull();
|
expect(new jasmineUnderTest.ExceptionFormatter().stack()).toBeNull();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("includes error properties in stack", function() {
|
||||||
|
var error;
|
||||||
|
try { throw new Error("an error") } catch(e) { error = e; }
|
||||||
|
error.someProperty = 'hello there';
|
||||||
|
|
||||||
|
var result = new jasmineUnderTest.ExceptionFormatter().stack(error);
|
||||||
|
|
||||||
|
expect(result).toMatch(/error properties:.*someProperty.*hello there/);
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -44,6 +44,21 @@ describe("buildExpectationResult", function() {
|
|||||||
expect(result.stack).toEqual('foo');
|
expect(result.stack).toEqual('foo');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("delegates stack formatting to the provided formatter if there was a provided errorForStack", function() {
|
||||||
|
var fakeError = {stack: 'foo'},
|
||||||
|
stackFormatter = jasmine.createSpy("stack formatter").and.returnValue(fakeError.stack);
|
||||||
|
|
||||||
|
var result = jasmineUnderTest.buildExpectationResult(
|
||||||
|
{
|
||||||
|
passed: false,
|
||||||
|
errorForStack: fakeError,
|
||||||
|
stackFormatter: stackFormatter
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(stackFormatter).toHaveBeenCalledWith(fakeError);
|
||||||
|
expect(result.stack).toEqual('foo');
|
||||||
|
});
|
||||||
|
|
||||||
it("matcherName returns passed matcherName", function() {
|
it("matcherName returns passed matcherName", function() {
|
||||||
var result = jasmineUnderTest.buildExpectationResult({matcherName: 'some-value'});
|
var result = jasmineUnderTest.buildExpectationResult({matcherName: 'some-value'});
|
||||||
expect(result.matcherName).toBe('some-value');
|
expect(result.matcherName).toBe('some-value');
|
||||||
|
|||||||
@@ -78,7 +78,7 @@ describe("GlobalErrors", function() {
|
|||||||
errors.uninstall();
|
errors.uninstall();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("works in node.js", function() {
|
it("reports uncaughtException in node.js", function() {
|
||||||
var fakeGlobal = {
|
var fakeGlobal = {
|
||||||
process: {
|
process: {
|
||||||
on: jasmine.createSpy('process.on'),
|
on: jasmine.createSpy('process.on'),
|
||||||
@@ -107,4 +107,34 @@ describe("GlobalErrors", function() {
|
|||||||
expect(fakeGlobal.process.removeListener).toHaveBeenCalledWith('uncaughtException', addedListener);
|
expect(fakeGlobal.process.removeListener).toHaveBeenCalledWith('uncaughtException', addedListener);
|
||||||
expect(fakeGlobal.process.on).toHaveBeenCalledWith('uncaughtException', 'foo');
|
expect(fakeGlobal.process.on).toHaveBeenCalledWith('uncaughtException', 'foo');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("reports unhandledRejection in node.js", function() {
|
||||||
|
var fakeGlobal = {
|
||||||
|
process: {
|
||||||
|
on: jasmine.createSpy('process.on'),
|
||||||
|
removeListener: jasmine.createSpy('process.removeListener'),
|
||||||
|
listeners: jasmine.createSpy('process.listeners').and.returnValue(['foo']),
|
||||||
|
removeAllListeners: jasmine.createSpy('process.removeAllListeners')
|
||||||
|
}
|
||||||
|
},
|
||||||
|
handler = jasmine.createSpy('errorHandler'),
|
||||||
|
errors = new jasmineUnderTest.GlobalErrors(fakeGlobal);
|
||||||
|
|
||||||
|
errors.install();
|
||||||
|
expect(fakeGlobal.process.on).toHaveBeenCalledWith('unhandledRejection', jasmine.any(Function));
|
||||||
|
expect(fakeGlobal.process.listeners).toHaveBeenCalledWith('unhandledRejection');
|
||||||
|
expect(fakeGlobal.process.removeAllListeners).toHaveBeenCalledWith('unhandledRejection');
|
||||||
|
|
||||||
|
errors.pushListener(handler);
|
||||||
|
|
||||||
|
var addedListener = fakeGlobal.process.on.calls.argsFor(0)[1];
|
||||||
|
addedListener(new Error('bar'));
|
||||||
|
|
||||||
|
expect(handler).toHaveBeenCalledWith(new Error('bar'));
|
||||||
|
|
||||||
|
errors.uninstall();
|
||||||
|
|
||||||
|
expect(fakeGlobal.process.removeListener).toHaveBeenCalledWith('unhandledRejection', addedListener);
|
||||||
|
expect(fakeGlobal.process.on).toHaveBeenCalledWith('unhandledRejection', 'foo');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -183,7 +183,7 @@ describe("QueueRunner", function() {
|
|||||||
|
|
||||||
it("sets a timeout if requested for asynchronous functions so they don't go on forever", function() {
|
it("sets a timeout if requested for asynchronous functions so they don't go on forever", function() {
|
||||||
var timeout = 3,
|
var timeout = 3,
|
||||||
beforeFn = { fn: function(done) { }, type: 'before', timeout: function() { return timeout; } },
|
beforeFn = { fn: function(done) { }, type: 'before', timeout: timeout },
|
||||||
queueableFn = { fn: jasmine.createSpy('fn'), type: 'queueable' },
|
queueableFn = { fn: jasmine.createSpy('fn'), type: 'queueable' },
|
||||||
onComplete = jasmine.createSpy('onComplete'),
|
onComplete = jasmine.createSpy('onComplete'),
|
||||||
onException = jasmine.createSpy('onException'),
|
onException = jasmine.createSpy('onException'),
|
||||||
@@ -304,7 +304,7 @@ describe("QueueRunner", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("continues running functions when an exception is thrown in async code without timing out", function() {
|
it("continues running functions when an exception is thrown in async code without timing out", function() {
|
||||||
var queueableFn = { fn: function(done) { throwAsync(); }, timeout: function() { return 1; } },
|
var queueableFn = { fn: function(done) { throwAsync(); }, timeout: 1 },
|
||||||
nextQueueableFn = { fn: jasmine.createSpy("nextFunction") },
|
nextQueueableFn = { fn: jasmine.createSpy("nextFunction") },
|
||||||
onException = jasmine.createSpy('onException'),
|
onException = jasmine.createSpy('onException'),
|
||||||
globalErrors = { pushListener: jasmine.createSpy('pushListener'), popListener: jasmine.createSpy('popListener') },
|
globalErrors = { pushListener: jasmine.createSpy('pushListener'), popListener: jasmine.createSpy('popListener') },
|
||||||
@@ -481,15 +481,18 @@ describe("QueueRunner", function() {
|
|||||||
var queueableFn = { fn: function() { throw new Error("error"); } },
|
var queueableFn = { fn: function() { throw new Error("error"); } },
|
||||||
nextQueueableFn = { fn: jasmine.createSpy("nextFunction") },
|
nextQueueableFn = { fn: jasmine.createSpy("nextFunction") },
|
||||||
cleanupFn = { fn: jasmine.createSpy("cleanup") },
|
cleanupFn = { fn: jasmine.createSpy("cleanup") },
|
||||||
|
onComplete = jasmine.createSpy("onComplete"),
|
||||||
queueRunner = new jasmineUnderTest.QueueRunner({
|
queueRunner = new jasmineUnderTest.QueueRunner({
|
||||||
queueableFns: [queueableFn, nextQueueableFn],
|
queueableFns: [queueableFn, nextQueueableFn],
|
||||||
cleanupFns: [cleanupFn],
|
cleanupFns: [cleanupFn],
|
||||||
|
onComplete: onComplete,
|
||||||
completeOnFirstError: true
|
completeOnFirstError: true
|
||||||
});
|
});
|
||||||
|
|
||||||
queueRunner.execute();
|
queueRunner.execute();
|
||||||
expect(nextQueueableFn.fn).not.toHaveBeenCalled();
|
expect(nextQueueableFn.fn).not.toHaveBeenCalled();
|
||||||
expect(cleanupFn.fn).toHaveBeenCalled();
|
expect(cleanupFn.fn).toHaveBeenCalled();
|
||||||
|
expect(onComplete).toHaveBeenCalledWith(jasmine.any(jasmineUnderTest.StopExecutionError));
|
||||||
});
|
});
|
||||||
|
|
||||||
it("does not skip when a cleanup function throws", function() {
|
it("does not skip when a cleanup function throws", function() {
|
||||||
|
|||||||
@@ -214,6 +214,97 @@ describe("SpyRegistry", function() {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("#spyOnAllFunctions", function() {
|
||||||
|
it("checks for the existence of the object", function() {
|
||||||
|
var spyRegistry = new jasmineUnderTest.SpyRegistry();
|
||||||
|
expect(function() {
|
||||||
|
spyRegistry.spyOnAllFunctions(void 0);
|
||||||
|
}).toThrowError(/spyOnAllFunctions could not find an object to spy upon/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("overrides all writable and configurable functions of the object", function() {
|
||||||
|
var spyRegistry = new jasmineUnderTest.SpyRegistry({createSpy: function() {
|
||||||
|
return 'I am a spy';
|
||||||
|
}});
|
||||||
|
var createNoop = function() { return function() { /**/}; };
|
||||||
|
var noop1 = createNoop();
|
||||||
|
var noop2 = createNoop();
|
||||||
|
var noop3 = createNoop();
|
||||||
|
var noop4 = createNoop();
|
||||||
|
var noop5 = createNoop();
|
||||||
|
|
||||||
|
var parent = {
|
||||||
|
notSpied1: noop1
|
||||||
|
};
|
||||||
|
var subject = Object.create(parent);
|
||||||
|
Object.defineProperty(subject, 'spied1', {
|
||||||
|
value: noop1,
|
||||||
|
writable: true,
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
Object.defineProperty(subject, 'spied2', {
|
||||||
|
value: noop2,
|
||||||
|
writable: true,
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
var _spied3 = noop3;
|
||||||
|
Object.defineProperty(subject, 'spied3', {
|
||||||
|
configurable: true,
|
||||||
|
set: function (val) {
|
||||||
|
_spied3 = val;
|
||||||
|
},
|
||||||
|
get: function() {
|
||||||
|
return _spied3;
|
||||||
|
},
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
subject.spied4 = noop4;
|
||||||
|
Object.defineProperty(subject, 'notSpied2', {
|
||||||
|
value: noop2,
|
||||||
|
writable: false,
|
||||||
|
configurable: true,
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
Object.defineProperty(subject, 'notSpied3', {
|
||||||
|
value: noop3,
|
||||||
|
writable: true,
|
||||||
|
configurable: false,
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
Object.defineProperty(subject, 'notSpied4', {
|
||||||
|
configurable: false,
|
||||||
|
set: function(val) { /**/ },
|
||||||
|
get: function() {
|
||||||
|
return noop4;
|
||||||
|
},
|
||||||
|
enumerable: true
|
||||||
|
});
|
||||||
|
Object.defineProperty(subject, 'notSpied5', {
|
||||||
|
value: noop5,
|
||||||
|
writable: true,
|
||||||
|
configurable: true,
|
||||||
|
enumerable: false
|
||||||
|
});
|
||||||
|
subject.notSpied6 = 6;
|
||||||
|
|
||||||
|
var spiedObject = spyRegistry.spyOnAllFunctions(subject);
|
||||||
|
|
||||||
|
expect(subject.notSpied1).toBe(noop1);
|
||||||
|
expect(subject.notSpied2).toBe(noop2);
|
||||||
|
expect(subject.notSpied3).toBe(noop3);
|
||||||
|
expect(subject.notSpied4).toBe(noop4);
|
||||||
|
expect(subject.notSpied5).toBe(noop5);
|
||||||
|
expect(subject.notSpied6).toBe(6);
|
||||||
|
expect(subject.spied1).toBe('I am a spy');
|
||||||
|
expect(subject.spied2).toBe('I am a spy');
|
||||||
|
expect(subject.spied3).toBe('I am a spy');
|
||||||
|
expect(subject.spied4).toBe('I am a spy');
|
||||||
|
expect(spiedObject).toBe(subject);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
describe("#clearSpies", function() {
|
describe("#clearSpies", function() {
|
||||||
it("restores the original functions on the spied-upon objects", function() {
|
it("restores the original functions on the spied-upon objects", function() {
|
||||||
var spies = [],
|
var spies = [],
|
||||||
|
|||||||
@@ -20,6 +20,18 @@ describe('Spies', function () {
|
|||||||
expect(spy.bob).toEqual("test");
|
expect(spy.bob).toEqual("test");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should allow you to omit the name argument and only pass the originalFn argument", function() {
|
||||||
|
var fn = function test() {};
|
||||||
|
var spy = env.createSpy(fn);
|
||||||
|
|
||||||
|
// IE doesn't do `.name`
|
||||||
|
if (fn.name === "test") {
|
||||||
|
expect(spy.and.identity).toEqual("test");
|
||||||
|
} else {
|
||||||
|
expect(spy.and.identity).toEqual("unknown");
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
it("warns the user that we intend to overwrite an existing property", function() {
|
it("warns the user that we intend to overwrite an existing property", function() {
|
||||||
TestClass.prototype.someFunction.and = "turkey";
|
TestClass.prototype.someFunction.and = "turkey";
|
||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,14 @@
|
|||||||
describe("StackTrace", function() {
|
describe("StackTrace", function() {
|
||||||
it("understands Chrome/IE/Edge style traces", function() {
|
it("understands Chrome/IE/Edge style traces", function() {
|
||||||
var raw =
|
var error = {
|
||||||
'Error: nope\n' +
|
message: 'nope',
|
||||||
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
stack:
|
||||||
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)';
|
'Error: nope\n' +
|
||||||
|
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
||||||
|
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)'
|
||||||
|
};
|
||||||
|
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
|
|
||||||
expect(result.message).toEqual('Error: nope');
|
expect(result.message).toEqual('Error: nope');
|
||||||
expect(result.style).toEqual('v8');
|
expect(result.style).toEqual('v8');
|
||||||
@@ -25,13 +28,36 @@ describe("StackTrace", function() {
|
|||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("understands Chrome/IE/Edge style traces with multiline messages", function() {
|
||||||
|
var error = {
|
||||||
|
message: 'line 1\nline 2',
|
||||||
|
stack:
|
||||||
|
'Error: line 1\nline 2\n' +
|
||||||
|
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
||||||
|
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)'
|
||||||
|
};
|
||||||
|
|
||||||
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
|
|
||||||
|
expect(result.message).toEqual('Error: line 1\nline 2');
|
||||||
|
var rawFrames = result.frames.map(function(f) { return f.raw; });
|
||||||
|
expect(rawFrames).toEqual([
|
||||||
|
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)',
|
||||||
|
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)',
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
||||||
it("understands Node style traces", function() {
|
it("understands Node style traces", function() {
|
||||||
var raw = 'Error\n' +
|
var error = {
|
||||||
' at /somewhere/jasmine/lib/jasmine-core/jasmine.js:4255:9\n' +
|
message: 'nope',
|
||||||
' at QueueRunner.complete [as onComplete] (/somewhere/jasmine/lib/jasmine-core/jasmine.js:579:9)\n' +
|
stack:
|
||||||
' at Immediate.<anonymous> (/somewhere/jasmine/lib/jasmine-core/jasmine.js:4314:12)\n' +
|
'Error\n' +
|
||||||
' at runCallback (timers.js:672:20)';
|
' at /somewhere/jasmine/lib/jasmine-core/jasmine.js:4255:9\n' +
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
' at QueueRunner.complete [as onComplete] (/somewhere/jasmine/lib/jasmine-core/jasmine.js:579:9)\n' +
|
||||||
|
' at Immediate.<anonymous> (/somewhere/jasmine/lib/jasmine-core/jasmine.js:4314:12)\n' +
|
||||||
|
' at runCallback (timers.js:672:20)'
|
||||||
|
};
|
||||||
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
|
|
||||||
expect(result.message).toEqual('Error');
|
expect(result.message).toEqual('Error');
|
||||||
expect(result.style).toEqual('v8');
|
expect(result.style).toEqual('v8');
|
||||||
@@ -64,10 +90,13 @@ describe("StackTrace", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("understands Safari/Firefox/Phantom-OS X style traces", function() {
|
it("understands Safari/Firefox/Phantom-OS X style traces", function() {
|
||||||
var raw =
|
var error = {
|
||||||
'http://localhost:8888/__spec__/core/UtilSpec.js:115:28\n' +
|
message: 'nope',
|
||||||
'run@http://localhost:8888/__jasmine__/jasmine.js:4320:27';
|
stack:
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
'http://localhost:8888/__spec__/core/UtilSpec.js:115:28\n' +
|
||||||
|
'run@http://localhost:8888/__jasmine__/jasmine.js:4320:27'
|
||||||
|
};
|
||||||
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
|
|
||||||
expect(result.message).toBeFalsy();
|
expect(result.message).toBeFalsy();
|
||||||
expect(result.style).toEqual('webkit');
|
expect(result.style).toEqual('webkit');
|
||||||
@@ -88,20 +117,26 @@ describe("StackTrace", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("does not mistake gibberish for Safari/Firefox/Phantom-OS X style traces", function() {
|
it("does not mistake gibberish for Safari/Firefox/Phantom-OS X style traces", function() {
|
||||||
var raw = 'randomcharsnotincludingwhitespace';
|
var error = {
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
message: 'nope',
|
||||||
|
stack: 'randomcharsnotincludingwhitespace'
|
||||||
|
};
|
||||||
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
expect(result.style).toBeNull();
|
expect(result.style).toBeNull();
|
||||||
expect(result.frames).toEqual([
|
expect(result.frames).toEqual([
|
||||||
{ raw: raw }
|
{ raw: error.stack }
|
||||||
]);
|
]);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("understands Phantom-Linux style traces", function() {
|
it("understands Phantom-Linux style traces", function() {
|
||||||
var raw =
|
var error = {
|
||||||
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
message: 'nope',
|
||||||
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)';
|
stack:
|
||||||
|
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
||||||
|
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)'
|
||||||
|
};
|
||||||
|
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
|
|
||||||
expect(result.message).toBeFalsy();
|
expect(result.message).toBeFalsy();
|
||||||
expect(result.style).toEqual('v8');
|
expect(result.style).toEqual('v8');
|
||||||
@@ -122,10 +157,13 @@ describe("StackTrace", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("ignores blank lines", function() {
|
it("ignores blank lines", function() {
|
||||||
var raw =
|
var error = {
|
||||||
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n';
|
message: 'nope',
|
||||||
|
stack:
|
||||||
|
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n'
|
||||||
|
};
|
||||||
|
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
|
|
||||||
expect(result.frames).toEqual([
|
expect(result.frames).toEqual([
|
||||||
{
|
{
|
||||||
@@ -138,12 +176,15 @@ describe("StackTrace", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("omits properties except 'raw' for frames that are not understood", function() {
|
it("omits properties except 'raw' for frames that are not understood", function() {
|
||||||
var raw =
|
var error = {
|
||||||
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
message: 'nope',
|
||||||
' but this is quite unexpected\n' +
|
stack:
|
||||||
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)';
|
' at UserContext.<anonymous> (http://localhost:8888/__spec__/core/UtilSpec.js:115:19)\n' +
|
||||||
|
' but this is quite unexpected\n' +
|
||||||
|
' at QueueRunner.run (http://localhost:8888/__jasmine__/jasmine.js:4320:20)'
|
||||||
|
};
|
||||||
|
|
||||||
var result = new jasmineUnderTest.StackTrace(raw);
|
var result = new jasmineUnderTest.StackTrace(error);
|
||||||
expect(result.style).toEqual('v8');
|
expect(result.style).toEqual('v8');
|
||||||
expect(result.frames).toEqual([
|
expect(result.frames).toEqual([
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -297,7 +297,7 @@ describe("TreeProcessor", function() {
|
|||||||
node.getResult.and.returnValue({ my: 'result' });
|
node.getResult.and.returnValue({ my: 'result' });
|
||||||
|
|
||||||
queueRunner.calls.mostRecent().args[0].onComplete();
|
queueRunner.calls.mostRecent().args[0].onComplete();
|
||||||
expect(nodeComplete).toHaveBeenCalledWith(node, { my: 'result' }, nodeDone);
|
expect(nodeComplete).toHaveBeenCalledWith(node, { my: 'result' }, jasmine.any(Function));
|
||||||
});
|
});
|
||||||
|
|
||||||
it("runs a node with children", function() {
|
it("runs a node with children", function() {
|
||||||
@@ -328,6 +328,37 @@ describe("TreeProcessor", function() {
|
|||||||
expect(leaf2.execute).toHaveBeenCalledWith('bar', false);
|
expect(leaf2.execute).toHaveBeenCalledWith('bar', false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("cascades errors up the tree", function() {
|
||||||
|
var leaf = new Leaf(),
|
||||||
|
node = new Node({ children: [leaf] }),
|
||||||
|
root = new Node({ children: [node] }),
|
||||||
|
queueRunner = jasmine.createSpy('queueRunner'),
|
||||||
|
nodeComplete = jasmine.createSpy('nodeComplete'),
|
||||||
|
processor = new jasmineUnderTest.TreeProcessor({
|
||||||
|
tree: root,
|
||||||
|
runnableIds: [node.id],
|
||||||
|
nodeComplete: nodeComplete,
|
||||||
|
queueRunnerFactory: queueRunner
|
||||||
|
}),
|
||||||
|
treeComplete = jasmine.createSpy('treeComplete'),
|
||||||
|
nodeDone = jasmine.createSpy('nodeDone');
|
||||||
|
|
||||||
|
processor.execute(treeComplete);
|
||||||
|
var queueableFns = queueRunner.calls.mostRecent().args[0].queueableFns;
|
||||||
|
queueableFns[0].fn(nodeDone);
|
||||||
|
|
||||||
|
queueableFns = queueRunner.calls.mostRecent().args[0].queueableFns;
|
||||||
|
expect(queueableFns.length).toBe(2);
|
||||||
|
|
||||||
|
queueableFns[1].fn('foo');
|
||||||
|
expect(leaf.execute).toHaveBeenCalledWith('foo', false);
|
||||||
|
|
||||||
|
queueRunner.calls.mostRecent().args[0].onComplete('things');
|
||||||
|
expect(nodeComplete).toHaveBeenCalled();
|
||||||
|
nodeComplete.calls.mostRecent().args[2]();
|
||||||
|
expect(nodeDone).toHaveBeenCalledWith('things');
|
||||||
|
});
|
||||||
|
|
||||||
it("runs an excluded node with leaf", function() {
|
it("runs an excluded node with leaf", function() {
|
||||||
var leaf1 = new Leaf(),
|
var leaf1 = new Leaf(),
|
||||||
node = new Node({ children: [leaf1] }),
|
node = new Node({ children: [leaf1] }),
|
||||||
@@ -361,7 +392,7 @@ describe("TreeProcessor", function() {
|
|||||||
node.getResult.and.returnValue({ im: 'disabled' });
|
node.getResult.and.returnValue({ im: 'disabled' });
|
||||||
|
|
||||||
queueRunner.calls.mostRecent().args[0].onComplete();
|
queueRunner.calls.mostRecent().args[0].onComplete();
|
||||||
expect(nodeComplete).toHaveBeenCalledWith(node, { im: 'disabled' }, nodeDone);
|
expect(nodeComplete).toHaveBeenCalledWith(node, { im: 'disabled' }, jasmine.any(Function));
|
||||||
});
|
});
|
||||||
|
|
||||||
it("runs beforeAlls for a node with children", function() {
|
it("runs beforeAlls for a node with children", function() {
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ describe("UserContext", function() {
|
|||||||
describe('when using a regular object as parameter', function() {
|
describe('when using a regular object as parameter', function() {
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
this.context = {};
|
this.context = {};
|
||||||
this.value = 'value'
|
this.value = 'value';
|
||||||
this.context.key = this.value;
|
this.context.key = this.value;
|
||||||
this.cloned = jasmineUnderTest.UserContext.fromExisting(this.context);
|
this.cloned = jasmineUnderTest.UserContext.fromExisting(this.context);
|
||||||
});
|
});
|
||||||
|
|||||||
51
spec/core/asymmetric_equality/EmptySpec.js
Normal file
51
spec/core/asymmetric_equality/EmptySpec.js
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
describe("Empty", function () {
|
||||||
|
it("matches an empty object", function () {
|
||||||
|
var empty = new jasmineUnderTest.Empty();
|
||||||
|
|
||||||
|
expect(empty.asymmetricMatch({})).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch({undefined: false})).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches an empty array", function () {
|
||||||
|
var empty = new jasmineUnderTest.Empty();
|
||||||
|
|
||||||
|
expect(empty.asymmetricMatch([])).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch([1, 12, 3])).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches an empty string", function () {
|
||||||
|
var empty = new jasmineUnderTest.Empty();
|
||||||
|
|
||||||
|
expect(empty.asymmetricMatch("")).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch('')).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch('12312')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches an empty map", function () {
|
||||||
|
jasmine.getEnv().requireFunctioningMaps();
|
||||||
|
var empty = new jasmineUnderTest.Empty();
|
||||||
|
var fullMap = new Map();
|
||||||
|
fullMap.set('thing', 2);
|
||||||
|
|
||||||
|
expect(empty.asymmetricMatch(new Map())).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch(fullMap)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches an empty set", function () {
|
||||||
|
jasmine.getEnv().requireFunctioningSets();
|
||||||
|
var empty = new jasmineUnderTest.Empty();
|
||||||
|
var fullSet = new Set();
|
||||||
|
fullSet.add(3);
|
||||||
|
|
||||||
|
expect(empty.asymmetricMatch(new Set())).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch(fullSet)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches an empty typed array", function() {
|
||||||
|
jasmine.getEnv().requireFunctioningTypedArrays();
|
||||||
|
var empty = new jasmineUnderTest.Empty();
|
||||||
|
|
||||||
|
expect(empty.asymmetricMatch(new Int16Array())).toBe(true);
|
||||||
|
expect(empty.asymmetricMatch(new Int16Array([1,2]))).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
38
spec/core/asymmetric_equality/FalsySpec.js
Normal file
38
spec/core/asymmetric_equality/FalsySpec.js
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
describe("Falsy", function() {
|
||||||
|
it("is true for an empty string", function() {
|
||||||
|
var falsy = new jasmineUnderTest.Falsy();
|
||||||
|
|
||||||
|
expect(falsy.asymmetricMatch("")).toBe(true);
|
||||||
|
expect(falsy.asymmetricMatch('')).toBe(true);
|
||||||
|
expect(falsy.asymmetricMatch('asdasdad')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is false for a number that is 0", function() {
|
||||||
|
var falsy = new jasmineUnderTest.Falsy(Number);
|
||||||
|
|
||||||
|
expect(falsy.asymmetricMatch(1)).toBe(false);
|
||||||
|
expect(falsy.asymmetricMatch(0)).toBe(true);
|
||||||
|
expect(falsy.asymmetricMatch(-23)).toBe(false);
|
||||||
|
expect(falsy.asymmetricMatch(-3.1)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a null or undefined", function() {
|
||||||
|
var falsy = new jasmineUnderTest.Falsy(Function);
|
||||||
|
|
||||||
|
expect(falsy.asymmetricMatch(null)).toBe(true);
|
||||||
|
expect(falsy.asymmetricMatch(undefined )).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for NaN", function() {
|
||||||
|
var falsy = new jasmineUnderTest.Falsy(Object);
|
||||||
|
|
||||||
|
expect(falsy.asymmetricMatch(NaN)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a false Boolean", function() {
|
||||||
|
var falsy = new jasmineUnderTest.Falsy(Boolean);
|
||||||
|
|
||||||
|
expect(falsy.asymmetricMatch(false)).toBe(true);
|
||||||
|
expect(falsy.asymmetricMatch(true)).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
53
spec/core/asymmetric_equality/NotEmptySpec.js
Normal file
53
spec/core/asymmetric_equality/NotEmptySpec.js
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
describe("NotEmpty", function () {
|
||||||
|
it("matches a non empty object", function () {
|
||||||
|
var notEmpty = new jasmineUnderTest.NotEmpty();
|
||||||
|
|
||||||
|
expect(notEmpty.asymmetricMatch({undefined: false})).toBe(true);
|
||||||
|
expect(notEmpty.asymmetricMatch({})).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches a non empty array", function () {
|
||||||
|
var notEmpty = new jasmineUnderTest.NotEmpty();
|
||||||
|
|
||||||
|
expect(notEmpty.asymmetricMatch([1, 12, 3])).toBe(true);
|
||||||
|
expect(notEmpty.asymmetricMatch([])).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches a non empty string", function () {
|
||||||
|
var notEmpty = new jasmineUnderTest.NotEmpty();
|
||||||
|
|
||||||
|
expect(notEmpty.asymmetricMatch('12312')).toBe(true);
|
||||||
|
expect(notEmpty.asymmetricMatch("")).toBe(false);
|
||||||
|
expect(notEmpty.asymmetricMatch('')).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches a non empty map", function () {
|
||||||
|
jasmine.getEnv().requireFunctioningMaps();
|
||||||
|
var notEmpty = new jasmineUnderTest.NotEmpty();
|
||||||
|
var fullMap = new Map();
|
||||||
|
fullMap.set('one', 1);
|
||||||
|
var emptyMap = new Map();
|
||||||
|
|
||||||
|
expect(notEmpty.asymmetricMatch(fullMap)).toBe(true);
|
||||||
|
expect(notEmpty.asymmetricMatch(emptyMap)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches a non empty set", function () {
|
||||||
|
jasmine.getEnv().requireFunctioningSets();
|
||||||
|
var notEmpty = new jasmineUnderTest.NotEmpty();
|
||||||
|
var filledSet = new Set();
|
||||||
|
filledSet.add(1);
|
||||||
|
var emptySet = new Set();
|
||||||
|
|
||||||
|
expect(notEmpty.asymmetricMatch(filledSet)).toBe(true);
|
||||||
|
expect(notEmpty.asymmetricMatch(emptySet)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("matches a non empty typed array", function() {
|
||||||
|
jasmine.getEnv().requireFunctioningTypedArrays();
|
||||||
|
var notEmpty = new jasmineUnderTest.NotEmpty();
|
||||||
|
|
||||||
|
expect(notEmpty.asymmetricMatch(new Int16Array([1,2,3]))).toBe(true);
|
||||||
|
expect(notEmpty.asymmetricMatch(new Int16Array())).toBe(false);
|
||||||
|
});
|
||||||
|
});
|
||||||
63
spec/core/asymmetric_equality/TruthySpec.js
Normal file
63
spec/core/asymmetric_equality/TruthySpec.js
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
describe("Truthy", function () {
|
||||||
|
it("is true for a non empty string", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch("foo")).toBe(true);
|
||||||
|
expect(truthy.asymmetricMatch("")).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a number that is not 0", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch(1)).toBe(true);
|
||||||
|
expect(truthy.asymmetricMatch(0)).toBe(false);
|
||||||
|
expect(truthy.asymmetricMatch(-23)).toBe(true);
|
||||||
|
expect(truthy.asymmetricMatch(-3.1)).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a function", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch(function () {
|
||||||
|
})).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for an Object", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch({})).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a truthful Boolean", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch(true)).toBe(true);
|
||||||
|
expect(truthy.asymmetricMatch(false)).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for an empty object", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch({})).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for an empty array", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch([])).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a date", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch(new Date())).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("is true for a infiniti", function () {
|
||||||
|
var truthy = new jasmineUnderTest.Truthy();
|
||||||
|
|
||||||
|
expect(truthy.asymmetricMatch(Infinity)).toBe(true);
|
||||||
|
expect(truthy.asymmetricMatch(-Infinity)).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
@@ -121,7 +121,7 @@ describe("Custom Matchers (Integration)", function() {
|
|||||||
|
|
||||||
var specExpectations = function(result) {
|
var specExpectations = function(result) {
|
||||||
expect(result.status).toEqual('passed');
|
expect(result.status).toEqual('passed');
|
||||||
}
|
};
|
||||||
|
|
||||||
env.addReporter({ specDone: specExpectations, jasmineDone: done });
|
env.addReporter({ specDone: specExpectations, jasmineDone: done });
|
||||||
env.execute();
|
env.execute();
|
||||||
|
|||||||
@@ -892,7 +892,7 @@ describe("Env integration", function() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
env.describe('test suite', function() {
|
env.describe('test suite', function() {
|
||||||
env.beforeAll(function() { env.spyOn(testObj, 'foo');})
|
env.beforeAll(function() { env.spyOn(testObj, 'foo');});
|
||||||
|
|
||||||
env.it('spec 0', function() {
|
env.it('spec 0', function() {
|
||||||
expect(jasmineUnderTest.isSpy(testObj.foo)).toBe(true);
|
expect(jasmineUnderTest.isSpy(testObj.foo)).toBe(true);
|
||||||
@@ -940,10 +940,10 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Mock clock can be installed and used in tests", function(done) {
|
it("Mock clock can be installed and used in tests", function(done) {
|
||||||
var globalSetTimeout = jasmine.createSpy('globalSetTimeout'),
|
var globalSetTimeout = jasmine.createSpy('globalSetTimeout').and.callFake(function(cb, t) { setTimeout(cb, t); }),
|
||||||
delayedFunctionForGlobalClock = jasmine.createSpy('delayedFunctionForGlobalClock'),
|
delayedFunctionForGlobalClock = jasmine.createSpy('delayedFunctionForGlobalClock'),
|
||||||
delayedFunctionForMockClock = jasmine.createSpy('delayedFunctionForMockClock'),
|
delayedFunctionForMockClock = jasmine.createSpy('delayedFunctionForMockClock'),
|
||||||
env = new jasmineUnderTest.Env({global: { setTimeout: globalSetTimeout }});
|
env = new jasmineUnderTest.Env({global: { setTimeout: globalSetTimeout, clearTimeout: clearTimeout, setImmediate: function(cb) { setTimeout(cb, 0); } }});
|
||||||
|
|
||||||
var assertions = function() {
|
var assertions = function() {
|
||||||
expect(delayedFunctionForMockClock).toHaveBeenCalled();
|
expect(delayedFunctionForMockClock).toHaveBeenCalled();
|
||||||
@@ -1005,6 +1005,25 @@ describe("Env integration", function() {
|
|||||||
|
|
||||||
describe("with a mock clock", function() {
|
describe("with a mock clock", function() {
|
||||||
var realSetTimeout;
|
var realSetTimeout;
|
||||||
|
function createMockedEnv() {
|
||||||
|
// explicitly pass in timing functions so we can make sure that clear stack always works
|
||||||
|
// no matter how long the suite in the spec is
|
||||||
|
return new jasmineUnderTest.Env({ global: {
|
||||||
|
setTimeout: function(cb, t) {
|
||||||
|
var stack = jasmine.util.errorWithStack().stack;
|
||||||
|
if (stack.indexOf('ClearStack') >= 0) {
|
||||||
|
realSetTimeout(cb, t);
|
||||||
|
} else {
|
||||||
|
setTimeout(cb, t);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
clearTimeout: clearTimeout,
|
||||||
|
setInterval: setInterval,
|
||||||
|
clearInterval: clearInterval,
|
||||||
|
setImmediate: function(cb) { realSetTimeout(cb, 0); }
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
|
||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
this.originalTimeout = jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL;
|
this.originalTimeout = jasmineUnderTest.DEFAULT_TIMEOUT_INTERVAL;
|
||||||
realSetTimeout = setTimeout;
|
realSetTimeout = setTimeout;
|
||||||
@@ -1019,7 +1038,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should wait a default interval before failing specs that haven't called done yet", function(done) {
|
it("should wait a default interval before failing specs that haven't called done yet", function(done) {
|
||||||
var env = new jasmineUnderTest.Env(),
|
var env = createMockedEnv(),
|
||||||
reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone" ]);
|
reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone" ]);
|
||||||
|
|
||||||
reporter.specDone.and.callFake(function(result) {
|
reporter.specDone.and.callFake(function(result) {
|
||||||
@@ -1048,7 +1067,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should not use the mock clock for asynchronous timeouts", function(done){
|
it("should not use the mock clock for asynchronous timeouts", function(done){
|
||||||
var env = new jasmineUnderTest.Env(),
|
var env = createMockedEnv(),
|
||||||
reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone" ]),
|
reporter = jasmine.createSpyObj('fakeReporter', [ "specDone", "jasmineDone" ]),
|
||||||
clock = env.clock;
|
clock = env.clock;
|
||||||
|
|
||||||
@@ -1086,28 +1105,16 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should wait a custom interval before reporting async functions that fail to call done', function(done) {
|
it('should wait a custom interval before reporting async functions that fail to call done', function(done) {
|
||||||
var env = new jasmineUnderTest.Env(),
|
var env = createMockedEnv(),
|
||||||
reporter = jasmine.createSpyObj('fakeReport', ['jasmineDone', 'suiteDone', 'specDone']),
|
reporter = jasmine.createSpyObj('fakeReport', ['jasmineDone', 'suiteDone', 'specDone']);
|
||||||
timeoutFailure = (/^Error: Timeout - Async callback was not invoked within timeout specified by jasmine\.DEFAULT_TIMEOUT_INTERVAL\./);
|
|
||||||
|
|
||||||
reporter.specDone.and.callFake(function(r) {
|
reporter.jasmineDone.and.callFake(function(r) {
|
||||||
realSetTimeout(function() {
|
expect(r.failedExpectations).toEqual([]);
|
||||||
jasmine.clock().tick(1);
|
expect(reporter.suiteDone).toHaveFailedExpectationsForRunnable('suite beforeAll', [ /^Error: Timeout - Async callback was not invoked within 5000ms \(custom timeout\)/ ]);
|
||||||
}, 0);
|
expect(reporter.suiteDone).toHaveFailedExpectationsForRunnable('suite afterAll', [ /^Error: Timeout - Async callback was not invoked within 2000ms \(custom timeout\)/ ]);
|
||||||
});
|
expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite beforeEach times out', [/^Error: Timeout - Async callback was not invoked within 1000ms \(custom timeout\)/]);
|
||||||
|
expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite afterEach times out', [ /^Error: Timeout - Async callback was not invoked within 4000ms \(custom timeout\)/ ]);
|
||||||
reporter.suiteDone.and.callFake(function(r) {
|
expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite it times out', [ /^Error: Timeout - Async callback was not invoked within 6000ms \(custom timeout\)/ ]);
|
||||||
realSetTimeout(function() {
|
|
||||||
jasmine.clock().tick(1);
|
|
||||||
}, 0);
|
|
||||||
});
|
|
||||||
|
|
||||||
reporter.jasmineDone.and.callFake(function() {
|
|
||||||
expect(reporter.suiteDone).toHaveFailedExpectationsForRunnable('suite beforeAll', [ timeoutFailure ]);
|
|
||||||
expect(reporter.suiteDone).toHaveFailedExpectationsForRunnable('suite afterAll', [ timeoutFailure ]);
|
|
||||||
expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite beforeEach times out', [ timeoutFailure ]);
|
|
||||||
expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite afterEach times out', [ timeoutFailure ]);
|
|
||||||
expect(reporter.specDone).toHaveFailedExpectationsForRunnable('suite it times out', [ timeoutFailure ]);
|
|
||||||
|
|
||||||
jasmine.clock().tick(1);
|
jasmine.clock().tick(1);
|
||||||
realSetTimeout(done);
|
realSetTimeout(done);
|
||||||
@@ -1616,7 +1623,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("should be possible to get full name from a spec", function() {
|
it("should be possible to get full name from a spec", function() {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
topLevelSpec, nestedSpec, doublyNestedSpec;
|
topLevelSpec, nestedSpec, doublyNestedSpec;
|
||||||
|
|
||||||
env.describe("my tests", function() {
|
env.describe("my tests", function() {
|
||||||
@@ -1638,7 +1645,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Custom equality testers should be per spec", function(done) {
|
it("Custom equality testers should be per spec", function(done) {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
reporter = jasmine.createSpyObj('fakeReporter', [
|
reporter = jasmine.createSpyObj('fakeReporter', [
|
||||||
"jasmineDone",
|
"jasmineDone",
|
||||||
"specDone"
|
"specDone"
|
||||||
@@ -1672,7 +1679,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Custom equality testers should be per suite", function(done) {
|
it("Custom equality testers should be per suite", function(done) {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
reporter = jasmine.createSpyObj('fakeReporter', [
|
reporter = jasmine.createSpyObj('fakeReporter', [
|
||||||
"jasmineDone",
|
"jasmineDone",
|
||||||
"specDone"
|
"specDone"
|
||||||
@@ -1715,7 +1722,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Custom equality testers for toContain should be per spec", function(done) {
|
it("Custom equality testers for toContain should be per spec", function(done) {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
reporter = jasmine.createSpyObj('fakeReporter', [
|
reporter = jasmine.createSpyObj('fakeReporter', [
|
||||||
"jasmineDone",
|
"jasmineDone",
|
||||||
"specDone"
|
"specDone"
|
||||||
@@ -1766,7 +1773,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Custom equality testers for toContain should be per suite", function(done) {
|
it("Custom equality testers for toContain should be per suite", function(done) {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
reporter = jasmine.createSpyObj('fakeReporter', [
|
reporter = jasmine.createSpyObj('fakeReporter', [
|
||||||
"jasmineDone",
|
"jasmineDone",
|
||||||
"specDone"
|
"specDone"
|
||||||
@@ -1809,7 +1816,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Custom matchers should be per spec", function(done) {
|
it("Custom matchers should be per spec", function(done) {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
matchers = {
|
matchers = {
|
||||||
toFoo: function() {}
|
toFoo: function() {}
|
||||||
};
|
};
|
||||||
@@ -1831,7 +1838,7 @@ describe("Env integration", function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it("Custom matchers should be per suite", function(done) {
|
it("Custom matchers should be per suite", function(done) {
|
||||||
var env = new jasmineUnderTest.Env({global: { setTimeout: setTimeout }}),
|
var env = new jasmineUnderTest.Env(),
|
||||||
matchers = {
|
matchers = {
|
||||||
toFoo: function() {}
|
toFoo: function() {}
|
||||||
};
|
};
|
||||||
@@ -2060,11 +2067,13 @@ describe("Env integration", function() {
|
|||||||
env.execute();
|
env.execute();
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('If suppressLoadErrors was called', function() {
|
describe('If suppressLoadErrors: true was passed', function() {
|
||||||
it('does not report or handle errors that occur during loading', function(done) {
|
it('does not install a global error handler during loading', function(done) {
|
||||||
|
var originalOnerror = jasmine.createSpy('original onerror')
|
||||||
var global = {
|
var global = {
|
||||||
setTimeout: function(fn, delay) { setTimeout(fn, delay) },
|
setTimeout: function(fn, delay) { setTimeout(fn, delay) },
|
||||||
clearTimeout: function(fn, delay) { clearTimeout(fn, delay) }
|
clearTimeout: function(fn, delay) { clearTimeout(fn, delay) },
|
||||||
|
onerror: originalOnerror
|
||||||
};
|
};
|
||||||
spyOn(jasmineUnderTest, 'getGlobal').and.returnValue(global);
|
spyOn(jasmineUnderTest, 'getGlobal').and.returnValue(global);
|
||||||
var globalErrors = new jasmineUnderTest.GlobalErrors(global);
|
var globalErrors = new jasmineUnderTest.GlobalErrors(global);
|
||||||
@@ -2072,17 +2081,16 @@ describe("Env integration", function() {
|
|||||||
globalErrors.pushListener(onerror);
|
globalErrors.pushListener(onerror);
|
||||||
spyOn(jasmineUnderTest, 'GlobalErrors').and.returnValue(globalErrors);
|
spyOn(jasmineUnderTest, 'GlobalErrors').and.returnValue(globalErrors);
|
||||||
|
|
||||||
var env = new jasmineUnderTest.Env(),
|
var env = new jasmineUnderTest.Env({suppressLoadErrors: true});
|
||||||
reporter = jasmine.createSpyObj('reporter', ['jasmineDone', 'suiteDone', 'specDone']);
|
reporter = jasmine.createSpyObj('reporter', ['jasmineDone', 'suiteDone', 'specDone']);
|
||||||
|
|
||||||
reporter.jasmineDone.and.callFake(function(e) {
|
reporter.jasmineDone.and.callFake(function(e) {
|
||||||
expect(e.failedExpectations).toEqual([]);
|
expect(e.failedExpectations).toEqual([]);
|
||||||
expect(onerror).toHaveBeenCalledWith('Uncaught Error: ENOCHEESE');
|
expect(originalOnerror).toHaveBeenCalledWith('Uncaught Error: ENOCHEESE');
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
env.addReporter(reporter);
|
env.addReporter(reporter);
|
||||||
env.suppressLoadErrors(true);
|
|
||||||
global.onerror('Uncaught Error: ENOCHEESE');
|
global.onerror('Uncaught Error: ENOCHEESE');
|
||||||
|
|
||||||
env.execute();
|
env.execute();
|
||||||
@@ -2303,6 +2311,9 @@ describe("Env integration", function() {
|
|||||||
var env = new jasmineUnderTest.Env(),
|
var env = new jasmineUnderTest.Env(),
|
||||||
reporter = jasmine.createSpyObj('reporter', ['jasmineDone', 'suiteDone', 'specDone']);
|
reporter = jasmine.createSpyObj('reporter', ['jasmineDone', 'suiteDone', 'specDone']);
|
||||||
|
|
||||||
|
// prevent deprecation from being desplayed
|
||||||
|
spyOn(console, "error");
|
||||||
|
|
||||||
reporter.jasmineDone.and.callFake(function(result) {
|
reporter.jasmineDone.and.callFake(function(result) {
|
||||||
expect(result.deprecationWarnings).toEqual([
|
expect(result.deprecationWarnings).toEqual([
|
||||||
jasmine.objectContaining({ message: 'top level deprecation' })
|
jasmine.objectContaining({ message: 'top level deprecation' })
|
||||||
@@ -2341,4 +2352,167 @@ describe("Env integration", function() {
|
|||||||
|
|
||||||
env.execute();
|
env.execute();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should report deprecation stack with an error object', function(done) {
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
exceptionFormatter = new jasmineUnderTest.ExceptionFormatter(),
|
||||||
|
reporter = jasmine.createSpyObj('reporter', ['jasmineDone', 'suiteDone', 'specDone']),
|
||||||
|
topLevelError, suiteLevelError, specLevelError;
|
||||||
|
|
||||||
|
try { throw new Error('top level deprecation') } catch (err) { topLevelError = err; }
|
||||||
|
try { throw new Error('suite level deprecation') } catch (err) { suiteLevelError = err; }
|
||||||
|
try { throw new Error('spec level deprecation') } catch (err) { specLevelError = err; }
|
||||||
|
|
||||||
|
// prevent deprecation from being desplayed
|
||||||
|
spyOn(console, "error");
|
||||||
|
|
||||||
|
reporter.jasmineDone.and.callFake(function(result) {
|
||||||
|
expect(result.deprecationWarnings).toEqual([
|
||||||
|
jasmine.objectContaining({
|
||||||
|
message: topLevelError.message,
|
||||||
|
stack: exceptionFormatter.stack(topLevelError)
|
||||||
|
})
|
||||||
|
]);
|
||||||
|
|
||||||
|
expect(reporter.suiteDone).toHaveBeenCalledWith(jasmine.objectContaining({
|
||||||
|
fullName: 'suite',
|
||||||
|
deprecationWarnings: [
|
||||||
|
jasmine.objectContaining({
|
||||||
|
message: suiteLevelError.message,
|
||||||
|
stack: exceptionFormatter.stack(suiteLevelError)
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
expect(reporter.specDone).toHaveBeenCalledWith(jasmine.objectContaining({
|
||||||
|
fullName: 'suite spec',
|
||||||
|
deprecationWarnings: [
|
||||||
|
jasmine.objectContaining({
|
||||||
|
message: specLevelError.message,
|
||||||
|
stack: exceptionFormatter.stack(specLevelError)
|
||||||
|
})
|
||||||
|
]
|
||||||
|
}));
|
||||||
|
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
|
||||||
|
env.addReporter(reporter);
|
||||||
|
|
||||||
|
env.deprecated(topLevelError);
|
||||||
|
|
||||||
|
env.describe('suite', function() {
|
||||||
|
env.beforeAll(function() {
|
||||||
|
env.deprecated(suiteLevelError);
|
||||||
|
});
|
||||||
|
|
||||||
|
env.it('spec', function() {
|
||||||
|
env.deprecated(specLevelError);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
env.execute();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('supports async matchers', function(done) {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
specDone = jasmine.createSpy('specDone'),
|
||||||
|
suiteDone = jasmine.createSpy('suiteDone');
|
||||||
|
|
||||||
|
env.addReporter({
|
||||||
|
specDone: specDone,
|
||||||
|
suiteDone: suiteDone,
|
||||||
|
jasmineDone: function(result) {
|
||||||
|
expect(result.failedExpectations).toEqual([jasmine.objectContaining({
|
||||||
|
message: 'Expected a promise to be rejected.'
|
||||||
|
})]);
|
||||||
|
|
||||||
|
expect(specDone).toHaveBeenCalledWith(jasmine.objectContaining({
|
||||||
|
description: 'has an async failure',
|
||||||
|
failedExpectations: [jasmine.objectContaining({
|
||||||
|
message: 'Expected a promise to be rejected.'
|
||||||
|
})]
|
||||||
|
}));
|
||||||
|
|
||||||
|
expect(suiteDone).toHaveBeenCalledWith(jasmine.objectContaining({
|
||||||
|
description: 'a suite',
|
||||||
|
failedExpectations: [jasmine.objectContaining({
|
||||||
|
message: 'Expected a promise to be rejected.'
|
||||||
|
})]
|
||||||
|
}));
|
||||||
|
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function fail(innerDone) {
|
||||||
|
var resolve;
|
||||||
|
var p = new Promise(function(res, rej) { resolve = res });
|
||||||
|
env.expectAsync(p).toBeRejected().then(innerDone);
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
env.afterAll(fail);
|
||||||
|
env.describe('a suite', function() {
|
||||||
|
env.afterAll(fail);
|
||||||
|
env.it('has an async failure', fail);
|
||||||
|
});
|
||||||
|
|
||||||
|
env.execute();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('provides custom equality testers to async matchers', function(done) {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
specDone = jasmine.createSpy('specDone');
|
||||||
|
|
||||||
|
env.addReporter({
|
||||||
|
specDone: specDone,
|
||||||
|
jasmineDone: function() {
|
||||||
|
expect(specDone).toHaveBeenCalledWith(jasmine.objectContaining({
|
||||||
|
description: 'has an async failure',
|
||||||
|
failedExpectations: []
|
||||||
|
}));
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
env.it('has an async failure', function() {
|
||||||
|
env.addCustomEqualityTester(function() { return true; });
|
||||||
|
var p = Promise.resolve('something');
|
||||||
|
return env.expectAsync(p).toBeResolvedTo('something else');
|
||||||
|
});
|
||||||
|
|
||||||
|
env.execute();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('includes useful stack frames in async matcher failures', function(done) {
|
||||||
|
jasmine.getEnv().requirePromises();
|
||||||
|
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
specDone = jasmine.createSpy('specDone');
|
||||||
|
|
||||||
|
env.addReporter({
|
||||||
|
specDone: specDone,
|
||||||
|
jasmineDone: function() {
|
||||||
|
expect(specDone).toHaveBeenCalledWith(jasmine.objectContaining({
|
||||||
|
failedExpectations: [jasmine.objectContaining({
|
||||||
|
stack: jasmine.stringMatching('EnvSpec.js')
|
||||||
|
})]
|
||||||
|
}));
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
env.it('has an async failure', function() {
|
||||||
|
env.addCustomEqualityTester(function() { return true; });
|
||||||
|
var p = Promise.resolve();
|
||||||
|
return env.expectAsync(p).toBeRejected();
|
||||||
|
});
|
||||||
|
|
||||||
|
env.execute();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -952,13 +952,17 @@ describe("spec running", function () {
|
|||||||
it("does not run further specs when one fails", function(done) {
|
it("does not run further specs when one fails", function(done) {
|
||||||
var actions = [];
|
var actions = [];
|
||||||
|
|
||||||
env.it('fails', function() {
|
env.describe('wrapper', function() {
|
||||||
actions.push('fails');
|
env.it('fails', function() {
|
||||||
env.expect(1).toBe(2);
|
actions.push('fails');
|
||||||
|
env.expect(1).toBe(2);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
env.it('does not run', function() {
|
env.describe('holder', function() {
|
||||||
actions.push('does not run');
|
env.it('does not run', function() {
|
||||||
|
actions.push('does not run');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
env.randomizeTests(false);
|
env.randomizeTests(false);
|
||||||
|
|||||||
@@ -145,7 +145,7 @@ describe("matchersUtil", function() {
|
|||||||
actual = { b: 1 };
|
actual = { b: 1 };
|
||||||
|
|
||||||
expect(jasmineUnderTest.matchersUtil.equals(actual, expected)).toBe(false);
|
expect(jasmineUnderTest.matchersUtil.equals(actual, expected)).toBe(false);
|
||||||
})
|
});
|
||||||
|
|
||||||
it("fails when comparing an empty object to an empty array (issue #114)", function() {
|
it("fails when comparing an empty object to an empty array (issue #114)", function() {
|
||||||
var emptyObject = {},
|
var emptyObject = {},
|
||||||
@@ -211,11 +211,11 @@ describe("matchersUtil", function() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var a = document.createElement("div");
|
var a = document.createElement("div");
|
||||||
a.setAttribute("test-attr", "attr-value")
|
a.setAttribute("test-attr", "attr-value");
|
||||||
a.appendChild(document.createTextNode('test'));
|
a.appendChild(document.createTextNode('test'));
|
||||||
|
|
||||||
var b = document.createElement("div");
|
var b = document.createElement("div");
|
||||||
b.setAttribute("test-attr", "attr-value2")
|
b.setAttribute("test-attr", "attr-value2");
|
||||||
b.appendChild(document.createTextNode('test'));
|
b.appendChild(document.createTextNode('test'));
|
||||||
|
|
||||||
expect(jasmineUnderTest.matchersUtil.equals(a,b)).toBe(false);
|
expect(jasmineUnderTest.matchersUtil.equals(a,b)).toBe(false);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ describe("toBeGreaterThanOrEqual", function() {
|
|||||||
|
|
||||||
result = matcher.compare(1.0, 1.0);
|
result = matcher.compare(1.0, 1.0);
|
||||||
expect(result.pass).toBe(true);
|
expect(result.pass).toBe(true);
|
||||||
})
|
});
|
||||||
|
|
||||||
it("fails when actual < expected", function() {
|
it("fails when actual < expected", function() {
|
||||||
var matcher = jasmineUnderTest.matchers.toBeGreaterThanOrEqual(),
|
var matcher = jasmineUnderTest.matchers.toBeGreaterThanOrEqual(),
|
||||||
|
|||||||
@@ -95,7 +95,7 @@ describe("toEqual", function() {
|
|||||||
expected = {x: {}},
|
expected = {x: {}},
|
||||||
message =
|
message =
|
||||||
"Expected $.x not to have properties\n" +
|
"Expected $.x not to have properties\n" +
|
||||||
" y: 'foo bar'"
|
" y: 'foo bar'";
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
@@ -570,50 +570,67 @@ describe("toEqual", function() {
|
|||||||
expect(compareEquals(actual, expected).pass).toBe(true);
|
expect(compareEquals(actual, expected).pass).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
function isNotRunningInBrowser() {
|
describe('DOM nodes', function() {
|
||||||
return typeof document === 'undefined'
|
function isNotRunningInBrowser() {
|
||||||
}
|
return typeof document === 'undefined'
|
||||||
|
|
||||||
it("reports mismatches between DOM nodes with different tags", function() {
|
|
||||||
if(isNotRunningInBrowser()) {
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var actual = {a: document.createElement('div')},
|
beforeEach(function(done) {
|
||||||
expected = {a: document.createElement('p')},
|
this.nonBrowser = isNotRunningInBrowser();
|
||||||
|
if (this.nonBrowser) {
|
||||||
|
var jsdom = require('jsdom');
|
||||||
|
var self = this;
|
||||||
|
jsdom.env('', function(err, win) {
|
||||||
|
if (err) {
|
||||||
|
done.fail(err);
|
||||||
|
} else {
|
||||||
|
jasmineUnderTest.getGlobal().Node = win.Node;
|
||||||
|
self.doc = win.document;
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.doc = document;
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(function() {
|
||||||
|
if (this.nonBrowser) {
|
||||||
|
delete jasmineUnderTest.getGlobal().Node;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
it("reports mismatches between DOM nodes with different tags", function() {
|
||||||
|
var actual = {a: this.doc.createElement('div')},
|
||||||
|
expected = {a: this.doc.createElement('p')},
|
||||||
message = 'Expected $.a = <div> to equal <p>.';
|
message = 'Expected $.a = <div> to equal <p>.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('reports mismatches between DOM nodes with different content', function() {
|
it('reports mismatches between DOM nodes with different content', function() {
|
||||||
if(isNotRunningInBrowser()) {
|
var nodeA = this.doc.createElement('div'),
|
||||||
return;
|
nodeB = this.doc.createElement('div');
|
||||||
}
|
|
||||||
|
|
||||||
var nodeA = document.createElement('div'),
|
nodeA.setAttribute('thing', 'foo');
|
||||||
nodeB = document.createElement('div');
|
nodeB.setAttribute('thing', 'bar');
|
||||||
|
|
||||||
nodeA.innerText = 'foo'
|
expect(nodeA.isEqualNode(nodeB)).toBe(false);
|
||||||
nodeB.innerText = 'bar'
|
var actual = {a: nodeA},
|
||||||
|
|
||||||
var actual = {a: nodeA},
|
|
||||||
expected = {a: nodeB},
|
expected = {a: nodeB},
|
||||||
message = 'Expected $.a = <div>...</div> to equal <div>...</div>.';
|
message = 'Expected $.a = <div thing="foo"> to equal <div thing="bar">.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
})
|
});
|
||||||
|
|
||||||
it("reports mismatches between a DOM node and a bare Object", function() {
|
it("reports mismatches between a DOM node and a bare Object", function() {
|
||||||
if(isNotRunningInBrowser()) {
|
var actual = {a: this.doc.createElement('div')},
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var actual = {a: document.createElement('div')},
|
|
||||||
expected = {a: {}},
|
expected = {a: {}},
|
||||||
message = 'Expected $.a = <div> to equal Object({ }).';
|
message = 'Expected $.a = <div> to equal Object({ }).';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
it("reports asymmetric mismatches", function() {
|
it("reports asymmetric mismatches", function() {
|
||||||
@@ -658,7 +675,7 @@ describe("toEqual", function() {
|
|||||||
boolean: false,
|
boolean: false,
|
||||||
notDefined: 0,
|
notDefined: 0,
|
||||||
aNull: void 0
|
aNull: void 0
|
||||||
}
|
};
|
||||||
|
|
||||||
var expected = {
|
var expected = {
|
||||||
foo: [
|
foo: [
|
||||||
@@ -675,7 +692,7 @@ describe("toEqual", function() {
|
|||||||
boolean: true,
|
boolean: true,
|
||||||
notDefined: void 0,
|
notDefined: void 0,
|
||||||
aNull: null
|
aNull: null
|
||||||
}
|
};
|
||||||
|
|
||||||
var message =
|
var message =
|
||||||
'Expected $.foo[0].bar = 1 to equal 2.\n' +
|
'Expected $.foo[0].bar = 1 to equal 2.\n' +
|
||||||
@@ -690,19 +707,19 @@ describe("toEqual", function() {
|
|||||||
'Expected $.inf = -Infinity to equal Infinity.\n' +
|
'Expected $.inf = -Infinity to equal Infinity.\n' +
|
||||||
'Expected $.boolean = false to equal true.\n' +
|
'Expected $.boolean = false to equal true.\n' +
|
||||||
'Expected $.notDefined = 0 to equal undefined.\n' +
|
'Expected $.notDefined = 0 to equal undefined.\n' +
|
||||||
'Expected $.aNull = undefined to equal null.'
|
'Expected $.aNull = undefined to equal null.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
})
|
});
|
||||||
|
|
||||||
describe("different length arrays", function() {
|
describe("different length arrays", function() {
|
||||||
it("actual array is longer", function() {
|
it("actual array is longer", function() {
|
||||||
var actual = [1, 1, 2, 3, 5],
|
var actual = [1, 1, 2, 3, 5],
|
||||||
expected = [1, 1, 2, 3],
|
expected = [1, 1, 2, 3],
|
||||||
message = 'Expected $.length = 5 to equal 4.\n' +
|
message = 'Expected $.length = 5 to equal 4.\n' +
|
||||||
'Expected $[4] = 5 to equal undefined.';
|
'Unexpected $[4] = 5 in array.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -712,7 +729,38 @@ describe("toEqual", function() {
|
|||||||
message = 'Expected $.length = 4 to equal 5.\n' +
|
message = 'Expected $.length = 4 to equal 5.\n' +
|
||||||
'Expected $[4] = undefined to equal 5.';
|
'Expected $[4] = undefined to equal 5.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("undefined in middle of actual array", function() {
|
||||||
|
var actual = [1, void 0, 3],
|
||||||
|
expected = [1, 2, 3],
|
||||||
|
message = 'Expected $[1] = undefined to equal 2.';
|
||||||
|
|
||||||
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("undefined in middle of expected array", function() {
|
||||||
|
var actual = [1, 2, 3],
|
||||||
|
expected = [1, void 0, 3],
|
||||||
|
message = 'Expected $[1] = 2 to equal undefined.';
|
||||||
|
|
||||||
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("actual array is longer by 4 elements", function() {
|
||||||
|
var actual = [1, 1, 2, 3, 5, 8, 13],
|
||||||
|
expected = [1, 1, 2],
|
||||||
|
message = 'Expected $.length = 7 to equal 3.\n' +
|
||||||
|
'Unexpected $[3] = 3 in array.\n' +
|
||||||
|
'Unexpected $[4] = 5 in array.\n' +
|
||||||
|
'Unexpected $[5] = 8 in array.\n' +
|
||||||
|
'Unexpected $[6] = 13 in array.';
|
||||||
|
|
||||||
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -725,7 +773,7 @@ describe("toEqual", function() {
|
|||||||
'Expected $[5] = undefined to equal 8.\n' +
|
'Expected $[5] = undefined to equal 8.\n' +
|
||||||
'Expected $[6] = undefined to equal 13.';
|
'Expected $[6] = undefined to equal 13.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -736,27 +784,47 @@ describe("toEqual", function() {
|
|||||||
'Expected $[0] = 1 to equal 2.\n' +
|
'Expected $[0] = 1 to equal 2.\n' +
|
||||||
'Expected $[1] = undefined to equal 3.';
|
'Expected $[1] = undefined to equal 3.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("object with nested array", function() {
|
it("object with nested array (actual longer than expected)", function() {
|
||||||
var actual = { values: [1, 1, 2, 3] },
|
var actual = { values: [1, 1, 2, 3] },
|
||||||
expected = { values: [1, 1, 2] },
|
expected = { values: [1, 1, 2] },
|
||||||
message = 'Expected $.values.length = 4 to equal 3.\n' +
|
message = 'Expected $.values.length = 4 to equal 3.\n' +
|
||||||
'Expected $.values[3] = 3 to equal undefined.';
|
'Unexpected $.values[3] = 3 in array.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("array with nested object", function() {
|
it("object with nested array (expected longer than actual)", function() {
|
||||||
|
var actual = { values: [1, 1, 2] },
|
||||||
|
expected = { values: [1, 1, 2, 3] },
|
||||||
|
message = 'Expected $.values.length = 3 to equal 4.\n' +
|
||||||
|
'Expected $.values[3] = undefined to equal 3.';
|
||||||
|
|
||||||
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("array with unexpected nested object", function() {
|
||||||
var actual = [1, 1, 2, { value: 3 }],
|
var actual = [1, 1, 2, { value: 3 }],
|
||||||
expected = [1, 1, 2],
|
expected = [1, 1, 2],
|
||||||
message = 'Expected $.length = 4 to equal 3.\n' +
|
message = 'Expected $.length = 4 to equal 3.\n' +
|
||||||
'Expected $[3] = Object({ value: 3 }) to equal undefined.';
|
'Unexpected $[3] = Object({ value: 3 }) in array.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("array with missing nested object", function() {
|
||||||
|
var actual = [1, 1, 2],
|
||||||
|
expected = [1, 1, 2, { value: 3 }],
|
||||||
|
message = 'Expected $.length = 3 to equal 4.\n' +
|
||||||
|
'Expected $[3] = undefined to equal Object({ value: 3 }).';
|
||||||
|
|
||||||
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -767,9 +835,9 @@ describe("toEqual", function() {
|
|||||||
'Expected $[0][1] = undefined to equal 1.\n' +
|
'Expected $[0][1] = undefined to equal 1.\n' +
|
||||||
'Expected $[1].length = 2 to equal 1.\n' +
|
'Expected $[1].length = 2 to equal 1.\n' +
|
||||||
'Expected $[1][0] = 1 to equal 2.\n' +
|
'Expected $[1][0] = 1 to equal 2.\n' +
|
||||||
'Expected $[1][1] = 2 to equal undefined.';
|
'Unexpected $[1][1] = 2 in array.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -778,7 +846,7 @@ describe("toEqual", function() {
|
|||||||
expected = [1, 2, void 0],
|
expected = [1, 2, void 0],
|
||||||
message = 'Expected $.length = 2 to equal 3.';
|
message = 'Expected $.length = 2 to equal 3.';
|
||||||
|
|
||||||
expect(compareEquals(actual, expected).pass).toBe(false)
|
expect(compareEquals(actual, expected).pass).toBe(false);
|
||||||
expect(compareEquals(actual, expected).message).toEqual(message);
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
||||||
});
|
});
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,16 +1,38 @@
|
|||||||
describe('toHaveClass', function() {
|
describe('toHaveClass', function() {
|
||||||
|
beforeEach(function(done) {
|
||||||
|
this.createElementWithClassName = function(className) {
|
||||||
|
var el = this.doc.createElement('div');
|
||||||
|
el.className = className;
|
||||||
|
return el;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof document !== 'undefined') {
|
||||||
|
this.doc = document;
|
||||||
|
done();
|
||||||
|
} else {
|
||||||
|
var jsdom = require('jsdom');
|
||||||
|
var self = this;
|
||||||
|
jsdom.env('', function(err, win) {
|
||||||
|
if (err) {
|
||||||
|
done.fail(err);
|
||||||
|
} else {
|
||||||
|
self.doc = win.document;
|
||||||
|
done();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
it('fails for a DOM element that lacks the expected class', function() {
|
it('fails for a DOM element that lacks the expected class', function() {
|
||||||
var matcher = jasmineUnderTest.matchers.toHaveClass(),
|
var matcher = jasmineUnderTest.matchers.toHaveClass(),
|
||||||
result = matcher.compare(document.createElement('div'), 'foo');
|
result = matcher.compare(this.createElementWithClassName(''), 'foo');
|
||||||
|
|
||||||
expect(result.pass).toBe(false);
|
expect(result.pass).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('passes for a DOM element that has the expected class', function() {
|
it('passes for a DOM element that has the expected class', function() {
|
||||||
var matcher = jasmineUnderTest.matchers.toHaveClass(),
|
var matcher = jasmineUnderTest.matchers.toHaveClass(),
|
||||||
el = document.createElement('div');
|
el = this.createElementWithClassName('foo bar baz');
|
||||||
|
|
||||||
el.className = 'foo bar baz';
|
|
||||||
|
|
||||||
expect(matcher.compare(el, 'foo').pass).toBe(true);
|
expect(matcher.compare(el, 'foo').pass).toBe(true);
|
||||||
expect(matcher.compare(el, 'bar').pass).toBe(true);
|
expect(matcher.compare(el, 'bar').pass).toBe(true);
|
||||||
@@ -19,9 +41,7 @@ describe('toHaveClass', function() {
|
|||||||
|
|
||||||
it('fails for a DOM element that only has other classes', function() {
|
it('fails for a DOM element that only has other classes', function() {
|
||||||
var matcher = jasmineUnderTest.matchers.toHaveClass(),
|
var matcher = jasmineUnderTest.matchers.toHaveClass(),
|
||||||
el = document.createElement('div');
|
el = this.createElementWithClassName('foo bar');
|
||||||
|
|
||||||
el.className = 'foo bar';
|
|
||||||
|
|
||||||
expect(matcher.compare(el, 'fo').pass).toBe(false);
|
expect(matcher.compare(el, 'fo').pass).toBe(false);
|
||||||
});
|
});
|
||||||
@@ -37,8 +57,9 @@ describe('toHaveClass', function() {
|
|||||||
matcher.compare(undefined, 'foo');
|
matcher.compare(undefined, 'foo');
|
||||||
}).toThrowError('undefined is not a DOM element');
|
}).toThrowError('undefined is not a DOM element');
|
||||||
|
|
||||||
|
var textNode = this.doc.createTextNode('');
|
||||||
expect(function() {
|
expect(function() {
|
||||||
matcher.compare(document.createTextNode(''), 'foo')
|
matcher.compare(textNode, 'foo')
|
||||||
}).toThrowError('HTMLNode is not a DOM element');
|
}).toThrowError('HTMLNode is not a DOM element');
|
||||||
|
|
||||||
expect(function() {
|
expect(function() {
|
||||||
8
spec/helpers/promises.js
Normal file
8
spec/helpers/promises.js
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
(function(env) {
|
||||||
|
env.requirePromises = function() {
|
||||||
|
if (typeof Promise !== 'function') {
|
||||||
|
env.pending("Environment does not support promises");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
})(jasmine.getEnv());
|
||||||
|
|
||||||
@@ -103,7 +103,6 @@ describe("HtmlReporter", function() {
|
|||||||
createTextNode: function() { return document.createTextNode.apply(document, arguments); }
|
createTextNode: function() { return document.createTextNode.apply(document, arguments); }
|
||||||
});
|
});
|
||||||
reporter.initialize();
|
reporter.initialize();
|
||||||
|
|
||||||
reporter.specDone({id: 789, status: "excluded", fullName: "symbols should have titles", passedExpectations: [], failedExpectations: []});
|
reporter.specDone({id: 789, status: "excluded", fullName: "symbols should have titles", passedExpectations: [], failedExpectations: []});
|
||||||
|
|
||||||
var specEl = container.querySelector('.jasmine-symbol-summary li');
|
var specEl = container.querySelector('.jasmine-symbol-summary li');
|
||||||
@@ -696,7 +695,85 @@ describe("HtmlReporter", function() {
|
|||||||
expect(navigateHandler).toHaveBeenCalledWith('throwFailures', false);
|
expect(navigateHandler).toHaveBeenCalledWith('throwFailures', false);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe("UI for hiding disabled specs", function() {
|
||||||
|
it("should be unchecked if not hiding disabled specs", function() {
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
container = document.createElement("div"),
|
||||||
|
getContainer = function() {
|
||||||
|
return container;
|
||||||
|
},
|
||||||
|
reporter = new jasmineUnderTest.HtmlReporter({
|
||||||
|
env: env,
|
||||||
|
getContainer: getContainer,
|
||||||
|
createElement: function() {
|
||||||
|
return document.createElement.apply(document, arguments);
|
||||||
|
},
|
||||||
|
createTextNode: function() {
|
||||||
|
return document.createTextNode.apply(document, arguments);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
env.hideDisabled(false);
|
||||||
|
reporter.initialize();
|
||||||
|
reporter.jasmineDone({});
|
||||||
|
|
||||||
|
var disabledUI = container.querySelector(".jasmine-disabled");
|
||||||
|
expect(disabledUI.checked).toBe(false);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should be checked if hiding disabled", function() {
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
container = document.createElement("div"),
|
||||||
|
getContainer = function() {
|
||||||
|
return container;
|
||||||
|
},
|
||||||
|
reporter = new jasmineUnderTest.HtmlReporter({
|
||||||
|
env: env,
|
||||||
|
getContainer: getContainer,
|
||||||
|
createElement: function() {
|
||||||
|
return document.createElement.apply(document, arguments);
|
||||||
|
},
|
||||||
|
createTextNode: function() {
|
||||||
|
return document.createTextNode.apply(document, arguments);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
env.hideDisabled(true);
|
||||||
|
reporter.initialize();
|
||||||
|
reporter.jasmineDone({});
|
||||||
|
|
||||||
|
var disabledUI = container.querySelector(".jasmine-disabled");
|
||||||
|
expect(disabledUI.checked).toBe(true);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should not display specs that have been disabled", function() {
|
||||||
|
var env = new jasmineUnderTest.Env(),
|
||||||
|
container = document.createElement('div'),
|
||||||
|
|
||||||
|
getContainer = function() {return container;},
|
||||||
|
|
||||||
|
reporter = new jasmineUnderTest.HtmlReporter({
|
||||||
|
env: env,
|
||||||
|
getContainer: getContainer,
|
||||||
|
createElement: function() { return document.createElement.apply(document, arguments); },
|
||||||
|
createTextNode: function() { return document.createTextNode.apply(document, arguments); }
|
||||||
|
});
|
||||||
|
env.hideDisabled(true);
|
||||||
|
reporter.initialize();
|
||||||
|
reporter.specDone({
|
||||||
|
id: 789,
|
||||||
|
status: "excluded",
|
||||||
|
fullName: "symbols should have titles",
|
||||||
|
passedExpectations: [],
|
||||||
|
failedExpectations: []
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var specEl = container.querySelector('.jasmine-symbol-summary li');
|
||||||
|
expect(specEl.getAttribute("class")).toEqual("jasmine-excluded-no-display");
|
||||||
|
});
|
||||||
|
});
|
||||||
describe("UI for running tests in random order", function() {
|
describe("UI for running tests in random order", function() {
|
||||||
it("should be unchecked if not randomizing", function() {
|
it("should be unchecked if not randomizing", function() {
|
||||||
var env = new jasmineUnderTest.Env(),
|
var env = new jasmineUnderTest.Env(),
|
||||||
@@ -1047,7 +1124,7 @@ describe("HtmlReporter", function() {
|
|||||||
beforeEach(function() {
|
beforeEach(function() {
|
||||||
env = new jasmineUnderTest.Env();
|
env = new jasmineUnderTest.Env();
|
||||||
container = document.createElement("div");
|
container = document.createElement("div");
|
||||||
var getContainer = function() { return container; }
|
var getContainer = function() { return container; };
|
||||||
reporter = new jasmineUnderTest.HtmlReporter({
|
reporter = new jasmineUnderTest.HtmlReporter({
|
||||||
env: env,
|
env: env,
|
||||||
getContainer: getContainer,
|
getContainer: getContainer,
|
||||||
|
|||||||
@@ -24,4 +24,11 @@ describe("jasmineUnderTest.pp (HTML Dependent)", function () {
|
|||||||
expect(jasmineUnderTest.pp(err)).toMatch(/Not enough arguments/);
|
expect(jasmineUnderTest.pp(err)).toMatch(/Not enough arguments/);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should stringify HTML element with text and attributes", function() {
|
||||||
|
var el = document.createElement('div');
|
||||||
|
el.setAttribute('things', 'foo');
|
||||||
|
el.innerHTML = 'foo';
|
||||||
|
expect(jasmineUnderTest.pp(el)).toEqual('<div things="foo">...</div>');
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -6,10 +6,10 @@ sauce:
|
|||||||
name: jasmine-core <%= Time.now.to_s %>
|
name: jasmine-core <%= Time.now.to_s %>
|
||||||
username: <%= ENV['SAUCE_USERNAME'] %>
|
username: <%= ENV['SAUCE_USERNAME'] %>
|
||||||
access_key: <%= ENV['SAUCE_ACCESS_KEY'] %>
|
access_key: <%= ENV['SAUCE_ACCESS_KEY'] %>
|
||||||
build: <%= ENV['TRAVIS_BUILD_NUMBER'] || 'Ran locally' %>
|
build: Core <%= ENV['TRAVIS_BUILD_NUMBER'] || 'Ran locally' %>
|
||||||
tags:
|
tags:
|
||||||
- <%= ENV['TRAVIS_RUBY_VERSION'] || RUBY_VERSION %>
|
- Jasmine-Core
|
||||||
- CI
|
- "<%= ENV['TRAVIS_JOB_NUMBER'] %>"
|
||||||
tunnel_identifier: <%= ENV['TRAVIS_JOB_NUMBER'] ? %Q("#{ENV['TRAVIS_JOB_NUMBER']}") : nil %>
|
tunnel_identifier: <%= ENV['TRAVIS_JOB_NUMBER'] ? %Q("#{ENV['TRAVIS_JOB_NUMBER']}") : nil %>
|
||||||
os: <%= ENV['SAUCE_OS'] %>
|
os: <%= ENV['SAUCE_OS'] %>
|
||||||
browser_version: "<%= ENV['SAUCE_BROWSER_VERSION'] %>"
|
browser_version: "<%= ENV['SAUCE_BROWSER_VERSION'] %>"
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
"helpers/checkForSymbol.js",
|
"helpers/checkForSymbol.js",
|
||||||
"helpers/checkForTypedArrays.js",
|
"helpers/checkForTypedArrays.js",
|
||||||
"helpers/integrationMatchers.js",
|
"helpers/integrationMatchers.js",
|
||||||
|
"helpers/promises.js",
|
||||||
"helpers/nodeDefineJasmineUnderTest.js"
|
"helpers/nodeDefineJasmineUnderTest.js"
|
||||||
],
|
],
|
||||||
"random": true
|
"random": true
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ helpers:
|
|||||||
- 'helpers/checkForSymbol.js'
|
- 'helpers/checkForSymbol.js'
|
||||||
- 'helpers/checkForTypedArrays.js'
|
- 'helpers/checkForTypedArrays.js'
|
||||||
- 'helpers/integrationMatchers.js'
|
- 'helpers/integrationMatchers.js'
|
||||||
|
- 'helpers/promises.js'
|
||||||
- 'helpers/defineJasmineUnderTest.js'
|
- 'helpers/defineJasmineUnderTest.js'
|
||||||
spec_files:
|
spec_files:
|
||||||
- '**/*[Ss]pec.js'
|
- '**/*[Ss]pec.js'
|
||||||
|
|||||||
153
src/core/AsyncExpectation.js
Normal file
153
src/core/AsyncExpectation.js
Normal file
@@ -0,0 +1,153 @@
|
|||||||
|
getJasmineRequireObj().AsyncExpectation = function(j$) {
|
||||||
|
var promiseForMessage = {
|
||||||
|
jasmineToString: function() { return 'a promise'; }
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Asynchronous matchers.
|
||||||
|
* @namespace async-matchers
|
||||||
|
*/
|
||||||
|
function AsyncExpectation(options) {
|
||||||
|
var global = options.global || j$.getGlobal();
|
||||||
|
this.util = options.util || { buildFailureMessage: function() {} };
|
||||||
|
this.customEqualityTesters = options.customEqualityTesters || [];
|
||||||
|
this.addExpectationResult = options.addExpectationResult || function(){};
|
||||||
|
this.actual = options.actual;
|
||||||
|
this.isNot = options.isNot;
|
||||||
|
|
||||||
|
if (!global.Promise) {
|
||||||
|
throw new Error('expectAsync is unavailable because the environment does not support promises.');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!j$.isPromise(this.actual)) {
|
||||||
|
throw new Error('Expected expectAsync to be called with a promise.');
|
||||||
|
}
|
||||||
|
|
||||||
|
['toBeResolved', 'toBeRejected', 'toBeResolvedTo'].forEach(wrapCompare.bind(this));
|
||||||
|
}
|
||||||
|
|
||||||
|
function wrapCompare(name) {
|
||||||
|
var compare = this[name];
|
||||||
|
this[name] = function() {
|
||||||
|
var self = this;
|
||||||
|
var args = Array.prototype.slice.call(arguments);
|
||||||
|
args.unshift(this.actual);
|
||||||
|
|
||||||
|
// Capture the call stack here, before we go async, so that it will
|
||||||
|
// contain frames that are relevant to the user instead of just parts
|
||||||
|
// of Jasmine.
|
||||||
|
var errorForStack = j$.util.errorWithStack();
|
||||||
|
|
||||||
|
return compare.apply(self, args).then(function(result) {
|
||||||
|
var message;
|
||||||
|
|
||||||
|
if (self.isNot) {
|
||||||
|
result.pass = !result.pass;
|
||||||
|
}
|
||||||
|
|
||||||
|
args[0] = promiseForMessage;
|
||||||
|
message = j$.Expectation.finalizeMessage(self.util, name, self.isNot, args, result);
|
||||||
|
|
||||||
|
self.addExpectationResult(result.pass, {
|
||||||
|
matcherName: name,
|
||||||
|
passed: result.pass,
|
||||||
|
message: message,
|
||||||
|
error: undefined,
|
||||||
|
errorForStack: errorForStack,
|
||||||
|
actual: self.actual
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expect a promise to be resolved.
|
||||||
|
* @function
|
||||||
|
* @async
|
||||||
|
* @name async-matchers#toBeResolved
|
||||||
|
* @example
|
||||||
|
* await expectAsync(aPromise).toBeResolved();
|
||||||
|
* @example
|
||||||
|
* return expectAsync(aPromise).toBeResolved();
|
||||||
|
*/
|
||||||
|
AsyncExpectation.prototype.toBeResolved = function(actual) {
|
||||||
|
return actual.then(
|
||||||
|
function() { return {pass: true}; },
|
||||||
|
function() { return {pass: false}; }
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expect a promise to be rejected.
|
||||||
|
* @function
|
||||||
|
* @async
|
||||||
|
* @name async-matchers#toBeRejected
|
||||||
|
* @example
|
||||||
|
* await expectAsync(aPromise).toBeRejected();
|
||||||
|
* @example
|
||||||
|
* return expectAsync(aPromise).toBeRejected();
|
||||||
|
*/
|
||||||
|
AsyncExpectation.prototype.toBeRejected = function(actual) {
|
||||||
|
return actual.then(
|
||||||
|
function() { return {pass: false}; },
|
||||||
|
function() { return {pass: true}; }
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Expect a promise to be resolved to a value equal to the expected, using deep equality comparison.
|
||||||
|
* @function
|
||||||
|
* @async
|
||||||
|
* @name async-matchers#toBeResolvedTo
|
||||||
|
* @param {Object} expected - Value that the promise is expected to resolve to
|
||||||
|
* @example
|
||||||
|
* await expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
|
||||||
|
* @example
|
||||||
|
* return expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
|
||||||
|
*/
|
||||||
|
AsyncExpectation.prototype.toBeResolvedTo = function(actualPromise, expectedValue) {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
function prefix(passed) {
|
||||||
|
return 'Expected a promise ' +
|
||||||
|
(passed ? 'not ' : '') +
|
||||||
|
'to be resolved to ' + j$.pp(expectedValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
return actualPromise.then(
|
||||||
|
function(actualValue) {
|
||||||
|
if (self.util.equals(actualValue, expectedValue, self.customEqualityTesters)) {
|
||||||
|
return {
|
||||||
|
pass: true,
|
||||||
|
message: prefix(true) + '.'
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
return {
|
||||||
|
pass: false,
|
||||||
|
message: prefix(false) + ' but it was resolved to ' + j$.pp(actualValue) + '.'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function() {
|
||||||
|
return {
|
||||||
|
pass: false,
|
||||||
|
message: prefix(false) + ' but it was rejected.'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
AsyncExpectation.factory = function(options) {
|
||||||
|
var expect = new AsyncExpectation(options);
|
||||||
|
|
||||||
|
options = j$.util.clone(options);
|
||||||
|
options.isNot = true;
|
||||||
|
expect.not = new AsyncExpectation(options);
|
||||||
|
|
||||||
|
return expect;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
return AsyncExpectation;
|
||||||
|
};
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
getJasmineRequireObj().Clock = function() {
|
getJasmineRequireObj().Clock = function() {
|
||||||
|
|
||||||
|
/* global process */
|
||||||
var NODE_JS = typeof process !== 'undefined' && process.versions && typeof process.versions.node === 'string';
|
var NODE_JS = typeof process !== 'undefined' && process.versions && typeof process.versions.node === 'string';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
171
src/core/Env.js
171
src/core/Env.js
@@ -13,9 +13,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
|
|
||||||
var totalSpecsDefined = 0;
|
var totalSpecsDefined = 0;
|
||||||
|
|
||||||
var realSetTimeout = j$.getGlobal().setTimeout;
|
var realSetTimeout = global.setTimeout;
|
||||||
var realClearTimeout = j$.getGlobal().clearTimeout;
|
var realClearTimeout = global.clearTimeout;
|
||||||
var clearStack = j$.getClearStack(j$.getGlobal());
|
var clearStack = j$.getClearStack(global);
|
||||||
this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global));
|
this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global));
|
||||||
|
|
||||||
var runnableResources = {};
|
var runnableResources = {};
|
||||||
@@ -26,6 +26,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
var throwOnExpectationFailure = false;
|
var throwOnExpectationFailure = false;
|
||||||
var stopOnSpecFailure = false;
|
var stopOnSpecFailure = false;
|
||||||
var random = true;
|
var random = true;
|
||||||
|
var hidingDisabled = false;
|
||||||
var seed = null;
|
var seed = null;
|
||||||
var handlingLoadErrors = true;
|
var handlingLoadErrors = true;
|
||||||
var hasFailures = false;
|
var hasFailures = false;
|
||||||
@@ -38,17 +39,29 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return currentSpec || currentSuite();
|
return currentSpec || currentSuite();
|
||||||
};
|
};
|
||||||
|
|
||||||
var globalErrors = new j$.GlobalErrors();
|
var globalErrors = null;
|
||||||
globalErrors.install();
|
|
||||||
globalErrors.pushListener(function(message, filename, lineno) {
|
var installGlobalErrors = function() {
|
||||||
topSuite.result.failedExpectations.push({
|
if (globalErrors) {
|
||||||
passed: false,
|
return;
|
||||||
globalErrorType: 'load',
|
}
|
||||||
message: message,
|
|
||||||
filename: filename,
|
globalErrors = new j$.GlobalErrors();
|
||||||
lineno: lineno
|
globalErrors.install();
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!options.suppressLoadErrors) {
|
||||||
|
installGlobalErrors();
|
||||||
|
globalErrors.pushListener(function(message, filename, lineno) {
|
||||||
|
topSuite.result.failedExpectations.push({
|
||||||
|
passed: false,
|
||||||
|
globalErrorType: 'load',
|
||||||
|
message: message,
|
||||||
|
filename: filename,
|
||||||
|
lineno: lineno
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
this.specFilter = function() {
|
this.specFilter = function() {
|
||||||
return true;
|
return true;
|
||||||
@@ -104,6 +117,19 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var asyncExpectationFactory = function(actual, spec) {
|
||||||
|
return j$.AsyncExpectation.factory({
|
||||||
|
util: j$.matchersUtil,
|
||||||
|
customEqualityTesters: runnableResources[spec.id].customEqualityTesters,
|
||||||
|
actual: actual,
|
||||||
|
addExpectationResult: addExpectationResult
|
||||||
|
});
|
||||||
|
|
||||||
|
function addExpectationResult(passed, result) {
|
||||||
|
return spec.addExpectationResult(passed, result);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
var defaultResourcesForRunnable = function(id, parentRunnableId) {
|
var defaultResourcesForRunnable = function(id, parentRunnableId) {
|
||||||
var resources = {spies: [], customEqualityTesters: [], customMatchers: {}, customSpyStrategies: {}};
|
var resources = {spies: [], customEqualityTesters: [], customMatchers: {}, customSpyStrategies: {}};
|
||||||
|
|
||||||
@@ -162,6 +188,13 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
var maximumSpecCallbackDepth = 20;
|
var maximumSpecCallbackDepth = 20;
|
||||||
var currentSpecCallbackDepth = 0;
|
var currentSpecCallbackDepth = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets whether Jasmine should throw an Error when an expectation fails.
|
||||||
|
* This causes a spec to only have one expectation failure.
|
||||||
|
* @name Env#throwOnExpectationFailure
|
||||||
|
* @function
|
||||||
|
* @param {Boolean} value Whether to throw when a expectation fails
|
||||||
|
*/
|
||||||
this.throwOnExpectationFailure = function(value) {
|
this.throwOnExpectationFailure = function(value) {
|
||||||
throwOnExpectationFailure = !!value;
|
throwOnExpectationFailure = !!value;
|
||||||
};
|
};
|
||||||
@@ -170,6 +203,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return throwOnExpectationFailure;
|
return throwOnExpectationFailure;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether to stop suite execution when a spec fails
|
||||||
|
* @name Env#stopOnSpecFailure
|
||||||
|
* @function
|
||||||
|
* @param {Boolean} value Whether to stop suite execution when a spec fails
|
||||||
|
*/
|
||||||
this.stopOnSpecFailure = function(value) {
|
this.stopOnSpecFailure = function(value) {
|
||||||
stopOnSpecFailure = !!value;
|
stopOnSpecFailure = !!value;
|
||||||
};
|
};
|
||||||
@@ -178,6 +217,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return stopOnSpecFailure;
|
return stopOnSpecFailure;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set whether to randomize test execution order
|
||||||
|
* @name Env#randomizeTests
|
||||||
|
* @function
|
||||||
|
* @param {Boolean} value Whether to randomize execution order
|
||||||
|
*/
|
||||||
this.randomizeTests = function(value) {
|
this.randomizeTests = function(value) {
|
||||||
random = !!value;
|
random = !!value;
|
||||||
};
|
};
|
||||||
@@ -186,6 +231,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return random;
|
return random;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the random number seed for spec randomization
|
||||||
|
* @name Env#seed
|
||||||
|
* @function
|
||||||
|
* @param {Number} value The seed value
|
||||||
|
*/
|
||||||
this.seed = function(value) {
|
this.seed = function(value) {
|
||||||
if (value) {
|
if (value) {
|
||||||
seed = value;
|
seed = value;
|
||||||
@@ -193,18 +244,23 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return seed;
|
return seed;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.suppressLoadErrors = function() {
|
this.hidingDisabled = function(value) {
|
||||||
if (handlingLoadErrors) {
|
return hidingDisabled;
|
||||||
globalErrors.popListener();
|
|
||||||
}
|
|
||||||
handlingLoadErrors = false;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.deprecated = function(msg) {
|
/**
|
||||||
|
* @name Env#hideDisabled
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
|
this.hideDisabled = function(value) {
|
||||||
|
hidingDisabled = !!value;
|
||||||
|
};
|
||||||
|
|
||||||
|
this.deprecated = function(deprecation) {
|
||||||
var runnable = currentRunnable() || topSuite;
|
var runnable = currentRunnable() || topSuite;
|
||||||
runnable.addDeprecationWarning(msg);
|
runnable.addDeprecationWarning(deprecation);
|
||||||
if(typeof console !== 'undefined' && typeof console.warn !== 'undefined') {
|
if(typeof console !== 'undefined' && typeof console.error === 'function') {
|
||||||
console.error('DEPRECATION: ' + msg);
|
console.error('DEPRECATION:', deprecation);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -233,6 +289,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
id: getNextSuiteId(),
|
id: getNextSuiteId(),
|
||||||
description: 'Jasmine__TopLevel__Suite',
|
description: 'Jasmine__TopLevel__Suite',
|
||||||
expectationFactory: expectationFactory,
|
expectationFactory: expectationFactory,
|
||||||
|
asyncExpectationFactory: asyncExpectationFactory,
|
||||||
expectationResultFactory: expectationResultFactory
|
expectationResultFactory: expectationResultFactory
|
||||||
});
|
});
|
||||||
defaultResourcesForRunnable(topSuite.id);
|
defaultResourcesForRunnable(topSuite.id);
|
||||||
@@ -245,6 +302,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
/**
|
/**
|
||||||
* This represents the available reporter callback for an object passed to {@link Env#addReporter}.
|
* This represents the available reporter callback for an object passed to {@link Env#addReporter}.
|
||||||
* @interface Reporter
|
* @interface Reporter
|
||||||
|
* @see custom_reporter
|
||||||
*/
|
*/
|
||||||
var reporter = new j$.ReportDispatcher([
|
var reporter = new j$.ReportDispatcher([
|
||||||
/**
|
/**
|
||||||
@@ -252,6 +310,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
* @function
|
* @function
|
||||||
* @name Reporter#jasmineStarted
|
* @name Reporter#jasmineStarted
|
||||||
* @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run
|
* @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run
|
||||||
|
* @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
|
||||||
|
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
'jasmineStarted',
|
'jasmineStarted',
|
||||||
/**
|
/**
|
||||||
@@ -259,6 +320,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
* @function
|
* @function
|
||||||
* @name Reporter#jasmineDone
|
* @name Reporter#jasmineDone
|
||||||
* @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running.
|
* @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running.
|
||||||
|
* @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
|
||||||
|
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
'jasmineDone',
|
'jasmineDone',
|
||||||
/**
|
/**
|
||||||
@@ -266,6 +330,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
* @function
|
* @function
|
||||||
* @name Reporter#suiteStarted
|
* @name Reporter#suiteStarted
|
||||||
* @param {SuiteResult} result Information about the individual {@link describe} being run
|
* @param {SuiteResult} result Information about the individual {@link describe} being run
|
||||||
|
* @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
|
||||||
|
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
'suiteStarted',
|
'suiteStarted',
|
||||||
/**
|
/**
|
||||||
@@ -275,6 +342,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
* @function
|
* @function
|
||||||
* @name Reporter#suiteDone
|
* @name Reporter#suiteDone
|
||||||
* @param {SuiteResult} result
|
* @param {SuiteResult} result
|
||||||
|
* @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
|
||||||
|
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
'suiteDone',
|
'suiteDone',
|
||||||
/**
|
/**
|
||||||
@@ -282,6 +352,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
* @function
|
* @function
|
||||||
* @name Reporter#specStarted
|
* @name Reporter#specStarted
|
||||||
* @param {SpecResult} result Information about the individual {@link it} being run
|
* @param {SpecResult} result Information about the individual {@link it} being run
|
||||||
|
* @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
|
||||||
|
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
'specStarted',
|
'specStarted',
|
||||||
/**
|
/**
|
||||||
@@ -291,13 +364,16 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
* @function
|
* @function
|
||||||
* @name Reporter#specDone
|
* @name Reporter#specDone
|
||||||
* @param {SpecResult} result
|
* @param {SpecResult} result
|
||||||
|
* @param {Function} [done] Used to specify to Jasmine that this callback is asynchronous and Jasmine should wait until it has been called before moving on.
|
||||||
|
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
'specDone'
|
'specDone'
|
||||||
], queueRunnerFactory);
|
], queueRunnerFactory);
|
||||||
|
|
||||||
this.execute = function(runnablesToRun) {
|
this.execute = function(runnablesToRun) {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.suppressLoadErrors();
|
installGlobalErrors();
|
||||||
|
|
||||||
if(!runnablesToRun) {
|
if(!runnablesToRun) {
|
||||||
if (focusedRunnables.length) {
|
if (focusedRunnables.length) {
|
||||||
@@ -379,8 +455,8 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
/**
|
/**
|
||||||
* Information passed to the {@link Reporter#jasmineDone} event.
|
* Information passed to the {@link Reporter#jasmineDone} event.
|
||||||
* @typedef JasmineDoneInfo
|
* @typedef JasmineDoneInfo
|
||||||
* @property {OverallStatus} - The overall result of the sute: 'passed', 'failed', or 'incomplete'.
|
* @property {OverallStatus} overallStatus - The overall result of the sute: 'passed', 'failed', or 'incomplete'.
|
||||||
* @property {IncompleteReason} - Explanation of why the suite was incimplete.
|
* @property {IncompleteReason} incompleteReason - Explanation of why the suite was incomplete.
|
||||||
* @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
|
* @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
|
||||||
* @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level.
|
* @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level.
|
||||||
* @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level.
|
* @property {Expectation[]} deprecationWarnings - List of deprecation warnings that occurred at the global level.
|
||||||
@@ -407,10 +483,22 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
reporter.addReporter(reporterToAdd);
|
reporter.addReporter(reporterToAdd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provide a fallback reporter if no other reporters have been specified.
|
||||||
|
* @name Env#provideFallbackReporter
|
||||||
|
* @function
|
||||||
|
* @param {Reporter} reporterToAdd The reporter
|
||||||
|
* @see custom_reporter
|
||||||
|
*/
|
||||||
this.provideFallbackReporter = function(reporterToAdd) {
|
this.provideFallbackReporter = function(reporterToAdd) {
|
||||||
reporter.provideFallbackReporter(reporterToAdd);
|
reporter.provideFallbackReporter(reporterToAdd);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear all registered reporters
|
||||||
|
* @name Env#clearReporters
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
this.clearReporters = function() {
|
this.clearReporters = function() {
|
||||||
reporter.clearReporters();
|
reporter.clearReporters();
|
||||||
};
|
};
|
||||||
@@ -449,7 +537,16 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return spyRegistry.spyOnProperty.apply(spyRegistry, arguments);
|
return spyRegistry.spyOnProperty.apply(spyRegistry, arguments);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.spyOnAllFunctions = function() {
|
||||||
|
return spyRegistry.spyOnAllFunctions.apply(spyRegistry, arguments);
|
||||||
|
};
|
||||||
|
|
||||||
this.createSpy = function(name, originalFn) {
|
this.createSpy = function(name, originalFn) {
|
||||||
|
if (arguments.length === 1 && j$.isFunction_(name)) {
|
||||||
|
originalFn = name;
|
||||||
|
name = originalFn.name;
|
||||||
|
}
|
||||||
|
|
||||||
return spyFactory.createSpy(name, originalFn);
|
return spyFactory.createSpy(name, originalFn);
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -483,6 +580,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
description: description,
|
description: description,
|
||||||
parentSuite: currentDeclarationSuite,
|
parentSuite: currentDeclarationSuite,
|
||||||
expectationFactory: expectationFactory,
|
expectationFactory: expectationFactory,
|
||||||
|
asyncExpectationFactory: asyncExpectationFactory,
|
||||||
expectationResultFactory: expectationResultFactory,
|
expectationResultFactory: expectationResultFactory,
|
||||||
throwOnExpectationFailure: throwOnExpectationFailure
|
throwOnExpectationFailure: throwOnExpectationFailure
|
||||||
});
|
});
|
||||||
@@ -576,6 +674,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
id: getNextSpecId(),
|
id: getNextSpecId(),
|
||||||
beforeAndAfterFns: beforeAndAfterFns(suite),
|
beforeAndAfterFns: beforeAndAfterFns(suite),
|
||||||
expectationFactory: expectationFactory,
|
expectationFactory: expectationFactory,
|
||||||
|
asyncExpectationFactory: asyncExpectationFactory,
|
||||||
resultCallback: specResultCallback,
|
resultCallback: specResultCallback,
|
||||||
getSpecName: function(spec) {
|
getSpecName: function(spec) {
|
||||||
return getSpecName(spec, suite);
|
return getSpecName(spec, suite);
|
||||||
@@ -587,7 +686,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
userContext: function() { return suite.clonedSharedUserContext(); },
|
userContext: function() { return suite.clonedSharedUserContext(); },
|
||||||
queueableFn: {
|
queueableFn: {
|
||||||
fn: fn,
|
fn: fn,
|
||||||
timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
|
timeout: timeout || 0
|
||||||
},
|
},
|
||||||
throwOnExpectationFailure: throwOnExpectationFailure
|
throwOnExpectationFailure: throwOnExpectationFailure
|
||||||
});
|
});
|
||||||
@@ -657,12 +756,20 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
return currentRunnable().expect(actual);
|
return currentRunnable().expect(actual);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.expectAsync = function(actual) {
|
||||||
|
if (!currentRunnable()) {
|
||||||
|
throw new Error('\'expectAsync\' was used when there was no current spec, this could be because an asynchronous test timed out');
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentRunnable().expectAsync(actual);
|
||||||
|
};
|
||||||
|
|
||||||
this.beforeEach = function(beforeEachFunction, timeout) {
|
this.beforeEach = function(beforeEachFunction, timeout) {
|
||||||
ensureIsNotNested('beforeEach');
|
ensureIsNotNested('beforeEach');
|
||||||
ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach');
|
ensureIsFunctionOrAsync(beforeEachFunction, 'beforeEach');
|
||||||
currentDeclarationSuite.beforeEach({
|
currentDeclarationSuite.beforeEach({
|
||||||
fn: beforeEachFunction,
|
fn: beforeEachFunction,
|
||||||
timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
|
timeout: timeout || 0
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -671,7 +778,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll');
|
ensureIsFunctionOrAsync(beforeAllFunction, 'beforeAll');
|
||||||
currentDeclarationSuite.beforeAll({
|
currentDeclarationSuite.beforeAll({
|
||||||
fn: beforeAllFunction,
|
fn: beforeAllFunction,
|
||||||
timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
|
timeout: timeout || 0
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -681,7 +788,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
afterEachFunction.isCleanup = true;
|
afterEachFunction.isCleanup = true;
|
||||||
currentDeclarationSuite.afterEach({
|
currentDeclarationSuite.afterEach({
|
||||||
fn: afterEachFunction,
|
fn: afterEachFunction,
|
||||||
timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
|
timeout: timeout || 0
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -690,7 +797,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
ensureIsFunctionOrAsync(afterAllFunction, 'afterAll');
|
ensureIsFunctionOrAsync(afterAllFunction, 'afterAll');
|
||||||
currentDeclarationSuite.afterAll({
|
currentDeclarationSuite.afterAll({
|
||||||
fn: afterAllFunction,
|
fn: afterAllFunction,
|
||||||
timeout: function() { return timeout || j$.DEFAULT_TIMEOUT_INTERVAL; }
|
timeout: timeout || 0
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -712,11 +819,11 @@ getJasmineRequireObj().Env = function(j$) {
|
|||||||
message += ': ';
|
message += ': ';
|
||||||
if (error.message) {
|
if (error.message) {
|
||||||
message += error.message;
|
message += error.message;
|
||||||
} else if (jasmine.isString_(error)) {
|
} else if (j$.isString_(error)) {
|
||||||
message += error;
|
message += error;
|
||||||
} else {
|
} else {
|
||||||
// pretty print all kind of objects. This includes arrays.
|
// pretty print all kind of objects. This includes arrays.
|
||||||
message += jasmine.pp(error);
|
message += j$.pp(error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -27,20 +27,24 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
var stackTrace = new j$.StackTrace(error.stack);
|
var stackTrace = new j$.StackTrace(error);
|
||||||
var lines = filterJasmine(stackTrace);
|
var lines = filterJasmine(stackTrace);
|
||||||
|
var result = '';
|
||||||
|
|
||||||
if (stackTrace.message) {
|
if (stackTrace.message) {
|
||||||
lines.unshift(stackTrace.message);
|
lines.unshift(stackTrace.message);
|
||||||
}
|
}
|
||||||
|
|
||||||
return lines.join('\n');
|
result += formatProperties(error);
|
||||||
|
result += lines.join('\n');
|
||||||
|
|
||||||
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
function filterJasmine(stackTrace) {
|
function filterJasmine(stackTrace) {
|
||||||
var result = [],
|
var result = [],
|
||||||
jasmineMarker = stackTrace.style === 'webkit' ? '<Jasmine>' : ' at <Jasmine>';
|
jasmineMarker = stackTrace.style === 'webkit' ? '<Jasmine>' : ' at <Jasmine>';
|
||||||
|
|
||||||
stackTrace.frames.forEach(function(frame) {
|
stackTrace.frames.forEach(function(frame) {
|
||||||
if (frame.file && frame.file !== jasmineFile) {
|
if (frame.file && frame.file !== jasmineFile) {
|
||||||
result.push(frame.raw);
|
result.push(frame.raw);
|
||||||
@@ -48,9 +52,33 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
|||||||
result.push(jasmineMarker);
|
result.push(jasmineMarker);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function formatProperties(error) {
|
||||||
|
if (!(error instanceof Object)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var ignored = ['name', 'message', 'stack', 'fileName', 'sourceURL', 'line', 'lineNumber', 'column', 'description'];
|
||||||
|
var result = {};
|
||||||
|
var empty = true;
|
||||||
|
|
||||||
|
for (var prop in error) {
|
||||||
|
if (j$.util.arrayContains(ignored, prop)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
result[prop] = error[prop];
|
||||||
|
empty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!empty) {
|
||||||
|
return 'error properties: ' + j$.pp(result) + '\n';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ExceptionFormatter;
|
return ExceptionFormatter;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ getJasmineRequireObj().Expectation = function() {
|
|||||||
return function() {
|
return function() {
|
||||||
var args = Array.prototype.slice.call(arguments, 0),
|
var args = Array.prototype.slice.call(arguments, 0),
|
||||||
expected = args.slice(0),
|
expected = args.slice(0),
|
||||||
message = '';
|
message;
|
||||||
|
|
||||||
args.unshift(this.actual);
|
args.unshift(this.actual);
|
||||||
|
|
||||||
@@ -39,20 +39,7 @@ getJasmineRequireObj().Expectation = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var result = matcherCompare.apply(null, args);
|
var result = matcherCompare.apply(null, args);
|
||||||
|
message = Expectation.finalizeMessage(this.util, name, this.isNot, args, result);
|
||||||
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) {
|
if (expected.length == 1) {
|
||||||
expected = expected[0];
|
expected = expected[0];
|
||||||
@@ -73,6 +60,23 @@ getJasmineRequireObj().Expectation = function() {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Expectation.finalizeMessage = function(util, name, isNot, args, result) {
|
||||||
|
if (result.pass) {
|
||||||
|
return '';
|
||||||
|
} else if (result.message) {
|
||||||
|
if (Object.prototype.toString.apply(result.message) === '[object Function]') {
|
||||||
|
return result.message();
|
||||||
|
} else {
|
||||||
|
return result.message;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
args = args.slice();
|
||||||
|
args.unshift(isNot);
|
||||||
|
args.unshift(name);
|
||||||
|
return util.buildFailureMessage.apply(null, args);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
Expectation.addCoreMatchers = function(matchers) {
|
Expectation.addCoreMatchers = function(matchers) {
|
||||||
var prototype = Expectation.prototype;
|
var prototype = Expectation.prototype;
|
||||||
for (var matcherName in matchers) {
|
for (var matcherName in matchers) {
|
||||||
|
|||||||
@@ -45,10 +45,16 @@ getJasmineRequireObj().buildExpectationResult = function() {
|
|||||||
|
|
||||||
var error = options.error;
|
var error = options.error;
|
||||||
if (!error) {
|
if (!error) {
|
||||||
try {
|
if (options.errorForStack) {
|
||||||
throw new Error(message());
|
error = options.errorForStack;
|
||||||
} catch (e) {
|
} else if (options.stack) {
|
||||||
error = e;
|
error = options;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
throw new Error(message());
|
||||||
|
} catch (e) {
|
||||||
|
error = e;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return stackFormatter(error);
|
return stackFormatter(error);
|
||||||
|
|||||||
@@ -13,18 +13,29 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.originalHandlers = {};
|
||||||
|
this.installOne_ = function installOne_(errorType) {
|
||||||
|
this.originalHandlers[errorType] = global.process.listeners(errorType);
|
||||||
|
global.process.removeAllListeners(errorType);
|
||||||
|
global.process.on(errorType, onerror);
|
||||||
|
|
||||||
|
this.uninstall = function uninstall() {
|
||||||
|
var errorTypes = Object.keys(this.originalHandlers);
|
||||||
|
for (var iType = 0; iType < errorTypes.length; iType++) {
|
||||||
|
var errorType = errorTypes[iType];
|
||||||
|
global.process.removeListener(errorType, onerror);
|
||||||
|
for (var i = 0; i < this.originalHandlers[errorType].length; i++) {
|
||||||
|
global.process.on(errorType, this.originalHandlers[errorType][i]);
|
||||||
|
}
|
||||||
|
delete this.originalHandlers[errorType];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
this.install = function install() {
|
this.install = function install() {
|
||||||
if (global.process && global.process.listeners && j$.isFunction_(global.process.on)) {
|
if (global.process && global.process.listeners && j$.isFunction_(global.process.on)) {
|
||||||
var originalHandlers = global.process.listeners('uncaughtException');
|
this.installOne_('uncaughtException');
|
||||||
global.process.removeAllListeners('uncaughtException');
|
this.installOne_('unhandledRejection');
|
||||||
global.process.on('uncaughtException', onerror);
|
|
||||||
|
|
||||||
this.uninstall = function uninstall() {
|
|
||||||
global.process.removeListener('uncaughtException', onerror);
|
|
||||||
for (var i = 0; i < originalHandlers.length; i++) {
|
|
||||||
global.process.on('uncaughtException', originalHandlers[i]);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
} else {
|
||||||
var originalHandler = global.onerror;
|
var originalHandler = global.onerror;
|
||||||
global.onerror = onerror;
|
global.onerror = onerror;
|
||||||
|
|||||||
@@ -233,8 +233,8 @@ getJasmineRequireObj().pp = function(j$) {
|
|||||||
if (el.innerHTML === '') {
|
if (el.innerHTML === '') {
|
||||||
this.append(el.outerHTML.replace(closingTag, ''));
|
this.append(el.outerHTML.replace(closingTag, ''));
|
||||||
} else {
|
} else {
|
||||||
var tagEnd = el.outerHTML.indexOf(el.innerHTML);
|
var tagEnd = el.outerHTML.indexOf('>');
|
||||||
this.append(el.outerHTML.substring(0, tagEnd));
|
this.append(el.outerHTML.substring(0, tagEnd + 1));
|
||||||
this.append('...' + closingTag);
|
this.append('...' + closingTag);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -105,12 +105,16 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
|
|
||||||
self.globalErrors.pushListener(handleError);
|
self.globalErrors.pushListener(handleError);
|
||||||
|
|
||||||
if (queueableFn.timeout) {
|
if (queueableFn.timeout !== undefined) {
|
||||||
|
var timeoutInterval = queueableFn.timeout || j$.DEFAULT_TIMEOUT_INTERVAL;
|
||||||
timeoutId = self.setTimeout(function() {
|
timeoutId = self.setTimeout(function() {
|
||||||
var error = new Error('Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.');
|
var error = new Error(
|
||||||
|
'Timeout - Async callback was not invoked within ' + timeoutInterval + 'ms ' +
|
||||||
|
(queueableFn.timeout ? '(custom timeout)' : '(set by jasmine.DEFAULT_TIMEOUT_INTERVAL)')
|
||||||
|
);
|
||||||
onException(error);
|
onException(error);
|
||||||
next();
|
next();
|
||||||
}, queueableFn.timeout());
|
}, timeoutInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -159,7 +163,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
self.errored = result.errored;
|
self.errored = self.errored || result.errored;
|
||||||
|
|
||||||
if (this.completeOnFirstError && result.errored) {
|
if (this.completeOnFirstError && result.errored) {
|
||||||
this.skipToCleanup(iterativeIndex);
|
this.skipToCleanup(iterativeIndex);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
getJasmineRequireObj().Spec = function(j$) {
|
getJasmineRequireObj().Spec = function(j$) {
|
||||||
function Spec(attrs) {
|
function Spec(attrs) {
|
||||||
this.expectationFactory = attrs.expectationFactory;
|
this.expectationFactory = attrs.expectationFactory;
|
||||||
|
this.asyncExpectationFactory = attrs.asyncExpectationFactory;
|
||||||
this.resultCallback = attrs.resultCallback || function() {};
|
this.resultCallback = attrs.resultCallback || function() {};
|
||||||
this.id = attrs.id;
|
this.id = attrs.id;
|
||||||
this.description = attrs.description || '';
|
this.description = attrs.description || '';
|
||||||
@@ -57,6 +58,10 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
return this.expectationFactory(actual, this);
|
return this.expectationFactory(actual, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Spec.prototype.expectAsync = function(actual) {
|
||||||
|
return this.asyncExpectationFactory(actual, this);
|
||||||
|
};
|
||||||
|
|
||||||
Spec.prototype.execute = function(onComplete, excluded) {
|
Spec.prototype.execute = function(onComplete, excluded) {
|
||||||
var self = this;
|
var self = this;
|
||||||
|
|
||||||
@@ -152,8 +157,11 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
return this.getSpecName(this);
|
return this.getSpecName(this);
|
||||||
};
|
};
|
||||||
|
|
||||||
Spec.prototype.addDeprecationWarning = function(msg) {
|
Spec.prototype.addDeprecationWarning = function(deprecation) {
|
||||||
this.result.deprecationWarnings.push(this.expectationResultFactory({ message: msg }));
|
if (typeof deprecation === 'string') {
|
||||||
|
deprecation = { message: deprecation };
|
||||||
|
}
|
||||||
|
this.result.deprecationWarnings.push(this.expectationResultFactory(deprecation));
|
||||||
};
|
};
|
||||||
|
|
||||||
var extractCustomPendingMessage = function(e) {
|
var extractCustomPendingMessage = function(e) {
|
||||||
@@ -174,5 +182,6 @@ getJasmineRequireObj().Spec = function(j$) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (typeof window == void 0 && typeof exports == 'object') {
|
if (typeof window == void 0 && typeof exports == 'object') {
|
||||||
|
/* globals exports */
|
||||||
exports.Spec = jasmineRequire.Spec;
|
exports.Spec = jasmineRequire.Spec;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -120,6 +120,23 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
|
|||||||
return spy;
|
return spy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.spyOnAllFunctions = function(obj) {
|
||||||
|
if (j$.util.isUndefined(obj)) {
|
||||||
|
throw new Error('spyOnAllFunctions could not find an object to spy upon');
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var prop in obj) {
|
||||||
|
if (Object.prototype.hasOwnProperty.call(obj, prop) && obj[prop] instanceof Function) {
|
||||||
|
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
||||||
|
if ((descriptor.writable || descriptor.set) && descriptor.configurable) {
|
||||||
|
this.spyOn(obj, prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
};
|
||||||
|
|
||||||
this.clearSpies = function() {
|
this.clearSpies = function() {
|
||||||
var spies = currentSpies();
|
var spies = currentSpies();
|
||||||
for (var i = spies.length - 1; i >= 0; i--) {
|
for (var i = spies.length - 1; i >= 0; i--) {
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
getJasmineRequireObj().StackTrace = function(j$) {
|
getJasmineRequireObj().StackTrace = function(j$) {
|
||||||
function StackTrace(rawTrace) {
|
function StackTrace(error) {
|
||||||
var lines = rawTrace
|
var lines = error.stack
|
||||||
.split('\n')
|
.split('\n')
|
||||||
.filter(function(line) { return line !== ''; });
|
.filter(function(line) { return line !== ''; });
|
||||||
|
|
||||||
if (lines[0].match(/^Error/)) {
|
var extractResult = extractMessage(error.message, lines);
|
||||||
this.message = lines.shift();
|
|
||||||
} else {
|
if (extractResult) {
|
||||||
this.message = undefined;
|
this.message = extractResult.message;
|
||||||
|
lines = extractResult.remainder;
|
||||||
}
|
}
|
||||||
|
|
||||||
var parseResult = tryParseFrames(lines);
|
var parseResult = tryParseFrames(lines);
|
||||||
@@ -75,6 +76,34 @@ getJasmineRequireObj().StackTrace = function(j$) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function extractMessage(message, stackLines) {
|
||||||
|
var len = messagePrefixLength(message, stackLines);
|
||||||
|
|
||||||
|
if (len > 0) {
|
||||||
|
return {
|
||||||
|
message: stackLines.slice(0, len).join('\n'),
|
||||||
|
remainder: stackLines.slice(len)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function messagePrefixLength(message, stackLines) {
|
||||||
|
if (!stackLines[0].match(/^Error/)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var messageLines = message.split('\n');
|
||||||
|
var i;
|
||||||
|
|
||||||
|
for (i = 1; i < messageLines.length; i++) {
|
||||||
|
if (messageLines[i] !== stackLines[i]) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return messageLines.length;
|
||||||
|
}
|
||||||
|
|
||||||
return StackTrace;
|
return StackTrace;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ getJasmineRequireObj().Suite = function(j$) {
|
|||||||
this.parentSuite = attrs.parentSuite;
|
this.parentSuite = attrs.parentSuite;
|
||||||
this.description = attrs.description;
|
this.description = attrs.description;
|
||||||
this.expectationFactory = attrs.expectationFactory;
|
this.expectationFactory = attrs.expectationFactory;
|
||||||
|
this.asyncExpectationFactory = attrs.asyncExpectationFactory;
|
||||||
this.expectationResultFactory = attrs.expectationResultFactory;
|
this.expectationResultFactory = attrs.expectationResultFactory;
|
||||||
this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
|
this.throwOnExpectationFailure = !!attrs.throwOnExpectationFailure;
|
||||||
|
|
||||||
@@ -37,6 +38,10 @@ getJasmineRequireObj().Suite = function(j$) {
|
|||||||
return this.expectationFactory(actual, this);
|
return this.expectationFactory(actual, this);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Suite.prototype.expectAsync = function(actual) {
|
||||||
|
return this.asyncExpectationFactory(actual, this);
|
||||||
|
};
|
||||||
|
|
||||||
Suite.prototype.getFullName = function() {
|
Suite.prototype.getFullName = function() {
|
||||||
var fullName = [];
|
var fullName = [];
|
||||||
for (var parentSuite = this; parentSuite; parentSuite = parentSuite.parentSuite) {
|
for (var parentSuite = this; parentSuite; parentSuite = parentSuite.parentSuite) {
|
||||||
@@ -148,8 +153,11 @@ getJasmineRequireObj().Suite = function(j$) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Suite.prototype.addDeprecationWarning = function(msg) {
|
Suite.prototype.addDeprecationWarning = function(deprecation) {
|
||||||
this.result.deprecationWarnings.push(this.expectationResultFactory({ message: msg }));
|
if (typeof deprecation === 'string') {
|
||||||
|
deprecation = { message: deprecation };
|
||||||
|
}
|
||||||
|
this.result.deprecationWarnings.push(this.expectationResultFactory(deprecation));
|
||||||
};
|
};
|
||||||
|
|
||||||
function isFailure(args) {
|
function isFailure(args) {
|
||||||
@@ -160,5 +168,6 @@ getJasmineRequireObj().Suite = function(j$) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (typeof window == void 0 && typeof exports == 'object') {
|
if (typeof window == void 0 && typeof exports == 'object') {
|
||||||
|
/* globals exports */
|
||||||
exports.Suite = jasmineRequire.Suite;
|
exports.Suite = jasmineRequire.Suite;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -174,8 +174,11 @@ getJasmineRequireObj().TreeProcessor = function() {
|
|||||||
|
|
||||||
queueRunnerFactory({
|
queueRunnerFactory({
|
||||||
onComplete: function () {
|
onComplete: function () {
|
||||||
|
var args = Array.prototype.slice.call(arguments, [0]);
|
||||||
node.cleanupBeforeAfter();
|
node.cleanupBeforeAfter();
|
||||||
nodeComplete(node, node.getResult(), done);
|
nodeComplete(node, node.getResult(), function() {
|
||||||
|
done.apply(undefined, args);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)),
|
queueableFns: [onStart].concat(wrapChildren(node, segmentNumber)),
|
||||||
userContext: node.sharedUserContext(),
|
userContext: node.sharedUserContext(),
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ getJasmineRequireObj().Any = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* jshint -W122 */
|
/* jshint -W122 */
|
||||||
|
/* global Symbol */
|
||||||
if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) {
|
if (typeof Symbol != 'undefined' && this.expectedObject == Symbol) {
|
||||||
return typeof other == 'symbol';
|
return typeof other == 'symbol';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ getJasmineRequireObj().ArrayContaining = function(j$) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
ArrayContaining.prototype.jasmineToString = function () {
|
ArrayContaining.prototype.jasmineToString = function () {
|
||||||
return '<jasmine.arrayContaining(' + jasmine.pp(this.sample) +')>';
|
return '<jasmine.arrayContaining(' + j$.pp(this.sample) +')>';
|
||||||
};
|
};
|
||||||
|
|
||||||
return ArrayContaining;
|
return ArrayContaining;
|
||||||
|
|||||||
25
src/core/asymmetric_equality/Empty.js
Normal file
25
src/core/asymmetric_equality/Empty.js
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
getJasmineRequireObj().Empty = function (j$) {
|
||||||
|
|
||||||
|
function Empty() {}
|
||||||
|
|
||||||
|
Empty.prototype.asymmetricMatch = function (other) {
|
||||||
|
if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) {
|
||||||
|
return other.length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j$.isMap(other) || j$.isSet(other)) {
|
||||||
|
return other.size === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j$.isObject_(other)) {
|
||||||
|
return Object.keys(other).length === 0;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
Empty.prototype.jasmineToString = function () {
|
||||||
|
return '<jasmine.empty>';
|
||||||
|
};
|
||||||
|
|
||||||
|
return Empty;
|
||||||
|
};
|
||||||
14
src/core/asymmetric_equality/Falsy.js
Normal file
14
src/core/asymmetric_equality/Falsy.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
getJasmineRequireObj().Falsy = function(j$) {
|
||||||
|
|
||||||
|
function Falsy() {}
|
||||||
|
|
||||||
|
Falsy.prototype.asymmetricMatch = function(other) {
|
||||||
|
return !other;
|
||||||
|
};
|
||||||
|
|
||||||
|
Falsy.prototype.jasmineToString = function() {
|
||||||
|
return '<jasmine.falsy>';
|
||||||
|
};
|
||||||
|
|
||||||
|
return Falsy;
|
||||||
|
};
|
||||||
26
src/core/asymmetric_equality/NotEmpty.js
Normal file
26
src/core/asymmetric_equality/NotEmpty.js
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
getJasmineRequireObj().NotEmpty = function (j$) {
|
||||||
|
|
||||||
|
function NotEmpty() {}
|
||||||
|
|
||||||
|
NotEmpty.prototype.asymmetricMatch = function (other) {
|
||||||
|
if (j$.isString_(other) || j$.isArray_(other) || j$.isTypedArray_(other)) {
|
||||||
|
return other.length !== 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j$.isMap(other) || j$.isSet(other)) {
|
||||||
|
return other.size !== 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j$.isObject_(other)) {
|
||||||
|
return Object.keys(other).length !== 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
|
NotEmpty.prototype.jasmineToString = function () {
|
||||||
|
return '<jasmine.notEmpty>';
|
||||||
|
};
|
||||||
|
|
||||||
|
return NotEmpty;
|
||||||
|
};
|
||||||
14
src/core/asymmetric_equality/Truthy.js
Normal file
14
src/core/asymmetric_equality/Truthy.js
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
getJasmineRequireObj().Truthy = function(j$) {
|
||||||
|
|
||||||
|
function Truthy() {}
|
||||||
|
|
||||||
|
Truthy.prototype.asymmetricMatch = function(other) {
|
||||||
|
return !!other;
|
||||||
|
};
|
||||||
|
|
||||||
|
Truthy.prototype.jasmineToString = function() {
|
||||||
|
return '<jasmine.truthy>';
|
||||||
|
};
|
||||||
|
|
||||||
|
return Truthy;
|
||||||
|
};
|
||||||
@@ -101,7 +101,14 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
j$.isDomNode = function(obj) {
|
j$.isDomNode = function(obj) {
|
||||||
return obj.nodeType > 0;
|
// Node is a function, because constructors
|
||||||
|
return typeof jasmineGlobal.Node !== 'undefined' ?
|
||||||
|
obj instanceof jasmineGlobal.Node :
|
||||||
|
obj !== null &&
|
||||||
|
typeof obj === 'object' &&
|
||||||
|
typeof obj.nodeType === 'number' &&
|
||||||
|
typeof obj.nodeName === 'string';
|
||||||
|
// return obj.nodeType > 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
j$.isMap = function(obj) {
|
j$.isMap = function(obj) {
|
||||||
@@ -113,7 +120,7 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
j$.isPromise = function(obj) {
|
j$.isPromise = function(obj) {
|
||||||
return typeof jasmineGlobal.Promise !== 'undefined' && obj.constructor === jasmineGlobal.Promise;
|
return typeof jasmineGlobal.Promise !== 'undefined' && obj && obj.constructor === jasmineGlobal.Promise;
|
||||||
};
|
};
|
||||||
|
|
||||||
j$.fnNameFor = function(func) {
|
j$.fnNameFor = function(func) {
|
||||||
@@ -121,8 +128,8 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|||||||
return func.name;
|
return func.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
var matches = func.toString().match(/^\s*function\s*(\w*)\s*\(/) ||
|
var matches = func.toString().match(/^\s*function\s*(\w+)\s*\(/) ||
|
||||||
func.toString().match(/^\s*\[object\s*(\w*)Constructor\]/);
|
func.toString().match(/^\s*\[object\s*(\w+)Constructor\]/);
|
||||||
|
|
||||||
return matches ? matches[1] : '<anonymous>';
|
return matches ? matches[1] : '<anonymous>';
|
||||||
};
|
};
|
||||||
@@ -148,6 +155,38 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|||||||
return new j$.Anything();
|
return new j$.Anything();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
|
||||||
|
* that will succeed if the actual value being compared is `true` or anything truthy.
|
||||||
|
* @name jasmine.truthy
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
|
j$.truthy = function() {return new j$.Truthy();};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
|
||||||
|
* that will succeed if the actual value being compared is `null`, `undefined`, `0`, `false` or anything falsey.
|
||||||
|
* @name jasmine.falsy
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
|
j$.falsy = function() {return new j$.Falsy();};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
|
||||||
|
* that will succeed if the actual value being compared is empty.
|
||||||
|
* @name jasmine.empty
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
|
j$.empty = function() {return new j$.Empty();};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
|
||||||
|
* that will succeed if the actual value being compared is not empty.
|
||||||
|
* @name jasmine.notEmpty
|
||||||
|
* @function
|
||||||
|
*/
|
||||||
|
j$.notEmpty = function() {return new j$.NotEmpty();};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
|
* Get a matcher, usable in any {@link matchers|matcher} that uses Jasmine's equality (e.g. {@link matchers#toEqual|toEqual}, {@link matchers#toContain|toContain}, or {@link matchers#toHaveBeenCalledWith|toHaveBeenCalledWith}),
|
||||||
* that will succeed if the actual value being compared contains at least the keys and values.
|
* that will succeed if the actual value being compared contains at least the keys and values.
|
||||||
|
|||||||
@@ -225,8 +225,14 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
for (i = 0; i < aLength || i < bLength; i++) {
|
for (i = 0; i < aLength || i < bLength; i++) {
|
||||||
|
var formatter = false;
|
||||||
diffBuilder.withPath(i, function() {
|
diffBuilder.withPath(i, function() {
|
||||||
result = eq(i < aLength ? a[i] : void 0, i < bLength ? b[i] : void 0, aStack, bStack, customTesters, diffBuilder) && result;
|
if (i >= bLength) {
|
||||||
|
diffBuilder.record(a[i], void 0, actualArrayIsLongerFormatter);
|
||||||
|
result = false;
|
||||||
|
} else {
|
||||||
|
result = eq(i < aLength ? a[i] : void 0, i < bLength ? b[i] : void 0, aStack, bStack, customTesters, diffBuilder) && result;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
if (!result) {
|
if (!result) {
|
||||||
@@ -452,6 +458,13 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|||||||
', but was ' + j$.pp(actual) + '.';
|
', but was ' + j$.pp(actual) + '.';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function actualArrayIsLongerFormatter(actual, expected, path) {
|
||||||
|
return 'Unexpected ' +
|
||||||
|
path + (path.depth() ? ' = ' : '') +
|
||||||
|
j$.pp(actual) +
|
||||||
|
' in array.';
|
||||||
|
}
|
||||||
|
|
||||||
function formatKeyValuePairs(obj) {
|
function formatKeyValuePairs(obj) {
|
||||||
var formatted = '';
|
var formatted = '';
|
||||||
for (var key in obj) {
|
for (var key in obj) {
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
|
|||||||
'toHaveBeenCalledBefore',
|
'toHaveBeenCalledBefore',
|
||||||
'toHaveBeenCalledTimes',
|
'toHaveBeenCalledTimes',
|
||||||
'toHaveBeenCalledWith',
|
'toHaveBeenCalledWith',
|
||||||
|
'toHaveClass',
|
||||||
'toMatch',
|
'toMatch',
|
||||||
'toThrow',
|
'toThrow',
|
||||||
'toThrowError',
|
'toThrowError',
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
jasmineRequire.toHaveClass = function(j$) {
|
getJasmineRequireObj().toHaveClass = function(j$) {
|
||||||
/**
|
/**
|
||||||
* {@link expect} the actual value to be a DOM element that has the expected class
|
* {@link expect} the actual value to be a DOM element that has the expected class
|
||||||
* @function
|
* @function
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
var getJasmineRequireObj = (function (jasmineGlobal) {
|
var getJasmineRequireObj = (function (jasmineGlobal) {
|
||||||
|
/* globals exports, global, module, window */
|
||||||
var jasmineRequire;
|
var jasmineRequire;
|
||||||
|
|
||||||
if (typeof module !== 'undefined' && module.exports && typeof exports !== 'undefined') {
|
if (typeof module !== 'undefined' && module.exports && typeof exports !== 'undefined') {
|
||||||
@@ -37,6 +38,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|||||||
j$.StackTrace = jRequire.StackTrace(j$);
|
j$.StackTrace = jRequire.StackTrace(j$);
|
||||||
j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$);
|
j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$);
|
||||||
j$.Expectation = jRequire.Expectation();
|
j$.Expectation = jRequire.Expectation();
|
||||||
|
j$.AsyncExpectation = jRequire.AsyncExpectation(j$);
|
||||||
j$.buildExpectationResult = jRequire.buildExpectationResult();
|
j$.buildExpectationResult = jRequire.buildExpectationResult();
|
||||||
j$.JsApiReporter = jRequire.JsApiReporter();
|
j$.JsApiReporter = jRequire.JsApiReporter();
|
||||||
j$.matchersUtil = jRequire.matchersUtil(j$);
|
j$.matchersUtil = jRequire.matchersUtil(j$);
|
||||||
@@ -63,6 +65,11 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|||||||
j$.ObjectPath = jRequire.ObjectPath(j$);
|
j$.ObjectPath = jRequire.ObjectPath(j$);
|
||||||
j$.GlobalErrors = jRequire.GlobalErrors(j$);
|
j$.GlobalErrors = jRequire.GlobalErrors(j$);
|
||||||
|
|
||||||
|
j$.Truthy = jRequire.Truthy(j$);
|
||||||
|
j$.Falsy = jRequire.Falsy(j$);
|
||||||
|
j$.Empty = jRequire.Empty(j$);
|
||||||
|
j$.NotEmpty = jRequire.NotEmpty(j$);
|
||||||
|
|
||||||
j$.matchers = jRequire.requireMatchers(jRequire, j$);
|
j$.matchers = jRequire.requireMatchers(jRequire, j$);
|
||||||
|
|
||||||
return j$;
|
return j$;
|
||||||
|
|||||||
@@ -63,6 +63,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
* @param {String} description Textual description of what this spec is checking
|
* @param {String} description Textual description of what this spec is checking
|
||||||
* @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`.
|
* @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`.
|
||||||
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
it: function() {
|
it: function() {
|
||||||
return env.it.apply(env, arguments);
|
return env.it.apply(env, arguments);
|
||||||
@@ -92,6 +93,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
* @param {String} description Textual description of what this spec is checking.
|
* @param {String} description Textual description of what this spec is checking.
|
||||||
* @param {implementationCallback} testFunction Function that contains the code of your test.
|
* @param {implementationCallback} testFunction Function that contains the code of your test.
|
||||||
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
fit: function() {
|
fit: function() {
|
||||||
return env.fit.apply(env, arguments);
|
return env.fit.apply(env, arguments);
|
||||||
@@ -104,6 +106,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
* @global
|
* @global
|
||||||
* @param {implementationCallback} [function] Function that contains the code to setup your specs.
|
* @param {implementationCallback} [function] Function that contains the code to setup your specs.
|
||||||
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach.
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
beforeEach: function() {
|
beforeEach: function() {
|
||||||
return env.beforeEach.apply(env, arguments);
|
return env.beforeEach.apply(env, arguments);
|
||||||
@@ -116,6 +119,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
* @global
|
* @global
|
||||||
* @param {implementationCallback} [function] Function that contains the code to teardown your specs.
|
* @param {implementationCallback} [function] Function that contains the code to teardown your specs.
|
||||||
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach.
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
afterEach: function() {
|
afterEach: function() {
|
||||||
return env.afterEach.apply(env, arguments);
|
return env.afterEach.apply(env, arguments);
|
||||||
@@ -130,6 +134,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
* @global
|
* @global
|
||||||
* @param {implementationCallback} [function] Function that contains the code to setup your specs.
|
* @param {implementationCallback} [function] Function that contains the code to setup your specs.
|
||||||
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll.
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
beforeAll: function() {
|
beforeAll: function() {
|
||||||
return env.beforeAll.apply(env, arguments);
|
return env.beforeAll.apply(env, arguments);
|
||||||
@@ -144,6 +149,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
* @global
|
* @global
|
||||||
* @param {implementationCallback} [function] Function that contains the code to teardown your specs.
|
* @param {implementationCallback} [function] Function that contains the code to teardown your specs.
|
||||||
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll.
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll.
|
||||||
|
* @see async
|
||||||
*/
|
*/
|
||||||
afterAll: function() {
|
afterAll: function() {
|
||||||
return env.afterAll.apply(env, arguments);
|
return env.afterAll.apply(env, arguments);
|
||||||
@@ -161,6 +167,25 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
return env.expect(actual);
|
return env.expect(actual);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an asynchronous expectation for a spec. Note that the matchers
|
||||||
|
* that are provided by an asynchronous expectation all return promises
|
||||||
|
* which must be either returned from the spec or waited for using `await`
|
||||||
|
* in order for Jasmine to associate them with the correct spec.
|
||||||
|
* @name expectAsync
|
||||||
|
* @function
|
||||||
|
* @global
|
||||||
|
* @param {Object} actual - Actual computed value to test expectations against.
|
||||||
|
* @return {async-matchers}
|
||||||
|
* @example
|
||||||
|
* await expectAsync(somePromise).toBeResolved();
|
||||||
|
* @example
|
||||||
|
* return expectAsync(somePromise).toBeResolved();
|
||||||
|
*/
|
||||||
|
expectAsync: function(actual) {
|
||||||
|
return env.expectAsync(actual);
|
||||||
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Mark a spec as pending, expectation results will be ignored.
|
* Mark a spec as pending, expectation results will be ignored.
|
||||||
* @name pending
|
* @name pending
|
||||||
@@ -210,6 +235,18 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|||||||
return env.spyOnProperty(obj, methodName, accessType);
|
return env.spyOnProperty(obj, methodName, accessType);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Installs spies on all writable and configurable properties of an object.
|
||||||
|
* @name spyOnAllFunctions
|
||||||
|
* @function
|
||||||
|
* @global
|
||||||
|
* @param {Object} obj - The object upon which to install the {@link Spy}s
|
||||||
|
* @returns {Object} the spied object
|
||||||
|
*/
|
||||||
|
spyOnAllFunctions: function(obj) {
|
||||||
|
return env.spyOnAllFunctions(obj);
|
||||||
|
},
|
||||||
|
|
||||||
jsApiReporter: new jasmine.JsApiReporter({
|
jsApiReporter: new jasmine.JsApiReporter({
|
||||||
timer: new jasmine.Timer()
|
timer: new jasmine.Timer()
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ getJasmineRequireObj().util = function(j$) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
function errorWithStack() {
|
util.errorWithStack = function errorWithStack () {
|
||||||
// Don't throw and catch if we don't have to, because it makes it harder
|
// Don't throw and catch if we don't have to, because it makes it harder
|
||||||
// for users to debug their code with exception breakpoints.
|
// for users to debug their code with exception breakpoints.
|
||||||
var error = new Error();
|
var error = new Error();
|
||||||
@@ -127,10 +127,10 @@ getJasmineRequireObj().util = function(j$) {
|
|||||||
} catch (e) {
|
} catch (e) {
|
||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
function callerFile() {
|
function callerFile() {
|
||||||
var trace = new j$.StackTrace(errorWithStack().stack);
|
var trace = new j$.StackTrace(util.errorWithStack());
|
||||||
return trace.frames[2].file;
|
return trace.frames[2].file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
symbols.appendChild(createDom('li', {
|
symbols.appendChild(createDom('li', {
|
||||||
className: noExpectations(result) ? 'jasmine-empty' : 'jasmine-' + result.status,
|
className: this.displaySpecInCorrectFormat(result),
|
||||||
id: 'spec_' + result.id,
|
id: 'spec_' + result.id,
|
||||||
title: result.fullName
|
title: result.fullName
|
||||||
}
|
}
|
||||||
@@ -132,10 +132,22 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
addDeprecationWarnings(result);
|
addDeprecationWarnings(result);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
this.displaySpecInCorrectFormat = function(result) {
|
||||||
|
return noExpectations(result) ? 'jasmine-empty' : this.resultStatus(result.status);
|
||||||
|
};
|
||||||
|
|
||||||
|
this.resultStatus = function(status) {
|
||||||
|
if(status === 'excluded') {
|
||||||
|
return env.hidingDisabled() ? 'jasmine-excluded-no-display' : 'jasmine-excluded';
|
||||||
|
}
|
||||||
|
return 'jasmine-' + status;
|
||||||
|
};
|
||||||
|
|
||||||
this.jasmineDone = function(doneResult) {
|
this.jasmineDone = function(doneResult) {
|
||||||
var banner = find('.jasmine-banner');
|
var banner = find('.jasmine-banner');
|
||||||
var alert = find('.jasmine-alert');
|
var alert = find('.jasmine-alert');
|
||||||
var order = doneResult && doneResult.order;
|
var order = doneResult && doneResult.order;
|
||||||
|
var i;
|
||||||
alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
|
alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
|
||||||
|
|
||||||
banner.appendChild(optionsMenu(env));
|
banner.appendChild(optionsMenu(env));
|
||||||
@@ -322,7 +334,14 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
id: 'jasmine-random-order',
|
id: 'jasmine-random-order',
|
||||||
type: 'checkbox'
|
type: 'checkbox'
|
||||||
}),
|
}),
|
||||||
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order'))
|
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-random-order' }, 'run tests in random order')),
|
||||||
|
createDom('div', { className: 'jasmine-hide-disabled' },
|
||||||
|
createDom('input', {
|
||||||
|
className: 'jasmine-disabled',
|
||||||
|
id: 'jasmine-hide-disabled',
|
||||||
|
type: 'checkbox'
|
||||||
|
}),
|
||||||
|
createDom('label', { className: 'jasmine-label', 'for': 'jasmine-hide-disabled' }, 'hide disabled tests'))
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -344,6 +363,12 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|||||||
navigateWithNewParam('random', !env.randomTests());
|
navigateWithNewParam('random', !env.randomTests());
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var hideDisabled = optionsMenuDom.querySelector('#jasmine-hide-disabled');
|
||||||
|
hideDisabled.checked = env.hidingDisabled();
|
||||||
|
hideDisabled.onclick = function() {
|
||||||
|
navigateWithNewParam('hideDisabled', !env.hidingDisabled());
|
||||||
|
};
|
||||||
|
|
||||||
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
||||||
optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'),
|
optionsPayload = optionsMenuDom.querySelector('.jasmine-payload'),
|
||||||
isOpen = /\bjasmine-open\b/;
|
isOpen = /\bjasmine-open\b/;
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.jasmine-excluded {
|
&.jasmine-excluded {
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
|
|
||||||
&:before {
|
&:before {
|
||||||
@@ -144,6 +144,11 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.jasmine-excluded-no-display {
|
||||||
|
font-size: 14px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
&.jasmine-pending {
|
&.jasmine-pending {
|
||||||
line-height: 17px;
|
line-height: 17px;
|
||||||
&:before {
|
&:before {
|
||||||
@@ -294,7 +299,7 @@ body {
|
|||||||
|
|
||||||
&.jasmine-excluded a {
|
&.jasmine-excluded a {
|
||||||
color: $neutral-color;
|
color: $neutral-color;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -332,7 +337,7 @@ body {
|
|||||||
|
|
||||||
color: $text-color;
|
color: $text-color;
|
||||||
|
|
||||||
white-space: pre;
|
white-space: pre-wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.jasmine-result-message span.jasmine-result {
|
.jasmine-result-message span.jasmine-result {
|
||||||
|
|||||||
@@ -3,5 +3,4 @@ jasmineRequire.html = function(j$) {
|
|||||||
j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
|
j$.HtmlReporter = jasmineRequire.HtmlReporter(j$);
|
||||||
j$.QueryString = jasmineRequire.QueryString();
|
j$.QueryString = jasmineRequire.QueryString();
|
||||||
j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
|
j$.HtmlSpecFilter = jasmineRequire.HtmlSpecFilter();
|
||||||
j$.matchers.toHaveClass = jasmineRequire.toHaveClass(j$);
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
#!/bin/bash -e
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
git clone https://github.com/jasmine/jasmine.github.io.git
|
|
||||||
|
|
||||||
cd jasmine.github.io
|
|
||||||
export BUNDLE_GEMFILE=$PWD/Gemfile
|
|
||||||
bundle
|
|
||||||
|
|
||||||
bundle exec rake update_edge_jasmine
|
|
||||||
bundle exec rake phantom
|
|
||||||
Reference in New Issue
Block a user