jasmine-core 2.4.1 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/console/console.js +1 -1
- data/lib/jasmine-core/boot.js +1 -1
- data/lib/jasmine-core/jasmine-html.js +15 -7
- data/lib/jasmine-core/jasmine.js +261 -82
- data/lib/jasmine-core/node_boot.js +1 -1
- data/lib/jasmine-core/spec/console/ConsoleReporterSpec.js +16 -16
- data/lib/jasmine-core/spec/core/CallTrackerSpec.js +26 -11
- data/lib/jasmine-core/spec/core/ClockSpec.js +61 -42
- data/lib/jasmine-core/spec/core/DelayedFunctionSchedulerSpec.js +28 -15
- data/lib/jasmine-core/spec/core/EnvSpec.js +8 -8
- data/lib/jasmine-core/spec/core/ExceptionFormatterSpec.js +6 -6
- data/lib/jasmine-core/spec/core/ExceptionsSpec.js +1 -1
- data/lib/jasmine-core/spec/core/ExpectationResultSpec.js +8 -8
- data/lib/jasmine-core/spec/core/ExpectationSpec.js +17 -17
- data/lib/jasmine-core/spec/core/JsApiReporterSpec.js +14 -14
- data/lib/jasmine-core/spec/core/MockDateSpec.js +14 -14
- data/lib/jasmine-core/spec/core/PrettyPrintSpec.js +65 -56
- data/lib/jasmine-core/spec/core/QueueRunnerSpec.js +32 -18
- data/lib/jasmine-core/spec/core/ReportDispatcherSpec.js +27 -3
- data/lib/jasmine-core/spec/core/SpecSpec.js +37 -37
- data/lib/jasmine-core/spec/core/SpyRegistrySpec.js +46 -7
- data/lib/jasmine-core/spec/core/SpySpec.js +11 -11
- data/lib/jasmine-core/spec/core/SpyStrategySpec.js +25 -13
- data/lib/jasmine-core/spec/core/SuiteSpec.js +25 -25
- data/lib/jasmine-core/spec/core/TimerSpec.js +2 -2
- data/lib/jasmine-core/spec/core/TreeProcessorSpec.js +26 -26
- data/lib/jasmine-core/spec/core/UtilSpec.js +12 -12
- data/lib/jasmine-core/spec/core/asymmetric_equality/AnySpec.js +8 -8
- data/lib/jasmine-core/spec/core/asymmetric_equality/AnythingSpec.js +7 -7
- data/lib/jasmine-core/spec/core/asymmetric_equality/ArrayContainingSpec.js +6 -6
- data/lib/jasmine-core/spec/core/asymmetric_equality/ObjectContainingSpec.js +11 -11
- data/lib/jasmine-core/spec/core/asymmetric_equality/StringMatchingSpec.js +4 -4
- data/lib/jasmine-core/spec/core/formatErrorMsgSpec.js +13 -0
- data/lib/jasmine-core/spec/core/integration/CustomMatchersSpec.js +2 -2
- data/lib/jasmine-core/spec/core/integration/EnvSpec.js +195 -76
- data/lib/jasmine-core/spec/core/integration/SpecRunningSpec.js +20 -21
- data/lib/jasmine-core/spec/core/matchers/matchersUtilSpec.js +164 -114
- data/lib/jasmine-core/spec/core/matchers/toBeCloseToSpec.js +4 -4
- data/lib/jasmine-core/spec/core/matchers/toBeDefinedSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeFalsySpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeGreaterThanOrEqualSpec.js +29 -0
- data/lib/jasmine-core/spec/core/matchers/toBeGreaterThanSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeLessThanOrEqualSpec.js +29 -0
- data/lib/jasmine-core/spec/core/matchers/toBeLessThanSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeNaNSpec.js +3 -3
- data/lib/jasmine-core/spec/core/matchers/toBeNullSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeTruthySpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toBeUndefinedSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toContainSpec.js +4 -4
- data/lib/jasmine-core/spec/core/matchers/toEqualSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledSpec.js +11 -11
- data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledTimesSpec.js +22 -17
- data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledWithSpec.js +11 -10
- data/lib/jasmine-core/spec/core/matchers/toMatchSpec.js +7 -6
- data/lib/jasmine-core/spec/core/matchers/toThrowErrorSpec.js +24 -24
- data/lib/jasmine-core/spec/core/matchers/toThrowSpec.js +9 -8
- data/lib/jasmine-core/spec/helpers/defineJasmineUnderTest.js +3 -3
- data/lib/jasmine-core/spec/helpers/nodeDefineJasmineUnderTest.js +5 -5
- data/lib/jasmine-core/spec/html/HtmlReporterSpec.js +95 -59
- data/lib/jasmine-core/spec/html/HtmlSpecFilterSpec.js +3 -3
- data/lib/jasmine-core/spec/html/MatchersHtmlSpec.js +1 -1
- data/lib/jasmine-core/spec/html/PrettyPrintHtmlSpec.js +4 -4
- data/lib/jasmine-core/spec/html/QueryStringSpec.js +5 -5
- data/lib/jasmine-core/spec/html/ResultsNodeSpec.js +4 -4
- data/lib/jasmine-core/spec/npmPackage/npmPackageSpec.js +2 -2
- data/lib/jasmine-core/spec/performance/large_object_test.js +1 -1
- data/lib/jasmine-core/version.rb +1 -1
- metadata +5 -3
- data/lib/jasmine-core/spec/node_suite.js +0 -195
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53b9747ec8f9f68a92d930d1c1fd9985e0fe2b13
|
4
|
+
data.tar.gz: f902b066456e9891319425365eb964858313fcc6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44b3b65e99e332064a6c8b0cd1568cac8226c74daa2a6690a830a6a57fbdfd21994542fb5be234b69dfa61567be9509d92ed83c2b4f75b183233cd87870ef414
|
7
|
+
data.tar.gz: 7ce561e476521b3bc09d7fb5d4f87c8c1e0928c025fa315e3262b2fa7f70f2df4abe5945ec5db6412cac331488a73de3492f91677f1d7d5731a660e487c6332d
|
data/lib/console/console.js
CHANGED
data/lib/jasmine-core/boot.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
Copyright (c) 2008-
|
2
|
+
Copyright (c) 2008-2016 Pivotal Labs
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
a copy of this software and associated documentation files (the
|
@@ -209,9 +209,10 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
209
209
|
|
210
210
|
if (specsExecuted < totalSpecsDefined) {
|
211
211
|
var skippedMessage = 'Ran ' + specsExecuted + ' of ' + totalSpecsDefined + ' specs - run all';
|
212
|
+
var skippedLink = order && order.random ? '?random=true' : '?';
|
212
213
|
alert.appendChild(
|
213
214
|
createDom('span', {className: 'jasmine-bar jasmine-skipped'},
|
214
|
-
createDom('a', {href:
|
215
|
+
createDom('a', {href: skippedLink, title: 'Run all specs'}, skippedMessage)
|
215
216
|
)
|
216
217
|
);
|
217
218
|
}
|
@@ -237,15 +238,22 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
237
238
|
|
238
239
|
alert.appendChild(createDom('span', {className: statusBarClassName}, statusBarMessage, seedBar));
|
239
240
|
|
240
|
-
|
241
|
+
var errorBarClassName = 'jasmine-bar jasmine-errored';
|
242
|
+
var errorBarMessagePrefix = 'AfterAll ';
|
243
|
+
|
244
|
+
for(var i = 0; i < failedSuites.length; i++) {
|
241
245
|
var failedSuite = failedSuites[i];
|
242
246
|
for(var j = 0; j < failedSuite.failedExpectations.length; j++) {
|
243
|
-
|
244
|
-
var errorBarClassName = 'jasmine-bar jasmine-errored';
|
245
|
-
alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessage));
|
247
|
+
alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failedSuite.failedExpectations[j].message));
|
246
248
|
}
|
247
249
|
}
|
248
250
|
|
251
|
+
var globalFailures = (doneResult && doneResult.failedExpectations) || [];
|
252
|
+
for(i = 0; i < globalFailures.length; i++) {
|
253
|
+
var failure = globalFailures[i];
|
254
|
+
alert.appendChild(createDom('span', {className: errorBarClassName}, errorBarMessagePrefix + failure.message));
|
255
|
+
}
|
256
|
+
|
249
257
|
var results = find('.jasmine-results');
|
250
258
|
results.appendChild(summary);
|
251
259
|
|
@@ -309,7 +317,7 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
309
317
|
setMenuModeTo('jasmine-failure-list');
|
310
318
|
|
311
319
|
var failureNode = find('.jasmine-failures');
|
312
|
-
for (
|
320
|
+
for (i = 0; i < failures.length; i++) {
|
313
321
|
failureNode.appendChild(failures[i]);
|
314
322
|
}
|
315
323
|
}
|
data/lib/jasmine-core/jasmine.js
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
Copyright (c) 2008-
|
2
|
+
Copyright (c) 2008-2016 Pivotal Labs
|
3
3
|
|
4
4
|
Permission is hereby granted, free of charge, to any person obtaining
|
5
5
|
a copy of this software and associated documentation files (the
|
@@ -23,7 +23,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
23
23
|
var getJasmineRequireObj = (function (jasmineGlobal) {
|
24
24
|
var jasmineRequire;
|
25
25
|
|
26
|
-
if (typeof module !== 'undefined' && module.exports) {
|
26
|
+
if (typeof module !== 'undefined' && module.exports && typeof exports !== 'undefined') {
|
27
27
|
if (typeof global !== 'undefined') {
|
28
28
|
jasmineGlobal = global;
|
29
29
|
} else {
|
@@ -47,9 +47,10 @@ var getJasmineRequireObj = (function (jasmineGlobal) {
|
|
47
47
|
jRequire.base(j$, jasmineGlobal);
|
48
48
|
j$.util = jRequire.util();
|
49
49
|
j$.errors = jRequire.errors();
|
50
|
+
j$.formatErrorMsg = jRequire.formatErrorMsg();
|
50
51
|
j$.Any = jRequire.Any(j$);
|
51
52
|
j$.Anything = jRequire.Anything(j$);
|
52
|
-
j$.CallTracker = jRequire.CallTracker();
|
53
|
+
j$.CallTracker = jRequire.CallTracker(j$);
|
53
54
|
j$.MockDate = jRequire.MockDate();
|
54
55
|
j$.Clock = jRequire.Clock();
|
55
56
|
j$.DelayedFunctionScheduler = jRequire.DelayedFunctionScheduler();
|
@@ -89,6 +90,8 @@ getJasmineRequireObj().requireMatchers = function(jRequire, j$) {
|
|
89
90
|
'toBeDefined',
|
90
91
|
'toBeFalsy',
|
91
92
|
'toBeGreaterThan',
|
93
|
+
'toBeGreaterThanOrEqual',
|
94
|
+
'toBeLessThanOrEqual',
|
92
95
|
'toBeLessThan',
|
93
96
|
'toBeNaN',
|
94
97
|
'toBeNull',
|
@@ -153,7 +156,12 @@ getJasmineRequireObj().base = function(j$, jasmineGlobal) {
|
|
153
156
|
};
|
154
157
|
|
155
158
|
j$.fnNameFor = function(func) {
|
156
|
-
|
159
|
+
if (func.name) {
|
160
|
+
return func.name;
|
161
|
+
}
|
162
|
+
|
163
|
+
var matches = func.toString().match(/^\s*function\s*(\w*)\s*\(/);
|
164
|
+
return matches ? matches[1] : '<anonymous>';
|
157
165
|
};
|
158
166
|
|
159
167
|
j$.any = function(clazz) {
|
@@ -515,7 +523,6 @@ getJasmineRequireObj().Env = function(j$) {
|
|
515
523
|
var realClearTimeout = j$.getGlobal().clearTimeout;
|
516
524
|
this.clock = new j$.Clock(global, function () { return new j$.DelayedFunctionScheduler(); }, new j$.MockDate(global));
|
517
525
|
|
518
|
-
var runnableLookupTable = {};
|
519
526
|
var runnableResources = {};
|
520
527
|
|
521
528
|
var currentSpec = null;
|
@@ -625,7 +632,13 @@ getJasmineRequireObj().Env = function(j$) {
|
|
625
632
|
};
|
626
633
|
|
627
634
|
var getSpecName = function(spec, suite) {
|
628
|
-
|
635
|
+
var fullName = [spec.description],
|
636
|
+
suiteFullName = suite.getFullName();
|
637
|
+
|
638
|
+
if (suiteFullName !== '') {
|
639
|
+
fullName.unshift(suiteFullName);
|
640
|
+
}
|
641
|
+
return fullName.join(' ');
|
629
642
|
};
|
630
643
|
|
631
644
|
// TODO: we may just be able to pass in the fn instead of wrapping here
|
@@ -701,9 +714,9 @@ getJasmineRequireObj().Env = function(j$) {
|
|
701
714
|
env: this,
|
702
715
|
id: getNextSuiteId(),
|
703
716
|
description: 'Jasmine__TopLevel__Suite',
|
704
|
-
|
717
|
+
expectationFactory: expectationFactory,
|
718
|
+
expectationResultFactory: expectationResultFactory
|
705
719
|
});
|
706
|
-
runnableLookupTable[topSuite.id] = topSuite;
|
707
720
|
defaultResourcesForRunnable(topSuite.id);
|
708
721
|
currentDeclarationSuite = topSuite;
|
709
722
|
|
@@ -754,9 +767,15 @@ getJasmineRequireObj().Env = function(j$) {
|
|
754
767
|
totalSpecsDefined: totalSpecsDefined
|
755
768
|
});
|
756
769
|
|
770
|
+
currentlyExecutingSuites.push(topSuite);
|
771
|
+
|
757
772
|
processor.execute(function() {
|
773
|
+
clearResourcesForRunnable(topSuite.id);
|
774
|
+
currentlyExecutingSuites.pop();
|
775
|
+
|
758
776
|
reporter.jasmineDone({
|
759
|
-
order: order
|
777
|
+
order: order,
|
778
|
+
failedExpectations: topSuite.result.failedExpectations
|
760
779
|
});
|
761
780
|
});
|
762
781
|
};
|
@@ -765,6 +784,10 @@ getJasmineRequireObj().Env = function(j$) {
|
|
765
784
|
reporter.addReporter(reporterToAdd);
|
766
785
|
};
|
767
786
|
|
787
|
+
this.provideFallbackReporter = function(reporterToAdd) {
|
788
|
+
reporter.provideFallbackReporter(reporterToAdd);
|
789
|
+
};
|
790
|
+
|
768
791
|
var spyRegistry = new j$.SpyRegistry({currentSpies: function() {
|
769
792
|
if(!currentRunnable()) {
|
770
793
|
throw new Error('Spies must be created in a before function or a spec');
|
@@ -772,6 +795,10 @@ getJasmineRequireObj().Env = function(j$) {
|
|
772
795
|
return runnableResources[currentRunnable().id].spies;
|
773
796
|
}});
|
774
797
|
|
798
|
+
this.allowRespy = function(allow){
|
799
|
+
spyRegistry.allowRespy(allow);
|
800
|
+
};
|
801
|
+
|
775
802
|
this.spyOn = function() {
|
776
803
|
return spyRegistry.spyOn.apply(spyRegistry, arguments);
|
777
804
|
};
|
@@ -787,14 +814,13 @@ getJasmineRequireObj().Env = function(j$) {
|
|
787
814
|
throwOnExpectationFailure: throwOnExpectationFailure
|
788
815
|
});
|
789
816
|
|
790
|
-
runnableLookupTable[suite.id] = suite;
|
791
817
|
return suite;
|
792
818
|
};
|
793
819
|
|
794
820
|
this.describe = function(description, specDefinitions) {
|
795
821
|
var suite = suiteFactory(description);
|
796
822
|
if (specDefinitions.length > 0) {
|
797
|
-
throw new Error('describe does not expect
|
823
|
+
throw new Error('describe does not expect any arguments');
|
798
824
|
}
|
799
825
|
if (currentDeclarationSuite.markedPending) {
|
800
826
|
suite.pend();
|
@@ -889,8 +915,6 @@ getJasmineRequireObj().Env = function(j$) {
|
|
889
915
|
throwOnExpectationFailure: throwOnExpectationFailure
|
890
916
|
});
|
891
917
|
|
892
|
-
runnableLookupTable[spec.id] = spec;
|
893
|
-
|
894
918
|
if (!self.specFilter(spec)) {
|
895
919
|
spec.disable();
|
896
920
|
}
|
@@ -1079,12 +1103,29 @@ getJasmineRequireObj().JsApiReporter = function() {
|
|
1079
1103
|
return JsApiReporter;
|
1080
1104
|
};
|
1081
1105
|
|
1082
|
-
getJasmineRequireObj().CallTracker = function() {
|
1106
|
+
getJasmineRequireObj().CallTracker = function(j$) {
|
1083
1107
|
|
1084
1108
|
function CallTracker() {
|
1085
1109
|
var calls = [];
|
1110
|
+
var opts = {};
|
1111
|
+
|
1112
|
+
function argCloner(context) {
|
1113
|
+
var clonedArgs = [];
|
1114
|
+
var argsAsArray = j$.util.argsToArray(context.args);
|
1115
|
+
for(var i = 0; i < argsAsArray.length; i++) {
|
1116
|
+
if(Object.prototype.toString.apply(argsAsArray[i]).match(/^\[object/)) {
|
1117
|
+
clonedArgs.push(j$.util.clone(argsAsArray[i]));
|
1118
|
+
} else {
|
1119
|
+
clonedArgs.push(argsAsArray[i]);
|
1120
|
+
}
|
1121
|
+
}
|
1122
|
+
context.args = clonedArgs;
|
1123
|
+
}
|
1086
1124
|
|
1087
1125
|
this.track = function(context) {
|
1126
|
+
if(opts.cloneArgs) {
|
1127
|
+
argCloner(context);
|
1128
|
+
}
|
1088
1129
|
calls.push(context);
|
1089
1130
|
};
|
1090
1131
|
|
@@ -1125,6 +1166,11 @@ getJasmineRequireObj().CallTracker = function() {
|
|
1125
1166
|
this.reset = function() {
|
1126
1167
|
calls = [];
|
1127
1168
|
};
|
1169
|
+
|
1170
|
+
this.saveArgumentsByValue = function() {
|
1171
|
+
opts.cloneArgs = true;
|
1172
|
+
};
|
1173
|
+
|
1128
1174
|
}
|
1129
1175
|
|
1130
1176
|
return CallTracker;
|
@@ -1214,8 +1260,7 @@ getJasmineRequireObj().Clock = function() {
|
|
1214
1260
|
|
1215
1261
|
self.tick = function(millis) {
|
1216
1262
|
if (installed) {
|
1217
|
-
mockDate.tick(millis);
|
1218
|
-
delayedFunctionScheduler.tick(millis);
|
1263
|
+
delayedFunctionScheduler.tick(millis, function(millis) { mockDate.tick(millis); });
|
1219
1264
|
} else {
|
1220
1265
|
throw new Error('Mock clock is not installed, use jasmine.clock().install()');
|
1221
1266
|
}
|
@@ -1273,11 +1318,11 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|
1273
1318
|
var currentTime = 0;
|
1274
1319
|
var delayedFnCount = 0;
|
1275
1320
|
|
1276
|
-
self.tick = function(millis) {
|
1321
|
+
self.tick = function(millis, tickDate) {
|
1277
1322
|
millis = millis || 0;
|
1278
1323
|
var endTime = currentTime + millis;
|
1279
1324
|
|
1280
|
-
runScheduledFunctions(endTime);
|
1325
|
+
runScheduledFunctions(endTime, tickDate);
|
1281
1326
|
currentTime = endTime;
|
1282
1327
|
};
|
1283
1328
|
|
@@ -1380,13 +1425,18 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|
1380
1425
|
}
|
1381
1426
|
}
|
1382
1427
|
|
1383
|
-
function runScheduledFunctions(endTime) {
|
1428
|
+
function runScheduledFunctions(endTime, tickDate) {
|
1429
|
+
tickDate = tickDate || function() {};
|
1384
1430
|
if (scheduledLookup.length === 0 || scheduledLookup[0] > endTime) {
|
1431
|
+
tickDate(endTime);
|
1385
1432
|
return;
|
1386
1433
|
}
|
1387
1434
|
|
1388
1435
|
do {
|
1389
|
-
|
1436
|
+
var newCurrentTime = scheduledLookup.shift();
|
1437
|
+
tickDate(newCurrentTime - currentTime);
|
1438
|
+
|
1439
|
+
currentTime = newCurrentTime;
|
1390
1440
|
|
1391
1441
|
var funcsToRun = scheduledFunctions[currentTime];
|
1392
1442
|
delete scheduledFunctions[currentTime];
|
@@ -1841,6 +1891,7 @@ getJasmineRequireObj().QueueRunner = function(j$) {
|
|
1841
1891
|
called = true;
|
1842
1892
|
fn();
|
1843
1893
|
}
|
1894
|
+
return null;
|
1844
1895
|
};
|
1845
1896
|
}
|
1846
1897
|
|
@@ -1952,14 +2003,23 @@ getJasmineRequireObj().ReportDispatcher = function() {
|
|
1952
2003
|
}
|
1953
2004
|
|
1954
2005
|
var reporters = [];
|
2006
|
+
var fallbackReporter = null;
|
1955
2007
|
|
1956
2008
|
this.addReporter = function(reporter) {
|
1957
2009
|
reporters.push(reporter);
|
1958
2010
|
};
|
2011
|
+
|
2012
|
+
this.provideFallbackReporter = function(reporter) {
|
2013
|
+
fallbackReporter = reporter;
|
2014
|
+
};
|
2015
|
+
|
1959
2016
|
|
1960
2017
|
return this;
|
1961
2018
|
|
1962
2019
|
function dispatch(method, args) {
|
2020
|
+
if (reporters.length === 0 && fallbackReporter !== null) {
|
2021
|
+
reporters.push(fallbackReporter);
|
2022
|
+
}
|
1963
2023
|
for (var i = 0; i < reporters.length; i++) {
|
1964
2024
|
var reporter = reporters[i];
|
1965
2025
|
if (reporter[method]) {
|
@@ -1975,26 +2035,36 @@ getJasmineRequireObj().ReportDispatcher = function() {
|
|
1975
2035
|
|
1976
2036
|
getJasmineRequireObj().SpyRegistry = function(j$) {
|
1977
2037
|
|
2038
|
+
var getErrorMsg = j$.formatErrorMsg('<spyOn>', 'spyOn(<object>, <methodName>)');
|
2039
|
+
|
1978
2040
|
function SpyRegistry(options) {
|
1979
2041
|
options = options || {};
|
1980
2042
|
var currentSpies = options.currentSpies || function() { return []; };
|
1981
2043
|
|
2044
|
+
this.allowRespy = function(allow){
|
2045
|
+
this.respy = allow;
|
2046
|
+
};
|
2047
|
+
|
1982
2048
|
this.spyOn = function(obj, methodName) {
|
2049
|
+
|
1983
2050
|
if (j$.util.isUndefined(obj)) {
|
1984
|
-
throw new Error('
|
2051
|
+
throw new Error(getErrorMsg('could not find an object to spy upon for ' + methodName + '()'));
|
1985
2052
|
}
|
1986
2053
|
|
1987
2054
|
if (j$.util.isUndefined(methodName)) {
|
1988
|
-
throw new Error('No method name supplied');
|
2055
|
+
throw new Error(getErrorMsg('No method name supplied'));
|
1989
2056
|
}
|
1990
2057
|
|
1991
2058
|
if (j$.util.isUndefined(obj[methodName])) {
|
1992
|
-
throw new Error(methodName + '() method does not exist');
|
2059
|
+
throw new Error(getErrorMsg(methodName + '() method does not exist'));
|
1993
2060
|
}
|
1994
2061
|
|
1995
|
-
if (obj[methodName] && j$.isSpy(obj[methodName])) {
|
1996
|
-
|
1997
|
-
|
2062
|
+
if (obj[methodName] && j$.isSpy(obj[methodName]) ) {
|
2063
|
+
if ( !!this.respy ){
|
2064
|
+
return obj[methodName];
|
2065
|
+
}else {
|
2066
|
+
throw new Error(getErrorMsg(methodName + ' has already been spied upon'));
|
2067
|
+
}
|
1998
2068
|
}
|
1999
2069
|
|
2000
2070
|
var descriptor;
|
@@ -2005,28 +2075,37 @@ getJasmineRequireObj().SpyRegistry = function(j$) {
|
|
2005
2075
|
}
|
2006
2076
|
|
2007
2077
|
if (descriptor && !(descriptor.writable || descriptor.set)) {
|
2008
|
-
throw new Error(methodName + ' is not declared writable or has no setter');
|
2078
|
+
throw new Error(getErrorMsg(methodName + ' is not declared writable or has no setter'));
|
2009
2079
|
}
|
2010
2080
|
|
2011
|
-
var
|
2081
|
+
var originalMethod = obj[methodName],
|
2082
|
+
spiedMethod = j$.createSpy(methodName, originalMethod),
|
2083
|
+
restoreStrategy;
|
2084
|
+
|
2085
|
+
if (Object.prototype.hasOwnProperty.call(obj, methodName)) {
|
2086
|
+
restoreStrategy = function() {
|
2087
|
+
obj[methodName] = originalMethod;
|
2088
|
+
};
|
2089
|
+
} else {
|
2090
|
+
restoreStrategy = function() {
|
2091
|
+
delete obj[methodName];
|
2092
|
+
};
|
2093
|
+
}
|
2012
2094
|
|
2013
2095
|
currentSpies().push({
|
2014
|
-
|
2015
|
-
baseObj: obj,
|
2016
|
-
methodName: methodName,
|
2017
|
-
originalValue: obj[methodName]
|
2096
|
+
restoreObjectToOriginalState: restoreStrategy
|
2018
2097
|
});
|
2019
2098
|
|
2020
|
-
obj[methodName] =
|
2099
|
+
obj[methodName] = spiedMethod;
|
2021
2100
|
|
2022
|
-
return
|
2101
|
+
return spiedMethod;
|
2023
2102
|
};
|
2024
2103
|
|
2025
2104
|
this.clearSpies = function() {
|
2026
2105
|
var spies = currentSpies();
|
2027
|
-
for (var i =
|
2106
|
+
for (var i = spies.length - 1; i >= 0; i--) {
|
2028
2107
|
var spyEntry = spies[i];
|
2029
|
-
spyEntry.
|
2108
|
+
spyEntry.restoreObjectToOriginalState();
|
2030
2109
|
}
|
2031
2110
|
};
|
2032
2111
|
}
|
@@ -2081,6 +2160,9 @@ getJasmineRequireObj().SpyStrategy = function() {
|
|
2081
2160
|
};
|
2082
2161
|
|
2083
2162
|
this.callFake = function(fn) {
|
2163
|
+
if(!(fn instanceof Function)) {
|
2164
|
+
throw new Error('Argument passed to callFake should be a function, got ' + fn);
|
2165
|
+
}
|
2084
2166
|
plan = fn;
|
2085
2167
|
return getSpy();
|
2086
2168
|
};
|
@@ -2125,13 +2207,13 @@ getJasmineRequireObj().Suite = function(j$) {
|
|
2125
2207
|
};
|
2126
2208
|
|
2127
2209
|
Suite.prototype.getFullName = function() {
|
2128
|
-
var fullName =
|
2129
|
-
for (var parentSuite = this
|
2210
|
+
var fullName = [];
|
2211
|
+
for (var parentSuite = this; parentSuite; parentSuite = parentSuite.parentSuite) {
|
2130
2212
|
if (parentSuite.parentSuite) {
|
2131
|
-
fullName
|
2213
|
+
fullName.unshift(parentSuite.description);
|
2132
2214
|
}
|
2133
2215
|
}
|
2134
|
-
return fullName;
|
2216
|
+
return fullName.join(' ');
|
2135
2217
|
};
|
2136
2218
|
|
2137
2219
|
Suite.prototype.disable = function() {
|
@@ -2665,6 +2747,18 @@ getJasmineRequireObj().errors = function() {
|
|
2665
2747
|
ExpectationFailed: ExpectationFailed
|
2666
2748
|
};
|
2667
2749
|
};
|
2750
|
+
getJasmineRequireObj().formatErrorMsg = function() {
|
2751
|
+
function generateErrorMsg(domain, usage) {
|
2752
|
+
var usageDefinition = usage ? '\nUsage: ' + usage : '';
|
2753
|
+
|
2754
|
+
return function errorMsg(msg) {
|
2755
|
+
return domain + ' : ' + msg + usageDefinition;
|
2756
|
+
};
|
2757
|
+
}
|
2758
|
+
|
2759
|
+
return generateErrorMsg;
|
2760
|
+
};
|
2761
|
+
|
2668
2762
|
getJasmineRequireObj().matchersUtil = function(j$) {
|
2669
2763
|
// TODO: what to do about jasmine.pp not being inject? move to JSON.stringify? gut PrettyPrinter?
|
2670
2764
|
|
@@ -2828,35 +2922,43 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|
2828
2922
|
var size = 0;
|
2829
2923
|
// Recursively compare objects and arrays.
|
2830
2924
|
// Compare array lengths to determine if a deep comparison is necessary.
|
2831
|
-
if (className == '[object Array]'
|
2832
|
-
|
2833
|
-
|
2925
|
+
if (className == '[object Array]') {
|
2926
|
+
size = a.length;
|
2927
|
+
if (size !== b.length) {
|
2928
|
+
return false;
|
2929
|
+
}
|
2834
2930
|
|
2835
|
-
|
2836
|
-
|
2837
|
-
|
2838
|
-
if (className !== '[object Array]') {
|
2839
|
-
var aCtor = a.constructor, bCtor = b.constructor;
|
2840
|
-
if (aCtor !== bCtor && !(isFunction(aCtor) && aCtor instanceof aCtor &&
|
2841
|
-
isFunction(bCtor) && bCtor instanceof bCtor)) {
|
2931
|
+
while (size--) {
|
2932
|
+
result = eq(a[size], b[size], aStack, bStack, customTesters);
|
2933
|
+
if (!result) {
|
2842
2934
|
return false;
|
2843
2935
|
}
|
2844
2936
|
}
|
2845
|
-
|
2846
|
-
|
2847
|
-
|
2848
|
-
|
2849
|
-
|
2850
|
-
|
2851
|
-
|
2852
|
-
|
2937
|
+
} else {
|
2938
|
+
|
2939
|
+
// Objects with different constructors are not equivalent, but `Object`s
|
2940
|
+
// or `Array`s from different frames are.
|
2941
|
+
var aCtor = a.constructor, bCtor = b.constructor;
|
2942
|
+
if (aCtor !== bCtor && !(isObjectConstructor(aCtor) &&
|
2943
|
+
isObjectConstructor(bCtor))) {
|
2944
|
+
return false;
|
2853
2945
|
}
|
2854
|
-
|
2855
|
-
|
2856
|
-
|
2857
|
-
|
2858
|
-
|
2859
|
-
|
2946
|
+
}
|
2947
|
+
|
2948
|
+
// Deep compare objects.
|
2949
|
+
var aKeys = keys(a, className == '[object Array]'), key;
|
2950
|
+
size = aKeys.length;
|
2951
|
+
|
2952
|
+
// Ensure that both objects contain the same number of properties before comparing deep equality.
|
2953
|
+
if (keys(b, className == '[object Array]').length !== size) { return false; }
|
2954
|
+
|
2955
|
+
while (size--) {
|
2956
|
+
key = aKeys[size];
|
2957
|
+
// Deep compare each member
|
2958
|
+
result = has(b, key) && eq(a[key], b[key], aStack, bStack, customTesters);
|
2959
|
+
|
2960
|
+
if (!result) {
|
2961
|
+
return false;
|
2860
2962
|
}
|
2861
2963
|
}
|
2862
2964
|
// Remove the first object from the stack of traversed objects.
|
@@ -2865,14 +2967,48 @@ getJasmineRequireObj().matchersUtil = function(j$) {
|
|
2865
2967
|
|
2866
2968
|
return result;
|
2867
2969
|
|
2868
|
-
function
|
2869
|
-
|
2870
|
-
|
2970
|
+
function keys(obj, isArray) {
|
2971
|
+
var allKeys = Object.keys ? Object.keys(obj) :
|
2972
|
+
(function(o) {
|
2973
|
+
var keys = [];
|
2974
|
+
for (var key in o) {
|
2975
|
+
if (has(o, key)) {
|
2976
|
+
keys.push(key);
|
2977
|
+
}
|
2978
|
+
}
|
2979
|
+
return keys;
|
2980
|
+
})(obj);
|
2981
|
+
|
2982
|
+
if (!isArray) {
|
2983
|
+
return allKeys;
|
2984
|
+
}
|
2985
|
+
|
2986
|
+
var extraKeys = [];
|
2987
|
+
for (var i in allKeys) {
|
2988
|
+
if (!allKeys[i].match(/^[0-9]+$/)) {
|
2989
|
+
extraKeys.push(allKeys[i]);
|
2990
|
+
}
|
2991
|
+
}
|
2871
2992
|
|
2872
|
-
|
2873
|
-
return typeof obj === 'function';
|
2993
|
+
return extraKeys;
|
2874
2994
|
}
|
2875
2995
|
}
|
2996
|
+
|
2997
|
+
function has(obj, key) {
|
2998
|
+
return Object.prototype.hasOwnProperty.call(obj, key);
|
2999
|
+
}
|
3000
|
+
|
3001
|
+
function isFunction(obj) {
|
3002
|
+
return typeof obj === 'function';
|
3003
|
+
}
|
3004
|
+
|
3005
|
+
function isObjectConstructor(ctor) {
|
3006
|
+
// aCtor instanceof aCtor is true for the Object and Function
|
3007
|
+
// constructors (since a constructor is-a Function and a function is-a
|
3008
|
+
// Object). We don't just compare ctor === Object because the constructor
|
3009
|
+
// might come from a different frame with different globals.
|
3010
|
+
return isFunction(ctor) && ctor instanceof ctor;
|
3011
|
+
}
|
2876
3012
|
};
|
2877
3013
|
|
2878
3014
|
getJasmineRequireObj().toBe = function() {
|
@@ -2952,6 +3088,21 @@ getJasmineRequireObj().toBeGreaterThan = function() {
|
|
2952
3088
|
};
|
2953
3089
|
|
2954
3090
|
|
3091
|
+
getJasmineRequireObj().toBeGreaterThanOrEqual = function() {
|
3092
|
+
|
3093
|
+
function toBeGreaterThanOrEqual() {
|
3094
|
+
return {
|
3095
|
+
compare: function(actual, expected) {
|
3096
|
+
return {
|
3097
|
+
pass: actual >= expected
|
3098
|
+
};
|
3099
|
+
}
|
3100
|
+
};
|
3101
|
+
}
|
3102
|
+
|
3103
|
+
return toBeGreaterThanOrEqual;
|
3104
|
+
};
|
3105
|
+
|
2955
3106
|
getJasmineRequireObj().toBeLessThan = function() {
|
2956
3107
|
function toBeLessThan() {
|
2957
3108
|
return {
|
@@ -2966,6 +3117,21 @@ getJasmineRequireObj().toBeLessThan = function() {
|
|
2966
3117
|
|
2967
3118
|
return toBeLessThan;
|
2968
3119
|
};
|
3120
|
+
getJasmineRequireObj().toBeLessThanOrEqual = function() {
|
3121
|
+
function toBeLessThanOrEqual() {
|
3122
|
+
return {
|
3123
|
+
|
3124
|
+
compare: function(actual, expected) {
|
3125
|
+
return {
|
3126
|
+
pass: actual <= expected
|
3127
|
+
};
|
3128
|
+
}
|
3129
|
+
};
|
3130
|
+
}
|
3131
|
+
|
3132
|
+
return toBeLessThanOrEqual;
|
3133
|
+
};
|
3134
|
+
|
2969
3135
|
getJasmineRequireObj().toBeNaN = function(j$) {
|
2970
3136
|
|
2971
3137
|
function toBeNaN() {
|
@@ -3074,17 +3240,19 @@ getJasmineRequireObj().toEqual = function() {
|
|
3074
3240
|
|
3075
3241
|
getJasmineRequireObj().toHaveBeenCalled = function(j$) {
|
3076
3242
|
|
3243
|
+
var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalled>', 'expect(<spyObj>).toHaveBeenCalled()');
|
3244
|
+
|
3077
3245
|
function toHaveBeenCalled() {
|
3078
3246
|
return {
|
3079
3247
|
compare: function(actual) {
|
3080
3248
|
var result = {};
|
3081
3249
|
|
3082
3250
|
if (!j$.isSpy(actual)) {
|
3083
|
-
throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.');
|
3251
|
+
throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.'));
|
3084
3252
|
}
|
3085
3253
|
|
3086
3254
|
if (arguments.length > 1) {
|
3087
|
-
throw new Error('
|
3255
|
+
throw new Error(getErrorMsg('Does not take arguments, use toHaveBeenCalledWith'));
|
3088
3256
|
}
|
3089
3257
|
|
3090
3258
|
result.pass = actual.calls.any();
|
@@ -3103,18 +3271,20 @@ getJasmineRequireObj().toHaveBeenCalled = function(j$) {
|
|
3103
3271
|
|
3104
3272
|
getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) {
|
3105
3273
|
|
3274
|
+
var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledTimes>', 'expect(<spyObj>).toHaveBeenCalledTimes(<Number>)');
|
3275
|
+
|
3106
3276
|
function toHaveBeenCalledTimes() {
|
3107
3277
|
return {
|
3108
3278
|
compare: function(actual, expected) {
|
3109
3279
|
if (!j$.isSpy(actual)) {
|
3110
|
-
throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.');
|
3280
|
+
throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.'));
|
3111
3281
|
}
|
3112
3282
|
|
3113
3283
|
var args = Array.prototype.slice.call(arguments, 0),
|
3114
3284
|
result = { pass: false };
|
3115
3285
|
|
3116
|
-
if(!expected){
|
3117
|
-
throw new Error('
|
3286
|
+
if (!j$.isNumber_(expected)){
|
3287
|
+
throw new Error(getErrorMsg('The expected times failed is a required argument and must be a number.'));
|
3118
3288
|
}
|
3119
3289
|
|
3120
3290
|
actual = args[0];
|
@@ -3134,6 +3304,8 @@ getJasmineRequireObj().toHaveBeenCalledTimes = function(j$) {
|
|
3134
3304
|
|
3135
3305
|
getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
|
3136
3306
|
|
3307
|
+
var getErrorMsg = j$.formatErrorMsg('<toHaveBeenCalledWith>', 'expect(<spyObj>).toHaveBeenCalledWith(...arguments)');
|
3308
|
+
|
3137
3309
|
function toHaveBeenCalledWith(util, customEqualityTesters) {
|
3138
3310
|
return {
|
3139
3311
|
compare: function() {
|
@@ -3143,7 +3315,7 @@ getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
|
|
3143
3315
|
result = { pass: false };
|
3144
3316
|
|
3145
3317
|
if (!j$.isSpy(actual)) {
|
3146
|
-
throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.');
|
3318
|
+
throw new Error(getErrorMsg('Expected a spy, but got ' + j$.pp(actual) + '.'));
|
3147
3319
|
}
|
3148
3320
|
|
3149
3321
|
if (!actual.calls.any()) {
|
@@ -3168,11 +3340,13 @@ getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
|
|
3168
3340
|
|
3169
3341
|
getJasmineRequireObj().toMatch = function(j$) {
|
3170
3342
|
|
3343
|
+
var getErrorMsg = j$.formatErrorMsg('<toMatch>', 'expect(<expectation>).toMatch(<string> || <regexp>)');
|
3344
|
+
|
3171
3345
|
function toMatch() {
|
3172
3346
|
return {
|
3173
3347
|
compare: function(actual, expected) {
|
3174
3348
|
if (!j$.isString_(expected) && !j$.isA_('RegExp', expected)) {
|
3175
|
-
throw new Error('Expected is not a String or a RegExp');
|
3349
|
+
throw new Error(getErrorMsg('Expected is not a String or a RegExp'));
|
3176
3350
|
}
|
3177
3351
|
|
3178
3352
|
var regexp = new RegExp(expected);
|
@@ -3189,6 +3363,8 @@ getJasmineRequireObj().toMatch = function(j$) {
|
|
3189
3363
|
|
3190
3364
|
getJasmineRequireObj().toThrow = function(j$) {
|
3191
3365
|
|
3366
|
+
var getErrorMsg = j$.formatErrorMsg('<toThrow>', 'expect(function() {<expectation>}).toThrow()');
|
3367
|
+
|
3192
3368
|
function toThrow(util) {
|
3193
3369
|
return {
|
3194
3370
|
compare: function(actual, expected) {
|
@@ -3197,7 +3373,7 @@ getJasmineRequireObj().toThrow = function(j$) {
|
|
3197
3373
|
thrown;
|
3198
3374
|
|
3199
3375
|
if (typeof actual != 'function') {
|
3200
|
-
throw new Error('Actual is not a Function');
|
3376
|
+
throw new Error(getErrorMsg('Actual is not a Function'));
|
3201
3377
|
}
|
3202
3378
|
|
3203
3379
|
try {
|
@@ -3235,6 +3411,9 @@ getJasmineRequireObj().toThrow = function(j$) {
|
|
3235
3411
|
};
|
3236
3412
|
|
3237
3413
|
getJasmineRequireObj().toThrowError = function(j$) {
|
3414
|
+
|
3415
|
+
var getErrorMsg = j$.formatErrorMsg('<toThrowError>', 'expect(function() {<expectation>}).toThrowError(<ErrorConstructor>, <message>)');
|
3416
|
+
|
3238
3417
|
function toThrowError () {
|
3239
3418
|
return {
|
3240
3419
|
compare: function(actual) {
|
@@ -3244,7 +3423,7 @@ getJasmineRequireObj().toThrowError = function(j$) {
|
|
3244
3423
|
thrown;
|
3245
3424
|
|
3246
3425
|
if (typeof actual != 'function') {
|
3247
|
-
throw new Error('Actual is not a Function');
|
3426
|
+
throw new Error(getErrorMsg('Actual is not a Function'));
|
3248
3427
|
}
|
3249
3428
|
|
3250
3429
|
var errorMatcher = getMatcher.apply(null, arguments);
|
@@ -3300,15 +3479,15 @@ getJasmineRequireObj().toThrowError = function(j$) {
|
|
3300
3479
|
errorType = arguments[1];
|
3301
3480
|
expected = arguments[2];
|
3302
3481
|
if (!isAnErrorType(errorType)) {
|
3303
|
-
throw new Error('Expected error type is not an Error.');
|
3482
|
+
throw new Error(getErrorMsg('Expected error type is not an Error.'));
|
3304
3483
|
}
|
3305
3484
|
}
|
3306
3485
|
|
3307
3486
|
if (expected && !isStringOrRegExp(expected)) {
|
3308
3487
|
if (errorType) {
|
3309
|
-
throw new Error('Expected error message is not a string or RegExp.');
|
3488
|
+
throw new Error(getErrorMsg('Expected error message is not a string or RegExp.'));
|
3310
3489
|
} else {
|
3311
|
-
throw new Error('Expected is not an Error, string, or RegExp.');
|
3490
|
+
throw new Error(getErrorMsg('Expected is not an Error, string, or RegExp.'));
|
3312
3491
|
}
|
3313
3492
|
}
|
3314
3493
|
|
@@ -3450,5 +3629,5 @@ getJasmineRequireObj().interface = function(jasmine, env) {
|
|
3450
3629
|
};
|
3451
3630
|
|
3452
3631
|
getJasmineRequireObj().version = function() {
|
3453
|
-
return '2.
|
3632
|
+
return '2.5.0';
|
3454
3633
|
};
|