/
index.js
108 lines (92 loc) · 2.74 KB
/
index.js
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
(function () {
var $injector, $q, $rootScope, initialized;
function inject() {
if(initialized) { return; }
$injector = angular.injector(['ngMock']);
$q = $injector.get('$q');
$rootScope = $injector.get('$rootScope');
initialized = true;
}
function digest() {
try { $rootScope.$digest(); }
catch(err) { /* that's ok */ }
}
function createPromise(createSpy) {
return function () {
inject();
var autoFlush = false;
var deferred = $q.defer();
function autoFlushPromise(promise) {
var _then, _catch, _finally;
_then = promise.then;
_catch = promise.catch;
_finally = promise.finally;
promise.then = function () {
var p = _then.apply(promise, arguments);
if(autoFlush) { digest(); }
return autoFlushPromise(p);
};
promise.catch = function () {
var p = _catch.apply(promise, arguments);
if(autoFlush) { digest(); }
return autoFlushPromise(p);
};
promise.finally = function () {
var p = _finally.apply(promise, arguments);
if(autoFlush) { digest(); }
return autoFlushPromise(p);
};
return promise;
}
var promise = autoFlushPromise(deferred.promise);
var spy = createSpy.apply(null, arguments);
spy.resolve = function () {
deferred.resolve.apply(deferred, arguments);
digest();
return spy;
};
spy.resolves = function () {
deferred.resolve.apply(deferred, arguments);
autoFlush = true;
return spy;
};
spy.andResolve = spy.resolves;
spy.reject = function () {
deferred.reject.apply(deferred, arguments);
digest();
return spy;
};
spy.rejects = function () {
deferred.reject.apply(deferred, arguments);
autoFlush = true;
return spy;
};
spy.andReject = spy.rejects;
spy.notify = function () {
deferred.notify.apply(deferred, arguments);
digest();
return spy;
};
spy.notifies = function () {
deferred.notify.apply(deferred, arguments);
autoFlush = true;
return spy;
};
spy.andNotify = spy.notifies;
if('function' === typeof spy.andReturn) {
spy = spy.andReturn(promise);
} else if(spy.and && 'function' === typeof spy.and.returnValue) {
spy = spy.and.returnValue(promise);
} else if('function' === typeof spy.returns) {
spy = spy.returns(promise);
}
return spy;
};
}
if(window.jasmine) {
window.jasmine.createPromise = createPromise(jasmine.createSpy);
}
if(window.sinon) {
window.sinon.promise = createPromise(sinon.stub);
}
})();