jasmine-core 2.7.0 → 2.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/jasmine-core/jasmine.js +287 -43
- data/lib/jasmine-core/spec/core/CallTrackerSpec.js +10 -0
- data/lib/jasmine-core/spec/core/asymmetric_equality/ArrayWithExactContentsSpec.js +47 -0
- data/lib/jasmine-core/spec/core/integration/CustomMatchersSpec.js +3 -2
- data/lib/jasmine-core/spec/core/integration/EnvSpec.js +31 -16
- data/lib/jasmine-core/spec/core/matchers/matchersUtilSpec.js +14 -14
- data/lib/jasmine-core/spec/core/matchers/nothingSpec.js +8 -0
- data/lib/jasmine-core/spec/core/matchers/toEqualSpec.js +189 -17
- data/lib/jasmine-core/spec/helpers/checkForTypedArrays.js +20 -0
- data/lib/jasmine-core/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af3fdbce40dc44c9c0129b5ddd5137720bcf9319
|
4
|
+
data.tar.gz: d22c15e0965fc94de0bb67e9efbc4fbe2bd403b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8b6b5234a6935dbeeab646a474153c81954e677d43f95a34dba63f6d2e8e2e7a8a163abbd7c5b3d563180eba1bd15a199187f2342575bb31993eb84d574ad67
|
7
|
+
data.tar.gz: 32b6e96b74c6e630f849dd68ca813b4bf8edef110251079b55cfe2c4ef031613c70a496f03cb7b3e2dcec678f10baf7d0a9e297e5310a96353357882958b4492
|
data/lib/jasmine-core/jasmine.js
CHANGED
@@ -63,6 +63,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
63
63
|
j$.matchersUtil = jRequire.matchersUtil(j$);
|
64
64
|
j$.ObjectContaining = jRequire.ObjectContaining(j$);
|
65
65
|
j$.ArrayContaining = jRequire.ArrayContaining(j$);
|
66
|
+
j$.ArrayWithExactContents = jRequire.ArrayWithExactContents(j$);
|
66
67
|
j$.pp = jRequire.pp(j$);
|
67
68
|
j$.QueueRunner = jRequire.QueueRunner(j$);
|
68
69
|
j$.ReportDispatcher = jRequire.ReportDispatcher();
|
@@ -92,6 +93,7 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
92
93
|
|
93
94
|
getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
|
94
95
|
var availableMatchers = [
|
96
|
+
'nothing',
|
95
97
|
'toBe',
|
96
98
|
'toBeCloseTo',
|
97
99
|
'toBeDefined',
|
@@ -191,6 +193,18 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|
191
193
|
return j$.isA_('AsyncFunction', value);
|
192
194
|
};
|
193
195
|
|
196
|
+
j$.isTypedArray_ = function(value) {
|
197
|
+
return j$.isA_('Float32Array', value) ||
|
198
|
+
j$.isA_('Float64Array', value) ||
|
199
|
+
j$.isA_('Int16Array', value) ||
|
200
|
+
j$.isA_('Int32Array', value) ||
|
201
|
+
j$.isA_('Int8Array', value) ||
|
202
|
+
j$.isA_('Uint16Array', value) ||
|
203
|
+
j$.isA_('Uint32Array', value) ||
|
204
|
+
j$.isA_('Uint8Array', value) ||
|
205
|
+
j$.isA_('Uint8ClampedArray', value);
|
206
|
+
};
|
207
|
+
|
194
208
|
j$.isA_ = function(typeName, value) {
|
195
209
|
return j$.getType_(value) === '[object ' + typeName + ']';
|
196
210
|
};
|
@@ -208,7 +222,9 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|
208
222
|
return func.name;
|
209
223
|
}
|
210
224
|
|
211
|
-
var matches = func.toString().match(/^\s*function\s*(\w*)\s*\(/)
|
225
|
+
var matches = func.toString().match(/^\s*function\s*(\w*)\s*\(/) ||
|
226
|
+
func.toString().match(/^\s*\[object\s*(\w*)Constructor\]/);
|
227
|
+
|
212
228
|
return matches ? matches[1] : '<anonymous>';
|
213
229
|
};
|
214
230
|
|
@@ -266,6 +282,17 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|
266
282
|
return new j$.ArrayContaining(sample);
|
267
283
|
};
|
268
284
|
|
285
|
+
/**
|
286
|
+
* 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}),
|
287
|
+
* that will succeed if the actual value is an `Array` that contains all of the elements in the sample in any order.
|
288
|
+
* @name jasmine.arrayWithExactContents
|
289
|
+
* @function
|
290
|
+
* @param {Array} sample
|
291
|
+
*/
|
292
|
+
j$.arrayWithExactContents = function(sample) {
|
293
|
+
return new j$.ArrayWithExactContents(sample);
|
294
|
+
};
|
295
|
+
|
269
296
|
/**
|
270
297
|
* Create a bare {@link Spy} object. This won't be installed anywhere and will not have any implementation behind it.
|
271
298
|
* @name jasmine.createSpy
|
@@ -436,6 +463,16 @@ getJasmineRequireObj().Spec = function(j$) {
|
|
436
463
|
this.pend();
|
437
464
|
}
|
438
465
|
|
466
|
+
/**
|
467
|
+
* @typedef SpecResult
|
468
|
+
* @property {Int} id - The unique id of this spec.
|
469
|
+
* @property {String} description - The description passed to the {@link it} that created this spec.
|
470
|
+
* @property {String} fullName - The full description including all ancestors of this spec.
|
471
|
+
* @property {Expectation[]} failedExpectations - The list of expectations that failed during execution of this spec.
|
472
|
+
* @property {Expectation[]} passedExpectations - The list of expectations that passed during execution of this spec.
|
473
|
+
* @property {String} pendingReason - If the spec is {@link pending}, this will be the reason.
|
474
|
+
* @property {String} status - Once the spec has completed, this string represents the pass/fail status of this spec.
|
475
|
+
*/
|
439
476
|
this.result = {
|
440
477
|
id: this.id,
|
441
478
|
description: this.description,
|
@@ -664,12 +701,56 @@ getJasmineRequireObj().Env = function(j$) {
|
|
664
701
|
return currentSpec || currentSuite();
|
665
702
|
};
|
666
703
|
|
704
|
+
/**
|
705
|
+
* This represents the available reporter callback for an object passed to {@link Env#addReporter}.
|
706
|
+
* @interface Reporter
|
707
|
+
*/
|
667
708
|
var reporter = new j$.ReportDispatcher([
|
709
|
+
/**
|
710
|
+
* `jasmineStarted` is called after all of the specs have been loaded, but just before execution starts.
|
711
|
+
* @function
|
712
|
+
* @name Reporter#jasmineStarted
|
713
|
+
* @param {JasmineStartedInfo} suiteInfo Information about the full Jasmine suite that is being run
|
714
|
+
*/
|
668
715
|
'jasmineStarted',
|
716
|
+
/**
|
717
|
+
* When the entire suite has finished execution `jasmineDone` is called
|
718
|
+
* @function
|
719
|
+
* @name Reporter#jasmineDone
|
720
|
+
* @param {JasmineDoneInfo} suiteInfo Information about the full Jasmine suite that just finished running.
|
721
|
+
*/
|
669
722
|
'jasmineDone',
|
723
|
+
/**
|
724
|
+
* `suiteStarted` is invoked when a `describe` starts to run
|
725
|
+
* @function
|
726
|
+
* @name Reporter#suiteStarted
|
727
|
+
* @param {SuiteResult} result Information about the individual {@link describe} being run
|
728
|
+
*/
|
670
729
|
'suiteStarted',
|
730
|
+
/**
|
731
|
+
* `suiteDone` is invoked when all of the child specs and suites for a given suite have been run
|
732
|
+
*
|
733
|
+
* While jasmine doesn't require any specific functions, not defining a `suiteDone` will make it impossible for a reporter to know when a suite has failures in an `afterAll`.
|
734
|
+
* @function
|
735
|
+
* @name Reporter#suiteDone
|
736
|
+
* @param {SuiteResult} result
|
737
|
+
*/
|
671
738
|
'suiteDone',
|
739
|
+
/**
|
740
|
+
* `specStarted` is invoked when an `it` starts to run (including associated `beforeEach` functions)
|
741
|
+
* @function
|
742
|
+
* @name Reporter#specStarted
|
743
|
+
* @param {SpecResult} result Information about the individual {@link it} being run
|
744
|
+
*/
|
672
745
|
'specStarted',
|
746
|
+
/**
|
747
|
+
* `specDone` is invoked when an `it` and its associated `beforeEach` and `afterEach` functions have been run.
|
748
|
+
*
|
749
|
+
* While jasmine doesn't require any specific functions, not defining a `specDone` will make it impossible for a reporter to know when a spec has failed.
|
750
|
+
* @function
|
751
|
+
* @name Reporter#specDone
|
752
|
+
* @param {SpecResult} result
|
753
|
+
*/
|
673
754
|
'specDone'
|
674
755
|
]);
|
675
756
|
|
@@ -885,6 +966,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|
885
966
|
throw new Error('Invalid order: would cause a beforeAll or afterAll to be run multiple times');
|
886
967
|
}
|
887
968
|
|
969
|
+
/**
|
970
|
+
* Information passed to the {@link Reporter#jasmineStarted} event.
|
971
|
+
* @typedef JasmineStartedInfo
|
972
|
+
* @property {Int} totalSpecsDefined - The total number of specs defined in this suite.
|
973
|
+
* @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
|
974
|
+
*/
|
888
975
|
reporter.jasmineStarted({
|
889
976
|
totalSpecsDefined: totalSpecsDefined,
|
890
977
|
order: order
|
@@ -898,6 +985,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|
898
985
|
currentlyExecutingSuites.pop();
|
899
986
|
globalErrors.uninstall();
|
900
987
|
|
988
|
+
/**
|
989
|
+
* Information passed to the {@link Reporter#jasmineDone} event.
|
990
|
+
* @typedef JasmineDoneInfo
|
991
|
+
* @property {Order} order - Information about the ordering (random or not) of this execution of the suite.
|
992
|
+
* @property {Expectation[]} failedExpectations - List of expectations that failed in an {@link afterAll} at the global level.
|
993
|
+
*/
|
901
994
|
reporter.jasmineDone({
|
902
995
|
order: order,
|
903
996
|
failedExpectations: topSuite.result.failedExpectations
|
@@ -909,6 +1002,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
909
1002
|
* Add a custom reporter to the Jasmine environment.
|
910
1003
|
* @name Env#addReporter
|
911
1004
|
* @function
|
1005
|
+
* @param {Reporter} reporterToAdd The reporter to be added.
|
912
1006
|
* @see custom_reporter
|
913
1007
|
*/
|
914
1008
|
this.addReporter = function(reporterToAdd) {
|
@@ -1215,11 +1309,10 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
1215
1309
|
};
|
1216
1310
|
|
1217
1311
|
/**
|
1218
|
-
* _Note:_ Do not construct this directly, use the global `jsApiReporter` to retrieve the instantiated object.
|
1219
|
-
*
|
1220
1312
|
* @name jsApiReporter
|
1221
|
-
* @classdesc Reporter added by default in `boot.js` to record results for retrieval in javascript code.
|
1313
|
+
* @classdesc {@link Reporter} added by default in `boot.js` to record results for retrieval in javascript code. An instance is made available as `jsApiReporter` on the global object.
|
1222
1314
|
* @class
|
1315
|
+
* @hideconstructor
|
1223
1316
|
*/
|
1224
1317
|
function JsApiReporter(options) {
|
1225
1318
|
var timer = options.timer || noopTimer,
|
@@ -1273,7 +1366,7 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
1273
1366
|
* @function
|
1274
1367
|
* @param {Number} index - The position in the suites list to start from.
|
1275
1368
|
* @param {Number} length - Maximum number of suite results to return.
|
1276
|
-
* @return {
|
1369
|
+
* @return {SuiteResult[]}
|
1277
1370
|
*/
|
1278
1371
|
this.suiteResults = function(index, length) {
|
1279
1372
|
return suites.slice(index, index + length);
|
@@ -1288,7 +1381,7 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
1288
1381
|
* Get all of the suites in a single object, with their `id` as the key.
|
1289
1382
|
* @name jsApiReporter#suites
|
1290
1383
|
* @function
|
1291
|
-
* @return {Object}
|
1384
|
+
* @return {Object} - Map of suite id to {@link SuiteResult}
|
1292
1385
|
*/
|
1293
1386
|
this.suites = function() {
|
1294
1387
|
return suites_hash;
|
@@ -1308,7 +1401,7 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
1308
1401
|
* @function
|
1309
1402
|
* @param {Number} index - The position in the specs list to start from.
|
1310
1403
|
* @param {Number} length - Maximum number of specs results to return.
|
1311
|
-
* @return {
|
1404
|
+
* @return {SpecResult[]}
|
1312
1405
|
*/
|
1313
1406
|
this.specResults = function(index, length) {
|
1314
1407
|
return specs.slice(index, index + length);
|
@@ -1318,7 +1411,7 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
1318
1411
|
* Get all spec results.
|
1319
1412
|
* @name jsApiReporter#specs
|
1320
1413
|
* @function
|
1321
|
-
* @return {
|
1414
|
+
* @return {SpecResult[]}
|
1322
1415
|
*/
|
1323
1416
|
this.specs = function() {
|
1324
1417
|
return specs;
|
@@ -1403,8 +1496,9 @@ getJasmineRequireObj().ArrayContaining = function(j$) {
|
|
1403
1496
|
}
|
1404
1497
|
|
1405
1498
|
ArrayContaining.prototype.asymmetricMatch = function(other, customTesters) {
|
1406
|
-
|
1407
|
-
|
1499
|
+
if (!j$.isArray_(this.sample)) {
|
1500
|
+
throw new Error('You must provide an array to arrayContaining, not ' + j$.pp(this.sample) + '.');
|
1501
|
+
}
|
1408
1502
|
|
1409
1503
|
for (var i = 0; i < this.sample.length; i++) {
|
1410
1504
|
var item = this.sample[i];
|
@@ -1423,6 +1517,38 @@ getJasmineRequireObj().ArrayContaining = function(j$) {
|
|
1423
1517
|
return ArrayContaining;
|
1424
1518
|
};
|
1425
1519
|
|
1520
|
+
getJasmineRequireObj().ArrayWithExactContents = function(j$) {
|
1521
|
+
|
1522
|
+
function ArrayWithExactContents(sample) {
|
1523
|
+
this.sample = sample;
|
1524
|
+
}
|
1525
|
+
|
1526
|
+
ArrayWithExactContents.prototype.asymmetricMatch = function(other, customTesters) {
|
1527
|
+
if (!j$.isArray_(this.sample)) {
|
1528
|
+
throw new Error('You must provide an array to arrayWithExactContents, not ' + j$.pp(this.sample) + '.');
|
1529
|
+
}
|
1530
|
+
|
1531
|
+
if (this.sample.length !== other.length) {
|
1532
|
+
return false;
|
1533
|
+
}
|
1534
|
+
|
1535
|
+
for (var i = 0; i < this.sample.length; i++) {
|
1536
|
+
var item = this.sample[i];
|
1537
|
+
if (!j$.matchersUtil.contains(other, item, customTesters)) {
|
1538
|
+
return false;
|
1539
|
+
}
|
1540
|
+
}
|
1541
|
+
|
1542
|
+
return true;
|
1543
|
+
};
|
1544
|
+
|
1545
|
+
ArrayWithExactContents.prototype.jasmineToString = function() {
|
1546
|
+
return '<jasmine.arrayWithExactContents ' + j$.pp(this.sample) + '>';
|
1547
|
+
};
|
1548
|
+
|
1549
|
+
return ArrayWithExactContents;
|
1550
|
+
};
|
1551
|
+
|
1426
1552
|
getJasmineRequireObj().ObjectContaining = function(j$) {
|
1427
1553
|
|
1428
1554
|
function ObjectContaining(sample) {
|
@@ -1507,10 +1633,13 @@ getJasmineRequireObj().CallTracker = function(j$) {
|
|
1507
1633
|
var clonedArgs = [];
|
1508
1634
|
var argsAsArray = j$.util.argsToArray(context.args);
|
1509
1635
|
for(var i = 0; i < argsAsArray.length; i++) {
|
1510
|
-
|
1511
|
-
|
1512
|
-
|
1636
|
+
var str = Object.prototype.toString.apply(argsAsArray[i]),
|
1637
|
+
primitives = /^\[object (Boolean|String|RegExp|Number)/;
|
1638
|
+
|
1639
|
+
if (argsAsArray[i] == null || str.match(primitives)) {
|
1513
1640
|
clonedArgs.push(argsAsArray[i]);
|
1641
|
+
} else {
|
1642
|
+
clonedArgs.push(j$.util.clone(argsAsArray[i]));
|
1514
1643
|
}
|
1515
1644
|
}
|
1516
1645
|
context.args = clonedArgs;
|
@@ -2164,6 +2293,15 @@ getJasmineRequireObj().buildExpectationResult = function() {
|
|
2164
2293
|
var messageFormatter = options.messageFormatter || function() {},
|
2165
2294
|
stackFormatter = options.stackFormatter || function() {};
|
2166
2295
|
|
2296
|
+
/**
|
2297
|
+
* @typedef Expectation
|
2298
|
+
* @property {String} matcherName - The name of the matcher that was executed for this expectation.
|
2299
|
+
* @property {String} message - The failure message for the expectation.
|
2300
|
+
* @property {String} stack - The stack trace for the failure if available.
|
2301
|
+
* @property {Boolean} passed - Whether the expectation passed or failed.
|
2302
|
+
* @property {Object} expected - If the expectation failed, what was the expected value.
|
2303
|
+
* @property {Object} actual - If the expectation failed, what actual value was produced.
|
2304
|
+
*/
|
2167
2305
|
var result = {
|
2168
2306
|
matcherName: options.matcherName,
|
2169
2307
|
message: message(),
|
@@ -2374,13 +2512,17 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|
2374
2512
|
|
2375
2513
|
if (asymmetricA) {
|
2376
2514
|
result = a.asymmetricMatch(b, customTesters);
|
2377
|
-
|
2515
|
+
if (!result) {
|
2516
|
+
diffBuilder.record(a, b);
|
2517
|
+
}
|
2378
2518
|
return result;
|
2379
2519
|
}
|
2380
2520
|
|
2381
2521
|
if (asymmetricB) {
|
2382
2522
|
result = b.asymmetricMatch(a, customTesters);
|
2383
|
-
|
2523
|
+
if (!result) {
|
2524
|
+
diffBuilder.record(a, b);
|
2525
|
+
}
|
2384
2526
|
return result;
|
2385
2527
|
}
|
2386
2528
|
}
|
@@ -2533,35 +2675,84 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|
2533
2675
|
// Recursively compare objects and arrays.
|
2534
2676
|
// Compare array lengths to determine if a deep comparison is necessary.
|
2535
2677
|
if (className == '[object Array]') {
|
2536
|
-
|
2537
|
-
|
2678
|
+
var aLength = a.length;
|
2679
|
+
var bLength = b.length;
|
2680
|
+
|
2681
|
+
diffBuilder.withPath('length', function() {
|
2682
|
+
if (aLength !== bLength) {
|
2683
|
+
diffBuilder.record(aLength, bLength);
|
2684
|
+
result = false;
|
2685
|
+
}
|
2686
|
+
});
|
2687
|
+
|
2688
|
+
for (i = 0; i < aLength || i < bLength; i++) {
|
2689
|
+
diffBuilder.withPath(i, function() {
|
2690
|
+
result = eq(i < aLength ? a[i] : void 0, i < bLength ? b[i] : void 0, aStack, bStack, customTesters, diffBuilder) && result;
|
2691
|
+
});
|
2692
|
+
}
|
2693
|
+
if (!result) {
|
2694
|
+
return false;
|
2695
|
+
}
|
2696
|
+
} else if (className == '[object Map]') {
|
2697
|
+
if (a.size != b.size) {
|
2538
2698
|
diffBuilder.record(a, b);
|
2539
2699
|
return false;
|
2540
2700
|
}
|
2541
2701
|
|
2542
|
-
|
2543
|
-
|
2544
|
-
|
2545
|
-
|
2702
|
+
// For both sets of keys, check they map to equal values in both maps
|
2703
|
+
var mapKeys = [a.keys(), b.keys()];
|
2704
|
+
var mapIter, mapKeyIt, mapKey;
|
2705
|
+
for (i = 0; result && i < mapKeys.length; i++) {
|
2706
|
+
mapIter = mapKeys[i];
|
2707
|
+
mapKeyIt = mapIter.next();
|
2708
|
+
while (result && !mapKeyIt.done) {
|
2709
|
+
mapKey = mapKeyIt.value;
|
2710
|
+
result = eq(a.get(mapKey), b.get(mapKey), aStack, bStack, customTesters, j$.NullDiffBuilder());
|
2711
|
+
mapKeyIt = mapIter.next();
|
2712
|
+
}
|
2546
2713
|
}
|
2714
|
+
|
2547
2715
|
if (!result) {
|
2716
|
+
diffBuilder.record(a, b);
|
2548
2717
|
return false;
|
2549
2718
|
}
|
2550
|
-
} else if (className == '[object Set]'
|
2719
|
+
} else if (className == '[object Set]') {
|
2551
2720
|
if (a.size != b.size) {
|
2552
2721
|
diffBuilder.record(a, b);
|
2553
2722
|
return false;
|
2554
2723
|
}
|
2555
|
-
|
2556
|
-
|
2557
|
-
|
2558
|
-
|
2559
|
-
|
2560
|
-
|
2561
|
-
|
2562
|
-
|
2724
|
+
|
2725
|
+
// For both sets, check they are all contained in the other set
|
2726
|
+
var setPairs = [[a, b], [b, a]];
|
2727
|
+
var baseIter, baseValueIt, baseValue;
|
2728
|
+
var otherSet, otherIter, otherValueIt, otherValue, found;
|
2729
|
+
for (i = 0; result && i < setPairs.length; i++) {
|
2730
|
+
baseIter = setPairs[i][0].values();
|
2731
|
+
otherSet = setPairs[i][1];
|
2732
|
+
// For each value in the base set...
|
2733
|
+
baseValueIt = baseIter.next();
|
2734
|
+
while (result && !baseValueIt.done) {
|
2735
|
+
baseValue = baseValueIt.value;
|
2736
|
+
// ... test that it is present in the other set
|
2737
|
+
otherIter = otherSet.values();
|
2738
|
+
otherValueIt = otherIter.next();
|
2739
|
+
// Optimisation: start looking for value by object identity
|
2740
|
+
found = otherSet.has(baseValue);
|
2741
|
+
// If not found, compare by value equality
|
2742
|
+
while (!found && !otherValueIt.done) {
|
2743
|
+
otherValue = otherValueIt.value;
|
2744
|
+
found = eq(baseValue, otherValue, aStack, bStack, customTesters, j$.NullDiffBuilder());
|
2745
|
+
otherValueIt = otherIter.next();
|
2746
|
+
}
|
2747
|
+
result = result && found;
|
2748
|
+
baseValueIt = baseIter.next();
|
2563
2749
|
}
|
2564
|
-
}
|
2750
|
+
}
|
2751
|
+
|
2752
|
+
if (!result) {
|
2753
|
+
diffBuilder.record(a, b);
|
2754
|
+
return false;
|
2755
|
+
}
|
2565
2756
|
} else {
|
2566
2757
|
|
2567
2758
|
// Objects with different constructors are not equivalent, but `Object`s
|
@@ -2694,6 +2885,27 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|
2694
2885
|
}
|
2695
2886
|
};
|
2696
2887
|
|
2888
|
+
getJasmineRequireObj().nothing = function() {
|
2889
|
+
/**
|
2890
|
+
* {@link expect} nothing explicitly.
|
2891
|
+
* @function
|
2892
|
+
* @name matchers#nothing
|
2893
|
+
* @example
|
2894
|
+
* expect().nothing();
|
2895
|
+
*/
|
2896
|
+
function nothing() {
|
2897
|
+
return {
|
2898
|
+
compare: function() {
|
2899
|
+
return {
|
2900
|
+
pass: true
|
2901
|
+
};
|
2902
|
+
}
|
2903
|
+
};
|
2904
|
+
}
|
2905
|
+
|
2906
|
+
return nothing;
|
2907
|
+
};
|
2908
|
+
|
2697
2909
|
getJasmineRequireObj().NullDiffBuilder = function(j$) {
|
2698
2910
|
return function() {
|
2699
2911
|
return {
|
@@ -3716,6 +3928,8 @@ getJasmineRequireObj().pp = function(j$) {
|
|
3716
3928
|
this.emitSet(value);
|
3717
3929
|
} else if (j$.getType_(value) == '[object Map]') {
|
3718
3930
|
this.emitMap(value);
|
3931
|
+
} else if (j$.isTypedArray_(value)) {
|
3932
|
+
this.emitTypedArray(value);
|
3719
3933
|
} else if (value.toString && typeof value === 'object' && !j$.isArray_(value) && hasCustomToString(value)) {
|
3720
3934
|
this.emitScalar(value.toString());
|
3721
3935
|
} else if (j$.util.arrayContains(this.seen, value)) {
|
@@ -3886,6 +4100,18 @@ getJasmineRequireObj().pp = function(j$) {
|
|
3886
4100
|
this.append(' })');
|
3887
4101
|
};
|
3888
4102
|
|
4103
|
+
StringPrettyPrinter.prototype.emitTypedArray = function(arr) {
|
4104
|
+
var constructorName = j$.fnNameFor(arr.constructor),
|
4105
|
+
limitedArray = Array.prototype.slice.call(arr, 0, j$.MAX_PRETTY_PRINT_ARRAY_LENGTH),
|
4106
|
+
itemsString = Array.prototype.join.call(limitedArray, ', ');
|
4107
|
+
|
4108
|
+
if (limitedArray.length !== arr.length) {
|
4109
|
+
itemsString += ', ...';
|
4110
|
+
}
|
4111
|
+
|
4112
|
+
this.append(constructorName + ' [ ' + itemsString + ' ]');
|
4113
|
+
};
|
4114
|
+
|
3889
4115
|
StringPrettyPrinter.prototype.formatProperty = function(obj, property, isGetter) {
|
3890
4116
|
this.append(property);
|
3891
4117
|
this.append(': ');
|
@@ -4149,6 +4375,16 @@ getJasmineRequireObj().ReportDispatcher = function() {
|
|
4149
4375
|
|
4150
4376
|
getJasmineRequireObj().interface = function(jasmine, env) {
|
4151
4377
|
var jasmineInterface = {
|
4378
|
+
/**
|
4379
|
+
* Callback passed to parts of the Jasmine base interface.
|
4380
|
+
*
|
4381
|
+
* By default Jasmine assumes this function completes synchronously.
|
4382
|
+
* If you have code that you need to test asynchronously, you can declare that you receive a `done` callback, return a Promise, or use the `async` keyword if it is supported in your environment.
|
4383
|
+
* @callback implementationCallback
|
4384
|
+
* @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.
|
4385
|
+
* @returns {} Optionally return a Promise instead of using `done` to cause Jasmine to wait for completion.
|
4386
|
+
*/
|
4387
|
+
|
4152
4388
|
/**
|
4153
4389
|
* Create a group of specs (often called a suite).
|
4154
4390
|
*
|
@@ -4157,7 +4393,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4157
4393
|
* @function
|
4158
4394
|
* @global
|
4159
4395
|
* @param {String} description Textual description of the group
|
4160
|
-
* @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites
|
4396
|
+
* @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
|
4161
4397
|
*/
|
4162
4398
|
describe: function(description, specDefinitions) {
|
4163
4399
|
return env.describe(description, specDefinitions);
|
@@ -4171,7 +4407,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4171
4407
|
* @function
|
4172
4408
|
* @global
|
4173
4409
|
* @param {String} description Textual description of the group
|
4174
|
-
* @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites
|
4410
|
+
* @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
|
4175
4411
|
*/
|
4176
4412
|
xdescribe: function(description, specDefinitions) {
|
4177
4413
|
return env.xdescribe(description, specDefinitions);
|
@@ -4186,7 +4422,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4186
4422
|
* @function
|
4187
4423
|
* @global
|
4188
4424
|
* @param {String} description Textual description of the group
|
4189
|
-
* @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites
|
4425
|
+
* @param {Function} specDefinitions Function for Jasmine to invoke that will define inner suites and specs
|
4190
4426
|
*/
|
4191
4427
|
fdescribe: function(description, specDefinitions) {
|
4192
4428
|
return env.fdescribe(description, specDefinitions);
|
@@ -4200,7 +4436,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4200
4436
|
* @function
|
4201
4437
|
* @global
|
4202
4438
|
* @param {String} description Textual description of what this spec is checking
|
4203
|
-
* @param {
|
4439
|
+
* @param {implementationCallback} [testFunction] Function that contains the code of your test. If not provided the test will be `pending`.
|
4204
4440
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
|
4205
4441
|
*/
|
4206
4442
|
it: function() {
|
@@ -4215,7 +4451,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4215
4451
|
* @function
|
4216
4452
|
* @global
|
4217
4453
|
* @param {String} description Textual description of what this spec is checking.
|
4218
|
-
* @param {
|
4454
|
+
* @param {implementationCallback} [testFunction] Function that contains the code of your test. Will not be executed.
|
4219
4455
|
*/
|
4220
4456
|
xit: function() {
|
4221
4457
|
return env.xit.apply(env, arguments);
|
@@ -4229,7 +4465,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4229
4465
|
* @function
|
4230
4466
|
* @global
|
4231
4467
|
* @param {String} description Textual description of what this spec is checking.
|
4232
|
-
* @param {
|
4468
|
+
* @param {implementationCallback} testFunction Function that contains the code of your test.
|
4233
4469
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async spec.
|
4234
4470
|
*/
|
4235
4471
|
fit: function() {
|
@@ -4241,7 +4477,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4241
4477
|
* @name beforeEach
|
4242
4478
|
* @function
|
4243
4479
|
* @global
|
4244
|
-
* @param {
|
4480
|
+
* @param {implementationCallback} [function] Function that contains the code to setup your specs.
|
4245
4481
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeEach.
|
4246
4482
|
*/
|
4247
4483
|
beforeEach: function() {
|
@@ -4253,7 +4489,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4253
4489
|
* @name afterEach
|
4254
4490
|
* @function
|
4255
4491
|
* @global
|
4256
|
-
* @param {
|
4492
|
+
* @param {implementationCallback} [function] Function that contains the code to teardown your specs.
|
4257
4493
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterEach.
|
4258
4494
|
*/
|
4259
4495
|
afterEach: function() {
|
@@ -4267,7 +4503,7 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4267
4503
|
* @name beforeAll
|
4268
4504
|
* @function
|
4269
4505
|
* @global
|
4270
|
-
* @param {
|
4506
|
+
* @param {implementationCallback} [function] Function that contains the code to setup your specs.
|
4271
4507
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async beforeAll.
|
4272
4508
|
*/
|
4273
4509
|
beforeAll: function() {
|
@@ -4275,13 +4511,13 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
4275
4511
|
},
|
4276
4512
|
|
4277
4513
|
/**
|
4278
|
-
* Run some shared teardown once
|
4514
|
+
* Run some shared teardown once after all of the specs in the {@link describe} are run.
|
4279
4515
|
*
|
4280
4516
|
* _Note:_ Be careful, sharing the teardown from a afterAll makes it easy to accidentally leak state between your specs so that they erroneously pass or fail.
|
4281
4517
|
* @name afterAll
|
4282
4518
|
* @function
|
4283
4519
|
* @global
|
4284
|
-
* @param {
|
4520
|
+
* @param {implementationCallback} [function] Function that contains the code to teardown your specs.
|
4285
4521
|
* @param {Int} [timeout={@link jasmine.DEFAULT_TIMEOUT_INTERVAL}] Custom timeout for an async afterAll.
|
4286
4522
|
*/
|
4287
4523
|
afterAll: function() {
|
@@ -4748,6 +4984,14 @@ getJasmineRequireObj().Suite = function(j$) {
|
|
4748
4984
|
|
4749
4985
|
this.children = [];
|
4750
4986
|
|
4987
|
+
/**
|
4988
|
+
* @typedef SuiteResult
|
4989
|
+
* @property {Int} id - The unique id of this suite.
|
4990
|
+
* @property {String} description - The description text passed to the {@link describe} that made this suite.
|
4991
|
+
* @property {String} fullName - The full description including all ancestors of this suite.
|
4992
|
+
* @property {Expectation[]} failedExpectations - The list of expectations that failed in an {@link afterAll} for this suite.
|
4993
|
+
* @property {String} status - Once the suite has completed, this string represents the pass/fail status of this suite.
|
4994
|
+
*/
|
4751
4995
|
this.result = {
|
4752
4996
|
id: this.id,
|
4753
4997
|
description: this.description,
|
@@ -5137,5 +5381,5 @@ getJasmineRequireObj().UserContext = function(j$) {
|
|
5137
5381
|
};
|
5138
5382
|
|
5139
5383
|
getJasmineRequireObj().version = function() {
|
5140
|
-
return '2.
|
5384
|
+
return '2.8.0';
|
5141
5385
|
};
|
@@ -117,4 +117,14 @@ describe("CallTracker", function() {
|
|
117
117
|
expect(callTracker.mostRecent().args[1]).not.toBe(arrayArg);
|
118
118
|
expect(callTracker.mostRecent().args[1]).toEqual(arrayArg);
|
119
119
|
});
|
120
|
+
|
121
|
+
it('saves primitive arguments by value', function() {
|
122
|
+
var callTracker = new jasmineUnderTest.CallTracker(),
|
123
|
+
args = [undefined, null, false, '', /\s/, 0, 1.2, NaN];
|
124
|
+
|
125
|
+
callTracker.saveArgumentsByValue();
|
126
|
+
callTracker.track({ object: {}, args: args });
|
127
|
+
|
128
|
+
expect(callTracker.mostRecent().args).toEqual(args);
|
129
|
+
});
|
120
130
|
});
|
@@ -0,0 +1,47 @@
|
|
1
|
+
describe("ArrayWithExactContents", function() {
|
2
|
+
it("matches an array with the same items in a different order", function() {
|
3
|
+
var matcher = new jasmineUnderTest.ArrayWithExactContents(['a', 2, /a/]);
|
4
|
+
|
5
|
+
expect(matcher.asymmetricMatch([2, 'a', /a/])).toBe(true);
|
6
|
+
});
|
7
|
+
|
8
|
+
it("does not work when not passed an array", function() {
|
9
|
+
var matcher = new jasmineUnderTest.ArrayWithExactContents("foo");
|
10
|
+
|
11
|
+
expect(function() {
|
12
|
+
matcher.asymmetricMatch([]);
|
13
|
+
}).toThrowError(/not 'foo'/);
|
14
|
+
});
|
15
|
+
|
16
|
+
it("does not match when an item is missing", function() {
|
17
|
+
var matcher = new jasmineUnderTest.ArrayWithExactContents(['a', 2, /a/]);
|
18
|
+
|
19
|
+
expect(matcher.asymmetricMatch(['a', 2])).toBe(false);
|
20
|
+
expect(matcher.asymmetricMatch(['a', 2, undefined])).toBe(false);
|
21
|
+
});
|
22
|
+
|
23
|
+
it("does not match when there is an extra item", function() {
|
24
|
+
var matcher = new jasmineUnderTest.ArrayWithExactContents(['a']);
|
25
|
+
|
26
|
+
expect(matcher.asymmetricMatch(['a', 2])).toBe(false);
|
27
|
+
});
|
28
|
+
|
29
|
+
it("jasmineToStrings itself", function() {
|
30
|
+
var matcher = new jasmineUnderTest.ArrayWithExactContents([]);
|
31
|
+
|
32
|
+
expect(matcher.jasmineToString()).toMatch("<jasmine.arrayWithExactContents");
|
33
|
+
});
|
34
|
+
|
35
|
+
it("uses custom equality testers", function() {
|
36
|
+
var tester = function(a, b) {
|
37
|
+
// All "foo*" strings match each other.
|
38
|
+
if (typeof a == "string" && typeof b == "string" &&
|
39
|
+
a.substr(0, 3) == "foo" && b.substr(0, 3) == "foo") {
|
40
|
+
return true;
|
41
|
+
}
|
42
|
+
};
|
43
|
+
var matcher = new jasmineUnderTest.ArrayWithExactContents(["fooVal"]);
|
44
|
+
|
45
|
+
expect(matcher.asymmetricMatch(["fooBar"], [tester])).toBe(true);
|
46
|
+
});
|
47
|
+
});
|
@@ -67,8 +67,9 @@ describe("Custom Matchers (Integration)", function() {
|
|
67
67
|
};
|
68
68
|
|
69
69
|
env.addCustomEqualityTester(customEqualityFn);
|
70
|
-
env.expect({foo: 'fooValue'}).toEqual(
|
71
|
-
env.expect(['fooValue']).toEqual(
|
70
|
+
env.expect({foo: 'fooValue'}).toEqual(jasmineUnderTest.objectContaining({foo: 'fooBar'}));
|
71
|
+
env.expect(['fooValue', 'things']).toEqual(jasmineUnderTest.arrayContaining(['fooBar']));
|
72
|
+
env.expect(['fooValue']).toEqual(jasmineUnderTest.arrayWithExactContents(['fooBar']));
|
72
73
|
});
|
73
74
|
|
74
75
|
var specExpectations = function(result) {
|
@@ -786,7 +786,7 @@ describe("Env integration", function() {
|
|
786
786
|
env.execute();
|
787
787
|
});
|
788
788
|
|
789
|
-
it('can be configured to allow respying on functions', function () {
|
789
|
+
it('can be configured to allow respying on functions', function (done) {
|
790
790
|
var env = new jasmineUnderTest.Env(),
|
791
791
|
foo = {
|
792
792
|
bar: function () {
|
@@ -795,6 +795,7 @@ describe("Env integration", function() {
|
|
795
795
|
};
|
796
796
|
|
797
797
|
env.allowRespy(true);
|
798
|
+
env.addReporter({ jasmineDone: done });
|
798
799
|
|
799
800
|
env.describe('test suite', function(){
|
800
801
|
env.it('spec 0', function(){
|
@@ -928,7 +929,14 @@ describe("Env integration", function() {
|
|
928
929
|
});
|
929
930
|
|
930
931
|
it("should run async specs in order, waiting for them to complete", function(done) {
|
931
|
-
var env = new jasmineUnderTest.Env(),
|
932
|
+
var env = new jasmineUnderTest.Env(),
|
933
|
+
reporter = jasmine.createSpyObj('reporter', ['jasmineDone']),
|
934
|
+
mutatedVar;
|
935
|
+
|
936
|
+
reporter.jasmineDone.and.callFake(function() {
|
937
|
+
done();
|
938
|
+
});
|
939
|
+
env.addReporter(reporter);
|
932
940
|
|
933
941
|
env.describe("tests", function() {
|
934
942
|
env.beforeEach(function() {
|
@@ -939,7 +947,6 @@ describe("Env integration", function() {
|
|
939
947
|
setTimeout(function() {
|
940
948
|
expect(mutatedVar).toEqual(2);
|
941
949
|
underTestCallback();
|
942
|
-
done();
|
943
950
|
}, 0);
|
944
951
|
});
|
945
952
|
|
@@ -1110,14 +1117,18 @@ describe("Env integration", function() {
|
|
1110
1117
|
|
1111
1118
|
env.describe('suite', function() {
|
1112
1119
|
env.afterAll(function() {
|
1113
|
-
|
1114
|
-
|
1115
|
-
|
1120
|
+
if (jasmine.getEnv().ieVersion < 9) {
|
1121
|
+
} else {
|
1122
|
+
realSetTimeout(function() {
|
1123
|
+
jasmine.clock().tick(10);
|
1124
|
+
}, 100);
|
1125
|
+
}
|
1116
1126
|
});
|
1117
1127
|
env.describe('beforeAll', function() {
|
1118
1128
|
env.beforeAll(function(innerDone) {
|
1119
|
-
|
1120
|
-
|
1129
|
+
realSetTimeout(function() {
|
1130
|
+
jasmine.clock().tick(5001);
|
1131
|
+
}, 0);
|
1121
1132
|
}, 5000);
|
1122
1133
|
|
1123
1134
|
env.it('times out', function() {});
|
@@ -1125,8 +1136,9 @@ describe("Env integration", function() {
|
|
1125
1136
|
|
1126
1137
|
env.describe('afterAll', function() {
|
1127
1138
|
env.afterAll(function(innerDone) {
|
1128
|
-
|
1129
|
-
|
1139
|
+
realSetTimeout(function() {
|
1140
|
+
jasmine.clock().tick(2001);
|
1141
|
+
}, 0);
|
1130
1142
|
}, 2000);
|
1131
1143
|
|
1132
1144
|
env.it('times out', function() {});
|
@@ -1134,8 +1146,9 @@ describe("Env integration", function() {
|
|
1134
1146
|
|
1135
1147
|
env.describe('beforeEach', function() {
|
1136
1148
|
env.beforeEach(function(innerDone) {
|
1137
|
-
|
1138
|
-
|
1149
|
+
realSetTimeout(function() {
|
1150
|
+
jasmine.clock().tick(1001);
|
1151
|
+
}, 0);
|
1139
1152
|
}, 1000);
|
1140
1153
|
|
1141
1154
|
env.it('times out', function() {});
|
@@ -1143,16 +1156,18 @@ describe("Env integration", function() {
|
|
1143
1156
|
|
1144
1157
|
env.describe('afterEach', function() {
|
1145
1158
|
env.afterEach(function(innerDone) {
|
1146
|
-
|
1147
|
-
|
1159
|
+
realSetTimeout(function() {
|
1160
|
+
jasmine.clock().tick(4001);
|
1161
|
+
}, 0);
|
1148
1162
|
}, 4000);
|
1149
1163
|
|
1150
1164
|
env.it('times out', function() {});
|
1151
1165
|
});
|
1152
1166
|
|
1153
1167
|
env.it('it times out', function(innerDone) {
|
1154
|
-
|
1155
|
-
|
1168
|
+
realSetTimeout(function() {
|
1169
|
+
jasmine.clock().tick(6001);
|
1170
|
+
}, 0);
|
1156
1171
|
}, 6000);
|
1157
1172
|
});
|
1158
1173
|
|
@@ -393,6 +393,13 @@ describe("matchersUtil", function() {
|
|
393
393
|
expect(jasmineUnderTest.matchersUtil.equals(setA, setB)).toBe(true);
|
394
394
|
});
|
395
395
|
|
396
|
+
it("passes when comparing identical sets with different insertion order", function() {
|
397
|
+
jasmine.getEnv().requireFunctioningSets();
|
398
|
+
var setA = new Set([3, 6]);
|
399
|
+
var setB = new Set([6, 3]);
|
400
|
+
expect(jasmineUnderTest.matchersUtil.equals(setA, setB)).toBe(true);
|
401
|
+
});
|
402
|
+
|
396
403
|
it("fails for sets with different elements", function() {
|
397
404
|
jasmine.getEnv().requireFunctioningSets();
|
398
405
|
var setA = new Set([6, 3, 5]);
|
@@ -407,13 +414,6 @@ describe("matchersUtil", function() {
|
|
407
414
|
expect(jasmineUnderTest.matchersUtil.equals(setA, setB)).toBe(false);
|
408
415
|
});
|
409
416
|
|
410
|
-
it("fails for sets with different insertion order", function() {
|
411
|
-
jasmine.getEnv().requireFunctioningSets();
|
412
|
-
var setA = new Set([3, 6]);
|
413
|
-
var setB = new Set([6, 3]);
|
414
|
-
expect(jasmineUnderTest.matchersUtil.equals(setA, setB)).toBe(false);
|
415
|
-
});
|
416
|
-
|
417
417
|
it("passes when comparing two empty maps", function() {
|
418
418
|
jasmine.getEnv().requireFunctioningMaps();
|
419
419
|
expect(jasmineUnderTest.matchersUtil.equals(new Map(), new Map())).toBe(true);
|
@@ -427,6 +427,13 @@ describe("matchersUtil", function() {
|
|
427
427
|
expect(jasmineUnderTest.matchersUtil.equals(mapA, mapB)).toBe(true);
|
428
428
|
});
|
429
429
|
|
430
|
+
it("passes when comparing identical maps with different insertion order", function() {
|
431
|
+
jasmine.getEnv().requireFunctioningMaps();
|
432
|
+
var mapA = new Map([['a', 3], [6, 1]]);
|
433
|
+
var mapB = new Map([[6, 1], ['a', 3]]);
|
434
|
+
expect(jasmineUnderTest.matchersUtil.equals(mapA, mapB)).toBe(true);
|
435
|
+
});
|
436
|
+
|
430
437
|
it("fails for maps with different elements", function() {
|
431
438
|
jasmine.getEnv().requireFunctioningMaps();
|
432
439
|
var mapA = new Map([[6, 3], [5, 1]]);
|
@@ -441,13 +448,6 @@ describe("matchersUtil", function() {
|
|
441
448
|
expect(jasmineUnderTest.matchersUtil.equals(mapA, mapB)).toBe(false);
|
442
449
|
});
|
443
450
|
|
444
|
-
it("fails for maps with different insertion order", function() {
|
445
|
-
jasmine.getEnv().requireFunctioningMaps();
|
446
|
-
var mapA = new Map([['a', 3], [6, 1]]);
|
447
|
-
var mapB = new Map([[6, 1], ['a', 3]]);
|
448
|
-
expect(jasmineUnderTest.matchersUtil.equals(mapA, mapB)).toBe(false);
|
449
|
-
});
|
450
|
-
|
451
451
|
describe("when running in an environment with array polyfills", function() {
|
452
452
|
// IE 8 doesn't support `definePropery` on non-DOM nodes
|
453
453
|
if (jasmine.getEnv().ieVersion < 9) { return; }
|
@@ -161,8 +161,8 @@ describe("toEqual", function() {
|
|
161
161
|
it("uses the default failure message given arrays with different lengths", function() {
|
162
162
|
var actual = [1, 2],
|
163
163
|
expected = [1, 2, 3],
|
164
|
-
message =
|
165
|
-
|
164
|
+
message = 'Expected $.length = 2 to equal 3.\n' +
|
165
|
+
'Expected $[2] = undefined to equal 3.';
|
166
166
|
|
167
167
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
168
168
|
});
|
@@ -211,6 +211,16 @@ describe("toEqual", function() {
|
|
211
211
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
212
212
|
});
|
213
213
|
|
214
|
+
it("reports mismatches between arrays of different types", function() {
|
215
|
+
jasmine.getEnv().requireFunctioningTypedArrays();
|
216
|
+
|
217
|
+
var actual = new Uint32Array([1, 2, 3]),
|
218
|
+
expected = new Uint16Array([1, 2, 3]),
|
219
|
+
message = "Expected Uint32Array [ 1, 2, 3 ] to equal Uint16Array [ 1, 2, 3 ].";
|
220
|
+
|
221
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
222
|
+
});
|
223
|
+
|
214
224
|
it("reports mismatches involving NaN", function() {
|
215
225
|
var actual = {x: 0},
|
216
226
|
expected = {x: 0/0},
|
@@ -359,8 +369,9 @@ describe("toEqual", function() {
|
|
359
369
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
360
370
|
});
|
361
371
|
|
362
|
-
|
363
|
-
|
372
|
+
// == Sets ==
|
373
|
+
|
374
|
+
it("reports mismatches between Sets", function() {
|
364
375
|
jasmine.getEnv().requireFunctioningSets();
|
365
376
|
|
366
377
|
var actual = new Set([1]),
|
@@ -370,6 +381,16 @@ describe("toEqual", function() {
|
|
370
381
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
371
382
|
});
|
372
383
|
|
384
|
+
it("reports deep mismatches within Sets", function() {
|
385
|
+
jasmine.getEnv().requireFunctioningSets();
|
386
|
+
|
387
|
+
var actual = new Set([{x: 1}]),
|
388
|
+
expected = new Set([{x: 2}]),
|
389
|
+
message = 'Expected Set( Object({ x: 1 }) ) to equal Set( Object({ x: 2 }) ).';
|
390
|
+
|
391
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
392
|
+
});
|
393
|
+
|
373
394
|
it("reports mismatches between Sets nested in objects", function() {
|
374
395
|
jasmine.getEnv().requireFunctioningSets();
|
375
396
|
|
@@ -390,13 +411,46 @@ describe("toEqual", function() {
|
|
390
411
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
391
412
|
});
|
392
413
|
|
393
|
-
it("
|
394
|
-
|
414
|
+
it("reports mismatches between Sets where actual is missing a value from expected", function() {
|
415
|
+
jasmine.getEnv().requireFunctioningSets();
|
416
|
+
|
417
|
+
// Use 'duplicate' object in actual so sizes match
|
418
|
+
var actual = new Set([{x: 1}, {x: 1}]),
|
419
|
+
expected = new Set([{x: 1}, {x: 2}]),
|
420
|
+
message = 'Expected Set( Object({ x: 1 }), Object({ x: 1 }) ) to equal Set( Object({ x: 1 }), Object({ x: 2 }) ).';
|
421
|
+
|
422
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
423
|
+
});
|
424
|
+
|
425
|
+
it("reports mismatches between Sets where actual has a value missing from expected", function() {
|
426
|
+
jasmine.getEnv().requireFunctioningSets();
|
427
|
+
|
428
|
+
// Use 'duplicate' object in expected so sizes match
|
429
|
+
var actual = new Set([{x: 1}, {x: 2}]),
|
430
|
+
expected = new Set([{x: 1}, {x: 1}]),
|
431
|
+
message = 'Expected Set( Object({ x: 1 }), Object({ x: 2 }) ) to equal Set( Object({ x: 1 }), Object({ x: 1 }) ).';
|
432
|
+
|
433
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
434
|
+
});
|
435
|
+
|
436
|
+
// == Maps ==
|
437
|
+
|
438
|
+
it("does not report mismatches between deep equal Maps", function() {
|
439
|
+
jasmine.getEnv().requireFunctioningSets();
|
440
|
+
|
441
|
+
// values are the same but with different object identity
|
442
|
+
var actual = new Map([['a', {x: 1}]]),
|
443
|
+
expected = new Map([['a', {x: 1}]]);
|
444
|
+
|
445
|
+
expect(compareEquals(actual, expected).pass).toBe(true);
|
446
|
+
});
|
447
|
+
|
448
|
+
it("reports deep mismatches within Maps", function() {
|
395
449
|
jasmine.getEnv().requireFunctioningMaps();
|
396
450
|
|
397
|
-
var actual = new Map([['a', 1]]),
|
398
|
-
expected = new Map([['a', 2]]),
|
399
|
-
message = "Expected Map( [ 'a', 1 ] ) to equal Map( [ 'a', 2 ] ).";
|
451
|
+
var actual = new Map([['a', {x: 1}]]),
|
452
|
+
expected = new Map([['a', {x: 2}]]),
|
453
|
+
message = "Expected Map( [ 'a', Object({ x: 1 }) ] ) to equal Map( [ 'a', Object({ x: 2 }) ] ).";
|
400
454
|
|
401
455
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
402
456
|
});
|
@@ -405,8 +459,8 @@ describe("toEqual", function() {
|
|
405
459
|
jasmine.getEnv().requireFunctioningMaps();
|
406
460
|
|
407
461
|
var actual = {Maps: [new Map([['a', 1]])]},
|
408
|
-
expected = {Maps: [new Map([['a', 2]
|
409
|
-
message = "Expected $.Maps[0] = Map( [ 'a', 1 ] ) to equal Map( [ 'a', 2 ]
|
462
|
+
expected = {Maps: [new Map([['a', 2]])]},
|
463
|
+
message = "Expected $.Maps[0] = Map( [ 'a', 1 ] ) to equal Map( [ 'a', 2 ] ).";
|
410
464
|
|
411
465
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
412
466
|
});
|
@@ -415,11 +469,40 @@ describe("toEqual", function() {
|
|
415
469
|
jasmine.getEnv().requireFunctioningMaps();
|
416
470
|
|
417
471
|
var actual = new Map([['a', 1]]),
|
418
|
-
expected = new Map([['a', 2]]),
|
419
|
-
|
472
|
+
expected = new Map([['a', 2], ['b', 1]]),
|
473
|
+
message = "Expected Map( [ 'a', 1 ] ) to equal Map( [ 'a', 2 ], [ 'b', 1 ] ).";
|
474
|
+
|
475
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
476
|
+
});
|
477
|
+
|
478
|
+
it("reports mismatches between Maps with equal values but differing keys", function() {
|
479
|
+
jasmine.getEnv().requireFunctioningMaps();
|
480
|
+
|
481
|
+
var actual = new Map([['a', 1]]),
|
482
|
+
expected = new Map([['b', 1]]),
|
483
|
+
message = "Expected Map( [ 'a', 1 ] ) to equal Map( [ 'b', 1 ] ).";
|
420
484
|
|
421
485
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
422
|
-
});
|
486
|
+
});
|
487
|
+
|
488
|
+
it("does not report mismatches between Maps with keys with same object identity", function() {
|
489
|
+
jasmine.getEnv().requireFunctioningMaps();
|
490
|
+
var key = {x: 1},
|
491
|
+
actual = new Map([[key, 2]]),
|
492
|
+
expected = new Map([[key, 2]]);
|
493
|
+
|
494
|
+
expect(compareEquals(actual, expected).pass).toBe(true);
|
495
|
+
});
|
496
|
+
|
497
|
+
it("reports mismatches between Maps with identical keys with different object identity", function() {
|
498
|
+
jasmine.getEnv().requireFunctioningMaps();
|
499
|
+
|
500
|
+
var actual = new Map([[{x: 1}, 2]]),
|
501
|
+
expected = new Map([[{x: 1}, 2]]),
|
502
|
+
message = "Expected Map( [ Object({ x: 1 }), 2 ] ) to equal Map( [ Object({ x: 1 }), 2 ] ).";
|
503
|
+
|
504
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
505
|
+
});
|
423
506
|
|
424
507
|
function isNotRunningInBrowser() {
|
425
508
|
return typeof document === 'undefined'
|
@@ -487,9 +570,9 @@ describe("toEqual", function() {
|
|
487
570
|
|
488
571
|
it("does not report a mismatch when asymmetric matchers are satisfied", function() {
|
489
572
|
var actual = {a: 'a'},
|
490
|
-
expected = {a: jasmineUnderTest.any(String)}
|
491
|
-
message = 'Expected $.a = 1 to equal <jasmine.any(String)>.';
|
573
|
+
expected = {a: jasmineUnderTest.any(String)};
|
492
574
|
|
575
|
+
expect(compareEquals(actual, expected).message).toEqual('');
|
493
576
|
expect(compareEquals(actual, expected).pass).toBe(true)
|
494
577
|
});
|
495
578
|
|
@@ -530,7 +613,8 @@ describe("toEqual", function() {
|
|
530
613
|
|
531
614
|
var message =
|
532
615
|
'Expected $.foo[0].bar = 1 to equal 2.\n' +
|
533
|
-
|
616
|
+
'Expected $.foo[0].things.length = 2 to equal 3.\n' +
|
617
|
+
"Expected $.foo[0].things[2] = undefined to equal 'c'.\n" +
|
534
618
|
"Expected $.foo[1].things[1] = 'b' to equal 'd'.\n" +
|
535
619
|
'Expected $.baz[0].a to have properties\n' +
|
536
620
|
' c: 1\n' +
|
@@ -544,4 +628,92 @@ describe("toEqual", function() {
|
|
544
628
|
|
545
629
|
expect(compareEquals(actual, expected).message).toEqual(message);
|
546
630
|
})
|
631
|
+
|
632
|
+
describe("different length arrays", function() {
|
633
|
+
it("actual array is longer", function() {
|
634
|
+
var actual = [1, 1, 2, 3, 5],
|
635
|
+
expected = [1, 1, 2, 3],
|
636
|
+
message = 'Expected $.length = 5 to equal 4.\n' +
|
637
|
+
'Expected $[4] = 5 to equal undefined.';
|
638
|
+
|
639
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
640
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
641
|
+
});
|
642
|
+
|
643
|
+
it("expected array is longer", function() {
|
644
|
+
var actual = [1, 1, 2, 3],
|
645
|
+
expected = [1, 1, 2, 3, 5],
|
646
|
+
message = 'Expected $.length = 4 to equal 5.\n' +
|
647
|
+
'Expected $[4] = undefined to equal 5.';
|
648
|
+
|
649
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
650
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
651
|
+
});
|
652
|
+
|
653
|
+
it("expected array is longer by 4 elements", function() {
|
654
|
+
var actual = [1, 1, 2],
|
655
|
+
expected = [1, 1, 2, 3, 5, 8, 13],
|
656
|
+
message = 'Expected $.length = 3 to equal 7.\n' +
|
657
|
+
'Expected $[3] = undefined to equal 3.\n' +
|
658
|
+
'Expected $[4] = undefined to equal 5.\n' +
|
659
|
+
'Expected $[5] = undefined to equal 8.\n' +
|
660
|
+
'Expected $[6] = undefined to equal 13.';
|
661
|
+
|
662
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
663
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
664
|
+
});
|
665
|
+
|
666
|
+
it("different length and different elements", function() {
|
667
|
+
var actual = [1],
|
668
|
+
expected = [2, 3],
|
669
|
+
message = 'Expected $.length = 1 to equal 2.\n' +
|
670
|
+
'Expected $[0] = 1 to equal 2.\n' +
|
671
|
+
'Expected $[1] = undefined to equal 3.';
|
672
|
+
|
673
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
674
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
675
|
+
});
|
676
|
+
|
677
|
+
it("object with nested array", function() {
|
678
|
+
var actual = { values: [1, 1, 2, 3] },
|
679
|
+
expected = { values: [1, 1, 2] },
|
680
|
+
message = 'Expected $.values.length = 4 to equal 3.\n' +
|
681
|
+
'Expected $.values[3] = 3 to equal undefined.';
|
682
|
+
|
683
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
684
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
685
|
+
});
|
686
|
+
|
687
|
+
it("array with nested object", function() {
|
688
|
+
var actual = [1, 1, 2, { value: 3 }],
|
689
|
+
expected = [1, 1, 2],
|
690
|
+
message = 'Expected $.length = 4 to equal 3.\n' +
|
691
|
+
'Expected $[3] = Object({ value: 3 }) to equal undefined.';
|
692
|
+
|
693
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
694
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
695
|
+
});
|
696
|
+
|
697
|
+
it("array with nested different length array", function() {
|
698
|
+
var actual = [[1], [1, 2]],
|
699
|
+
expected = [[1, 1], [2]],
|
700
|
+
message = 'Expected $[0].length = 1 to equal 2.\n' +
|
701
|
+
'Expected $[0][1] = undefined to equal 1.\n' +
|
702
|
+
'Expected $[1].length = 2 to equal 1.\n' +
|
703
|
+
'Expected $[1][0] = 1 to equal 2.\n' +
|
704
|
+
'Expected $[1][1] = 2 to equal undefined.';
|
705
|
+
|
706
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
707
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
708
|
+
});
|
709
|
+
|
710
|
+
it("last element of longer array is undefined", function() {
|
711
|
+
var actual = [1, 2],
|
712
|
+
expected = [1, 2, void 0],
|
713
|
+
message = 'Expected $.length = 2 to equal 3.';
|
714
|
+
|
715
|
+
expect(compareEquals(actual, expected).pass).toBe(false)
|
716
|
+
expect(compareEquals(actual, expected).message).toEqual(message);
|
717
|
+
});
|
718
|
+
})
|
547
719
|
});
|
@@ -0,0 +1,20 @@
|
|
1
|
+
(function(env) {
|
2
|
+
function hasFunctioningTypedArrays() {
|
3
|
+
if (typeof Uint32Array === 'undefined') { return false; }
|
4
|
+
|
5
|
+
try {
|
6
|
+
var a = new Uint32Array([1, 2, 3]);
|
7
|
+
if (a.length !== 3) { return false; }
|
8
|
+
return true;
|
9
|
+
} catch(e) {
|
10
|
+
return false;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
|
14
|
+
env.requireFunctioningTypedArrays = function() {
|
15
|
+
if (!hasFunctioningTypedArrays()) {
|
16
|
+
env.pending("Browser has incomplete or missing support for typed arrays");
|
17
|
+
}
|
18
|
+
};
|
19
|
+
|
20
|
+
})(jasmine.getEnv());
|
data/lib/jasmine-core/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jasmine-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gregg Van Hove
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -122,6 +122,7 @@ files:
|
|
122
122
|
- "./lib/jasmine-core/spec/core/asymmetric_equality/AnySpec.js"
|
123
123
|
- "./lib/jasmine-core/spec/core/asymmetric_equality/AnythingSpec.js"
|
124
124
|
- "./lib/jasmine-core/spec/core/asymmetric_equality/ArrayContainingSpec.js"
|
125
|
+
- "./lib/jasmine-core/spec/core/asymmetric_equality/ArrayWithExactContentsSpec.js"
|
125
126
|
- "./lib/jasmine-core/spec/core/asymmetric_equality/ObjectContainingSpec.js"
|
126
127
|
- "./lib/jasmine-core/spec/core/asymmetric_equality/StringMatchingSpec.js"
|
127
128
|
- "./lib/jasmine-core/spec/core/formatErrorMsgSpec.js"
|
@@ -132,6 +133,7 @@ files:
|
|
132
133
|
- "./lib/jasmine-core/spec/core/matchers/NullDiffBuilderSpec.js"
|
133
134
|
- "./lib/jasmine-core/spec/core/matchers/ObjectPathSpec.js"
|
134
135
|
- "./lib/jasmine-core/spec/core/matchers/matchersUtilSpec.js"
|
136
|
+
- "./lib/jasmine-core/spec/core/matchers/nothingSpec.js"
|
135
137
|
- "./lib/jasmine-core/spec/core/matchers/toBeCloseToSpec.js"
|
136
138
|
- "./lib/jasmine-core/spec/core/matchers/toBeDefinedSpec.js"
|
137
139
|
- "./lib/jasmine-core/spec/core/matchers/toBeFalsySpec.js"
|
@@ -159,6 +161,7 @@ files:
|
|
159
161
|
- "./lib/jasmine-core/spec/helpers/asyncAwait.js"
|
160
162
|
- "./lib/jasmine-core/spec/helpers/checkForMap.js"
|
161
163
|
- "./lib/jasmine-core/spec/helpers/checkForSet.js"
|
164
|
+
- "./lib/jasmine-core/spec/helpers/checkForTypedArrays.js"
|
162
165
|
- "./lib/jasmine-core/spec/helpers/defineJasmineUnderTest.js"
|
163
166
|
- "./lib/jasmine-core/spec/helpers/nodeDefineJasmineUnderTest.js"
|
164
167
|
- "./lib/jasmine-core/spec/html/HtmlReporterSpec.js"
|