jasmine-core 2.0.0.rc2 → 2.0.0.rc3
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 +7 -0
- data/lib/jasmine-core/boot.js +0 -4
- data/lib/jasmine-core/boot/boot.js +0 -4
- data/lib/jasmine-core/jasmine-html.js +3 -1
- data/lib/jasmine-core/jasmine.css +4 -3
- data/lib/jasmine-core/jasmine.js +64 -34
- data/lib/jasmine-core/spec/console/ConsoleReporterSpec.js +2 -2
- data/lib/jasmine-core/spec/core/ClockSpec.js +168 -118
- data/lib/jasmine-core/spec/core/EnvSpec.js +133 -48
- data/lib/jasmine-core/spec/core/ExceptionsSpec.js +1 -1
- data/lib/jasmine-core/spec/core/ExpectationResultSpec.js +2 -2
- data/lib/jasmine-core/spec/core/ExpectationSpec.js +2 -2
- data/lib/jasmine-core/spec/core/JsApiReporterSpec.js +1 -1
- data/lib/jasmine-core/spec/core/QueueRunnerSpec.js +17 -0
- data/lib/jasmine-core/spec/core/SpecRunningSpec.js +6 -6
- data/lib/jasmine-core/spec/core/SpecSpec.js +6 -2
- data/lib/jasmine-core/spec/core/SpyStrategySpec.js +19 -9
- data/lib/jasmine-core/spec/core/TimerSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toContainSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toEqualSpec.js +2 -2
- data/lib/jasmine-core/spec/core/matchers/toHaveBeenCalledWithSpec.js +7 -12
- data/lib/jasmine-core/spec/core/matchers/toThrowErrorSpec.js +8 -8
- data/lib/jasmine-core/spec/core/matchers/toThrowSpec.js +4 -4
- data/lib/jasmine-core/spec/helpers/BrowserFlags.js +15 -11
- data/lib/jasmine-core/spec/html/HtmlReporterSpec.js +5 -3
- data/lib/jasmine-core/spec/html/PrettyPrintHtmlSpec.js +7 -0
- data/lib/jasmine-core/spec/node_suite.js +1 -1
- data/lib/jasmine-core/spec/support/dev_boot.js +0 -5
- data/lib/jasmine-core/version.rb +1 -1
- metadata +16 -107
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 1bd31139a1c91448e7da9a70a0d2305d03b2d0bc
|
4
|
+
data.tar.gz: 6f9500edfc06f08901eb9899ced10cf6fe331c70
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1abbaef73d3e0be63149fec07fba134017274b54aa7b7339b6422266b250387b947bf06ce4952d85a344f5cb85e21f527b90d1d505840c079fbed46b4a2020ac
|
7
|
+
data.tar.gz: 814477470ab35ce9d86a96c11f92a10d54600e88bbfa95de2e7527961ccb459371399374d9aa503b2dc3713857a9bcd1d90437b0cd45ec03b9ac07b4fdedc7b2
|
data/lib/jasmine-core/boot.js
CHANGED
@@ -69,10 +69,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
69
69
|
},
|
70
70
|
|
71
71
|
clock: env.clock,
|
72
|
-
setTimeout: env.clock.setTimeout,
|
73
|
-
clearTimeout: env.clock.clearTimeout,
|
74
|
-
setInterval: env.clock.setInterval,
|
75
|
-
clearInterval: env.clock.clearInterval,
|
76
72
|
jsApiReporter: new jasmine.JsApiReporter({
|
77
73
|
timer: new jasmine.Timer()
|
78
74
|
})
|
@@ -47,10 +47,6 @@
|
|
47
47
|
},
|
48
48
|
|
49
49
|
clock: env.clock,
|
50
|
-
setTimeout: env.clock.setTimeout,
|
51
|
-
clearTimeout: env.clock.clearTimeout,
|
52
|
-
setInterval: env.clock.setInterval,
|
53
|
-
clearInterval: env.clock.clearInterval,
|
54
50
|
jsApiReporter: new jasmine.JsApiReporter({
|
55
51
|
timer: new jasmine.Timer()
|
56
52
|
})
|
@@ -109,7 +109,9 @@ jasmineRequire.HtmlReporter = function(j$) {
|
|
109
109
|
|
110
110
|
var failure =
|
111
111
|
createDom("div", {className: "spec-detail failed"},
|
112
|
-
createDom("
|
112
|
+
createDom("div", {className: "description"},
|
113
|
+
createDom("a", {title: result.fullName, href: specHref(result)}, result.fullName)
|
114
|
+
),
|
113
115
|
createDom("div", {className: "messages"})
|
114
116
|
);
|
115
117
|
var messages = failure.childNodes[1];
|
@@ -11,7 +11,7 @@ body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
|
11
11
|
.html-reporter .banner { margin-top: 14px; }
|
12
12
|
.html-reporter .duration { color: #aaaaaa; float: right; }
|
13
13
|
.html-reporter .symbol-summary { overflow: hidden; *zoom: 1; margin: 14px 0; }
|
14
|
-
.html-reporter .symbol-summary li { display: block;
|
14
|
+
.html-reporter .symbol-summary li { display: inline-block; height: 8px; width: 14px; font-size: 16px; }
|
15
15
|
.html-reporter .symbol-summary li.passed { font-size: 14px; }
|
16
16
|
.html-reporter .symbol-summary li.passed:before { color: #5e7d00; content: "\02022"; }
|
17
17
|
.html-reporter .symbol-summary li.failed { line-height: 9px; }
|
@@ -48,7 +48,8 @@ body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
|
48
48
|
.html-reporter .suite { margin-top: 14px; }
|
49
49
|
.html-reporter .suite a { color: #333333; }
|
50
50
|
.html-reporter .failures .spec-detail { margin-bottom: 28px; }
|
51
|
-
.html-reporter .failures .spec-detail .description {
|
51
|
+
.html-reporter .failures .spec-detail .description { background-color: #b03911; }
|
52
|
+
.html-reporter .failures .spec-detail .description a { color: white; }
|
52
53
|
.html-reporter .result-message { padding-top: 14px; color: #333333; white-space: pre; }
|
53
54
|
.html-reporter .result-message span.result { display: block; }
|
54
|
-
.html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #
|
55
|
+
.html-reporter .stack-trace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
|
data/lib/jasmine-core/jasmine.js
CHANGED
@@ -30,7 +30,7 @@ function getJasmineRequireObj() {
|
|
30
30
|
}
|
31
31
|
|
32
32
|
getJasmineRequireObj().core = function(jRequire) {
|
33
|
-
j$ = {};
|
33
|
+
var j$ = {};
|
34
34
|
|
35
35
|
jRequire.base(j$);
|
36
36
|
j$.util = jRequire.util();
|
@@ -48,7 +48,7 @@ getJasmineRequireObj().core = function(jRequire) {
|
|
48
48
|
j$.pp = jRequire.pp(j$);
|
49
49
|
j$.QueueRunner = jRequire.QueueRunner();
|
50
50
|
j$.ReportDispatcher = jRequire.ReportDispatcher();
|
51
|
-
j$.Spec = jRequire.Spec();
|
51
|
+
j$.Spec = jRequire.Spec(j$);
|
52
52
|
j$.SpyStrategy = jRequire.SpyStrategy();
|
53
53
|
j$.Suite = jRequire.Suite();
|
54
54
|
j$.Timer = jRequire.Timer();
|
@@ -94,7 +94,6 @@ getJasmineRequireObj().base = function(j$) {
|
|
94
94
|
throw new Error("unimplemented method");
|
95
95
|
};
|
96
96
|
|
97
|
-
j$.DEFAULT_UPDATE_INTERVAL = 250;
|
98
97
|
j$.MAX_PRETTY_PRINT_DEPTH = 40;
|
99
98
|
j$.DEFAULT_TIMEOUT_INTERVAL = 5000;
|
100
99
|
|
@@ -221,7 +220,7 @@ getJasmineRequireObj().util = function() {
|
|
221
220
|
return util;
|
222
221
|
};
|
223
222
|
|
224
|
-
getJasmineRequireObj().Spec = function() {
|
223
|
+
getJasmineRequireObj().Spec = function(j$) {
|
225
224
|
function Spec(attrs) {
|
226
225
|
this.encounteredExpectations = false;
|
227
226
|
this.expectationFactory = attrs.expectationFactory;
|
@@ -281,14 +280,14 @@ getJasmineRequireObj().Spec = function() {
|
|
281
280
|
var timeout = Function.prototype.apply.apply(self.timer.setTimeout, [j$.getGlobal(), [function() {
|
282
281
|
onException(new Error('timeout'));
|
283
282
|
done();
|
284
|
-
},
|
283
|
+
}, j$.DEFAULT_TIMEOUT_INTERVAL]]);
|
285
284
|
|
286
285
|
var callDone = function() {
|
287
286
|
Function.prototype.apply.apply(self.timer.clearTimeout, [j$.getGlobal(), [timeout]]);
|
288
287
|
done();
|
289
288
|
};
|
290
289
|
|
291
|
-
fn(callDone); //TODO: do we care about more than 1 arg?
|
290
|
+
fn.call(this, callDone); //TODO: do we care about more than 1 arg?
|
292
291
|
};
|
293
292
|
}
|
294
293
|
|
@@ -382,6 +381,8 @@ getJasmineRequireObj().Env = function(j$) {
|
|
382
381
|
var realClearTimeout = j$.getGlobal().clearTimeout;
|
383
382
|
this.clock = new j$.Clock(global, new j$.DelayedFunctionScheduler());
|
384
383
|
|
384
|
+
var runnableLookupTable = {};
|
385
|
+
|
385
386
|
var spies = [];
|
386
387
|
|
387
388
|
this.currentSpec = null;
|
@@ -450,7 +451,7 @@ getJasmineRequireObj().Env = function(j$) {
|
|
450
451
|
};
|
451
452
|
|
452
453
|
var getSpecName = function(spec, currentSuite) {
|
453
|
-
return currentSuite.getFullName() + ' ' + spec.description
|
454
|
+
return currentSuite.getFullName() + ' ' + spec.description;
|
454
455
|
};
|
455
456
|
|
456
457
|
// TODO: we may just be able to pass in the fn instead of wrapping here
|
@@ -519,6 +520,8 @@ getJasmineRequireObj().Env = function(j$) {
|
|
519
520
|
timer: {setTimeout: realSetTimeout, clearTimeout: realClearTimeout}
|
520
521
|
});
|
521
522
|
|
523
|
+
runnableLookupTable[spec.id] = spec;
|
524
|
+
|
522
525
|
if (!self.specFilter(spec)) {
|
523
526
|
spec.disable();
|
524
527
|
}
|
@@ -557,10 +560,11 @@ getJasmineRequireObj().Env = function(j$) {
|
|
557
560
|
completeCallback: function() {}, // TODO - hook this up
|
558
561
|
resultCallback: function() {} // TODO - hook this up
|
559
562
|
});
|
563
|
+
runnableLookupTable[this.topSuite.id] = this.topSuite;
|
560
564
|
this.currentSuite = this.topSuite;
|
561
565
|
|
562
566
|
this.suiteFactory = function(description) {
|
563
|
-
|
567
|
+
var suite = new suiteConstructor({
|
564
568
|
env: self,
|
565
569
|
id: self.nextSuiteId(),
|
566
570
|
description: description,
|
@@ -571,13 +575,25 @@ getJasmineRequireObj().Env = function(j$) {
|
|
571
575
|
self.reporter.suiteDone(attrs);
|
572
576
|
}
|
573
577
|
});
|
578
|
+
|
579
|
+
runnableLookupTable[suite.id] = suite;
|
580
|
+
return suite;
|
574
581
|
};
|
575
582
|
|
576
|
-
this.execute = function() {
|
583
|
+
this.execute = function(runnablesToRun) {
|
584
|
+
runnablesToRun = runnablesToRun || [this.topSuite.id];
|
585
|
+
|
586
|
+
var allFns = [];
|
587
|
+
for(var i = 0; i < runnablesToRun.length; i++) {
|
588
|
+
var runnable = runnableLookupTable[runnablesToRun[i]];
|
589
|
+
allFns.push((function(runnable) { return function(done) { runnable.execute(done); }; })(runnable));
|
590
|
+
}
|
591
|
+
|
577
592
|
this.reporter.jasmineStarted({
|
578
593
|
totalSpecsDefined: totalSpecsDefined
|
579
594
|
});
|
580
|
-
|
595
|
+
|
596
|
+
queueRunnerFactory({fns: allFns, onComplete: this.reporter.jasmineDone});
|
581
597
|
};
|
582
598
|
|
583
599
|
this.spyOn = function(obj, methodName) {
|
@@ -630,12 +646,12 @@ getJasmineRequireObj().Env = function(j$) {
|
|
630
646
|
|
631
647
|
// TODO: move this to closure
|
632
648
|
Env.prototype.nextSpecId = function() {
|
633
|
-
return this.nextSpecId_++;
|
649
|
+
return 'spec' + this.nextSpecId_++;
|
634
650
|
};
|
635
651
|
|
636
652
|
// TODO: move this to closure
|
637
653
|
Env.prototype.nextSuiteId = function() {
|
638
|
-
return this.nextSuiteId_++;
|
654
|
+
return 'suite' + this.nextSuiteId_++;
|
639
655
|
};
|
640
656
|
|
641
657
|
// TODO: move this to closure
|
@@ -889,18 +905,19 @@ getJasmineRequireObj().Clock = function() {
|
|
889
905
|
setInterval: setInterval,
|
890
906
|
clearInterval: clearInterval
|
891
907
|
},
|
892
|
-
timer = realTimingFunctions,
|
893
908
|
installed = false;
|
894
909
|
|
895
910
|
self.install = function() {
|
896
|
-
|
911
|
+
replace(global, fakeTimingFunctions);
|
897
912
|
timer = fakeTimingFunctions;
|
913
|
+
installed = true;
|
898
914
|
};
|
899
915
|
|
900
916
|
self.uninstall = function() {
|
901
917
|
delayedFunctionScheduler.reset();
|
902
|
-
|
918
|
+
replace(global, realTimingFunctions);
|
903
919
|
timer = realTimingFunctions;
|
920
|
+
installed = false;
|
904
921
|
};
|
905
922
|
|
906
923
|
self.setTimeout = function(fn, delay, params) {
|
@@ -935,7 +952,7 @@ getJasmineRequireObj().Clock = function() {
|
|
935
952
|
if (installed) {
|
936
953
|
delayedFunctionScheduler.tick(millis);
|
937
954
|
} else {
|
938
|
-
throw new Error("Mock clock is not installed, use jasmine.
|
955
|
+
throw new Error("Mock clock is not installed, use jasmine.getEnv().clock.install()");
|
939
956
|
}
|
940
957
|
};
|
941
958
|
|
@@ -945,7 +962,13 @@ getJasmineRequireObj().Clock = function() {
|
|
945
962
|
//if these methods are polyfilled, apply will be present
|
946
963
|
//TODO: it may be difficult to load the polyfill before jasmine loads
|
947
964
|
//(env should be new-ed inside of onload)
|
948
|
-
return !(
|
965
|
+
return !(realTimingFunctions.setTimeout || realTimingFunctions.setInterval).apply;
|
966
|
+
}
|
967
|
+
|
968
|
+
function replace(dest, source) {
|
969
|
+
for (var prop in source) {
|
970
|
+
dest[prop] = source[prop];
|
971
|
+
}
|
949
972
|
}
|
950
973
|
|
951
974
|
function setTimeout(fn, delay) {
|
@@ -981,8 +1004,8 @@ getJasmineRequireObj().DelayedFunctionScheduler = function() {
|
|
981
1004
|
|
982
1005
|
self.tick = function(millis) {
|
983
1006
|
millis = millis || 0;
|
984
|
-
runFunctionsWithinRange(currentTime, currentTime + millis);
|
985
1007
|
currentTime = currentTime + millis;
|
1008
|
+
runFunctionsWithinRange(currentTime - millis, currentTime);
|
986
1009
|
};
|
987
1010
|
|
988
1011
|
self.scheduleFunction = function(funcToCall, millis, params, recurring, timeoutKey, runAtMillis) {
|
@@ -1323,7 +1346,7 @@ getJasmineRequireObj().pp = function(j$) {
|
|
1323
1346
|
this.emitScalar('Date(' + value + ')');
|
1324
1347
|
} else if (value.__Jasmine_been_here_before__) {
|
1325
1348
|
this.emitScalar('<circular reference: ' + (j$.isArray_(value) ? 'Array' : 'Object') + '>');
|
1326
|
-
} else if (j$.isArray_(value) ||
|
1349
|
+
} else if (j$.isArray_(value) || j$.isA_('Object', value)) {
|
1327
1350
|
value.__Jasmine_been_here_before__ = true;
|
1328
1351
|
if (j$.isArray_(value)) {
|
1329
1352
|
this.emitArray(value);
|
@@ -1433,6 +1456,7 @@ getJasmineRequireObj().QueueRunner = function() {
|
|
1433
1456
|
this.clearStack = attrs.clearStack || function(fn) {fn();};
|
1434
1457
|
this.onException = attrs.onException || function() {};
|
1435
1458
|
this.catchException = attrs.catchException || function() { return true; };
|
1459
|
+
this.userContext = {};
|
1436
1460
|
}
|
1437
1461
|
|
1438
1462
|
QueueRunner.prototype.execute = function() {
|
@@ -1461,7 +1485,7 @@ getJasmineRequireObj().QueueRunner = function() {
|
|
1461
1485
|
|
1462
1486
|
function attemptSync(fn) {
|
1463
1487
|
try {
|
1464
|
-
fn.call(self);
|
1488
|
+
fn.call(self.userContext);
|
1465
1489
|
} catch (e) {
|
1466
1490
|
handleException(e);
|
1467
1491
|
}
|
@@ -1471,7 +1495,7 @@ getJasmineRequireObj().QueueRunner = function() {
|
|
1471
1495
|
var next = function () { self.run(fns, iterativeIndex + 1); };
|
1472
1496
|
|
1473
1497
|
try {
|
1474
|
-
fn.call(self, next);
|
1498
|
+
fn.call(self.userContext, next);
|
1475
1499
|
} catch (e) {
|
1476
1500
|
handleException(e);
|
1477
1501
|
next();
|
@@ -1550,16 +1574,17 @@ getJasmineRequireObj().SpyStrategy = function() {
|
|
1550
1574
|
return getSpy();
|
1551
1575
|
};
|
1552
1576
|
|
1553
|
-
this.
|
1577
|
+
this.returnValue = function(value) {
|
1554
1578
|
plan = function() {
|
1555
1579
|
return value;
|
1556
1580
|
};
|
1557
1581
|
return getSpy();
|
1558
1582
|
};
|
1559
1583
|
|
1560
|
-
this.
|
1584
|
+
this.throwError = function(something) {
|
1585
|
+
var error = (something instanceof Error) ? something : new Error(something);
|
1561
1586
|
plan = function() {
|
1562
|
-
throw
|
1587
|
+
throw error;
|
1563
1588
|
};
|
1564
1589
|
return getSpy();
|
1565
1590
|
};
|
@@ -2114,21 +2139,26 @@ getJasmineRequireObj().toHaveBeenCalledWith = function(j$) {
|
|
2114
2139
|
compare: function() {
|
2115
2140
|
var args = Array.prototype.slice.call(arguments, 0),
|
2116
2141
|
actual = args[0],
|
2117
|
-
expectedArgs = args.slice(1)
|
2142
|
+
expectedArgs = args.slice(1),
|
2143
|
+
result = { pass: false };
|
2118
2144
|
|
2119
2145
|
if (!j$.isSpy(actual)) {
|
2120
2146
|
throw new Error('Expected a spy, but got ' + j$.pp(actual) + '.');
|
2121
2147
|
}
|
2122
2148
|
|
2123
|
-
|
2124
|
-
|
2125
|
-
|
2126
|
-
|
2127
|
-
|
2128
|
-
|
2129
|
-
|
2130
|
-
|
2131
|
-
}
|
2149
|
+
if (!actual.calls.any()) {
|
2150
|
+
result.message = "Expected spy " + actual.and.identity() + " to have been called with " + j$.pp(expectedArgs) + " but it was never called.";
|
2151
|
+
return result;
|
2152
|
+
}
|
2153
|
+
|
2154
|
+
if (util.contains(actual.calls.allArgs(), expectedArgs)) {
|
2155
|
+
result.pass = true;
|
2156
|
+
result.message = "Expected spy " + actual.and.identity() + " not to have been called with " + j$.pp(expectedArgs) + " but it was.";
|
2157
|
+
} else {
|
2158
|
+
result.message = "Expected spy " + actual.and.identity() + " to have been called with " + j$.pp(expectedArgs) + " but actual calls were " + j$.pp(actual.calls.allArgs()).replace(/^\[ | \]$/g, '') + ".";
|
2159
|
+
}
|
2160
|
+
|
2161
|
+
return result;
|
2132
2162
|
}
|
2133
2163
|
};
|
2134
2164
|
}
|
@@ -90,7 +90,7 @@ describe("ConsoleReporter", function() {
|
|
90
90
|
reporter.jasmineStarted();
|
91
91
|
reporter.specDone({status: "passed"});
|
92
92
|
|
93
|
-
timerSpy.elapsed.and.
|
93
|
+
timerSpy.elapsed.and.returnValue(1000);
|
94
94
|
|
95
95
|
out.clear();
|
96
96
|
reporter.jasmineDone();
|
@@ -127,7 +127,7 @@ describe("ConsoleReporter", function() {
|
|
127
127
|
|
128
128
|
out.clear();
|
129
129
|
|
130
|
-
timerSpy.elapsed.and.
|
130
|
+
timerSpy.elapsed.and.returnValue(100);
|
131
131
|
|
132
132
|
reporter.jasmineDone();
|
133
133
|
|
@@ -1,41 +1,141 @@
|
|
1
1
|
describe("Clock", function() {
|
2
2
|
|
3
|
-
it("
|
4
|
-
var
|
5
|
-
|
6
|
-
|
7
|
-
delayedFn = jasmine.createSpy(
|
8
|
-
clock = new j$.Clock(
|
3
|
+
it("does not replace setTimeout until it is installed", function() {
|
4
|
+
var fakeSetTimeout = jasmine.createSpy("global setTimeout"),
|
5
|
+
fakeGlobal = { setTimeout: fakeSetTimeout },
|
6
|
+
delayedFunctionScheduler = jasmine.createSpyObj("delayedFunctionScheduler", ["scheduleFunction"]),
|
7
|
+
delayedFn = jasmine.createSpy("delayedFn"),
|
8
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
9
9
|
|
10
|
-
|
10
|
+
fakeGlobal.setTimeout(delayedFn, 0);
|
11
11
|
|
12
|
+
expect(fakeSetTimeout).toHaveBeenCalledWith(delayedFn, 0);
|
12
13
|
expect(delayedFunctionScheduler.scheduleFunction).not.toHaveBeenCalled();
|
13
|
-
|
14
|
+
|
15
|
+
fakeSetTimeout.calls.reset();
|
16
|
+
|
17
|
+
clock.install();
|
18
|
+
fakeGlobal.setTimeout(delayedFn, 0);
|
19
|
+
|
20
|
+
expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalled();
|
21
|
+
expect(fakeSetTimeout).not.toHaveBeenCalled();
|
14
22
|
});
|
15
23
|
|
16
|
-
it("
|
17
|
-
var
|
24
|
+
it("does not replace clearTimeout until it is installed", function() {
|
25
|
+
var fakeClearTimeout = jasmine.createSpy("global cleartimeout"),
|
26
|
+
fakeGlobal = { clearTimeout: fakeClearTimeout },
|
27
|
+
delayedFunctionScheduler = jasmine.createSpyObj("delayedFunctionScheduler", ["removeFunctionWithId"]),
|
28
|
+
delayedFn = jasmine.createSpy("delayedFn"),
|
29
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
30
|
+
|
31
|
+
fakeGlobal.clearTimeout("foo");
|
32
|
+
|
33
|
+
expect(fakeClearTimeout).toHaveBeenCalledWith("foo");
|
34
|
+
expect(delayedFunctionScheduler.removeFunctionWithId).not.toHaveBeenCalled();
|
35
|
+
|
36
|
+
fakeClearTimeout.calls.reset();
|
37
|
+
|
38
|
+
clock.install();
|
39
|
+
fakeGlobal.clearTimeout("foo");
|
40
|
+
|
41
|
+
expect(delayedFunctionScheduler.removeFunctionWithId).toHaveBeenCalled();
|
42
|
+
expect(fakeClearTimeout).not.toHaveBeenCalled();
|
43
|
+
});
|
44
|
+
|
45
|
+
it("does not replace setInterval until it is installed", function() {
|
46
|
+
var fakeSetInterval = jasmine.createSpy("global setInterval"),
|
47
|
+
fakeGlobal = { setInterval: fakeSetInterval },
|
48
|
+
delayedFunctionScheduler = jasmine.createSpyObj("delayedFunctionScheduler", ["scheduleFunction"]),
|
49
|
+
delayedFn = jasmine.createSpy("delayedFn"),
|
50
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
51
|
+
|
52
|
+
fakeGlobal.setInterval(delayedFn, 0);
|
53
|
+
|
54
|
+
expect(fakeSetInterval).toHaveBeenCalledWith(delayedFn, 0);
|
55
|
+
expect(delayedFunctionScheduler.scheduleFunction).not.toHaveBeenCalled();
|
56
|
+
|
57
|
+
fakeSetInterval.calls.reset();
|
58
|
+
|
59
|
+
clock.install();
|
60
|
+
fakeGlobal.setInterval(delayedFn, 0);
|
61
|
+
|
62
|
+
expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalled();
|
63
|
+
expect(fakeSetInterval).not.toHaveBeenCalled();
|
64
|
+
});
|
65
|
+
|
66
|
+
it("does not replace clearInterval until it is installed", function() {
|
67
|
+
var fakeClearInterval = jasmine.createSpy("global clearinterval"),
|
68
|
+
fakeGlobal = { clearInterval: fakeClearInterval },
|
69
|
+
delayedFunctionScheduler = jasmine.createSpyObj("delayedFunctionScheduler", ["removeFunctionWithId"]),
|
70
|
+
delayedFn = jasmine.createSpy("delayedFn"),
|
71
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
72
|
+
|
73
|
+
fakeGlobal.clearInterval("foo");
|
74
|
+
|
75
|
+
expect(fakeClearInterval).toHaveBeenCalledWith("foo");
|
76
|
+
expect(delayedFunctionScheduler.removeFunctionWithId).not.toHaveBeenCalled();
|
77
|
+
|
78
|
+
fakeClearInterval.calls.reset();
|
79
|
+
|
80
|
+
clock.install();
|
81
|
+
fakeGlobal.clearInterval("foo");
|
82
|
+
|
83
|
+
expect(delayedFunctionScheduler.removeFunctionWithId).toHaveBeenCalled();
|
84
|
+
expect(fakeClearInterval).not.toHaveBeenCalled();
|
85
|
+
});
|
86
|
+
|
87
|
+
it("replaces the global timer functions on uninstall", function() {
|
88
|
+
var fakeSetTimeout = jasmine.createSpy("global setTimeout"),
|
89
|
+
fakeClearTimeout = jasmine.createSpy("global clearTimeout"),
|
90
|
+
fakeSetInterval = jasmine.createSpy("global setInterval"),
|
91
|
+
fakeClearInterval = jasmine.createSpy("global clearInterval"),
|
92
|
+
fakeGlobal = {
|
93
|
+
setTimeout: fakeSetTimeout,
|
94
|
+
clearTimeout: fakeClearTimeout,
|
95
|
+
setInterval: fakeSetInterval,
|
96
|
+
clearInterval: fakeClearInterval
|
97
|
+
},
|
98
|
+
delayedFunctionScheduler = jasmine.createSpyObj("delayedFunctionScheduler", ["scheduleFunction", "reset"]),
|
99
|
+
delayedFn = jasmine.createSpy("delayedFn"),
|
100
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
101
|
+
|
102
|
+
clock.install();
|
103
|
+
clock.uninstall();
|
104
|
+
fakeGlobal.setTimeout(delayedFn, 0);
|
105
|
+
fakeGlobal.clearTimeout("foo");
|
106
|
+
fakeGlobal.setInterval(delayedFn, 10);
|
107
|
+
fakeGlobal.clearInterval("bar");
|
108
|
+
|
109
|
+
expect(fakeSetTimeout).toHaveBeenCalledWith(delayedFn, 0);
|
110
|
+
expect(fakeClearTimeout).toHaveBeenCalledWith("foo");
|
111
|
+
expect(fakeSetInterval).toHaveBeenCalledWith(delayedFn, 10);
|
112
|
+
expect(fakeClearInterval).toHaveBeenCalledWith("bar");
|
113
|
+
expect(delayedFunctionScheduler.scheduleFunction).not.toHaveBeenCalled();
|
114
|
+
});
|
115
|
+
|
116
|
+
it("schedules the delayed function (via setTimeout) with the fake timer", function() {
|
117
|
+
var fakeSetTimeout = jasmine.createSpy('setTimeout'),
|
18
118
|
scheduleFunction = jasmine.createSpy('scheduleFunction'),
|
19
|
-
delayedFunctionScheduler = {scheduleFunction: scheduleFunction},
|
20
|
-
|
119
|
+
delayedFunctionScheduler = { scheduleFunction: scheduleFunction },
|
120
|
+
fakeGlobal = { setTimeout: fakeSetTimeout },
|
21
121
|
delayedFn = jasmine.createSpy('delayedFn'),
|
22
|
-
clock = new j$.Clock(
|
122
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
23
123
|
|
24
124
|
clock.install();
|
25
125
|
clock.setTimeout(delayedFn, 0, 'a', 'b');
|
26
126
|
|
27
|
-
expect(
|
127
|
+
expect(fakeSetTimeout).not.toHaveBeenCalled();
|
28
128
|
expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith(delayedFn, 0, ['a', 'b']);
|
29
129
|
});
|
30
130
|
|
31
131
|
it("returns an id for the delayed function", function() {
|
32
|
-
var
|
132
|
+
var fakeSetTimeout = jasmine.createSpy('setTimeout'),
|
33
133
|
scheduleId = 123,
|
34
|
-
scheduleFunction = jasmine.createSpy('scheduleFunction').and.
|
134
|
+
scheduleFunction = jasmine.createSpy('scheduleFunction').and.returnValue(scheduleId),
|
35
135
|
delayedFunctionScheduler = {scheduleFunction: scheduleFunction},
|
36
|
-
|
136
|
+
fakeGlobal = { setTimeout: fakeSetTimeout },
|
37
137
|
delayedFn = jasmine.createSpy('delayedFn'),
|
38
|
-
clock = new j$.Clock(
|
138
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler),
|
39
139
|
timeoutId;
|
40
140
|
|
41
141
|
clock.install();
|
@@ -44,67 +144,43 @@ describe("Clock", function() {
|
|
44
144
|
expect(timeoutId).toEqual(123);
|
45
145
|
});
|
46
146
|
|
47
|
-
it("calls the global clearTimeout directly if Clock is not installed", function() {
|
48
|
-
var clearTimeout = jasmine.createSpy('clearTimeout'),
|
49
|
-
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearTimeout']),
|
50
|
-
global = { clearTimeout: clearTimeout },
|
51
|
-
clock = new j$.Clock(global, delayedFunctionScheduler);
|
52
|
-
|
53
|
-
clock.clearTimeout(123);
|
54
|
-
|
55
|
-
expect(clearTimeout).toHaveBeenCalledWith(123);
|
56
|
-
});
|
57
|
-
|
58
147
|
it("clears the scheduled function with the scheduler", function() {
|
59
|
-
var
|
148
|
+
var fakeClearTimeout = jasmine.createSpy('clearTimeout'),
|
60
149
|
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['removeFunctionWithId']),
|
61
|
-
|
150
|
+
fakeGlobal = { setTimeout: fakeClearTimeout },
|
62
151
|
delayedFn = jasmine.createSpy('delayedFn'),
|
63
|
-
clock = new j$.Clock(
|
152
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
64
153
|
|
65
154
|
clock.install();
|
66
155
|
clock.clearTimeout(123);
|
67
156
|
|
68
|
-
expect(
|
157
|
+
expect(fakeClearTimeout).not.toHaveBeenCalled();
|
69
158
|
expect(delayedFunctionScheduler.removeFunctionWithId).toHaveBeenCalledWith(123);
|
70
159
|
});
|
71
160
|
|
72
|
-
it("calls the global setInterval directly if Clock is not installed", function() {
|
73
|
-
var setInterval = jasmine.createSpy('setInterval'),
|
74
|
-
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction']),
|
75
|
-
global = { setInterval: setInterval },
|
76
|
-
delayedFn = jasmine.createSpy('delayedFn'),
|
77
|
-
clock = new j$.Clock(global, delayedFunctionScheduler);
|
78
|
-
|
79
|
-
clock.setInterval(delayedFn, 0);
|
80
|
-
|
81
|
-
expect(delayedFunctionScheduler.scheduleFunction).not.toHaveBeenCalled();
|
82
|
-
expect(setInterval).toHaveBeenCalledWith(delayedFn, 0);
|
83
|
-
});
|
84
|
-
|
85
161
|
it("schedules the delayed function with the fake timer", function() {
|
86
|
-
var
|
162
|
+
var fakeSetInterval = jasmine.createSpy('setInterval'),
|
87
163
|
scheduleFunction = jasmine.createSpy('scheduleFunction'),
|
88
164
|
delayedFunctionScheduler = {scheduleFunction: scheduleFunction},
|
89
|
-
|
165
|
+
fakeGlobal = { setInterval: fakeSetInterval },
|
90
166
|
delayedFn = jasmine.createSpy('delayedFn'),
|
91
|
-
clock = new j$.Clock(
|
167
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
92
168
|
|
93
169
|
clock.install();
|
94
170
|
clock.setInterval(delayedFn, 0, 'a', 'b');
|
95
171
|
|
96
|
-
expect(
|
172
|
+
expect(fakeSetInterval).not.toHaveBeenCalled();
|
97
173
|
expect(delayedFunctionScheduler.scheduleFunction).toHaveBeenCalledWith(delayedFn, 0, ['a', 'b'], true);
|
98
174
|
});
|
99
175
|
|
100
176
|
it("returns an id for the delayed function", function() {
|
101
|
-
var
|
177
|
+
var fakeSetInterval = jasmine.createSpy('setInterval'),
|
102
178
|
scheduleId = 123,
|
103
|
-
scheduleFunction = jasmine.createSpy('scheduleFunction').and.
|
179
|
+
scheduleFunction = jasmine.createSpy('scheduleFunction').and.returnValue(scheduleId),
|
104
180
|
delayedFunctionScheduler = {scheduleFunction: scheduleFunction},
|
105
|
-
|
181
|
+
fakeGlobal = { setInterval: fakeSetInterval },
|
106
182
|
delayedFn = jasmine.createSpy('delayedFn'),
|
107
|
-
clock = new j$.Clock(
|
183
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler),
|
108
184
|
intervalId;
|
109
185
|
|
110
186
|
clock.install();
|
@@ -113,23 +189,12 @@ describe("Clock", function() {
|
|
113
189
|
expect(intervalId).toEqual(123);
|
114
190
|
});
|
115
191
|
|
116
|
-
it("calls the global clearInterval directly if Clock is not installed", function() {
|
117
|
-
var clearInterval = jasmine.createSpy('clearInterval'),
|
118
|
-
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearInterval']),
|
119
|
-
global = { clearInterval: clearInterval },
|
120
|
-
clock = new j$.Clock(global, delayedFunctionScheduler);
|
121
|
-
|
122
|
-
clock.clearInterval(123);
|
123
|
-
|
124
|
-
expect(clearInterval).toHaveBeenCalledWith(123);
|
125
|
-
});
|
126
|
-
|
127
192
|
it("clears the scheduled function with the scheduler", function() {
|
128
193
|
var clearInterval = jasmine.createSpy('clearInterval'),
|
129
194
|
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['removeFunctionWithId']),
|
130
|
-
|
195
|
+
fakeGlobal = { setInterval: clearInterval },
|
131
196
|
delayedFn = jasmine.createSpy('delayedFn'),
|
132
|
-
clock = new j$.Clock(
|
197
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
133
198
|
|
134
199
|
clock.install();
|
135
200
|
clock.clearInterval(123);
|
@@ -145,53 +210,20 @@ describe("Clock", function() {
|
|
145
210
|
}).toThrow();
|
146
211
|
});
|
147
212
|
|
148
|
-
it("can be uninstalled", function() {
|
149
|
-
var setTimeout = jasmine.createSpy('setTimeout'),
|
150
|
-
setInterval = jasmine.createSpy('setInterval'),
|
151
|
-
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction', 'tick', 'reset']),
|
152
|
-
global = { setTimeout: setTimeout, setInterval: setInterval },
|
153
|
-
delayedFn = jasmine.createSpy('delayedFn'),
|
154
|
-
clock = new j$.Clock(global, delayedFunctionScheduler);
|
155
|
-
|
156
|
-
clock.install();
|
157
|
-
clock.setTimeout(delayedFn, 0);
|
158
|
-
expect(setTimeout).not.toHaveBeenCalled();
|
159
|
-
|
160
|
-
clock.setInterval(delayedFn, 0);
|
161
|
-
expect(setInterval).not.toHaveBeenCalled();
|
162
|
-
|
163
|
-
expect(function() {
|
164
|
-
clock.tick(0);
|
165
|
-
}).not.toThrow();
|
166
|
-
|
167
|
-
clock.uninstall();
|
168
|
-
|
169
|
-
expect(delayedFunctionScheduler.reset).toHaveBeenCalled();
|
170
|
-
|
171
|
-
clock.setTimeout(delayedFn, 0);
|
172
|
-
|
173
|
-
expect(setTimeout).toHaveBeenCalled();
|
174
|
-
|
175
|
-
clock.setInterval(delayedFn, 0);
|
176
|
-
expect(setInterval).toHaveBeenCalled();
|
177
|
-
|
178
|
-
expect(function() {
|
179
|
-
clock.tick(0);
|
180
|
-
}).toThrow();
|
181
|
-
});
|
182
|
-
|
183
|
-
|
184
213
|
it("on IE < 9, fails if extra args are passed to fake clock", function() {
|
185
214
|
//fail, because this would break in IE9.
|
186
|
-
var
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
215
|
+
var fakeSetTimeout = jasmine.createSpy('setTimeout'),
|
216
|
+
fakeSetInterval = jasmine.createSpy('setInterval'),
|
217
|
+
delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['scheduleFunction']),
|
218
|
+
fn = jasmine.createSpy('fn'),
|
219
|
+
fakeGlobal = {
|
220
|
+
setTimeout: fakeSetTimeout,
|
221
|
+
setInterval: fakeSetInterval
|
222
|
+
},
|
223
|
+
clock = new j$.Clock(fakeGlobal, delayedFunctionScheduler);
|
192
224
|
|
193
|
-
|
194
|
-
|
225
|
+
fakeSetTimeout.apply = null;
|
226
|
+
fakeSetInterval.apply = null;
|
195
227
|
|
196
228
|
clock.install();
|
197
229
|
|
@@ -221,8 +253,8 @@ describe("Clock (acceptance)", function() {
|
|
221
253
|
|
222
254
|
clock.install();
|
223
255
|
|
224
|
-
clock.setTimeout(delayedFn1, 0
|
225
|
-
var intervalId = clock.setInterval(recurring1, 50
|
256
|
+
clock.setTimeout(delayedFn1, 0);
|
257
|
+
var intervalId = clock.setInterval(recurring1, 50);
|
226
258
|
clock.setTimeout(delayedFn2, 100);
|
227
259
|
clock.setTimeout(delayedFn3, 200);
|
228
260
|
|
@@ -232,13 +264,13 @@ describe("Clock (acceptance)", function() {
|
|
232
264
|
|
233
265
|
clock.tick(0);
|
234
266
|
|
235
|
-
expect(delayedFn1).
|
267
|
+
expect(delayedFn1).toHaveBeenCalled();
|
236
268
|
expect(delayedFn2).not.toHaveBeenCalled();
|
237
269
|
expect(delayedFn3).not.toHaveBeenCalled();
|
238
270
|
|
239
271
|
clock.tick(50);
|
240
272
|
|
241
|
-
expect(recurring1).
|
273
|
+
expect(recurring1).toHaveBeenCalled();
|
242
274
|
expect(recurring1.calls.count()).toBe(1);
|
243
275
|
expect(delayedFn2).not.toHaveBeenCalled();
|
244
276
|
expect(delayedFn3).not.toHaveBeenCalled();
|
@@ -280,7 +312,7 @@ describe("Clock (acceptance)", function() {
|
|
280
312
|
it("correctly schedules functions after the Clock has advanced", function() {
|
281
313
|
var delayedFn1 = jasmine.createSpy('delayedFn1'),
|
282
314
|
delayedFunctionScheduler = new j$.DelayedFunctionScheduler(),
|
283
|
-
clock = new j$.Clock({setTimeout: function(){}}, delayedFunctionScheduler);
|
315
|
+
clock = new j$.Clock({setTimeout: function() {}}, delayedFunctionScheduler);
|
284
316
|
|
285
317
|
clock.install();
|
286
318
|
|
@@ -292,7 +324,25 @@ describe("Clock (acceptance)", function() {
|
|
292
324
|
expect(delayedFn1).toHaveBeenCalled();
|
293
325
|
});
|
294
326
|
|
295
|
-
it("
|
327
|
+
it("correctly schedules functions while the Clock is advancing", function() {
|
328
|
+
var delayedFn1 = jasmine.createSpy('delayedFn1'),
|
329
|
+
delayedFn2 = jasmine.createSpy('delayedFn2'),
|
330
|
+
delayedFunctionScheduler = new j$.DelayedFunctionScheduler(),
|
331
|
+
clock = new j$.Clock({setTimeout: function() {}}, delayedFunctionScheduler);
|
332
|
+
|
333
|
+
delayedFn1.and.callFake(function() { clock.setTimeout(delayedFn2, 0); });
|
334
|
+
clock.install();
|
335
|
+
clock.setTimeout(delayedFn1, 5);
|
336
|
+
|
337
|
+
clock.tick(5);
|
338
|
+
expect(delayedFn1).toHaveBeenCalled();
|
339
|
+
expect(delayedFn2).not.toHaveBeenCalled();
|
340
|
+
|
341
|
+
clock.tick();
|
342
|
+
expect(delayedFn2).toHaveBeenCalled();
|
343
|
+
});
|
344
|
+
|
345
|
+
it("calls the global clearTimeout correctly when not installed", function() {
|
296
346
|
var delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearTimeout']),
|
297
347
|
global = jasmine.getGlobal(),
|
298
348
|
clock = new j$.Clock(global, delayedFunctionScheduler);
|
@@ -302,7 +352,7 @@ describe("Clock (acceptance)", function() {
|
|
302
352
|
}).not.toThrow();
|
303
353
|
});
|
304
354
|
|
305
|
-
it("calls the global clearTimeout correctly when not installed", function
|
355
|
+
it("calls the global clearTimeout correctly when not installed", function() {
|
306
356
|
var delayedFunctionScheduler = jasmine.createSpyObj('delayedFunctionScheduler', ['clearTimeout']),
|
307
357
|
global = jasmine.getGlobal(),
|
308
358
|
clock = new j$.Clock(global, delayedFunctionScheduler);
|