jasmine-core 3.2.1 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/jasmine-core/boot.js +10 -11
- data/lib/jasmine-core/boot/boot.js +10 -11
- data/lib/jasmine-core/jasmine-html.js +14 -14
- data/lib/jasmine-core/jasmine.css +10 -4
- data/lib/jasmine-core/jasmine.js +613 -262
- data/lib/jasmine-core/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4408443a5a610c1e7535cb6bcaa3a316290adde9aec1cbfc4cf6ae0dc6085937
|
4
|
+
data.tar.gz: 73da51b15bc89f5e45e3fb91c3186f78631954e5dcb7a6a272be5e1c3b9a0ea3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5f532a3591a0f28d992471eb9fe75256fe0afa0e4ddc7a1abb3efe22e8ab455755c1acb25371b530d26c5f636105f0f3feb54df49e4c212b9bb2906c0c3e6859
|
7
|
+
data.tar.gz: e37bcb79937ccd115390dd99027cc8ebf773c1a648319a3bee4dc82506590dcab2bacc5b74a225bd96c0f3a623ea156d820d61a8f683375e006150d95e38cbb7
|
data/lib/jasmine-core/boot.js
CHANGED
@@ -73,24 +73,21 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
73
73
|
|
74
74
|
var filterSpecs = !!queryString.getParam("spec");
|
75
75
|
|
76
|
-
var
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
var hideDisabled = queryString.getParam("hideDisabled");
|
83
|
-
env.hideDisabled(hideDisabled);
|
76
|
+
var config = {
|
77
|
+
failFast: queryString.getParam("failFast"),
|
78
|
+
oneFailurePerSpec: queryString.getParam("oneFailurePerSpec"),
|
79
|
+
hideDisabled: queryString.getParam("hideDisabled")
|
80
|
+
};
|
84
81
|
|
85
82
|
var random = queryString.getParam("random");
|
86
83
|
|
87
84
|
if (random !== undefined && random !== "") {
|
88
|
-
|
85
|
+
config.random = random;
|
89
86
|
}
|
90
87
|
|
91
88
|
var seed = queryString.getParam("seed");
|
92
89
|
if (seed) {
|
93
|
-
|
90
|
+
config.seed = seed;
|
94
91
|
}
|
95
92
|
|
96
93
|
/**
|
@@ -121,10 +118,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
121
118
|
filterString: function() { return queryString.getParam("spec"); }
|
122
119
|
});
|
123
120
|
|
124
|
-
|
121
|
+
config.specFilter = function(spec) {
|
125
122
|
return specFilter.matches(spec.getFullName());
|
126
123
|
};
|
127
124
|
|
125
|
+
env.configure(config);
|
126
|
+
|
128
127
|
/**
|
129
128
|
* Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack.
|
130
129
|
*/
|
@@ -51,24 +51,21 @@
|
|
51
51
|
|
52
52
|
var filterSpecs = !!queryString.getParam("spec");
|
53
53
|
|
54
|
-
var
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
var hideDisabled = queryString.getParam("hideDisabled");
|
61
|
-
env.hideDisabled(hideDisabled);
|
54
|
+
var config = {
|
55
|
+
failFast: queryString.getParam("failFast"),
|
56
|
+
oneFailurePerSpec: queryString.getParam("oneFailurePerSpec"),
|
57
|
+
hideDisabled: queryString.getParam("hideDisabled")
|
58
|
+
};
|
62
59
|
|
63
60
|
var random = queryString.getParam("random");
|
64
61
|
|
65
62
|
if (random !== undefined && random !== "") {
|
66
|
-
|
63
|
+
config.random = random;
|
67
64
|
}
|
68
65
|
|
69
66
|
var seed = queryString.getParam("seed");
|
70
67
|
if (seed) {
|
71
|
-
|
68
|
+
config.seed = seed;
|
72
69
|
}
|
73
70
|
|
74
71
|
/**
|
@@ -99,10 +96,12 @@
|
|
99
96
|
filterString: function() { return queryString.getParam("spec"); }
|
100
97
|
});
|
101
98
|
|
102
|
-
|
99
|
+
config.specFilter = function(spec) {
|
103
100
|
return specFilter.matches(spec.getFullName());
|
104
101
|
};
|
105
102
|
|
103
|
+
env.configure(config);
|
104
|
+
|
106
105
|
/**
|
107
106
|
* Setting up timing functions to be able to be overridden. Certain browsers (Safari, IE 8, phantomjs) require this hack.
|
108
107
|
*/
|
@@ -80,7 +80,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
80
80
|
|
81
81
|
|
82
82
|
function HtmlReporter(options) {
|
83
|
-
var
|
83
|
+
var config = function() { return (options.env && options.env.configuration()) || {}; },
|
84
84
|
getContainer = options.getContainer,
|
85
85
|
createElement = options.createElement,
|
86
86
|
createTextNode = options.createTextNode,
|
@@ -167,9 +167,9 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
167
167
|
|
168
168
|
this.resultStatus = function(status) {
|
169
169
|
if(status === 'excluded') {
|
170
|
-
return
|
171
|
-
}
|
172
|
-
return 'jasmine-' + status;
|
170
|
+
return config().hideDisabled ? 'jasmine-excluded-no-display' : 'jasmine-excluded';
|
171
|
+
}
|
172
|
+
return 'jasmine-' + status;
|
173
173
|
};
|
174
174
|
|
175
175
|
this.jasmineDone = function(doneResult) {
|
@@ -179,7 +179,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
179
179
|
var i;
|
180
180
|
alert.appendChild(createDom('span', {className: 'jasmine-duration'}, 'finished in ' + timer.elapsed() / 1000 + 's'));
|
181
181
|
|
182
|
-
banner.appendChild(optionsMenu(
|
182
|
+
banner.appendChild(optionsMenu(config()));
|
183
183
|
|
184
184
|
if (stateBuilder.specsExecuted < totalSpecsDefined) {
|
185
185
|
var skippedMessage = 'Ran ' + stateBuilder.specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all';
|
@@ -339,7 +339,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
339
339
|
}
|
340
340
|
}
|
341
341
|
|
342
|
-
function optionsMenu(
|
342
|
+
function optionsMenu(config) {
|
343
343
|
var optionsMenuDom = createDom('div', { className: 'jasmine-run-options' },
|
344
344
|
createDom('span', { className: 'jasmine-trigger' }, 'Options'),
|
345
345
|
createDom('div', { className: 'jasmine-payload' },
|
@@ -375,27 +375,27 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
375
375
|
);
|
376
376
|
|
377
377
|
var failFastCheckbox = optionsMenuDom.querySelector('#jasmine-fail-fast');
|
378
|
-
failFastCheckbox.checked =
|
378
|
+
failFastCheckbox.checked = config.failFast;
|
379
379
|
failFastCheckbox.onclick = function() {
|
380
|
-
navigateWithNewParam('failFast', !
|
380
|
+
navigateWithNewParam('failFast', !config.failFast);
|
381
381
|
};
|
382
382
|
|
383
383
|
var throwCheckbox = optionsMenuDom.querySelector('#jasmine-throw-failures');
|
384
|
-
throwCheckbox.checked =
|
384
|
+
throwCheckbox.checked = config.oneFailurePerSpec;
|
385
385
|
throwCheckbox.onclick = function() {
|
386
|
-
navigateWithNewParam('throwFailures', !
|
386
|
+
navigateWithNewParam('throwFailures', !config.oneFailurePerSpec);
|
387
387
|
};
|
388
388
|
|
389
389
|
var randomCheckbox = optionsMenuDom.querySelector('#jasmine-random-order');
|
390
|
-
randomCheckbox.checked =
|
390
|
+
randomCheckbox.checked = config.random;
|
391
391
|
randomCheckbox.onclick = function() {
|
392
|
-
navigateWithNewParam('random', !
|
392
|
+
navigateWithNewParam('random', !config.random);
|
393
393
|
};
|
394
394
|
|
395
395
|
var hideDisabled = optionsMenuDom.querySelector('#jasmine-hide-disabled');
|
396
|
-
hideDisabled.checked =
|
396
|
+
hideDisabled.checked = config.hideDisabled;
|
397
397
|
hideDisabled.onclick = function() {
|
398
|
-
navigateWithNewParam('hideDisabled', !
|
398
|
+
navigateWithNewParam('hideDisabled', !config.hideDisabled);
|
399
399
|
};
|
400
400
|
|
401
401
|
var optionsTrigger = optionsMenuDom.querySelector('.jasmine-trigger'),
|
@@ -1,3 +1,4 @@
|
|
1
|
+
@charset "UTF-8";
|
1
2
|
body { overflow-y: scroll; }
|
2
3
|
|
3
4
|
.jasmine_html-reporter { background-color: #eee; padding: 5px; margin: -8px; font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333; }
|
@@ -15,16 +16,16 @@ body { overflow-y: scroll; }
|
|
15
16
|
.jasmine_html-reporter .jasmine-symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; }
|
16
17
|
.jasmine_html-reporter .jasmine-symbol-summary li { display: inline-block; height: 10px; width: 14px; font-size: 16px; }
|
17
18
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed { font-size: 14px; }
|
18
|
-
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before { color: #007069; content: "
|
19
|
+
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-passed:before { color: #007069; content: "•"; }
|
19
20
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed { line-height: 9px; }
|
20
|
-
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "
|
21
|
+
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-failed:before { color: #ca3a11; content: "×"; font-weight: bold; margin-left: -1px; }
|
21
22
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded { font-size: 14px; }
|
22
|
-
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "
|
23
|
+
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded:before { color: #bababa; content: "•"; }
|
23
24
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-excluded-no-display { font-size: 14px; display: none; }
|
24
25
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending { line-height: 17px; }
|
25
26
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-pending:before { color: #ba9d37; content: "*"; }
|
26
27
|
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty { font-size: 14px; }
|
27
|
-
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before { color: #ba9d37; content: "
|
28
|
+
.jasmine_html-reporter .jasmine-symbol-summary li.jasmine-empty:before { color: #ba9d37; content: "•"; }
|
28
29
|
.jasmine_html-reporter .jasmine-run-options { float: right; margin-right: 5px; border: 1px solid #8a4182; color: #8a4182; position: relative; line-height: 20px; }
|
29
30
|
.jasmine_html-reporter .jasmine-run-options .jasmine-trigger { cursor: pointer; padding: 8px 16px; }
|
30
31
|
.jasmine_html-reporter .jasmine-run-options .jasmine-payload { position: absolute; display: none; right: -1px; border: 1px solid #8a4182; background-color: #eee; white-space: nowrap; padding: 4px 8px; }
|
@@ -49,6 +50,11 @@ body { overflow-y: scroll; }
|
|
49
50
|
.jasmine_html-reporter .jasmine-summary li.jasmine-empty a { color: #ba9d37; }
|
50
51
|
.jasmine_html-reporter .jasmine-summary li.jasmine-pending a { color: #ba9d37; }
|
51
52
|
.jasmine_html-reporter .jasmine-summary li.jasmine-excluded a { color: #bababa; }
|
53
|
+
.jasmine_html-reporter .jasmine-specs li.jasmine-passed a:before { content: "• "; }
|
54
|
+
.jasmine_html-reporter .jasmine-specs li.jasmine-failed a:before { content: "× "; }
|
55
|
+
.jasmine_html-reporter .jasmine-specs li.jasmine-empty a:before { content: "* "; }
|
56
|
+
.jasmine_html-reporter .jasmine-specs li.jasmine-pending a:before { content: "• "; }
|
57
|
+
.jasmine_html-reporter .jasmine-specs li.jasmine-excluded a:before { content: "• "; }
|
52
58
|
.jasmine_html-reporter .jasmine-description + .jasmine-suite { margin-top: 0; }
|
53
59
|
.jasmine_html-reporter .jasmine-suite { margin-top: 14px; }
|
54
60
|
.jasmine_html-reporter .jasmine-suite a { color: #333; }
|
data/lib/jasmine-core/jasmine.js
CHANGED
@@ -59,8 +59,9 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
59
59
|
j$.Env = jRequire.Env(j$);
|
60
60
|
j$.StackTrace = jRequire.StackTrace(j$);
|
61
61
|
j$.ExceptionFormatter = jRequire.ExceptionFormatter(j$);
|
62
|
-
j$.
|
63
|
-
j$.
|
62
|
+
j$.ExpectationFilterChain = jRequire.ExpectationFilterChain();
|
63
|
+
j$.Expector = jRequire.Expector(j$);
|
64
|
+
j$.Expectation = jRequire.Expectation(j$);
|
64
65
|
j$.buildExpectationResult = jRequire.buildExpectationResult();
|
65
66
|
j$.JsApiReporter = jRequire.JsApiReporter();
|
66
67
|
j$.matchersUtil = jRequire.matchersUtil(j$);
|
@@ -93,6 +94,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
93
94
|
j$.NotEmpty = jRequire.NotEmpty(j$);
|
94
95
|
|
95
96
|
j$.matchers = jRequire.requireMatchers(jRequire, j$);
|
97
|
+
j$.asyncMatchers = jRequire.requireAsyncMatchers(jRequire, j$);
|
96
98
|
|
97
99
|
return j$;
|
98
100
|
};
|
@@ -261,7 +263,11 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|
261
263
|
};
|
262
264
|
|
263
265
|
j$.isPromise = function(obj) {
|
264
|
-
return typeof jasmineGlobal.Promise !== 'undefined' && obj && obj.constructor === jasmineGlobal.Promise;
|
266
|
+
return typeof jasmineGlobal.Promise !== 'undefined' && !!obj && obj.constructor === jasmineGlobal.Promise;
|
267
|
+
};
|
268
|
+
|
269
|
+
j$.isPromiseLike = function(obj) {
|
270
|
+
return !!obj && j$.isFunction_(obj.then);
|
265
271
|
};
|
266
272
|
|
267
273
|
j$.fnNameFor = function(func) {
|
@@ -794,14 +800,62 @@ getJasmineRequireObj().Env = function(j$) {
|
|
794
800
|
var currentSpec = null;
|
795
801
|
var currentlyExecutingSuites = [];
|
796
802
|
var currentDeclarationSuite = null;
|
797
|
-
var throwOnExpectationFailure = false;
|
798
|
-
var stopOnSpecFailure = false;
|
799
|
-
var random = true;
|
800
|
-
var hidingDisabled = false;
|
801
|
-
var seed = null;
|
802
|
-
var handlingLoadErrors = true;
|
803
803
|
var hasFailures = false;
|
804
804
|
|
805
|
+
/**
|
806
|
+
* This represents the available options to configure Jasmine.
|
807
|
+
* Options that are not provided will use their default values
|
808
|
+
* @interface Configuration
|
809
|
+
*/
|
810
|
+
var config = {
|
811
|
+
/**
|
812
|
+
* Whether to randomize spec execution order
|
813
|
+
* @name Configuration#random
|
814
|
+
* @type Boolean
|
815
|
+
* @default true
|
816
|
+
*/
|
817
|
+
random: true,
|
818
|
+
/**
|
819
|
+
* Seed to use as the basis of randomization.
|
820
|
+
* Null causes the seed to be determined randomly at the start of execution.
|
821
|
+
* @name Configuration#seed
|
822
|
+
* @type function
|
823
|
+
* @default null
|
824
|
+
*/
|
825
|
+
seed: null,
|
826
|
+
/**
|
827
|
+
* Whether to stop execution of the suite after the first spec failure
|
828
|
+
* @name Configuration#failFast
|
829
|
+
* @type Boolean
|
830
|
+
* @default false
|
831
|
+
*/
|
832
|
+
failFast: false,
|
833
|
+
/**
|
834
|
+
* Whether to cause specs to only have one expectation failure.
|
835
|
+
* @name Configuration#oneFailurePerSpec
|
836
|
+
* @type Boolean
|
837
|
+
* @default false
|
838
|
+
*/
|
839
|
+
oneFailurePerSpec: false,
|
840
|
+
/**
|
841
|
+
* Function to use to filter specs
|
842
|
+
* @name Configuration#specFilter
|
843
|
+
* @type function
|
844
|
+
* @default true
|
845
|
+
*/
|
846
|
+
specFilter: function() {
|
847
|
+
return true;
|
848
|
+
},
|
849
|
+
/**
|
850
|
+
* Whether or not reporters should hide disabled specs from their output.
|
851
|
+
* Currently only supported by Jasmine's HTMLReporter
|
852
|
+
* @name Configuration#hideDisabled
|
853
|
+
* @type Boolean
|
854
|
+
* @default false
|
855
|
+
*/
|
856
|
+
hideDisabled: false
|
857
|
+
};
|
858
|
+
|
805
859
|
var currentSuite = function() {
|
806
860
|
return currentlyExecutingSuites[currentlyExecutingSuites.length - 1];
|
807
861
|
};
|
@@ -834,10 +888,63 @@ getJasmineRequireObj().Env = function(j$) {
|
|
834
888
|
});
|
835
889
|
}
|
836
890
|
|
837
|
-
|
838
|
-
|
891
|
+
/**
|
892
|
+
* Configure your jasmine environment
|
893
|
+
* @name Env#configure
|
894
|
+
* @argument {Configuration} configuration
|
895
|
+
* @function
|
896
|
+
*/
|
897
|
+
this.configure = function(configuration) {
|
898
|
+
if (configuration.specFilter) {
|
899
|
+
config.specFilter = configuration.specFilter;
|
900
|
+
}
|
901
|
+
|
902
|
+
if (configuration.hasOwnProperty('random')) {
|
903
|
+
config.random = !!configuration.random;
|
904
|
+
}
|
905
|
+
|
906
|
+
if (configuration.hasOwnProperty('seed')) {
|
907
|
+
config.seed = configuration.seed;
|
908
|
+
}
|
909
|
+
|
910
|
+
if (configuration.hasOwnProperty('failFast')) {
|
911
|
+
config.failFast = configuration.failFast;
|
912
|
+
}
|
913
|
+
|
914
|
+
if (configuration.hasOwnProperty('oneFailurePerSpec')) {
|
915
|
+
config.oneFailurePerSpec = configuration.oneFailurePerSpec;
|
916
|
+
}
|
917
|
+
|
918
|
+
if (configuration.hasOwnProperty('hideDisabled')) {
|
919
|
+
config.hideDisabled = configuration.hideDisabled;
|
920
|
+
}
|
921
|
+
};
|
922
|
+
|
923
|
+
/**
|
924
|
+
* Get the current configuration for your jasmine environment
|
925
|
+
* @name Env#configuration
|
926
|
+
* @function
|
927
|
+
* @returns {Configuration}
|
928
|
+
*/
|
929
|
+
this.configuration = function() {
|
930
|
+
var result = {};
|
931
|
+
for (var property in config) {
|
932
|
+
result[property] = config[property];
|
933
|
+
}
|
934
|
+
return result;
|
839
935
|
};
|
840
936
|
|
937
|
+
Object.defineProperty(this, 'specFilter', {
|
938
|
+
get: function() {
|
939
|
+
self.deprecated('Getting specFilter directly from Env is deprecated, please check the specFilter option from `configuration`');
|
940
|
+
return config.specFilter;
|
941
|
+
},
|
942
|
+
set: function(val) {
|
943
|
+
self.deprecated('Setting specFilter directly on Env is deprecated, please use the specFilter option in `configure`');
|
944
|
+
config.specFilter = val;
|
945
|
+
}
|
946
|
+
});
|
947
|
+
|
841
948
|
this.addSpyStrategy = function(name, fn) {
|
842
949
|
if(!currentRunnable()) {
|
843
950
|
throw new Error('Custom spy strategies must be added in a before function or a spec');
|
@@ -863,6 +970,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
863
970
|
};
|
864
971
|
|
865
972
|
j$.Expectation.addCoreMatchers(j$.matchers);
|
973
|
+
j$.Expectation.addAsyncCoreMatchers(j$.asyncMatchers);
|
866
974
|
|
867
975
|
var nextSpecId = 0;
|
868
976
|
var getNextSpecId = function() {
|
@@ -875,7 +983,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
875
983
|
};
|
876
984
|
|
877
985
|
var expectationFactory = function(actual, spec) {
|
878
|
-
return j$.Expectation.
|
986
|
+
return j$.Expectation.factory({
|
879
987
|
util: j$.matchersUtil,
|
880
988
|
customEqualityTesters: runnableResources[spec.id].customEqualityTesters,
|
881
989
|
customMatchers: runnableResources[spec.id].customMatchers,
|
@@ -889,7 +997,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
889
997
|
};
|
890
998
|
|
891
999
|
var asyncExpectationFactory = function(actual, spec) {
|
892
|
-
return j$.
|
1000
|
+
return j$.Expectation.asyncFactory({
|
893
1001
|
util: j$.matchersUtil,
|
894
1002
|
customEqualityTesters: runnableResources[spec.id].customEqualityTesters,
|
895
1003
|
actual: actual,
|
@@ -965,13 +1073,16 @@ getJasmineRequireObj().Env = function(j$) {
|
|
965
1073
|
* @name Env#throwOnExpectationFailure
|
966
1074
|
* @function
|
967
1075
|
* @param {Boolean} value Whether to throw when a expectation fails
|
1076
|
+
* @deprecated Use the `oneFailurePerSpec` option with {@link Env#configure}
|
968
1077
|
*/
|
969
1078
|
this.throwOnExpectationFailure = function(value) {
|
970
|
-
throwOnExpectationFailure
|
1079
|
+
this.deprecated('Setting throwOnExpectationFailure directly on Env is deprecated, please use the oneFailurePerSpec option in `configure`');
|
1080
|
+
this.configure({oneFailurePerSpec: !!value});
|
971
1081
|
};
|
972
1082
|
|
973
1083
|
this.throwingExpectationFailures = function() {
|
974
|
-
|
1084
|
+
this.deprecated('Getting throwingExpectationFailures directly from Env is deprecated, please check the oneFailurePerSpec option from `configuration`');
|
1085
|
+
return config.oneFailurePerSpec;
|
975
1086
|
};
|
976
1087
|
|
977
1088
|
/**
|
@@ -979,13 +1090,16 @@ getJasmineRequireObj().Env = function(j$) {
|
|
979
1090
|
* @name Env#stopOnSpecFailure
|
980
1091
|
* @function
|
981
1092
|
* @param {Boolean} value Whether to stop suite execution when a spec fails
|
1093
|
+
* @deprecated Use the `failFast` option with {@link Env#configure}
|
982
1094
|
*/
|
983
1095
|
this.stopOnSpecFailure = function(value) {
|
984
|
-
stopOnSpecFailure
|
1096
|
+
this.deprecated('Setting stopOnSpecFailure directly is deprecated, please use the failFast option in `configure`');
|
1097
|
+
this.configure({failFast: !!value});
|
985
1098
|
};
|
986
1099
|
|
987
1100
|
this.stoppingOnSpecFailure = function() {
|
988
|
-
|
1101
|
+
this.deprecated('Getting stoppingOnSpecFailure directly from Env is deprecated, please check the failFast option from `configuration`');
|
1102
|
+
return config.failFast;
|
989
1103
|
};
|
990
1104
|
|
991
1105
|
/**
|
@@ -993,13 +1107,16 @@ getJasmineRequireObj().Env = function(j$) {
|
|
993
1107
|
* @name Env#randomizeTests
|
994
1108
|
* @function
|
995
1109
|
* @param {Boolean} value Whether to randomize execution order
|
1110
|
+
* @deprecated Use the `random` option with {@link Env#configure}
|
996
1111
|
*/
|
997
1112
|
this.randomizeTests = function(value) {
|
998
|
-
random
|
1113
|
+
this.deprecated('Setting randomizeTests directly is deprecated, please use the random option in `configure`');
|
1114
|
+
config.random = !!value;
|
999
1115
|
};
|
1000
1116
|
|
1001
1117
|
this.randomTests = function() {
|
1002
|
-
|
1118
|
+
this.deprecated('Getting randomTests directly from Env is deprecated, please check the random option from `configuration`');
|
1119
|
+
return config.random;
|
1003
1120
|
};
|
1004
1121
|
|
1005
1122
|
/**
|
@@ -1007,16 +1124,19 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1007
1124
|
* @name Env#seed
|
1008
1125
|
* @function
|
1009
1126
|
* @param {Number} value The seed value
|
1127
|
+
* @deprecated Use the `seed` option with {@link Env#configure}
|
1010
1128
|
*/
|
1011
1129
|
this.seed = function(value) {
|
1130
|
+
this.deprecated('Setting seed directly is deprecated, please use the seed option in `configure`');
|
1012
1131
|
if (value) {
|
1013
|
-
seed = value;
|
1132
|
+
config.seed = value;
|
1014
1133
|
}
|
1015
|
-
return seed;
|
1134
|
+
return config.seed;
|
1016
1135
|
};
|
1017
1136
|
|
1018
1137
|
this.hidingDisabled = function(value) {
|
1019
|
-
|
1138
|
+
this.deprecated('Getting hidingDisabled directly from Env is deprecated, please check the hideDisabled option from `configuration`');
|
1139
|
+
return config.hideDisabled;
|
1020
1140
|
};
|
1021
1141
|
|
1022
1142
|
/**
|
@@ -1024,7 +1144,8 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1024
1144
|
* @function
|
1025
1145
|
*/
|
1026
1146
|
this.hideDisabled = function(value) {
|
1027
|
-
|
1147
|
+
this.deprecated('Setting hideDisabled directly is deprecated, please use the hideDisabled option in `configure`');
|
1148
|
+
config.hideDisabled = !!value;
|
1028
1149
|
};
|
1029
1150
|
|
1030
1151
|
this.deprecated = function(deprecation) {
|
@@ -1038,9 +1159,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1038
1159
|
var queueRunnerFactory = function(options, args) {
|
1039
1160
|
var failFast = false;
|
1040
1161
|
if (options.isLeaf) {
|
1041
|
-
failFast =
|
1162
|
+
failFast = config.oneFailurePerSpec;
|
1042
1163
|
} else if (!options.isReporter) {
|
1043
|
-
failFast =
|
1164
|
+
failFast = config.failFast;
|
1044
1165
|
}
|
1045
1166
|
options.clearStack = options.clearStack || clearStack;
|
1046
1167
|
options.timeout = {setTimeout: realSetTimeout, clearTimeout: realClearTimeout};
|
@@ -1155,8 +1276,8 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1155
1276
|
}
|
1156
1277
|
|
1157
1278
|
var order = new j$.Order({
|
1158
|
-
random: random,
|
1159
|
-
seed: seed
|
1279
|
+
random: config.random,
|
1280
|
+
seed: config.seed
|
1160
1281
|
});
|
1161
1282
|
|
1162
1283
|
var processor = new j$.TreeProcessor({
|
@@ -1186,7 +1307,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1186
1307
|
return order.sort(node.children);
|
1187
1308
|
},
|
1188
1309
|
excludeNode: function(spec) {
|
1189
|
-
return !
|
1310
|
+
return !config.specFilter(spec);
|
1190
1311
|
}
|
1191
1312
|
});
|
1192
1313
|
|
@@ -1353,7 +1474,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1353
1474
|
expectationFactory: expectationFactory,
|
1354
1475
|
asyncExpectationFactory: asyncExpectationFactory,
|
1355
1476
|
expectationResultFactory: expectationResultFactory,
|
1356
|
-
throwOnExpectationFailure:
|
1477
|
+
throwOnExpectationFailure: config.oneFailurePerSpec
|
1357
1478
|
});
|
1358
1479
|
|
1359
1480
|
return suite;
|
@@ -1459,7 +1580,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1459
1580
|
fn: fn,
|
1460
1581
|
timeout: timeout || 0
|
1461
1582
|
},
|
1462
|
-
throwOnExpectationFailure:
|
1583
|
+
throwOnExpectationFailure: config.oneFailurePerSpec
|
1463
1584
|
});
|
1464
1585
|
|
1465
1586
|
return spec;
|
@@ -1607,7 +1728,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
1607
1728
|
error: error && error.message ? error : null
|
1608
1729
|
});
|
1609
1730
|
|
1610
|
-
if (
|
1731
|
+
if (config.oneFailurePerSpec) {
|
1611
1732
|
throw new Error(message);
|
1612
1733
|
}
|
1613
1734
|
};
|
@@ -2025,160 +2146,6 @@ getJasmineRequireObj().Truthy = function(j$) {
|
|
2025
2146
|
return Truthy;
|
2026
2147
|
};
|
2027
2148
|
|
2028
|
-
getJasmineRequireObj().AsyncExpectation = function(j$) {
|
2029
|
-
var promiseForMessage = {
|
2030
|
-
jasmineToString: function() { return 'a promise'; }
|
2031
|
-
};
|
2032
|
-
|
2033
|
-
/**
|
2034
|
-
* Asynchronous matchers.
|
2035
|
-
* @namespace async-matchers
|
2036
|
-
*/
|
2037
|
-
function AsyncExpectation(options) {
|
2038
|
-
var global = options.global || j$.getGlobal();
|
2039
|
-
this.util = options.util || { buildFailureMessage: function() {} };
|
2040
|
-
this.customEqualityTesters = options.customEqualityTesters || [];
|
2041
|
-
this.addExpectationResult = options.addExpectationResult || function(){};
|
2042
|
-
this.actual = options.actual;
|
2043
|
-
this.isNot = options.isNot;
|
2044
|
-
|
2045
|
-
if (!global.Promise) {
|
2046
|
-
throw new Error('expectAsync is unavailable because the environment does not support promises.');
|
2047
|
-
}
|
2048
|
-
|
2049
|
-
if (!j$.isPromise(this.actual)) {
|
2050
|
-
throw new Error('Expected expectAsync to be called with a promise.');
|
2051
|
-
}
|
2052
|
-
|
2053
|
-
['toBeResolved', 'toBeRejected', 'toBeResolvedTo'].forEach(wrapCompare.bind(this));
|
2054
|
-
}
|
2055
|
-
|
2056
|
-
function wrapCompare(name) {
|
2057
|
-
var compare = this[name];
|
2058
|
-
this[name] = function() {
|
2059
|
-
var self = this;
|
2060
|
-
var args = Array.prototype.slice.call(arguments);
|
2061
|
-
args.unshift(this.actual);
|
2062
|
-
|
2063
|
-
// Capture the call stack here, before we go async, so that it will
|
2064
|
-
// contain frames that are relevant to the user instead of just parts
|
2065
|
-
// of Jasmine.
|
2066
|
-
var errorForStack = j$.util.errorWithStack();
|
2067
|
-
|
2068
|
-
return compare.apply(self, args).then(function(result) {
|
2069
|
-
var message;
|
2070
|
-
|
2071
|
-
if (self.isNot) {
|
2072
|
-
result.pass = !result.pass;
|
2073
|
-
}
|
2074
|
-
|
2075
|
-
args[0] = promiseForMessage;
|
2076
|
-
message = j$.Expectation.finalizeMessage(self.util, name, self.isNot, args, result);
|
2077
|
-
|
2078
|
-
self.addExpectationResult(result.pass, {
|
2079
|
-
matcherName: name,
|
2080
|
-
passed: result.pass,
|
2081
|
-
message: message,
|
2082
|
-
error: undefined,
|
2083
|
-
errorForStack: errorForStack,
|
2084
|
-
actual: self.actual
|
2085
|
-
});
|
2086
|
-
});
|
2087
|
-
};
|
2088
|
-
}
|
2089
|
-
|
2090
|
-
/**
|
2091
|
-
* Expect a promise to be resolved.
|
2092
|
-
* @function
|
2093
|
-
* @async
|
2094
|
-
* @name async-matchers#toBeResolved
|
2095
|
-
* @example
|
2096
|
-
* await expectAsync(aPromise).toBeResolved();
|
2097
|
-
* @example
|
2098
|
-
* return expectAsync(aPromise).toBeResolved();
|
2099
|
-
*/
|
2100
|
-
AsyncExpectation.prototype.toBeResolved = function(actual) {
|
2101
|
-
return actual.then(
|
2102
|
-
function() { return {pass: true}; },
|
2103
|
-
function() { return {pass: false}; }
|
2104
|
-
);
|
2105
|
-
};
|
2106
|
-
|
2107
|
-
/**
|
2108
|
-
* Expect a promise to be rejected.
|
2109
|
-
* @function
|
2110
|
-
* @async
|
2111
|
-
* @name async-matchers#toBeRejected
|
2112
|
-
* @example
|
2113
|
-
* await expectAsync(aPromise).toBeRejected();
|
2114
|
-
* @example
|
2115
|
-
* return expectAsync(aPromise).toBeRejected();
|
2116
|
-
*/
|
2117
|
-
AsyncExpectation.prototype.toBeRejected = function(actual) {
|
2118
|
-
return actual.then(
|
2119
|
-
function() { return {pass: false}; },
|
2120
|
-
function() { return {pass: true}; }
|
2121
|
-
);
|
2122
|
-
};
|
2123
|
-
|
2124
|
-
/**
|
2125
|
-
* Expect a promise to be resolved to a value equal to the expected, using deep equality comparison.
|
2126
|
-
* @function
|
2127
|
-
* @async
|
2128
|
-
* @name async-matchers#toBeResolvedTo
|
2129
|
-
* @param {Object} expected - Value that the promise is expected to resolve to
|
2130
|
-
* @example
|
2131
|
-
* await expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
|
2132
|
-
* @example
|
2133
|
-
* return expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
|
2134
|
-
*/
|
2135
|
-
AsyncExpectation.prototype.toBeResolvedTo = function(actualPromise, expectedValue) {
|
2136
|
-
var self = this;
|
2137
|
-
|
2138
|
-
function prefix(passed) {
|
2139
|
-
return 'Expected a promise ' +
|
2140
|
-
(passed ? 'not ' : '') +
|
2141
|
-
'to be resolved to ' + j$.pp(expectedValue);
|
2142
|
-
}
|
2143
|
-
|
2144
|
-
return actualPromise.then(
|
2145
|
-
function(actualValue) {
|
2146
|
-
if (self.util.equals(actualValue, expectedValue, self.customEqualityTesters)) {
|
2147
|
-
return {
|
2148
|
-
pass: true,
|
2149
|
-
message: prefix(true) + '.'
|
2150
|
-
};
|
2151
|
-
} else {
|
2152
|
-
return {
|
2153
|
-
pass: false,
|
2154
|
-
message: prefix(false) + ' but it was resolved to ' + j$.pp(actualValue) + '.'
|
2155
|
-
};
|
2156
|
-
}
|
2157
|
-
},
|
2158
|
-
function() {
|
2159
|
-
return {
|
2160
|
-
pass: false,
|
2161
|
-
message: prefix(false) + ' but it was rejected.'
|
2162
|
-
};
|
2163
|
-
}
|
2164
|
-
);
|
2165
|
-
};
|
2166
|
-
|
2167
|
-
|
2168
|
-
AsyncExpectation.factory = function(options) {
|
2169
|
-
var expect = new AsyncExpectation(options);
|
2170
|
-
|
2171
|
-
options = j$.util.clone(options);
|
2172
|
-
options.isNot = true;
|
2173
|
-
expect.not = new AsyncExpectation(options);
|
2174
|
-
|
2175
|
-
return expect;
|
2176
|
-
};
|
2177
|
-
|
2178
|
-
|
2179
|
-
return AsyncExpectation;
|
2180
|
-
};
|
2181
|
-
|
2182
2149
|
getJasmineRequireObj().CallTracker = function(j$) {
|
2183
2150
|
|
2184
2151
|
/**
|
@@ -2737,6 +2704,8 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
|
2737
2704
|
|
2738
2705
|
if (error.name && error.message) {
|
2739
2706
|
message += error.name + ': ' + error.message;
|
2707
|
+
} else if (error.message) {
|
2708
|
+
message += error.message;
|
2740
2709
|
} else {
|
2741
2710
|
message += error.toString() + ' thrown';
|
2742
2711
|
}
|
@@ -2814,107 +2783,238 @@ getJasmineRequireObj().ExceptionFormatter = function(j$) {
|
|
2814
2783
|
return ExceptionFormatter;
|
2815
2784
|
};
|
2816
2785
|
|
2817
|
-
getJasmineRequireObj().Expectation = function() {
|
2786
|
+
getJasmineRequireObj().Expectation = function(j$) {
|
2787
|
+
var promiseForMessage = {
|
2788
|
+
jasmineToString: function() { return 'a promise'; }
|
2789
|
+
};
|
2818
2790
|
|
2819
2791
|
/**
|
2820
2792
|
* Matchers that come with Jasmine out of the box.
|
2821
2793
|
* @namespace matchers
|
2822
2794
|
*/
|
2823
2795
|
function Expectation(options) {
|
2824
|
-
this.
|
2825
|
-
this.customEqualityTesters = options.customEqualityTesters || [];
|
2826
|
-
this.actual = options.actual;
|
2827
|
-
this.addExpectationResult = options.addExpectationResult || function(){};
|
2828
|
-
this.isNot = options.isNot;
|
2796
|
+
this.expector = new j$.Expector(options);
|
2829
2797
|
|
2830
2798
|
var customMatchers = options.customMatchers || {};
|
2831
2799
|
for (var matcherName in customMatchers) {
|
2832
|
-
this[matcherName] =
|
2800
|
+
this[matcherName] = wrapSyncCompare(matcherName, customMatchers[matcherName]);
|
2833
2801
|
}
|
2834
2802
|
}
|
2835
2803
|
|
2836
|
-
|
2837
|
-
|
2838
|
-
|
2839
|
-
|
2840
|
-
|
2804
|
+
/**
|
2805
|
+
* Add some context for an {@link expect}
|
2806
|
+
* @function
|
2807
|
+
* @name matchers#withContext
|
2808
|
+
* @param {String} message - Additional context to show when the matcher fails
|
2809
|
+
* @return {matchers}
|
2810
|
+
*/
|
2811
|
+
Expectation.prototype.withContext = function withContext(message) {
|
2812
|
+
return addFilter(this, new ContextAddingFilter(message));
|
2813
|
+
};
|
2841
2814
|
|
2842
|
-
|
2815
|
+
/**
|
2816
|
+
* Invert the matcher following this {@link expect}
|
2817
|
+
* @member
|
2818
|
+
* @name matchers#not
|
2819
|
+
* @type {matchers}
|
2820
|
+
* @example
|
2821
|
+
* expect(something).not.toBe(true);
|
2822
|
+
*/
|
2823
|
+
Object.defineProperty(Expectation.prototype, 'not', {
|
2824
|
+
get: function() {
|
2825
|
+
return addFilter(this, syncNegatingFilter);
|
2826
|
+
}
|
2827
|
+
});
|
2843
2828
|
|
2844
|
-
|
2845
|
-
|
2829
|
+
/**
|
2830
|
+
* Asynchronous matchers.
|
2831
|
+
* @namespace async-matchers
|
2832
|
+
*/
|
2833
|
+
function AsyncExpectation(options) {
|
2834
|
+
var global = options.global || j$.getGlobal();
|
2835
|
+
this.expector = new j$.Expector(options);
|
2846
2836
|
|
2847
|
-
|
2848
|
-
|
2849
|
-
|
2850
|
-
return result;
|
2851
|
-
}
|
2837
|
+
if (!global.Promise) {
|
2838
|
+
throw new Error('expectAsync is unavailable because the environment does not support promises.');
|
2839
|
+
}
|
2852
2840
|
|
2853
|
-
|
2854
|
-
|
2855
|
-
|
2841
|
+
if (!j$.isPromiseLike(this.expector.actual)) {
|
2842
|
+
throw new Error('Expected expectAsync to be called with a promise.');
|
2843
|
+
}
|
2844
|
+
}
|
2856
2845
|
|
2857
|
-
|
2858
|
-
|
2846
|
+
/**
|
2847
|
+
* Add some context for an {@link expectAsync}
|
2848
|
+
* @function
|
2849
|
+
* @name async-matchers#withContext
|
2850
|
+
* @param {String} message - Additional context to show when the async matcher fails
|
2851
|
+
* @return {async-matchers}
|
2852
|
+
*/
|
2853
|
+
AsyncExpectation.prototype.withContext = function withContext(message) {
|
2854
|
+
return addFilter(this, new ContextAddingFilter(message));
|
2855
|
+
};
|
2859
2856
|
|
2860
|
-
|
2861
|
-
|
2862
|
-
|
2857
|
+
/**
|
2858
|
+
* Invert the matcher following this {@link expectAsync}
|
2859
|
+
* @member
|
2860
|
+
* @name async-matchers#not
|
2861
|
+
* @type {async-matchers}
|
2862
|
+
* @example
|
2863
|
+
* await expectAsync(myPromise).not.toBeResolved();
|
2864
|
+
* @example
|
2865
|
+
* return expectAsync(myPromise).not.toBeResolved();
|
2866
|
+
*/
|
2867
|
+
Object.defineProperty(AsyncExpectation.prototype, 'not', {
|
2868
|
+
get: function() {
|
2869
|
+
return addFilter(this, asyncNegatingFilter);
|
2870
|
+
}
|
2871
|
+
});
|
2863
2872
|
|
2864
|
-
|
2865
|
-
|
2866
|
-
|
2867
|
-
|
2868
|
-
matcherName: name,
|
2869
|
-
passed: result.pass,
|
2870
|
-
message: message,
|
2871
|
-
error: result.error,
|
2872
|
-
actual: this.actual,
|
2873
|
-
expected: expected // TODO: this may need to be arrayified/sliced
|
2874
|
-
}
|
2875
|
-
);
|
2873
|
+
function wrapSyncCompare(name, matcherFactory) {
|
2874
|
+
return function() {
|
2875
|
+
var result = this.expector.compare(name, matcherFactory, arguments);
|
2876
|
+
this.expector.processResult(result);
|
2876
2877
|
};
|
2877
|
-
}
|
2878
|
+
}
|
2878
2879
|
|
2879
|
-
|
2880
|
-
|
2881
|
-
|
2882
|
-
|
2883
|
-
|
2880
|
+
function wrapAsyncCompare(name, matcherFactory) {
|
2881
|
+
return function() {
|
2882
|
+
var self = this;
|
2883
|
+
|
2884
|
+
// Capture the call stack here, before we go async, so that it will contain
|
2885
|
+
// frames that are relevant to the user instead of just parts of Jasmine.
|
2886
|
+
var errorForStack = j$.util.errorWithStack();
|
2887
|
+
|
2888
|
+
return this.expector.compare(name, matcherFactory, arguments).then(function(result) {
|
2889
|
+
self.expector.processResult(result, errorForStack, promiseForMessage);
|
2890
|
+
});
|
2891
|
+
};
|
2892
|
+
}
|
2893
|
+
|
2894
|
+
function addCoreMatchers(prototype, matchers, wrapper) {
|
2895
|
+
for (var matcherName in matchers) {
|
2896
|
+
var matcher = matchers[matcherName];
|
2897
|
+
prototype[matcherName] = wrapper(matcherName, matcher);
|
2898
|
+
}
|
2899
|
+
}
|
2900
|
+
|
2901
|
+
function addFilter(source, filter) {
|
2902
|
+
var result = Object.create(source);
|
2903
|
+
result.expector = source.expector.addFilter(filter);
|
2904
|
+
return result;
|
2905
|
+
}
|
2906
|
+
|
2907
|
+
function negatedFailureMessage(result, matcherName, args, util) {
|
2908
|
+
if (result.message) {
|
2909
|
+
if (j$.isFunction_(result.message)) {
|
2884
2910
|
return result.message();
|
2885
2911
|
} else {
|
2886
2912
|
return result.message;
|
2887
2913
|
}
|
2888
|
-
} else {
|
2889
|
-
args = args.slice();
|
2890
|
-
args.unshift(isNot);
|
2891
|
-
args.unshift(name);
|
2892
|
-
return util.buildFailureMessage.apply(null, args);
|
2893
2914
|
}
|
2915
|
+
|
2916
|
+
args = args.slice();
|
2917
|
+
args.unshift(true);
|
2918
|
+
args.unshift(matcherName);
|
2919
|
+
return util.buildFailureMessage.apply(null, args);
|
2920
|
+
}
|
2921
|
+
|
2922
|
+
function negate(result) {
|
2923
|
+
result.pass = !result.pass;
|
2924
|
+
return result;
|
2925
|
+
}
|
2926
|
+
|
2927
|
+
var syncNegatingFilter = {
|
2928
|
+
selectComparisonFunc: function(matcher) {
|
2929
|
+
function defaultNegativeCompare() {
|
2930
|
+
return negate(matcher.compare.apply(null, arguments));
|
2931
|
+
}
|
2932
|
+
|
2933
|
+
return matcher.negativeCompare || defaultNegativeCompare;
|
2934
|
+
},
|
2935
|
+
buildFailureMessage: negatedFailureMessage
|
2894
2936
|
};
|
2895
2937
|
|
2896
|
-
|
2897
|
-
|
2898
|
-
|
2899
|
-
|
2900
|
-
|
2938
|
+
var asyncNegatingFilter = {
|
2939
|
+
selectComparisonFunc: function(matcher) {
|
2940
|
+
function defaultNegativeCompare() {
|
2941
|
+
return matcher.compare.apply(this, arguments).then(negate);
|
2942
|
+
}
|
2943
|
+
|
2944
|
+
return defaultNegativeCompare;
|
2945
|
+
},
|
2946
|
+
buildFailureMessage: negatedFailureMessage
|
2947
|
+
};
|
2948
|
+
|
2949
|
+
function ContextAddingFilter(message) {
|
2950
|
+
this.message = message;
|
2951
|
+
}
|
2952
|
+
|
2953
|
+
ContextAddingFilter.prototype.modifyFailureMessage = function(msg) {
|
2954
|
+
return this.message + ': ' + msg;
|
2955
|
+
};
|
2956
|
+
|
2957
|
+
return {
|
2958
|
+
factory: function(options) {
|
2959
|
+
return new Expectation(options || {});
|
2960
|
+
},
|
2961
|
+
addCoreMatchers: function(matchers) {
|
2962
|
+
addCoreMatchers(Expectation.prototype, matchers, wrapSyncCompare);
|
2963
|
+
},
|
2964
|
+
asyncFactory: function(options) {
|
2965
|
+
return new AsyncExpectation(options || {});
|
2966
|
+
},
|
2967
|
+
addAsyncCoreMatchers: function(matchers) {
|
2968
|
+
addCoreMatchers(AsyncExpectation.prototype, matchers, wrapAsyncCompare);
|
2901
2969
|
}
|
2902
2970
|
};
|
2971
|
+
};
|
2903
2972
|
|
2904
|
-
|
2905
|
-
|
2973
|
+
getJasmineRequireObj().ExpectationFilterChain = function() {
|
2974
|
+
function ExpectationFilterChain(maybeFilter, prev) {
|
2975
|
+
this.filter_ = maybeFilter;
|
2976
|
+
this.prev_ = prev;
|
2977
|
+
}
|
2906
2978
|
|
2907
|
-
|
2979
|
+
ExpectationFilterChain.prototype.addFilter = function(filter) {
|
2980
|
+
return new ExpectationFilterChain(filter, this);
|
2981
|
+
};
|
2982
|
+
|
2983
|
+
ExpectationFilterChain.prototype.selectComparisonFunc = function(matcher) {
|
2984
|
+
return this.callFirst_('selectComparisonFunc', arguments).result;
|
2985
|
+
};
|
2908
2986
|
|
2909
|
-
|
2910
|
-
|
2911
|
-
|
2912
|
-
expect.not = new Expectation(options);
|
2987
|
+
ExpectationFilterChain.prototype.buildFailureMessage = function(result, matcherName, args, util) {
|
2988
|
+
return this.callFirst_('buildFailureMessage', arguments).result;
|
2989
|
+
};
|
2913
2990
|
|
2914
|
-
|
2991
|
+
ExpectationFilterChain.prototype.modifyFailureMessage = function(msg) {
|
2992
|
+
var result = this.callFirst_('modifyFailureMessage', arguments).result;
|
2993
|
+
return result || msg;
|
2915
2994
|
};
|
2916
2995
|
|
2917
|
-
|
2996
|
+
ExpectationFilterChain.prototype.callFirst_ = function(fname, args) {
|
2997
|
+
var prevResult;
|
2998
|
+
|
2999
|
+
if (this.prev_) {
|
3000
|
+
prevResult = this.prev_.callFirst_(fname, args);
|
3001
|
+
|
3002
|
+
if (prevResult.found) {
|
3003
|
+
return prevResult;
|
3004
|
+
}
|
3005
|
+
}
|
3006
|
+
|
3007
|
+
if (this.filter_ && this.filter_[fname]) {
|
3008
|
+
return {
|
3009
|
+
found: true,
|
3010
|
+
result: this.filter_[fname].apply(this.filter_, args)
|
3011
|
+
};
|
3012
|
+
}
|
3013
|
+
|
3014
|
+
return {found: false};
|
3015
|
+
};
|
3016
|
+
|
3017
|
+
return ExpectationFilterChain;
|
2918
3018
|
};
|
2919
3019
|
|
2920
3020
|
//TODO: expectation result may make more sense as a presentation of an expectation.
|
@@ -2983,6 +3083,87 @@ getJasmineRequireObj().buildExpectationResult = function() {
|
|
2983
3083
|
return buildExpectationResult;
|
2984
3084
|
};
|
2985
3085
|
|
3086
|
+
getJasmineRequireObj().Expector = function(j$) {
|
3087
|
+
function Expector(options) {
|
3088
|
+
this.util = options.util || { buildFailureMessage: function() {} };
|
3089
|
+
this.customEqualityTesters = options.customEqualityTesters || [];
|
3090
|
+
this.actual = options.actual;
|
3091
|
+
this.addExpectationResult = options.addExpectationResult || function(){};
|
3092
|
+
this.filters = new j$.ExpectationFilterChain();
|
3093
|
+
}
|
3094
|
+
|
3095
|
+
Expector.prototype.instantiateMatcher = function(matcherName, matcherFactory, args) {
|
3096
|
+
this.matcherName = matcherName;
|
3097
|
+
this.args = Array.prototype.slice.call(args, 0);
|
3098
|
+
this.expected = this.args.slice(0);
|
3099
|
+
|
3100
|
+
this.args.unshift(this.actual);
|
3101
|
+
|
3102
|
+
var matcher = matcherFactory(this.util, this.customEqualityTesters);
|
3103
|
+
var comparisonFunc = this.filters.selectComparisonFunc(matcher);
|
3104
|
+
return comparisonFunc || matcher.compare;
|
3105
|
+
};
|
3106
|
+
|
3107
|
+
Expector.prototype.buildMessage = function(result) {
|
3108
|
+
var self = this;
|
3109
|
+
|
3110
|
+
if (result.pass) {
|
3111
|
+
return '';
|
3112
|
+
}
|
3113
|
+
|
3114
|
+
var msg = this.filters.buildFailureMessage(result, this.matcherName, this.args, this.util, defaultMessage);
|
3115
|
+
return this.filters.modifyFailureMessage(msg || defaultMessage());
|
3116
|
+
|
3117
|
+
function defaultMessage() {
|
3118
|
+
if (!result.message) {
|
3119
|
+
var args = self.args.slice();
|
3120
|
+
args.unshift(false);
|
3121
|
+
args.unshift(self.matcherName);
|
3122
|
+
return self.util.buildFailureMessage.apply(null, args);
|
3123
|
+
} else if (j$.isFunction_(result.message)) {
|
3124
|
+
return result.message();
|
3125
|
+
} else {
|
3126
|
+
return result.message;
|
3127
|
+
}
|
3128
|
+
}
|
3129
|
+
};
|
3130
|
+
|
3131
|
+
Expector.prototype.compare = function(matcherName, matcherFactory, args) {
|
3132
|
+
var matcherCompare = this.instantiateMatcher(matcherName, matcherFactory, args);
|
3133
|
+
return matcherCompare.apply(null, this.args);
|
3134
|
+
};
|
3135
|
+
|
3136
|
+
Expector.prototype.addFilter = function(filter) {
|
3137
|
+
var result = Object.create(this);
|
3138
|
+
result.filters = this.filters.addFilter(filter);
|
3139
|
+
return result;
|
3140
|
+
};
|
3141
|
+
|
3142
|
+
Expector.prototype.processResult = function(result, errorForStack, actualOverride) {
|
3143
|
+
this.args[0] = actualOverride || this.args[0];
|
3144
|
+
var message = this.buildMessage(result);
|
3145
|
+
|
3146
|
+
if (this.expected.length === 1) {
|
3147
|
+
this.expected = this.expected[0];
|
3148
|
+
}
|
3149
|
+
|
3150
|
+
this.addExpectationResult(
|
3151
|
+
result.pass,
|
3152
|
+
{
|
3153
|
+
matcherName: this.matcherName,
|
3154
|
+
passed: result.pass,
|
3155
|
+
message: message,
|
3156
|
+
error: errorForStack ? undefined : result.error,
|
3157
|
+
errorForStack: errorForStack || undefined,
|
3158
|
+
actual: this.actual,
|
3159
|
+
expected: this.expected // TODO: this may need to be arrayified/sliced
|
3160
|
+
}
|
3161
|
+
);
|
3162
|
+
};
|
3163
|
+
|
3164
|
+
return Expector;
|
3165
|
+
};
|
3166
|
+
|
2986
3167
|
getJasmineRequireObj().formatErrorMsg = function() {
|
2987
3168
|
function generateErrorMsg(domain, usage) {
|
2988
3169
|
var usageDefinition = usage ? '\nUsage: ' + usage : '';
|
@@ -3055,6 +3236,146 @@ getJasmineRequireObj().GlobalErrors = function(j$) {
|
|
3055
3236
|
return GlobalErrors;
|
3056
3237
|
};
|
3057
3238
|
|
3239
|
+
getJasmineRequireObj().toBeRejected = function(j$) {
|
3240
|
+
/**
|
3241
|
+
* Expect a promise to be rejected.
|
3242
|
+
* @function
|
3243
|
+
* @async
|
3244
|
+
* @name async-matchers#toBeRejected
|
3245
|
+
* @example
|
3246
|
+
* await expectAsync(aPromise).toBeRejected();
|
3247
|
+
* @example
|
3248
|
+
* return expectAsync(aPromise).toBeRejected();
|
3249
|
+
*/
|
3250
|
+
return function toBeResolved(util) {
|
3251
|
+
return {
|
3252
|
+
compare: function(actual) {
|
3253
|
+
return actual.then(
|
3254
|
+
function() { return {pass: false}; },
|
3255
|
+
function() { return {pass: true}; }
|
3256
|
+
);
|
3257
|
+
}
|
3258
|
+
};
|
3259
|
+
};
|
3260
|
+
};
|
3261
|
+
|
3262
|
+
getJasmineRequireObj().toBeRejectedWith = function(j$) {
|
3263
|
+
/**
|
3264
|
+
* Expect a promise to be rejected with a value equal to the expected, using deep equality comparison.
|
3265
|
+
* @function
|
3266
|
+
* @async
|
3267
|
+
* @name async-matchers#toBeRejectedWith
|
3268
|
+
* @param {Object} expected - Value that the promise is expected to be rejected with
|
3269
|
+
* @example
|
3270
|
+
* await expectAsync(aPromise).toBeRejectedWith({prop: 'value'});
|
3271
|
+
* @example
|
3272
|
+
* return expectAsync(aPromise).toBeRejectedWith({prop: 'value'});
|
3273
|
+
*/
|
3274
|
+
return function toBeRejectedWith(util, customEqualityTesters) {
|
3275
|
+
return {
|
3276
|
+
compare: function(actualPromise, expectedValue) {
|
3277
|
+
function prefix(passed) {
|
3278
|
+
return 'Expected a promise ' +
|
3279
|
+
(passed ? 'not ' : '') +
|
3280
|
+
'to be rejected with ' + j$.pp(expectedValue);
|
3281
|
+
}
|
3282
|
+
|
3283
|
+
return actualPromise.then(
|
3284
|
+
function() {
|
3285
|
+
return {
|
3286
|
+
pass: false,
|
3287
|
+
message: prefix(false) + ' but it was resolved.'
|
3288
|
+
};
|
3289
|
+
},
|
3290
|
+
function(actualValue) {
|
3291
|
+
if (util.equals(actualValue, expectedValue, customEqualityTesters)) {
|
3292
|
+
return {
|
3293
|
+
pass: true,
|
3294
|
+
message: prefix(true) + '.'
|
3295
|
+
};
|
3296
|
+
} else {
|
3297
|
+
return {
|
3298
|
+
pass: false,
|
3299
|
+
message: prefix(false) + ' but it was rejected with ' + j$.pp(actualValue) + '.'
|
3300
|
+
};
|
3301
|
+
}
|
3302
|
+
}
|
3303
|
+
);
|
3304
|
+
}
|
3305
|
+
};
|
3306
|
+
};
|
3307
|
+
};
|
3308
|
+
|
3309
|
+
getJasmineRequireObj().toBeResolved = function(j$) {
|
3310
|
+
/**
|
3311
|
+
* Expect a promise to be resolved.
|
3312
|
+
* @function
|
3313
|
+
* @async
|
3314
|
+
* @name async-matchers#toBeResolved
|
3315
|
+
* @example
|
3316
|
+
* await expectAsync(aPromise).toBeResolved();
|
3317
|
+
* @example
|
3318
|
+
* return expectAsync(aPromise).toBeResolved();
|
3319
|
+
*/
|
3320
|
+
return function toBeResolved(util) {
|
3321
|
+
return {
|
3322
|
+
compare: function(actual) {
|
3323
|
+
return actual.then(
|
3324
|
+
function() { return {pass: true}; },
|
3325
|
+
function() { return {pass: false}; }
|
3326
|
+
);
|
3327
|
+
}
|
3328
|
+
};
|
3329
|
+
};
|
3330
|
+
};
|
3331
|
+
|
3332
|
+
getJasmineRequireObj().toBeResolvedTo = function(j$) {
|
3333
|
+
/**
|
3334
|
+
* Expect a promise to be resolved to a value equal to the expected, using deep equality comparison.
|
3335
|
+
* @function
|
3336
|
+
* @async
|
3337
|
+
* @name async-matchers#toBeResolvedTo
|
3338
|
+
* @param {Object} expected - Value that the promise is expected to resolve to
|
3339
|
+
* @example
|
3340
|
+
* await expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
|
3341
|
+
* @example
|
3342
|
+
* return expectAsync(aPromise).toBeResolvedTo({prop: 'value'});
|
3343
|
+
*/
|
3344
|
+
return function toBeResolvedTo(util, customEqualityTesters) {
|
3345
|
+
return {
|
3346
|
+
compare: function(actualPromise, expectedValue) {
|
3347
|
+
function prefix(passed) {
|
3348
|
+
return 'Expected a promise ' +
|
3349
|
+
(passed ? 'not ' : '') +
|
3350
|
+
'to be resolved to ' + j$.pp(expectedValue);
|
3351
|
+
}
|
3352
|
+
|
3353
|
+
return actualPromise.then(
|
3354
|
+
function(actualValue) {
|
3355
|
+
if (util.equals(actualValue, expectedValue, customEqualityTesters)) {
|
3356
|
+
return {
|
3357
|
+
pass: true,
|
3358
|
+
message: prefix(true) + '.'
|
3359
|
+
};
|
3360
|
+
} else {
|
3361
|
+
return {
|
3362
|
+
pass: false,
|
3363
|
+
message: prefix(false) + ' but it was resolved to ' + j$.pp(actualValue) + '.'
|
3364
|
+
};
|
3365
|
+
}
|
3366
|
+
},
|
3367
|
+
function() {
|
3368
|
+
return {
|
3369
|
+
pass: false,
|
3370
|
+
message: prefix(false) + ' but it was rejected.'
|
3371
|
+
};
|
3372
|
+
}
|
3373
|
+
);
|
3374
|
+
}
|
3375
|
+
};
|
3376
|
+
};
|
3377
|
+
};
|
3378
|
+
|
3058
3379
|
getJasmineRequireObj().DiffBuilder = function(j$) {
|
3059
3380
|
return function DiffBuilder() {
|
3060
3381
|
var path = new j$.ObjectPath(),
|
@@ -3645,7 +3966,24 @@ getJasmineRequireObj().ObjectPath = function(j$) {
|
|
3645
3966
|
return ObjectPath;
|
3646
3967
|
};
|
3647
3968
|
|
3648
|
-
getJasmineRequireObj().
|
3969
|
+
getJasmineRequireObj().requireAsyncMatchers = function(jRequire, j$) {
|
3970
|
+
var availableMatchers = [
|
3971
|
+
'toBeResolved',
|
3972
|
+
'toBeRejected',
|
3973
|
+
'toBeResolvedTo',
|
3974
|
+
'toBeRejectedWith'
|
3975
|
+
],
|
3976
|
+
matchers = {};
|
3977
|
+
|
3978
|
+
for (var i = 0; i < availableMatchers.length; i++) {
|
3979
|
+
var name = availableMatchers[i];
|
3980
|
+
matchers[name] = jRequire[name](j$);
|
3981
|
+
}
|
3982
|
+
|
3983
|
+
return matchers;
|
3984
|
+
};
|
3985
|
+
|
3986
|
+
getJasmineRequireObj().toBe = function(j$) {
|
3649
3987
|
/**
|
3650
3988
|
* {@link expect} the actual value to be `===` to the expected value.
|
3651
3989
|
* @function
|
@@ -3654,12 +3992,20 @@ getJasmineRequireObj().toBe = function() {
|
|
3654
3992
|
* @example
|
3655
3993
|
* expect(thing).toBe(realThing);
|
3656
3994
|
*/
|
3657
|
-
function toBe() {
|
3995
|
+
function toBe(util) {
|
3996
|
+
var tip = ' Tip: To check for deep equality, use .toEqual() instead of .toBe().';
|
3997
|
+
|
3658
3998
|
return {
|
3659
3999
|
compare: function(actual, expected) {
|
3660
|
-
|
3661
|
-
pass: actual === expected
|
4000
|
+
var result = {
|
4001
|
+
pass: actual === expected,
|
3662
4002
|
};
|
4003
|
+
|
4004
|
+
if (typeof expected === 'object') {
|
4005
|
+
result.message = util.buildFailureMessage('toBe', result.pass, actual, expected) + tip;
|
4006
|
+
}
|
4007
|
+
|
4008
|
+
return result;
|
3663
4009
|
}
|
3664
4010
|
};
|
3665
4011
|
}
|
@@ -4994,26 +5340,29 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|
4994
5340
|
|
4995
5341
|
function once(fn) {
|
4996
5342
|
var called = false;
|
4997
|
-
return function() {
|
5343
|
+
return function(arg) {
|
4998
5344
|
if (!called) {
|
4999
5345
|
called = true;
|
5000
|
-
|
5346
|
+
// Direct call using single parameter, because cleanup/next does not need more
|
5347
|
+
fn(arg);
|
5001
5348
|
}
|
5002
5349
|
return null;
|
5003
5350
|
};
|
5004
5351
|
}
|
5005
5352
|
|
5353
|
+
function emptyFn() {}
|
5354
|
+
|
5006
5355
|
function QueueRunner(attrs) {
|
5007
5356
|
var queueableFns = attrs.queueableFns || [];
|
5008
5357
|
this.queueableFns = queueableFns.concat(attrs.cleanupFns || []);
|
5009
5358
|
this.firstCleanupIx = queueableFns.length;
|
5010
|
-
this.onComplete = attrs.onComplete ||
|
5359
|
+
this.onComplete = attrs.onComplete || emptyFn;
|
5011
5360
|
this.clearStack = attrs.clearStack || function(fn) {fn();};
|
5012
|
-
this.onException = attrs.onException ||
|
5361
|
+
this.onException = attrs.onException || emptyFn;
|
5013
5362
|
this.userContext = attrs.userContext || new j$.UserContext();
|
5014
5363
|
this.timeout = attrs.timeout || {setTimeout: setTimeout, clearTimeout: clearTimeout};
|
5015
|
-
this.fail = attrs.fail ||
|
5016
|
-
this.globalErrors = attrs.globalErrors || { pushListener:
|
5364
|
+
this.fail = attrs.fail || emptyFn;
|
5365
|
+
this.globalErrors = attrs.globalErrors || { pushListener: emptyFn, popListener: emptyFn };
|
5017
5366
|
this.completeOnFirstError = !!attrs.completeOnFirstError;
|
5018
5367
|
this.errored = false;
|
5019
5368
|
|
@@ -5055,7 +5404,9 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|
5055
5404
|
next(error);
|
5056
5405
|
},
|
5057
5406
|
cleanup = once(function cleanup() {
|
5058
|
-
|
5407
|
+
if (timeoutId !== void 0) {
|
5408
|
+
self.clearTimeout(timeoutId);
|
5409
|
+
}
|
5059
5410
|
self.globalErrors.popListener(handleError);
|
5060
5411
|
}),
|
5061
5412
|
next = once(function next(err) {
|
@@ -6617,5 +6968,5 @@ getJasmineRequireObj().UserContext = function(j$) {
|
|
6617
6968
|
};
|
6618
6969
|
|
6619
6970
|
getJasmineRequireObj().version = function() {
|
6620
|
-
return '3.
|
6971
|
+
return '3.3.0';
|
6621
6972
|
};
|