jasmine-core 2.0.0.rc2 → 2.0.0.rc3
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|