1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
// find *Spec.js files in the src directory next to the corresponding source file
var test = window.test = {};
test.cb = (function( jasmine ) {
var callbacks = [];
return {
use: function() {
callbacks = [];
},
createSpy: function( name, arg, data, context ) {
return jasmine.createSpy( name ).and.callFake( function() {
callbacks.push( { cb: arguments[ arg || 0 ], data: data, context: context } );
});
},
execOne: function() {
var exec = callbacks.shift();
exec.cb.apply( exec.context, exec.data );
},
execAll: function() {
while( callbacks.length ) {
this.execOne();
}
}
};
})( this.jasmine );
test.clock = ( function() {
var id = 0, timers, saved;
var names = [ "setTimeout", "setInterval", "clearTimeout", "clearInterval" ];
var byNext = function( a, b ) { return a.next - b.next; };
var mocks = {
setTimeout: function( fn, t ) {
timers.push( { id: id, fn: fn, next: t, t: t, type: "t" } );
return id++;
},
clearTimeout: function( id ) {
timers = timers.filter( function( timer ) { return timer.id !== id; } );
},
setInterval: function( fn, t ) {
timers.push( { id: id, fn: fn, next: t, t: t, type: "i" } );
return id++;
},
clearInterval: function( id ) {
timers = timers.filter( function( timer ) { return timer.id !== id; } );
}
};
return {
steal: function() {
timers = [];
saved = {};
names.forEach( function( n ) {
saved[n] = window[n];
window[n] = mocks[n];
});
},
restore: function() {
names.forEach( function( n ) {
window[n] = saved[n];
});
timers = null;
saved = null;
},
tick: function() {
if( timers.length ) {
timers.sort( byNext );
var t0 = timers[0];
if( t0.type === "t" ) {
timers.shift();
} else {
t0.next += t0.t;
}
t0.fn();
}
}
};
})();
|