@angular-wave/angular.ts 0.0.1

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.
Files changed (231) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc.cjs +29 -0
  3. package/.github/workflows/playwright.yml +27 -0
  4. package/CHANGELOG.md +17974 -0
  5. package/CODE_OF_CONDUCT.md +3 -0
  6. package/CONTRIBUTING.md +246 -0
  7. package/DEVELOPERS.md +488 -0
  8. package/LICENSE +22 -0
  9. package/Makefile +31 -0
  10. package/README.md +115 -0
  11. package/RELEASE.md +98 -0
  12. package/SECURITY.md +16 -0
  13. package/TRIAGING.md +135 -0
  14. package/css/angular.css +22 -0
  15. package/dist/angular-ts.cjs.js +36843 -0
  16. package/dist/angular-ts.esm.js +36841 -0
  17. package/dist/angular-ts.umd.js +36848 -0
  18. package/dist/build/angular-animate.js +4272 -0
  19. package/dist/build/angular-aria.js +426 -0
  20. package/dist/build/angular-message-format.js +1072 -0
  21. package/dist/build/angular-messages.js +829 -0
  22. package/dist/build/angular-mocks.js +3757 -0
  23. package/dist/build/angular-parse-ext.js +1275 -0
  24. package/dist/build/angular-resource.js +911 -0
  25. package/dist/build/angular-route.js +1266 -0
  26. package/dist/build/angular-sanitize.js +891 -0
  27. package/dist/build/angular-touch.js +368 -0
  28. package/dist/build/angular.js +36600 -0
  29. package/e2e/unit.spec.ts +15 -0
  30. package/images/android-chrome-192x192.png +0 -0
  31. package/images/android-chrome-512x512.png +0 -0
  32. package/images/apple-touch-icon.png +0 -0
  33. package/images/favicon-16x16.png +0 -0
  34. package/images/favicon-32x32.png +0 -0
  35. package/images/favicon.ico +0 -0
  36. package/images/site.webmanifest +1 -0
  37. package/index.html +104 -0
  38. package/package.json +47 -0
  39. package/playwright.config.ts +78 -0
  40. package/public/circle.html +1 -0
  41. package/public/my_child_directive.html +1 -0
  42. package/public/my_directive.html +1 -0
  43. package/public/my_other_directive.html +1 -0
  44. package/public/test.html +1 -0
  45. package/rollup.config.js +31 -0
  46. package/src/animations/animateCache.js +55 -0
  47. package/src/animations/animateChildrenDirective.js +105 -0
  48. package/src/animations/animateCss.js +1139 -0
  49. package/src/animations/animateCssDriver.js +291 -0
  50. package/src/animations/animateJs.js +367 -0
  51. package/src/animations/animateJsDriver.js +67 -0
  52. package/src/animations/animateQueue.js +851 -0
  53. package/src/animations/animation.js +506 -0
  54. package/src/animations/module.js +779 -0
  55. package/src/animations/ngAnimateSwap.js +119 -0
  56. package/src/animations/rafScheduler.js +50 -0
  57. package/src/animations/shared.js +378 -0
  58. package/src/constants.js +20 -0
  59. package/src/core/animate.js +845 -0
  60. package/src/core/animateCss.js +73 -0
  61. package/src/core/animateRunner.js +195 -0
  62. package/src/core/attributes.js +199 -0
  63. package/src/core/cache.js +45 -0
  64. package/src/core/compile.js +4727 -0
  65. package/src/core/controller.js +225 -0
  66. package/src/core/exceptionHandler.js +63 -0
  67. package/src/core/filter.js +146 -0
  68. package/src/core/interpolate.js +442 -0
  69. package/src/core/interval.js +188 -0
  70. package/src/core/intervalFactory.js +57 -0
  71. package/src/core/location.js +1086 -0
  72. package/src/core/parser/parse.js +2562 -0
  73. package/src/core/parser/parse.md +13 -0
  74. package/src/core/q.js +746 -0
  75. package/src/core/rootScope.js +1596 -0
  76. package/src/core/sanitizeUri.js +85 -0
  77. package/src/core/sce.js +1161 -0
  78. package/src/core/taskTrackerFactory.js +125 -0
  79. package/src/core/timeout.js +121 -0
  80. package/src/core/urlUtils.js +187 -0
  81. package/src/core/utils.js +1349 -0
  82. package/src/directive/a.js +37 -0
  83. package/src/directive/attrs.js +283 -0
  84. package/src/directive/bind.js +51 -0
  85. package/src/directive/bind.md +142 -0
  86. package/src/directive/change.js +12 -0
  87. package/src/directive/change.md +25 -0
  88. package/src/directive/cloak.js +12 -0
  89. package/src/directive/cloak.md +24 -0
  90. package/src/directive/events.js +75 -0
  91. package/src/directive/events.md +166 -0
  92. package/src/directive/form.js +725 -0
  93. package/src/directive/init.js +15 -0
  94. package/src/directive/init.md +41 -0
  95. package/src/directive/input.js +1783 -0
  96. package/src/directive/list.js +46 -0
  97. package/src/directive/list.md +22 -0
  98. package/src/directive/ngClass.js +249 -0
  99. package/src/directive/ngController.js +64 -0
  100. package/src/directive/ngCsp.js +82 -0
  101. package/src/directive/ngIf.js +134 -0
  102. package/src/directive/ngInclude.js +217 -0
  103. package/src/directive/ngModel.js +1356 -0
  104. package/src/directive/ngModelOptions.js +509 -0
  105. package/src/directive/ngOptions.js +670 -0
  106. package/src/directive/ngRef.js +90 -0
  107. package/src/directive/ngRepeat.js +650 -0
  108. package/src/directive/ngShowHide.js +255 -0
  109. package/src/directive/ngSwitch.js +178 -0
  110. package/src/directive/ngTransclude.js +98 -0
  111. package/src/directive/non-bindable.js +11 -0
  112. package/src/directive/non-bindable.md +17 -0
  113. package/src/directive/script.js +30 -0
  114. package/src/directive/select.js +624 -0
  115. package/src/directive/style.js +25 -0
  116. package/src/directive/style.md +23 -0
  117. package/src/directive/validators.js +329 -0
  118. package/src/exts/aria.js +544 -0
  119. package/src/exts/messages.js +852 -0
  120. package/src/filters/filter.js +207 -0
  121. package/src/filters/filter.md +69 -0
  122. package/src/filters/filters.js +239 -0
  123. package/src/filters/json.md +16 -0
  124. package/src/filters/limit-to.js +43 -0
  125. package/src/filters/limit-to.md +19 -0
  126. package/src/filters/order-by.js +183 -0
  127. package/src/filters/order-by.md +83 -0
  128. package/src/index.js +13 -0
  129. package/src/injector.js +1034 -0
  130. package/src/jqLite.js +1117 -0
  131. package/src/loader.js +1320 -0
  132. package/src/public.js +215 -0
  133. package/src/routeToRegExp.js +41 -0
  134. package/src/services/anchorScroll.js +135 -0
  135. package/src/services/browser.js +321 -0
  136. package/src/services/cacheFactory.js +398 -0
  137. package/src/services/cookieReader.js +72 -0
  138. package/src/services/document.js +64 -0
  139. package/src/services/http.js +1537 -0
  140. package/src/services/httpBackend.js +206 -0
  141. package/src/services/log.js +160 -0
  142. package/src/services/templateRequest.js +139 -0
  143. package/test/angular.spec.js +2153 -0
  144. package/test/aria/aria.spec.js +1245 -0
  145. package/test/binding.spec.js +504 -0
  146. package/test/build-test.html +14 -0
  147. package/test/injector.spec.js +2327 -0
  148. package/test/jasmine/jasmine-5.1.2/boot0.js +65 -0
  149. package/test/jasmine/jasmine-5.1.2/boot1.js +133 -0
  150. package/test/jasmine/jasmine-5.1.2/jasmine-html.js +963 -0
  151. package/test/jasmine/jasmine-5.1.2/jasmine.css +320 -0
  152. package/test/jasmine/jasmine-5.1.2/jasmine.js +10824 -0
  153. package/test/jasmine/jasmine-5.1.2/jasmine_favicon.png +0 -0
  154. package/test/jasmine/jasmine-browser.json +17 -0
  155. package/test/jasmine/jasmine.json +9 -0
  156. package/test/jqlite.spec.js +2133 -0
  157. package/test/loader.spec.js +219 -0
  158. package/test/messages/messages.spec.js +1146 -0
  159. package/test/min-err.spec.js +174 -0
  160. package/test/mock-test.html +13 -0
  161. package/test/module-test.html +15 -0
  162. package/test/ng/anomate.spec.js +606 -0
  163. package/test/ng/cache-factor.spec.js +334 -0
  164. package/test/ng/compile.spec.js +17956 -0
  165. package/test/ng/controller-provider.spec.js +227 -0
  166. package/test/ng/cookie-reader.spec.js +98 -0
  167. package/test/ng/directive/a.spec.js +192 -0
  168. package/test/ng/directive/bind.spec.js +334 -0
  169. package/test/ng/directive/boolean.spec.js +136 -0
  170. package/test/ng/directive/change.spec.js +71 -0
  171. package/test/ng/directive/class.spec.js +858 -0
  172. package/test/ng/directive/click.spec.js +38 -0
  173. package/test/ng/directive/cloak.spec.js +44 -0
  174. package/test/ng/directive/constoller.spec.js +194 -0
  175. package/test/ng/directive/element-style.spec.js +92 -0
  176. package/test/ng/directive/event.spec.js +282 -0
  177. package/test/ng/directive/form.spec.js +1518 -0
  178. package/test/ng/directive/href.spec.js +143 -0
  179. package/test/ng/directive/if.spec.js +402 -0
  180. package/test/ng/directive/include.spec.js +828 -0
  181. package/test/ng/directive/init.spec.js +68 -0
  182. package/test/ng/directive/input.spec.js +3810 -0
  183. package/test/ng/directive/list.spec.js +170 -0
  184. package/test/ng/directive/model-options.spec.js +1008 -0
  185. package/test/ng/directive/model.spec.js +1905 -0
  186. package/test/ng/directive/non-bindable.spec.js +55 -0
  187. package/test/ng/directive/options.spec.js +3583 -0
  188. package/test/ng/directive/ref.spec.js +575 -0
  189. package/test/ng/directive/repeat.spec.js +1675 -0
  190. package/test/ng/directive/script.spec.js +52 -0
  191. package/test/ng/directive/scrset.spec.js +67 -0
  192. package/test/ng/directive/select.spec.js +2541 -0
  193. package/test/ng/directive/show-hide.spec.js +253 -0
  194. package/test/ng/directive/src.spec.js +157 -0
  195. package/test/ng/directive/style.spec.js +178 -0
  196. package/test/ng/directive/switch.spec.js +647 -0
  197. package/test/ng/directive/validators.spec.js +717 -0
  198. package/test/ng/document.spec.js +52 -0
  199. package/test/ng/filter/filter.spec.js +714 -0
  200. package/test/ng/filter/filters.spec.js +35 -0
  201. package/test/ng/filter/limit-to.spec.js +251 -0
  202. package/test/ng/filter/order-by.spec.js +891 -0
  203. package/test/ng/filter.spec.js +149 -0
  204. package/test/ng/http-backend.spec.js +398 -0
  205. package/test/ng/http.spec.js +4071 -0
  206. package/test/ng/interpolate.spec.js +642 -0
  207. package/test/ng/interval.spec.js +343 -0
  208. package/test/ng/location.spec.js +3488 -0
  209. package/test/ng/on.spec.js +229 -0
  210. package/test/ng/parse.spec.js +4655 -0
  211. package/test/ng/prop.spec.js +805 -0
  212. package/test/ng/q.spec.js +2904 -0
  213. package/test/ng/root-element.spec.js +16 -0
  214. package/test/ng/sanitize-uri.spec.js +249 -0
  215. package/test/ng/sce.spec.js +660 -0
  216. package/test/ng/scope.spec.js +3442 -0
  217. package/test/ng/template-request.spec.js +236 -0
  218. package/test/ng/timeout.spec.js +351 -0
  219. package/test/ng/url-utils.spec.js +156 -0
  220. package/test/ng/utils.spec.js +144 -0
  221. package/test/original-test.html +21 -0
  222. package/test/public.spec.js +34 -0
  223. package/test/sanitize/bing-html.spec.js +36 -0
  224. package/test/server/express.js +158 -0
  225. package/test/test-utils.js +11 -0
  226. package/tsconfig.json +17 -0
  227. package/types/angular.d.ts +138 -0
  228. package/types/global.d.ts +9 -0
  229. package/types/index.d.ts +2357 -0
  230. package/types/jqlite.d.ts +558 -0
  231. package/vite.config.js +14 -0
@@ -0,0 +1,2904 @@
1
+ import { createInjector } from "../../src/injector";
2
+ import { setupModuleLoader } from "../../src/loader";
3
+ import { publishExternalAPI } from "../../src/public";
4
+
5
+ /**
6
+ http://wiki.commonjs.org/wiki/Promises
7
+ http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript
8
+
9
+ Q: https://github.com/kriskowal/q
10
+ https://github.com/kriskowal/q/blob/master/design/README.js
11
+ https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md
12
+ http://jsconf.eu/2010/speaker/commonjs_i_promise_by_kris_kow.html
13
+ - good walkthrough of the Q api's and design, jump to 15:30
14
+
15
+ twisted: http://twistedmatrix.com/documents/11.0.0/api/twisted.internet.defer.Deferred.html
16
+ dojo: https://github.com/dojo/dojo/blob/master/_base/Deferred.js
17
+ http://dojotoolkit.org/api/1.6/dojo/Deferred
18
+ http://dojotoolkit.org/documentation/tutorials/1.6/promises/
19
+ when.js: https://github.com/briancavalier/when.js
20
+ DART: http://www.dartlang.org/docs/api/Promise.html#Promise::Promise
21
+ http://code.google.com/p/dart/source/browse/trunk/dart/corelib/src/promise.dart
22
+ http://codereview.chromium.org/8271014/patch/11003/12005
23
+ https://chromereviews.googleplex.com/3365018/
24
+ WinJS: http://msdn.microsoft.com/en-us/library/windows/apps/br211867.aspx
25
+
26
+ http://download.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Future.html
27
+ http://en.wikipedia.org/wiki/Futures_and_promises
28
+ http://wiki.ecmascript.org/doku.php?id=strawman:deferred_functions
29
+ http://wiki.ecmascript.org/doku.php?id=strawman:async_functions
30
+
31
+
32
+ http://jsperf.com/throw-vs-return
33
+ */
34
+
35
+ describe("q", () => {
36
+ let $q, $rootScope, $injector;
37
+
38
+ beforeEach(() => {
39
+ publishExternalAPI();
40
+ $injector = createInjector(["ng"]);
41
+ $q = $injector.get("$q");
42
+ $rootScope = $injector.get("$rootScope");
43
+ });
44
+
45
+ it("sets up $q", function () {
46
+ publishExternalAPI();
47
+ var injector = createInjector(["ng"]);
48
+ expect(injector.has("$q")).toBe(true);
49
+ });
50
+
51
+ it("has a promise for each Deferred", function () {
52
+ var d = $q.defer();
53
+ expect(d.promise).toBeDefined();
54
+ });
55
+
56
+ it("can resolve a promise", function (done) {
57
+ var deferred = $q.defer();
58
+ var promise = deferred.promise;
59
+ var promiseSpy = jasmine.createSpy();
60
+ promise.then(promiseSpy);
61
+ deferred.resolve("a-ok");
62
+ setTimeout(function () {
63
+ expect(promiseSpy).toHaveBeenCalledWith("a-ok");
64
+ done();
65
+ }, 1);
66
+ });
67
+
68
+ it("works when resolved before promise listener", function (done) {
69
+ var d = $q.defer();
70
+ d.resolve(42);
71
+ var promiseSpy = jasmine.createSpy();
72
+ d.promise.then(promiseSpy);
73
+ setTimeout(function () {
74
+ expect(promiseSpy).toHaveBeenCalledWith(42);
75
+ done();
76
+ }, 0);
77
+ });
78
+
79
+ it("does not resolve promise immediately", function () {
80
+ var d = $q.defer();
81
+ var promiseSpy = jasmine.createSpy();
82
+ d.promise.then(promiseSpy);
83
+ d.resolve(42);
84
+ expect(promiseSpy).not.toHaveBeenCalled();
85
+ });
86
+
87
+ it("resolves promise at next digest", function () {
88
+ var d = $q.defer();
89
+ var promiseSpy = jasmine.createSpy();
90
+ d.promise.then(promiseSpy);
91
+ d.resolve(42);
92
+ $rootScope.$apply();
93
+ expect(promiseSpy).toHaveBeenCalledWith(42);
94
+ });
95
+
96
+ it("may only be resolved once", function () {
97
+ var d = $q.defer();
98
+ var promiseSpy = jasmine.createSpy();
99
+ d.promise.then(promiseSpy);
100
+ d.resolve(42);
101
+ d.resolve(43);
102
+ $rootScope.$apply();
103
+ expect(promiseSpy.calls.count()).toEqual(1);
104
+ expect(promiseSpy).toHaveBeenCalledWith(42);
105
+ });
106
+
107
+ it("may only ever be resolved once", function () {
108
+ var d = $q.defer();
109
+ var promiseSpy = jasmine.createSpy();
110
+ d.promise.then(promiseSpy);
111
+ d.resolve(42);
112
+ $rootScope.$apply();
113
+ expect(promiseSpy).toHaveBeenCalledWith(42);
114
+ d.resolve(43);
115
+ $rootScope.$apply();
116
+ expect(promiseSpy.calls.count()).toEqual(1);
117
+ });
118
+
119
+ it("resolves a listener added after resolution", function () {
120
+ var d = $q.defer();
121
+ d.resolve(42);
122
+ $rootScope.$apply();
123
+ var promiseSpy = jasmine.createSpy();
124
+ d.promise.then(promiseSpy);
125
+ $rootScope.$apply();
126
+ expect(promiseSpy).toHaveBeenCalledWith(42);
127
+ });
128
+
129
+ it("may have multiple callbacks", function () {
130
+ var d = $q.defer();
131
+ var firstSpy = jasmine.createSpy();
132
+ var secondSpy = jasmine.createSpy();
133
+ d.promise.then(firstSpy);
134
+ d.promise.then(secondSpy);
135
+ d.resolve(42);
136
+ $rootScope.$apply();
137
+ expect(firstSpy).toHaveBeenCalledWith(42);
138
+ expect(secondSpy).toHaveBeenCalledWith(42);
139
+ });
140
+
141
+ it("invokes callbacks once", function () {
142
+ var d = $q.defer();
143
+ var firstSpy = jasmine.createSpy();
144
+ var secondSpy = jasmine.createSpy();
145
+ d.promise.then(firstSpy);
146
+ d.resolve(42);
147
+ $rootScope.$apply();
148
+ expect(firstSpy.calls.count()).toBe(1);
149
+ expect(secondSpy.calls.count()).toBe(0);
150
+ d.promise.then(secondSpy);
151
+ expect(firstSpy.calls.count()).toBe(1);
152
+ expect(secondSpy.calls.count()).toBe(0);
153
+ $rootScope.$apply();
154
+ expect(firstSpy.calls.count()).toBe(1);
155
+ expect(secondSpy.calls.count()).toBe(1);
156
+ });
157
+
158
+ it("can reject a deferred", function () {
159
+ var d = $q.defer();
160
+ var fulfillSpy = jasmine.createSpy();
161
+ var rejectSpy = jasmine.createSpy();
162
+ d.promise.then(fulfillSpy, rejectSpy);
163
+ d.reject("fail");
164
+ $rootScope.$apply();
165
+ expect(fulfillSpy).not.toHaveBeenCalled();
166
+ expect(rejectSpy).toHaveBeenCalledWith("fail");
167
+ });
168
+
169
+ it("can reject just once", function () {
170
+ var d = $q.defer();
171
+ var rejectSpy = jasmine.createSpy();
172
+ d.promise.then(null, rejectSpy);
173
+ d.reject("fail");
174
+ $rootScope.$apply();
175
+ expect(rejectSpy.calls.count()).toBe(1);
176
+ d.reject("fail again");
177
+ $rootScope.$apply();
178
+ expect(rejectSpy.calls.count()).toBe(1);
179
+ });
180
+
181
+ it("cannot fulfill a promise once rejected", function () {
182
+ var d = $q.defer();
183
+ var fulfillSpy = jasmine.createSpy();
184
+ var rejectSpy = jasmine.createSpy();
185
+ d.promise.then(fulfillSpy, rejectSpy);
186
+ d.reject("fail");
187
+ $rootScope.$apply();
188
+ d.resolve("success");
189
+ $rootScope.$apply();
190
+ expect(fulfillSpy).not.toHaveBeenCalled();
191
+ });
192
+
193
+ it("does not require a failure handler each time", function () {
194
+ var d = $q.defer();
195
+ var fulfillSpy = jasmine.createSpy();
196
+ var rejectSpy = jasmine.createSpy();
197
+ d.promise.then(fulfillSpy);
198
+ d.promise.then(null, rejectSpy);
199
+ d.reject("fail");
200
+ $rootScope.$apply();
201
+ expect(rejectSpy).toHaveBeenCalledWith("fail");
202
+ });
203
+
204
+ it("does not require a success handler each time", function () {
205
+ var d = $q.defer();
206
+ var fulfillSpy = jasmine.createSpy();
207
+ var rejectSpy = jasmine.createSpy();
208
+ d.promise.then(fulfillSpy);
209
+ d.promise.then(null, rejectSpy);
210
+ d.resolve("ok");
211
+ $rootScope.$apply();
212
+ expect(fulfillSpy).toHaveBeenCalledWith("ok");
213
+ });
214
+
215
+ it("can register rejection handler with catch", function () {
216
+ var d = $q.defer();
217
+ var rejectSpy = jasmine.createSpy();
218
+ d.promise.catch(rejectSpy);
219
+ d.reject("fail");
220
+ $rootScope.$apply();
221
+ expect(rejectSpy).toHaveBeenCalled();
222
+ });
223
+
224
+ it("invokes a finally handler when fulfilled", function () {
225
+ var d = $q.defer();
226
+ var finallySpy = jasmine.createSpy();
227
+ d.promise.finally(finallySpy);
228
+ d.resolve(42);
229
+ $rootScope.$apply();
230
+ expect(finallySpy).toHaveBeenCalledWith();
231
+ });
232
+
233
+ it("invokes a finally handler when rejected", function () {
234
+ var d = $q.defer();
235
+ var finallySpy = jasmine.createSpy();
236
+ d.promise.finally(finallySpy);
237
+ d.reject("fail");
238
+ $rootScope.$apply();
239
+ expect(finallySpy).toHaveBeenCalledWith();
240
+ });
241
+
242
+ it("allows chaining handlers", function () {
243
+ var d = $q.defer();
244
+ var fulfilledSpy = jasmine.createSpy();
245
+ d.promise
246
+ .then(function (result) {
247
+ return result + 1;
248
+ })
249
+ .then(function (result) {
250
+ return result * 2;
251
+ })
252
+ .then(fulfilledSpy);
253
+ d.resolve(20);
254
+ $rootScope.$apply();
255
+ expect(fulfilledSpy).toHaveBeenCalledWith(42);
256
+ });
257
+
258
+ it("does not modify original resolution in chains", function () {
259
+ var d = $q.defer();
260
+ var fulfilledSpy = jasmine.createSpy();
261
+ d.promise
262
+ .then(function (result) {
263
+ return result + 1;
264
+ })
265
+ .then(function (result) {
266
+ return result * 2;
267
+ });
268
+ d.promise.then(fulfilledSpy);
269
+ d.resolve(20);
270
+ $rootScope.$apply();
271
+ expect(fulfilledSpy).toHaveBeenCalledWith(20);
272
+ });
273
+
274
+ it("catches rejection on chained handler", function () {
275
+ var d = $q.defer();
276
+ var rejectedSpy = jasmine.createSpy();
277
+ d.promise.then(() => {}).catch(rejectedSpy);
278
+ d.reject("fail");
279
+ $rootScope.$apply();
280
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
281
+ });
282
+
283
+ it("fulfills on chained handler", function () {
284
+ var d = $q.defer();
285
+ var fulfilledSpy = jasmine.createSpy();
286
+ d.promise.catch(() => {}).then(fulfilledSpy);
287
+ d.resolve(42);
288
+ $rootScope.$apply();
289
+ expect(fulfilledSpy).toHaveBeenCalledWith(42);
290
+ });
291
+
292
+ it("treats catch return value as resolution", function () {
293
+ var d = $q.defer();
294
+ var fulfilledSpy = jasmine.createSpy();
295
+ d.promise
296
+ .catch(function () {
297
+ return 42;
298
+ })
299
+ .then(fulfilledSpy);
300
+ d.reject("fail");
301
+ $rootScope.$apply();
302
+ expect(fulfilledSpy).toHaveBeenCalledWith(42);
303
+ });
304
+
305
+ it("rejects chained promise when handler throws", function () {
306
+ var d = $q.defer();
307
+ var rejectedSpy = jasmine.createSpy();
308
+ d.promise
309
+ .then(function () {
310
+ throw "fail";
311
+ })
312
+ .catch(rejectedSpy);
313
+ d.resolve(42);
314
+ $rootScope.$apply();
315
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
316
+ });
317
+
318
+ it("does not reject current promise when handler throws", function () {
319
+ var d = $q.defer();
320
+ var rejectedSpy = jasmine.createSpy();
321
+ d.promise.then(function () {
322
+ throw "fail";
323
+ });
324
+ d.promise.catch(rejectedSpy);
325
+ d.resolve(42);
326
+ $rootScope.$apply();
327
+ expect(rejectedSpy).not.toHaveBeenCalled();
328
+ });
329
+
330
+ it("waits on promise returned from handler", function () {
331
+ var d = $q.defer();
332
+ var fulfilledSpy = jasmine.createSpy();
333
+ d.promise
334
+ .then(function (v) {
335
+ var d2 = $q.defer();
336
+ d2.resolve(v + 1);
337
+ return d2.promise;
338
+ })
339
+ .then(function (v) {
340
+ return v * 2;
341
+ })
342
+ .then(fulfilledSpy);
343
+ d.resolve(20);
344
+ $rootScope.$apply();
345
+ expect(fulfilledSpy).toHaveBeenCalledWith(42);
346
+ });
347
+
348
+ it("waits on promise given to resolve", function () {
349
+ var d = $q.defer();
350
+ var d2 = $q.defer();
351
+ var fulfilledSpy = jasmine.createSpy();
352
+ d.promise.then(fulfilledSpy);
353
+ d2.resolve(42);
354
+ d.resolve(d2.promise);
355
+ $rootScope.$apply();
356
+ expect(fulfilledSpy).toHaveBeenCalledWith(42);
357
+ });
358
+
359
+ it("rejects when promise returned from handler rejects", function () {
360
+ var d = $q.defer();
361
+ var rejectedSpy = jasmine.createSpy();
362
+ d.promise
363
+ .then(function () {
364
+ var d2 = $q.defer();
365
+ d2.reject("fail");
366
+ return d2.promise;
367
+ })
368
+ .catch(rejectedSpy);
369
+ d.resolve("ok");
370
+ $rootScope.$apply();
371
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
372
+ });
373
+
374
+ it("allows chaining handlers on finally, with original value", function () {
375
+ var d = $q.defer();
376
+ var fulfilledSpy = jasmine.createSpy();
377
+ d.promise
378
+ .then(function (result) {
379
+ return result + 1;
380
+ })
381
+ .finally(function (result) {
382
+ return result * 2;
383
+ })
384
+ .then(fulfilledSpy);
385
+ d.resolve(20);
386
+ $rootScope.$apply();
387
+ expect(fulfilledSpy).toHaveBeenCalledWith(21);
388
+ });
389
+
390
+ it("allows chaining handlers on finally, with original rejection", function () {
391
+ var d = $q.defer();
392
+ var rejectedSpy = jasmine.createSpy();
393
+ d.promise
394
+ .then(function (result) {
395
+ throw "fail";
396
+ })
397
+ .finally(function () {})
398
+ .catch(rejectedSpy);
399
+ d.resolve(20);
400
+ $rootScope.$apply();
401
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
402
+ });
403
+
404
+ it("resolves to orig value when nested promise resolves", function () {
405
+ var d = $q.defer();
406
+ var fulfilledSpy = jasmine.createSpy();
407
+ var resolveNested;
408
+ d.promise
409
+ .then(function (result) {
410
+ return result + 1;
411
+ })
412
+ .finally(function (result) {
413
+ var d2 = $q.defer();
414
+ resolveNested = function () {
415
+ d2.resolve("abc");
416
+ };
417
+ return d2.promise;
418
+ })
419
+ .then(fulfilledSpy);
420
+ d.resolve(20);
421
+ $rootScope.$apply();
422
+ expect(fulfilledSpy).not.toHaveBeenCalled();
423
+ resolveNested();
424
+ $rootScope.$apply();
425
+ expect(fulfilledSpy).toHaveBeenCalledWith(21);
426
+ });
427
+
428
+ it("rejects to original value when nested promise resolves", function () {
429
+ var d = $q.defer();
430
+ var rejectedSpy = jasmine.createSpy();
431
+ var resolveNested;
432
+ d.promise
433
+ .then(function (result) {
434
+ throw "fail";
435
+ })
436
+ .finally(function (result) {
437
+ var d2 = $q.defer();
438
+ resolveNested = function () {
439
+ d2.resolve("abc");
440
+ };
441
+ return d2.promise;
442
+ })
443
+ .catch(rejectedSpy);
444
+ d.resolve(20);
445
+ $rootScope.$apply();
446
+ expect(rejectedSpy).not.toHaveBeenCalled();
447
+ resolveNested();
448
+ $rootScope.$apply();
449
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
450
+ });
451
+
452
+ it("rejects when nested promise rejects in finally", function () {
453
+ var d = $q.defer();
454
+ var fulfilledSpy = jasmine.createSpy();
455
+ var rejectedSpy = jasmine.createSpy();
456
+ var rejectNested;
457
+ d.promise
458
+ .then(function (result) {
459
+ return result + 1;
460
+ })
461
+ .finally(function (result) {
462
+ var d2 = $q.defer();
463
+ rejectNested = function () {
464
+ d2.reject("fail");
465
+ };
466
+ return d2.promise;
467
+ })
468
+ .then(fulfilledSpy, rejectedSpy);
469
+ d.resolve(20);
470
+ $rootScope.$apply();
471
+ expect(fulfilledSpy).not.toHaveBeenCalled();
472
+ rejectNested();
473
+ $rootScope.$apply();
474
+ expect(fulfilledSpy).not.toHaveBeenCalled();
475
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
476
+ });
477
+
478
+ it("can report progress", function () {
479
+ var d = $q.defer();
480
+ var progressSpy = jasmine.createSpy();
481
+ d.promise.then(null, null, progressSpy);
482
+ d.notify("working...");
483
+ $rootScope.$apply();
484
+ expect(progressSpy).toHaveBeenCalledWith("working...");
485
+ });
486
+
487
+ it("can report progress many times", function () {
488
+ var d = $q.defer();
489
+ var progressSpy = jasmine.createSpy();
490
+ d.promise.then(null, null, progressSpy);
491
+ d.notify("40%");
492
+ $rootScope.$apply();
493
+ d.notify("80%");
494
+ d.notify("100%");
495
+ $rootScope.$apply();
496
+ expect(progressSpy.calls.count()).toBe(3);
497
+ });
498
+
499
+ it("does not notify progress after being resolved", function () {
500
+ var d = $q.defer();
501
+ var progressSpy = jasmine.createSpy();
502
+ d.promise.then(null, null, progressSpy);
503
+ d.resolve("ok");
504
+ d.notify("working...");
505
+ $rootScope.$apply();
506
+ expect(progressSpy).not.toHaveBeenCalled();
507
+ });
508
+
509
+ it("does not notify progress after being rejected", function () {
510
+ var d = $q.defer();
511
+ var progressSpy = jasmine.createSpy();
512
+ d.promise.then(null, null, progressSpy);
513
+ d.reject("fail");
514
+ d.notify("working...");
515
+ $rootScope.$apply();
516
+ expect(progressSpy).not.toHaveBeenCalled();
517
+ });
518
+
519
+ it("can notify progress through chain", function () {
520
+ var d = $q.defer();
521
+ var progressSpy = jasmine.createSpy();
522
+ d.promise
523
+ .then(() => {})
524
+ .catch(() => {})
525
+ .then(null, null, progressSpy);
526
+ d.notify("working...");
527
+ $rootScope.$apply();
528
+ expect(progressSpy).toHaveBeenCalledWith("working...");
529
+ });
530
+
531
+ it("transforms progress through handlers", function () {
532
+ var d = $q.defer();
533
+ var progressSpy = jasmine.createSpy();
534
+ d.promise
535
+ .then(() => {})
536
+ .then(null, null, function (progress) {
537
+ return "***" + progress + "***";
538
+ })
539
+ .catch(() => {})
540
+ .then(null, null, progressSpy);
541
+ d.notify("working...");
542
+ $rootScope.$apply();
543
+ expect(progressSpy).toHaveBeenCalledWith("***working...***");
544
+ });
545
+
546
+ it("recovers from progressback exceptions", function () {
547
+ var d = $q.defer();
548
+ var progressSpy = jasmine.createSpy();
549
+ var fulfilledSpy = jasmine.createSpy();
550
+ d.promise.then(null, null, function (progress) {
551
+ throw "fail";
552
+ });
553
+ d.promise.then(fulfilledSpy, null, progressSpy);
554
+ d.notify("working...");
555
+ d.resolve("ok");
556
+ $rootScope.$apply();
557
+ expect(progressSpy).toHaveBeenCalledWith("working...");
558
+ expect(fulfilledSpy).toHaveBeenCalledWith("ok");
559
+ });
560
+
561
+ it("can notify progress through promise returned from handler", function () {
562
+ var d = $q.defer();
563
+ var progressSpy = jasmine.createSpy();
564
+ d.promise.then(null, null, progressSpy);
565
+ var d2 = $q.defer();
566
+ // Resolve original with nested promise
567
+ d.resolve(d2.promise);
568
+ // Notify on the nested promise
569
+ d2.notify("working...");
570
+ $rootScope.$apply();
571
+ expect(progressSpy).toHaveBeenCalledWith("working...");
572
+ });
573
+
574
+ it("allows attaching progressback in finally", function () {
575
+ var d = $q.defer();
576
+ var progressSpy = jasmine.createSpy();
577
+ d.promise.finally(null, progressSpy);
578
+ d.notify("working...");
579
+ $rootScope.$apply();
580
+ expect(progressSpy).toHaveBeenCalledWith("working...");
581
+ });
582
+
583
+ it("can make an immediately rejected promise", function () {
584
+ var fulfilledSpy = jasmine.createSpy();
585
+ var rejectedSpy = jasmine.createSpy();
586
+ var promise = $q.reject("fail");
587
+ promise.then(fulfilledSpy, rejectedSpy);
588
+ $rootScope.$apply();
589
+ expect(fulfilledSpy).not.toHaveBeenCalled();
590
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
591
+ });
592
+
593
+ it("can make an immediately resolved promise", function () {
594
+ var fulfilledSpy = jasmine.createSpy();
595
+ var rejectedSpy = jasmine.createSpy();
596
+ var promise = $q.when("ok");
597
+ promise.then(fulfilledSpy, rejectedSpy);
598
+ $rootScope.$apply();
599
+ expect(fulfilledSpy).toHaveBeenCalledWith("ok");
600
+ expect(rejectedSpy).not.toHaveBeenCalled();
601
+ });
602
+
603
+ it("can wrap a foreign promise", function () {
604
+ var fulfilledSpy = jasmine.createSpy();
605
+ var rejectedSpy = jasmine.createSpy();
606
+ var promise = $q.when({
607
+ then: function (handler) {
608
+ $rootScope.$evalAsync(function () {
609
+ handler("ok");
610
+ });
611
+ },
612
+ });
613
+ promise.then(fulfilledSpy, rejectedSpy);
614
+ $rootScope.$apply();
615
+ expect(fulfilledSpy).toHaveBeenCalledWith("ok");
616
+ expect(rejectedSpy).not.toHaveBeenCalled();
617
+ });
618
+
619
+ it("takes callbacks directly when wrapping", function () {
620
+ var fulfilledSpy = jasmine.createSpy();
621
+ var rejectedSpy = jasmine.createSpy();
622
+ var progressSpy = jasmine.createSpy();
623
+ var wrapped = $q.defer();
624
+ $q.when(wrapped.promise, fulfilledSpy, rejectedSpy, progressSpy);
625
+ wrapped.notify("working...");
626
+ wrapped.resolve("ok");
627
+ $rootScope.$apply();
628
+ expect(fulfilledSpy).toHaveBeenCalledWith("ok");
629
+ expect(rejectedSpy).not.toHaveBeenCalled();
630
+ expect(progressSpy).toHaveBeenCalledWith("working...");
631
+ });
632
+
633
+ it("makes an immediately resolved promise with resolve", function () {
634
+ var fulfilledSpy = jasmine.createSpy();
635
+ var rejectedSpy = jasmine.createSpy();
636
+ var promise = $q.resolve("ok");
637
+ promise.then(fulfilledSpy, rejectedSpy);
638
+ $rootScope.$apply();
639
+ expect(fulfilledSpy).toHaveBeenCalledWith("ok");
640
+ expect(rejectedSpy).not.toHaveBeenCalled();
641
+ });
642
+ });
643
+
644
+ describe("all", function () {
645
+ let $q, $rootScope, $injector;
646
+
647
+ beforeEach(() => {
648
+ publishExternalAPI();
649
+ $injector = createInjector(["ng"]);
650
+ $q = $injector.get("$q");
651
+ $rootScope = $injector.get("$rootScope");
652
+ });
653
+
654
+ it("can resolve an array of promises to array of results", function () {
655
+ var promise = $q.all([$q.when(1), $q.when(2), $q.when(3)]);
656
+ var fulfilledSpy = jasmine.createSpy();
657
+ promise.then(fulfilledSpy);
658
+ $rootScope.$apply();
659
+ expect(fulfilledSpy).toHaveBeenCalledWith([1, 2, 3]);
660
+ });
661
+
662
+ it("can resolve an object of promises to an object of results", function () {
663
+ var promise = $q.all({ a: $q.when(1), b: $q.when(2) });
664
+ var fulfilledSpy = jasmine.createSpy();
665
+ promise.then(fulfilledSpy);
666
+ $rootScope.$apply();
667
+ expect(fulfilledSpy).toHaveBeenCalledWith({ a: 1, b: 2 });
668
+ });
669
+
670
+ it("resolves an empty array of promises immediately", function () {
671
+ var promise = $q.all([]);
672
+ var fulfilledSpy = jasmine.createSpy();
673
+ promise.then(fulfilledSpy);
674
+ $rootScope.$apply();
675
+ expect(fulfilledSpy).toHaveBeenCalledWith([]);
676
+ });
677
+
678
+ it("resolves an empty object of promises immediately", function () {
679
+ var promise = $q.all({});
680
+ var fulfilledSpy = jasmine.createSpy();
681
+ promise.then(fulfilledSpy);
682
+ $rootScope.$apply();
683
+ expect(fulfilledSpy).toHaveBeenCalledWith({});
684
+ });
685
+
686
+ it("rejects when any of the promises rejects", function () {
687
+ var promise = $q.all([$q.when(1), $q.when(2), $q.reject("fail")]);
688
+ var fulfilledSpy = jasmine.createSpy();
689
+ var rejectedSpy = jasmine.createSpy();
690
+ promise.then(fulfilledSpy, rejectedSpy);
691
+ $rootScope.$apply();
692
+ expect(fulfilledSpy).not.toHaveBeenCalled();
693
+ expect(rejectedSpy).toHaveBeenCalledWith("fail");
694
+ });
695
+
696
+ it("wraps non-promises in the input collection", function () {
697
+ var promise = $q.all([$q.when(1), 2, 3]);
698
+ var fulfilledSpy = jasmine.createSpy();
699
+ promise.then(fulfilledSpy);
700
+ $rootScope.$apply();
701
+ expect(fulfilledSpy).toHaveBeenCalledWith([1, 2, 3]);
702
+ });
703
+
704
+ describe("all", function () {
705
+ let $q, $rootScope, $injector;
706
+
707
+ beforeEach(() => {
708
+ setupModuleLoader(window);
709
+ publishExternalAPI();
710
+ $injector = createInjector(["ng"]);
711
+ $q = $injector.get("$q");
712
+ $rootScope = $injector.get("$rootScope");
713
+ });
714
+
715
+ it("is a function", function () {
716
+ expect($q instanceof Function).toBe(true);
717
+ });
718
+
719
+ it("expects a function as an argument", function () {
720
+ expect($q).toThrow();
721
+ $q(() => {}); // Just checking that this doesn't throw
722
+ });
723
+
724
+ it("returns a promise", function () {
725
+ expect($q(() => {})).toBeDefined();
726
+ expect($q(() => {}).then).toBeDefined();
727
+ });
728
+
729
+ it("calls function with a resolve function", function () {
730
+ var fulfilledSpy = jasmine.createSpy();
731
+ $q(function (resolve) {
732
+ resolve("ok");
733
+ }).then(fulfilledSpy);
734
+ $rootScope.$apply();
735
+ expect(fulfilledSpy).toHaveBeenCalledWith("ok");
736
+ });
737
+ });
738
+
739
+ describe("$qq", function () {
740
+ let $q, $$q, $rootScope, $injector;
741
+
742
+ beforeEach(() => {
743
+ setupModuleLoader(window);
744
+ publishExternalAPI();
745
+ $injector = createInjector(["ng"]);
746
+ $q = $injector.get("$q");
747
+ $$q = $injector.get("$$q");
748
+ $rootScope = $injector.get("$rootScope");
749
+ });
750
+
751
+ afterEach(function () {});
752
+
753
+ it("uses deferreds that do not resolve at digest", function () {
754
+ var d = $$q.defer();
755
+ var fulfilledSpy = jasmine.createSpy();
756
+ d.promise.then(fulfilledSpy);
757
+ d.resolve("ok");
758
+ $rootScope.$apply();
759
+ expect(fulfilledSpy).not.toHaveBeenCalled();
760
+ });
761
+
762
+ it("uses deferreds that resolve later", (done) => {
763
+ var d = $$q.defer();
764
+ d.promise.then((val) => {
765
+ expect(val).toBe("ok");
766
+ done();
767
+ });
768
+ d.resolve("ok");
769
+ });
770
+
771
+ it("does not invoke digest", (done) => {
772
+ var d = $$q.defer();
773
+ var watchSpy = jasmine.createSpy();
774
+ d.promise.then(() => {
775
+ watchSpy();
776
+ done();
777
+ });
778
+ d.resolve("ok");
779
+ $rootScope.$watch(watchSpy);
780
+ expect(watchSpy).not.toHaveBeenCalled();
781
+ });
782
+ });
783
+
784
+ describe("$Q", () => {
785
+ let resolve;
786
+ let reject;
787
+ let resolve2;
788
+ let reject2;
789
+
790
+ const createPromise = function () {
791
+ return $q((resolveFn, rejectFn) => {
792
+ if (resolve === null) {
793
+ resolve = resolveFn;
794
+ reject = rejectFn;
795
+ } else if (resolve2 === null) {
796
+ resolve2 = resolveFn;
797
+ reject2 = rejectFn;
798
+ }
799
+ });
800
+ };
801
+
802
+ afterEach(() => {
803
+ resolve = reject = resolve2 = reject2 = null;
804
+ });
805
+
806
+ it("should return a Promise", () => {
807
+ const promise = $q(() => {});
808
+ expect(typeof promise.then).toBe("function");
809
+ expect(typeof promise.catch).toBe("function");
810
+ expect(typeof promise.finally).toBe("function");
811
+ });
812
+
813
+ it("should support the instanceof operator", () => {
814
+ // eslint-disable-next-line new-cap
815
+ let promise = $q(() => {});
816
+ expect(promise instanceof $q).toBe(true);
817
+ promise = new $q(() => {});
818
+ expect(promise instanceof $q).toBe(true);
819
+ });
820
+
821
+ // describe("resolve", () => {
822
+ // it("should fulfill the promise and execute all success callbacks in the registration order", () => {
823
+ // const promise = createPromise();
824
+ // promise.then(success(1), error());
825
+ // promise.then(success(2), error());
826
+ // expect(logStr()).toBe("");
827
+
828
+ // resolve("foo");
829
+ // mockNextTick.flush();
830
+ // expect(logStr()).toBe("success1(foo)->foo; success2(foo)->foo");
831
+ // });
832
+ // });
833
+ });
834
+
835
+ // it("should do nothing if a promise was previously resolved", () => {
836
+ // const promise = createPromise();
837
+ // promise.then(success(), error());
838
+ // expect(logStr()).toBe("");
839
+
840
+ // resolve("foo");
841
+ // mockNextTick.flush();
842
+ // expect(logStr()).toBe("success(foo)->foo");
843
+
844
+ // log = [];
845
+ // resolve("bar");
846
+ // reject("baz");
847
+ // expect(mockNextTick.queue.length).toBe(0);
848
+ // expect(logStr()).toBe("");
849
+ // });
850
+
851
+ // it("should do nothing if a promise was previously rejected", () => {
852
+ // const promise = createPromise();
853
+ // promise.then(success(), error());
854
+ // expect(logStr()).toBe("");
855
+
856
+ // reject("foo");
857
+ // mockNextTick.flush();
858
+ // expect(logStr()).toBe("error(foo)->reject(foo)");
859
+
860
+ // log = [];
861
+ // resolve("bar");
862
+ // reject("baz");
863
+ // expect(mockNextTick.queue.length).toBe(0);
864
+ // expect(logStr()).toBe("");
865
+ // });
866
+
867
+ // it("should allow deferred resolution with a new promise", () => {
868
+ // const promise = createPromise();
869
+
870
+ // promise.then(success(), error());
871
+
872
+ // resolve(createPromise());
873
+ // expect(logStr()).toBe("");
874
+
875
+ // resolve2("foo");
876
+ // mockNextTick.flush();
877
+ // expect(logStr()).toBe("success(foo)->foo");
878
+ // });
879
+
880
+ // it("should call the callback in the next turn", () => {
881
+ // const promise = createPromise();
882
+ // promise.then(success());
883
+ // expect(logStr()).toBe("");
884
+
885
+ // resolve("foo");
886
+ // expect(logStr()).toBe("");
887
+
888
+ // mockNextTick.flush();
889
+ // expect(logStr()).toBe("success(foo)->foo");
890
+ // });
891
+
892
+ // it("should not break if a callbacks registers another callback", () => {
893
+ // const promise = createPromise();
894
+ // promise.then(() => {
895
+ // log.push("outer");
896
+ // promise.then(() => {
897
+ // log.push("inner");
898
+ // });
899
+ // });
900
+
901
+ // resolve("foo");
902
+ // expect(logStr()).toBe("");
903
+
904
+ // mockNextTick.flush();
905
+ // expect(logStr()).toBe("outer; inner");
906
+ // });
907
+
908
+ // it("should not break if a callbacks tries to resolve the deferred again", () => {
909
+ // const promise = createPromise();
910
+ // promise.then((val) => {
911
+ // log.push(`then1(${val})->resolve(bar)`);
912
+ // deferred.resolve("bar"); // nop
913
+ // });
914
+
915
+ // promise.then(success(2));
916
+
917
+ // resolve("foo");
918
+ // expect(logStr()).toBe("");
919
+
920
+ // mockNextTick.flush();
921
+ // expect(logStr()).toBe("then1(foo)->resolve(bar); success2(foo)->foo");
922
+ // });
923
+ // });
924
+
925
+ // describe("reject", () => {
926
+ // it("should reject the promise and execute all error callbacks in the registration order", () => {
927
+ // const promise = createPromise();
928
+ // promise.then(success(), error(1));
929
+ // promise.then(success(), error(2));
930
+ // expect(logStr()).toBe("");
931
+
932
+ // reject("foo");
933
+ // mockNextTick.flush();
934
+ // expect(logStr()).toBe(
935
+ // "error1(foo)->reject(foo); error2(foo)->reject(foo)",
936
+ // );
937
+ // });
938
+
939
+ // it("should do nothing if a promise was previously resolved", () => {
940
+ // const promise = createPromise();
941
+ // promise.then(success(1), error(1));
942
+ // expect(logStr()).toBe("");
943
+
944
+ // resolve("foo");
945
+ // mockNextTick.flush();
946
+ // expect(logStr()).toBe("success1(foo)->foo");
947
+
948
+ // log = [];
949
+ // reject("bar");
950
+ // resolve("baz");
951
+ // expect(mockNextTick.queue.length).toBe(0);
952
+ // expect(logStr()).toBe("");
953
+
954
+ // promise.then(success(2), error(2));
955
+ // expect(logStr()).toBe("");
956
+ // mockNextTick.flush();
957
+ // expect(logStr()).toBe("success2(foo)->foo");
958
+ // });
959
+
960
+ // it("should do nothing if a promise was previously rejected", () => {
961
+ // const promise = createPromise();
962
+ // promise.then(success(1), error(1));
963
+ // expect(logStr()).toBe("");
964
+
965
+ // reject("foo");
966
+ // mockNextTick.flush();
967
+ // expect(logStr()).toBe("error1(foo)->reject(foo)");
968
+
969
+ // log = [];
970
+ // reject("bar");
971
+ // resolve("baz");
972
+ // expect(mockNextTick.queue.length).toBe(0);
973
+ // expect(logStr()).toBe("");
974
+
975
+ // promise.then(success(2), error(2));
976
+ // expect(logStr()).toBe("");
977
+ // mockNextTick.flush();
978
+ // expect(logStr()).toBe("error2(foo)->reject(foo)");
979
+ // });
980
+
981
+ // it("should not defer rejection with a new promise", () => {
982
+ // const promise = createPromise();
983
+ // promise.then(success(), error());
984
+
985
+ // reject(createPromise());
986
+ // mockNextTick.flush();
987
+ // expect(logStr()).toBe("error({})->reject({})");
988
+ // });
989
+
990
+ // it("should call the error callback in the next turn", () => {
991
+ // const promise = createPromise();
992
+ // promise.then(success(), error());
993
+ // expect(logStr()).toBe("");
994
+
995
+ // reject("foo");
996
+ // expect(logStr()).toBe("");
997
+
998
+ // mockNextTick.flush();
999
+ // expect(logStr()).toBe("error(foo)->reject(foo)");
1000
+ // });
1001
+
1002
+ // it("should support non-bound execution", () => {
1003
+ // const promise = createPromise();
1004
+ // promise.then(success(), error());
1005
+ // reject("detached");
1006
+ // mockNextTick.flush();
1007
+ // expect(logStr()).toBe("error(detached)->reject(detached)");
1008
+ // });
1009
+ // });
1010
+
1011
+ // describe("promise", () => {
1012
+ // describe("then", () => {
1013
+ // it(
1014
+ // "should allow registration of a success callback without an errback or progressBack " +
1015
+ // "and resolve",
1016
+ // () => {
1017
+ // const promise = createPromise();
1018
+ // promise.then(success());
1019
+ // resolve("foo");
1020
+ // mockNextTick.flush();
1021
+ // expect(logStr()).toBe("success(foo)->foo");
1022
+ // },
1023
+ // );
1024
+
1025
+ // it("should allow registration of a success callback without an errback and reject", () => {
1026
+ // const promise = createPromise();
1027
+ // promise.then(success());
1028
+ // reject("foo");
1029
+ // mockNextTick.flush();
1030
+ // expect(logStr()).toBe("");
1031
+ // });
1032
+
1033
+ // it(
1034
+ // "should allow registration of an errback without a success or progress callback and " +
1035
+ // " reject",
1036
+ // () => {
1037
+ // const promise = createPromise();
1038
+ // promise.then(null, error());
1039
+ // reject("oops!");
1040
+ // mockNextTick.flush();
1041
+ // expect(logStr()).toBe("error(oops!)->reject(oops!)");
1042
+ // },
1043
+ // );
1044
+
1045
+ // it("should allow registration of an errback without a success callback and resolve", () => {
1046
+ // const promise = createPromise();
1047
+ // promise.then(null, error());
1048
+ // resolve("done");
1049
+ // mockNextTick.flush();
1050
+ // expect(logStr()).toBe("");
1051
+ // });
1052
+
1053
+ // it("should allow registration of a progressBack without a success callback and resolve", () => {
1054
+ // const promise = createPromise();
1055
+ // promise.then(null, null, progress());
1056
+ // resolve("done");
1057
+ // mockNextTick.flush();
1058
+ // expect(logStr()).toBe("");
1059
+ // });
1060
+
1061
+ // it("should allow registration of a progressBack without a error callback and reject", () => {
1062
+ // const promise = createPromise();
1063
+ // promise.then(null, null, progress());
1064
+ // reject("oops!");
1065
+ // mockNextTick.flush();
1066
+ // expect(logStr()).toBe("");
1067
+ // });
1068
+
1069
+ // it("should resolve all callbacks with the original value", () => {
1070
+ // const promise = createPromise();
1071
+ // promise.then(success("A", "aVal"), error(), progress());
1072
+ // promise.then(success("B", "bErr", true), error(), progress());
1073
+ // promise.then(success("C", q.reject("cReason")), error(), progress());
1074
+ // promise.then(
1075
+ // success("D", q.reject("dReason"), true),
1076
+ // error(),
1077
+ // progress(),
1078
+ // );
1079
+ // promise.then(success("E", "eVal"), error(), progress());
1080
+
1081
+ // expect(logStr()).toBe("");
1082
+ // resolve("yup");
1083
+ // mockNextTick.flush();
1084
+ // expect(log).toEqual([
1085
+ // "successA(yup)->aVal",
1086
+ // "successB(yup)->throw(bErr)",
1087
+ // "successC(yup)->{}",
1088
+ // "successD(yup)->throw({})",
1089
+ // "successE(yup)->eVal",
1090
+ // ]);
1091
+ // });
1092
+
1093
+ // it("should reject all callbacks with the original reason", () => {
1094
+ // const promise = createPromise();
1095
+ // promise.then(success(), error("A", "aVal"), progress());
1096
+ // promise.then(success(), error("B", "bEr", true), progress());
1097
+ // promise.then(success(), error("C", q.reject("cReason")), progress());
1098
+ // promise.then(success(), error("D", "dVal"), progress());
1099
+
1100
+ // expect(logStr()).toBe("");
1101
+ // reject("noo!");
1102
+ // mockNextTick.flush();
1103
+ // expect(logStr()).toBe(
1104
+ // "errorA(noo!)->aVal; errorB(noo!)->throw(bEr); errorC(noo!)->{}; errorD(noo!)->dVal",
1105
+ // );
1106
+ // });
1107
+
1108
+ // it("should propagate resolution and rejection between dependent promises", () => {
1109
+ // const promise = createPromise();
1110
+ // promise
1111
+ // .then(success(1, "x"), error("1"))
1112
+ // .then(success(2, "y", true), error("2"))
1113
+ // .then(success(3), error(3, "z", true))
1114
+ // .then(success(4), error(4, "done"))
1115
+ // .then(success(5), error(5));
1116
+
1117
+ // expect(logStr()).toBe("");
1118
+ // resolve("sweet!");
1119
+ // mockNextTick.flush();
1120
+ // expect(log).toEqual([
1121
+ // "success1(sweet!)->x",
1122
+ // "success2(x)->throw(y)",
1123
+ // "error3(y)->throw(z)",
1124
+ // "error4(z)->done",
1125
+ // "success5(done)->done",
1126
+ // ]);
1127
+ // });
1128
+
1129
+ // it("should reject a derived promise if an exception is thrown while resolving its parent", () => {
1130
+ // const promise = createPromise();
1131
+ // promise
1132
+ // .then(success(1, "oops", true), error(1))
1133
+ // .then(success(2), error(2));
1134
+ // resolve("done!");
1135
+ // mockNextTick.flush();
1136
+ // expect(logStr()).toBe(
1137
+ // "success1(done!)->throw(oops); error2(oops)->reject(oops)",
1138
+ // );
1139
+ // });
1140
+
1141
+ // it("should reject a derived promise if an exception is thrown while rejecting its parent", () => {
1142
+ // const promise = createPromise();
1143
+ // promise.then(null, error(1, "oops", true)).then(success(2), error(2));
1144
+ // reject("timeout");
1145
+ // mockNextTick.flush();
1146
+ // expect(logStr()).toBe(
1147
+ // "error1(timeout)->throw(oops); error2(oops)->reject(oops)",
1148
+ // );
1149
+ // });
1150
+
1151
+ // it("should call success callback in the next turn even if promise is already resolved", () => {
1152
+ // const promise = createPromise();
1153
+ // resolve("done!");
1154
+
1155
+ // promise.then(success());
1156
+ // expect(logStr()).toBe("");
1157
+
1158
+ // mockNextTick.flush();
1159
+ // expect(log).toEqual(["success(done!)->done!"]);
1160
+ // });
1161
+
1162
+ // it("should call error callback in the next turn even if promise is already rejected", () => {
1163
+ // const promise = createPromise();
1164
+ // reject("oops!");
1165
+
1166
+ // promise.then(null, error());
1167
+ // expect(logStr()).toBe("");
1168
+
1169
+ // mockNextTick.flush();
1170
+ // expect(log).toEqual(["error(oops!)->reject(oops!)"]);
1171
+ // });
1172
+
1173
+ // it("should forward success resolution when success callbacks are not functions", () => {
1174
+ // const promise = createPromise();
1175
+ // resolve("yay!");
1176
+
1177
+ // promise
1178
+ // .then(1)
1179
+ // .then(null)
1180
+ // .then({})
1181
+ // .then("gah!")
1182
+ // .then([])
1183
+ // .then(success());
1184
+
1185
+ // expect(logStr()).toBe("");
1186
+
1187
+ // mockNextTick.flush();
1188
+ // expect(log).toEqual(["success(yay!)->yay!"]);
1189
+ // });
1190
+
1191
+ // it("should forward error resolution when error callbacks are not functions", () => {
1192
+ // const promise = createPromise();
1193
+ // reject("oops!");
1194
+
1195
+ // promise
1196
+ // .then(null, 1)
1197
+ // .then(null, null)
1198
+ // .then(null, {})
1199
+ // .then(null, "gah!")
1200
+ // .then(null, [])
1201
+ // .then(null, error());
1202
+
1203
+ // expect(logStr()).toBe("");
1204
+
1205
+ // mockNextTick.flush();
1206
+ // expect(log).toEqual(["error(oops!)->reject(oops!)"]);
1207
+ // });
1208
+ // });
1209
+
1210
+ // describe("finally", () => {
1211
+ // it("should not take an argument", () => {
1212
+ // const promise = createPromise();
1213
+ // promise.finally(fin(1));
1214
+ // resolve("foo");
1215
+ // mockNextTick.flush();
1216
+ // expect(logStr()).toBe("finally1()");
1217
+ // });
1218
+
1219
+ // describe("when the promise is fulfilled", () => {
1220
+ // it("should call the callback", () => {
1221
+ // const promise = createPromise();
1222
+ // promise.then(success(1)).finally(fin(1));
1223
+ // resolve("foo");
1224
+ // mockNextTick.flush();
1225
+ // expect(logStr()).toBe("success1(foo)->foo; finally1()");
1226
+ // });
1227
+
1228
+ // it("should fulfill with the original value", () => {
1229
+ // const promise = createPromise();
1230
+ // promise
1231
+ // .finally(fin("B", "b"), error("B"))
1232
+ // .then(success("BB", "bb"), error("BB"));
1233
+ // resolve("RESOLVED_VAL");
1234
+ // mockNextTick.flush();
1235
+ // expect(log).toEqual([
1236
+ // "finallyB()->b",
1237
+ // "successBB(RESOLVED_VAL)->bb",
1238
+ // ]);
1239
+ // });
1240
+
1241
+ // it("should fulfill with the original value (larger test)", () => {
1242
+ // const promise = createPromise();
1243
+ // promise.then(success("A", "a"), error("A"));
1244
+ // promise
1245
+ // .finally(fin("B", "b"), error("B"))
1246
+ // .then(success("BB", "bb"), error("BB"));
1247
+ // promise
1248
+ // .then(success("C", "c"), error("C"))
1249
+ // .finally(fin("CC", "IGNORED"))
1250
+ // .then(success("CCC", "cc"), error("CCC"))
1251
+ // .then(success("CCCC", "ccc"), error("CCCC"));
1252
+ // resolve("RESOLVED_VAL");
1253
+ // mockNextTick.flush();
1254
+
1255
+ // expect(log).toEqual([
1256
+ // "successA(RESOLVED_VAL)->a",
1257
+ // "finallyB()->b",
1258
+ // "successC(RESOLVED_VAL)->c",
1259
+ // "finallyCC()->IGNORED",
1260
+ // "successBB(RESOLVED_VAL)->bb",
1261
+ // "successCCC(c)->cc",
1262
+ // "successCCCC(cc)->ccc",
1263
+ // ]);
1264
+ // });
1265
+
1266
+ // describe("when the callback returns a promise", () => {
1267
+ // describe("that is fulfilled", () => {
1268
+ // it("should fulfill with the original reason after that promise resolves", () => {
1269
+ // const promise = createPromise();
1270
+ // const promise2 = createPromise();
1271
+ // resolve2("bar");
1272
+
1273
+ // promise.finally(fin(1, promise)).then(success(2));
1274
+
1275
+ // resolve("foo");
1276
+ // mockNextTick.flush();
1277
+
1278
+ // expect(logStr()).toBe("finally1()->{}; success2(foo)->foo");
1279
+ // });
1280
+ // });
1281
+
1282
+ // describe("that is rejected", () => {
1283
+ // it("should reject with this new rejection reason", () => {
1284
+ // const promise = createPromise();
1285
+ // const promise2 = createPromise();
1286
+ // reject2("bar");
1287
+ // promise.finally(fin(1, promise2)).then(success(2), error(1));
1288
+ // resolve("foo");
1289
+ // mockNextTick.flush();
1290
+ // expect(logStr()).toBe(
1291
+ // "finally1()->{}; error1(bar)->reject(bar)",
1292
+ // );
1293
+ // });
1294
+ // });
1295
+ // });
1296
+
1297
+ // describe("when the callback throws an exception", () => {
1298
+ // it("should reject with this new exception", () => {
1299
+ // const promise = createPromise();
1300
+ // promise
1301
+ // .finally(fin(1, "exception", true))
1302
+ // .then(success(1), error(2));
1303
+ // resolve("foo");
1304
+ // mockNextTick.flush();
1305
+ // expect(logStr()).toBe(
1306
+ // "finally1()->throw(exception); error2(exception)->reject(exception)",
1307
+ // );
1308
+ // });
1309
+ // });
1310
+ // });
1311
+
1312
+ // describe("when the promise is rejected", () => {
1313
+ // it("should call the callback", () => {
1314
+ // const promise = createPromise();
1315
+ // promise.finally(fin(1)).then(success(2), error(1));
1316
+ // reject("foo");
1317
+ // mockNextTick.flush();
1318
+ // expect(logStr()).toBe("finally1(); error1(foo)->reject(foo)");
1319
+ // });
1320
+
1321
+ // it("should reject with the original reason", () => {
1322
+ // const promise = createPromise();
1323
+ // promise.finally(fin(1), "hello").then(success(2), error(2));
1324
+ // reject("original");
1325
+ // mockNextTick.flush();
1326
+ // expect(logStr()).toBe(
1327
+ // "finally1(); error2(original)->reject(original)",
1328
+ // );
1329
+ // });
1330
+
1331
+ // describe("when the callback returns a promise", () => {
1332
+ // describe("that is fulfilled", () => {
1333
+ // it("should reject with the original reason after that promise resolves", () => {
1334
+ // const promise = createPromise();
1335
+ // const promise2 = createPromise();
1336
+ // resolve2("bar");
1337
+ // promise.finally(fin(1, promise2)).then(success(2), error(2));
1338
+ // reject("original");
1339
+ // mockNextTick.flush();
1340
+ // expect(logStr()).toBe(
1341
+ // "finally1()->{}; error2(original)->reject(original)",
1342
+ // );
1343
+ // });
1344
+ // });
1345
+
1346
+ // describe("that is rejected", () => {
1347
+ // it("should reject with the new reason", () => {
1348
+ // const promise = createPromise();
1349
+ // const promise2 = createPromise();
1350
+ // reject2("bar");
1351
+ // promise.finally(fin(1, promise2)).then(success(2), error(1));
1352
+ // resolve("foo");
1353
+ // mockNextTick.flush();
1354
+ // expect(logStr()).toBe(
1355
+ // "finally1()->{}; error1(bar)->reject(bar)",
1356
+ // );
1357
+ // });
1358
+ // });
1359
+ // });
1360
+
1361
+ // describe("when the callback throws an exception", () => {
1362
+ // it("should reject with this new exception", () => {
1363
+ // const promise = createPromise();
1364
+ // promise
1365
+ // .finally(fin(1, "exception", true))
1366
+ // .then(success(1), error(2));
1367
+ // resolve("foo");
1368
+ // mockNextTick.flush();
1369
+ // expect(logStr()).toBe(
1370
+ // "finally1()->throw(exception); error2(exception)->reject(exception)",
1371
+ // );
1372
+ // });
1373
+ // });
1374
+ // });
1375
+ // });
1376
+
1377
+ // describe("catch", () => {
1378
+ // it("should be a shorthand for defining promise error handlers", () => {
1379
+ // const promise = createPromise();
1380
+ // promise.catch(error(1)).then(null, error(2));
1381
+ // reject("foo");
1382
+ // mockNextTick.flush();
1383
+ // expect(logStr()).toBe(
1384
+ // "error1(foo)->reject(foo); error2(foo)->reject(foo)",
1385
+ // );
1386
+ // });
1387
+ // });
1388
+ // });
1389
+ // });
1390
+
1391
+ // describe("defer", () => {
1392
+ // it("should create a new deferred", () => {
1393
+ // expect(deferred.promise).toBeDefined();
1394
+ // expect(deferred.resolve).toBeDefined();
1395
+ // expect(deferred.reject).toBeDefined();
1396
+ // });
1397
+
1398
+ // describe("resolve", () => {
1399
+ // it("should fulfill the promise and execute all success callbacks in the registration order", () => {
1400
+ // promise.then(success(1), error());
1401
+ // promise.then(success(2), error());
1402
+ // expect(logStr()).toBe("");
1403
+
1404
+ // deferred.resolve("foo");
1405
+ // mockNextTick.flush();
1406
+ // expect(logStr()).toBe("success1(foo)->foo; success2(foo)->foo");
1407
+ // });
1408
+
1409
+ // it("should complain if promise fulfilled with itself", () => {
1410
+ // const resolveSpy = jasmine.createSpy("resolve");
1411
+ // const rejectSpy = jasmine.createSpy("reject");
1412
+ // promise.then(resolveSpy, rejectSpy);
1413
+ // deferred.resolve(deferred.promise);
1414
+ // mockNextTick.flush();
1415
+
1416
+ // expect(resolveSpy).not.toHaveBeenCalled();
1417
+ // expect(rejectSpy).toHaveBeenCalled();
1418
+ // expect(rejectSpy.calls.argsFor(0)[0]).toEqualMinErr(
1419
+ // "$q",
1420
+ // "qcycle",
1421
+ // "Expected promise to be resolved with value other than itself",
1422
+ // );
1423
+ // });
1424
+
1425
+ // it("should do nothing if a promise was previously resolved", () => {
1426
+ // promise.then(success(), error());
1427
+ // expect(logStr()).toBe("");
1428
+
1429
+ // deferred.resolve("foo");
1430
+ // mockNextTick.flush();
1431
+ // expect(logStr()).toBe("success(foo)->foo");
1432
+
1433
+ // log = [];
1434
+ // deferred.resolve("bar");
1435
+ // deferred.reject("baz");
1436
+ // expect(mockNextTick.queue.length).toBe(0);
1437
+ // expect(logStr()).toBe("");
1438
+ // });
1439
+
1440
+ // it("should do nothing if a promise was previously rejected", () => {
1441
+ // promise.then(success(), error());
1442
+ // expect(logStr()).toBe("");
1443
+
1444
+ // deferred.reject("foo");
1445
+ // mockNextTick.flush();
1446
+ // expect(logStr()).toBe("error(foo)->reject(foo)");
1447
+
1448
+ // log = [];
1449
+ // deferred.resolve("bar");
1450
+ // deferred.reject("baz");
1451
+ // expect(mockNextTick.queue.length).toBe(0);
1452
+ // expect(logStr()).toBe("");
1453
+ // });
1454
+
1455
+ // it("should allow deferred resolution with a new promise", () => {
1456
+ // const deferred2 = defer();
1457
+ // promise.then(success(), error());
1458
+
1459
+ // deferred.resolve(deferred2.promise);
1460
+ // expect(logStr()).toBe("");
1461
+
1462
+ // deferred2.resolve("foo");
1463
+ // mockNextTick.flush();
1464
+ // expect(logStr()).toBe("success(foo)->foo");
1465
+ // });
1466
+
1467
+ // it("should call the callback in the next turn", () => {
1468
+ // promise.then(success());
1469
+ // expect(logStr()).toBe("");
1470
+
1471
+ // deferred.resolve("foo");
1472
+ // expect(logStr()).toBe("");
1473
+
1474
+ // mockNextTick.flush();
1475
+ // expect(logStr()).toBe("success(foo)->foo");
1476
+ // });
1477
+
1478
+ // it("should support non-bound execution", () => {
1479
+ // const resolver = deferred.resolve;
1480
+ // promise.then(success(), error());
1481
+ // resolver("detached");
1482
+ // mockNextTick.flush();
1483
+ // expect(logStr()).toBe("success(detached)->detached");
1484
+ // });
1485
+
1486
+ // it("should not break if a callbacks registers another callback", () => {
1487
+ // promise.then(() => {
1488
+ // log.push("outer");
1489
+ // promise.then(() => {
1490
+ // log.push("inner");
1491
+ // });
1492
+ // });
1493
+
1494
+ // deferred.resolve("foo");
1495
+ // expect(logStr()).toBe("");
1496
+
1497
+ // mockNextTick.flush();
1498
+ // expect(logStr()).toBe("outer; inner");
1499
+ // });
1500
+
1501
+ // it("should not break if a callbacks tries to resolve the deferred again", () => {
1502
+ // promise.then((val) => {
1503
+ // log.push(`then1(${val})->resolve(bar)`);
1504
+ // deferred.resolve("bar"); // nop
1505
+ // });
1506
+
1507
+ // promise.then(success(2));
1508
+
1509
+ // deferred.resolve("foo");
1510
+ // expect(logStr()).toBe("");
1511
+
1512
+ // mockNextTick.flush();
1513
+ // expect(logStr()).toBe("then1(foo)->resolve(bar); success2(foo)->foo");
1514
+ // });
1515
+ // });
1516
+
1517
+ // describe("reject", () => {
1518
+ // it("should reject the promise and execute all error callbacks in the registration order", () => {
1519
+ // promise.then(success(), error(1));
1520
+ // promise.then(success(), error(2));
1521
+ // expect(logStr()).toBe("");
1522
+
1523
+ // deferred.reject("foo");
1524
+ // mockNextTick.flush();
1525
+ // expect(logStr()).toBe(
1526
+ // "error1(foo)->reject(foo); error2(foo)->reject(foo)",
1527
+ // );
1528
+ // });
1529
+
1530
+ // it("should do nothing if a promise was previously resolved", () => {
1531
+ // promise.then(success(1), error(1));
1532
+ // expect(logStr()).toBe("");
1533
+
1534
+ // deferred.resolve("foo");
1535
+ // mockNextTick.flush();
1536
+ // expect(logStr()).toBe("success1(foo)->foo");
1537
+
1538
+ // log = [];
1539
+ // deferred.reject("bar");
1540
+ // deferred.resolve("baz");
1541
+ // expect(mockNextTick.queue.length).toBe(0);
1542
+ // expect(logStr()).toBe("");
1543
+
1544
+ // promise.then(success(2), error(2));
1545
+ // expect(logStr()).toBe("");
1546
+ // mockNextTick.flush();
1547
+ // expect(logStr()).toBe("success2(foo)->foo");
1548
+ // });
1549
+
1550
+ // it("should do nothing if a promise was previously rejected", () => {
1551
+ // promise.then(success(1), error(1));
1552
+ // expect(logStr()).toBe("");
1553
+
1554
+ // deferred.reject("foo");
1555
+ // mockNextTick.flush();
1556
+ // expect(logStr()).toBe("error1(foo)->reject(foo)");
1557
+
1558
+ // log = [];
1559
+ // deferred.reject("bar");
1560
+ // deferred.resolve("baz");
1561
+ // expect(mockNextTick.queue.length).toBe(0);
1562
+ // expect(logStr()).toBe("");
1563
+
1564
+ // promise.then(success(2), error(2));
1565
+ // expect(logStr()).toBe("");
1566
+ // mockNextTick.flush();
1567
+ // expect(logStr()).toBe("error2(foo)->reject(foo)");
1568
+ // });
1569
+
1570
+ // it("should not defer rejection with a new promise", () => {
1571
+ // const deferred2 = defer();
1572
+ // promise.then(success(), error());
1573
+
1574
+ // deferred.reject(deferred2.promise);
1575
+ // mockNextTick.flush();
1576
+ // expect(logStr()).toBe("error({})->reject({})");
1577
+ // });
1578
+
1579
+ // it("should call the error callback in the next turn", () => {
1580
+ // promise.then(success(), error());
1581
+ // expect(logStr()).toBe("");
1582
+
1583
+ // deferred.reject("foo");
1584
+ // expect(logStr()).toBe("");
1585
+
1586
+ // mockNextTick.flush();
1587
+ // expect(logStr()).toBe("error(foo)->reject(foo)");
1588
+ // });
1589
+
1590
+ // it("should support non-bound execution", () => {
1591
+ // const rejector = deferred.reject;
1592
+ // promise.then(success(), error());
1593
+ // rejector("detached");
1594
+ // mockNextTick.flush();
1595
+ // expect(logStr()).toBe("error(detached)->reject(detached)");
1596
+ // });
1597
+ // });
1598
+
1599
+ // describe("notify", () => {
1600
+ // it("should execute all progress callbacks in the registration order", () => {
1601
+ // promise.then(success(1), error(1), progress(1));
1602
+ // promise.then(success(2), error(2), progress(2));
1603
+ // expect(logStr()).toBe("");
1604
+
1605
+ // deferred.notify("foo");
1606
+ // mockNextTick.flush();
1607
+ // expect(logStr()).toBe("progress1(foo)->foo; progress2(foo)->foo");
1608
+ // });
1609
+
1610
+ // it("should do nothing if a promise was previously resolved", () => {
1611
+ // promise.then(success(1), error(1), progress(1));
1612
+ // expect(logStr()).toBe("");
1613
+
1614
+ // deferred.resolve("foo");
1615
+ // mockNextTick.flush();
1616
+ // expect(logStr()).toBe("success1(foo)->foo");
1617
+
1618
+ // log = [];
1619
+ // deferred.notify("bar");
1620
+ // expect(mockNextTick.queue.length).toBe(0);
1621
+ // expect(logStr()).toBe("");
1622
+ // });
1623
+
1624
+ // it("should do nothing if a promise was previously rejected", () => {
1625
+ // promise.then(success(1), error(1), progress(1));
1626
+ // expect(logStr()).toBe("");
1627
+
1628
+ // deferred.reject("foo");
1629
+ // mockNextTick.flush();
1630
+ // expect(logStr()).toBe("error1(foo)->reject(foo)");
1631
+
1632
+ // log = [];
1633
+ // deferred.reject("bar");
1634
+ // deferred.resolve("baz");
1635
+ // deferred.notify("qux");
1636
+ // expect(mockNextTick.queue.length).toBe(0);
1637
+ // expect(logStr()).toBe("");
1638
+
1639
+ // promise.then(success(2), error(2), progress(2));
1640
+ // expect(logStr()).toBe("");
1641
+ // mockNextTick.flush();
1642
+ // expect(logStr()).toBe("error2(foo)->reject(foo)");
1643
+ // });
1644
+
1645
+ // it("should not apply any special treatment to promises passed to notify", () => {
1646
+ // const deferred2 = defer();
1647
+ // promise.then(success(), error(), progress());
1648
+
1649
+ // deferred.notify(deferred2.promise);
1650
+ // mockNextTick.flush();
1651
+ // expect(logStr()).toBe("progress({})->{}");
1652
+ // });
1653
+
1654
+ // it("should call the progress callbacks in the next turn", () => {
1655
+ // promise.then(success(), error(), progress(1));
1656
+ // promise.then(success(), error(), progress(2));
1657
+ // expect(logStr()).toBe("");
1658
+
1659
+ // deferred.notify("foo");
1660
+ // expect(logStr()).toBe("");
1661
+
1662
+ // mockNextTick.flush();
1663
+ // expect(logStr()).toBe("progress1(foo)->foo; progress2(foo)->foo");
1664
+ // });
1665
+
1666
+ // it("should ignore notifications sent out in the same turn before listener registration", () => {
1667
+ // deferred.notify("foo");
1668
+ // promise.then(success(), error(), progress(1));
1669
+ // expect(logStr()).toBe("");
1670
+ // expect(mockNextTick.queue).toEqual([]);
1671
+ // });
1672
+
1673
+ // it("should support non-bound execution", () => {
1674
+ // const { notify } = deferred;
1675
+ // promise.then(success(), error(), progress());
1676
+ // notify("detached");
1677
+ // mockNextTick.flush();
1678
+ // expect(logStr()).toBe("progress(detached)->detached");
1679
+ // });
1680
+
1681
+ // it("should not save and re-emit progress notifications between ticks", () => {
1682
+ // promise.then(success(1), error(1), progress(1));
1683
+ // deferred.notify("foo");
1684
+ // deferred.notify("bar");
1685
+ // mockNextTick.flush();
1686
+ // expect(logStr()).toBe("progress1(foo)->foo; progress1(bar)->bar");
1687
+
1688
+ // log = [];
1689
+ // promise.then(success(2), error(2), progress(2));
1690
+ // deferred.notify("baz");
1691
+ // mockNextTick.flush();
1692
+ // expect(logStr()).toBe("progress1(baz)->baz; progress2(baz)->baz");
1693
+ // });
1694
+ // });
1695
+
1696
+ // describe("promise", () => {
1697
+ // it("should have a then method", () => {
1698
+ // expect(typeof promise.then).toBe("function");
1699
+ // });
1700
+
1701
+ // it("should have a catch method", () => {
1702
+ // expect(typeof promise.catch).toBe("function");
1703
+ // });
1704
+
1705
+ // it("should have a finally method", () => {
1706
+ // expect(typeof promise.finally).toBe("function");
1707
+ // });
1708
+
1709
+ // describe("then", () => {
1710
+ // it(
1711
+ // "should allow registration of a success callback without an errback or progressBack " +
1712
+ // "and resolve",
1713
+ // () => {
1714
+ // promise.then(success());
1715
+ // syncResolve(deferred, "foo");
1716
+ // expect(logStr()).toBe("success(foo)->foo");
1717
+ // },
1718
+ // );
1719
+
1720
+ // it("should allow registration of a success callback without an errback and reject", () => {
1721
+ // promise.then(success());
1722
+ // syncReject(deferred, "foo");
1723
+ // expect(logStr()).toBe("");
1724
+ // });
1725
+
1726
+ // it("should allow registration of a success callback without a progressBack and notify", () => {
1727
+ // promise.then(success());
1728
+ // syncNotify(deferred, "doing");
1729
+ // expect(logStr()).toBe("");
1730
+ // });
1731
+
1732
+ // it(
1733
+ // "should allow registration of an errback without a success or progress callback and " +
1734
+ // " reject",
1735
+ // () => {
1736
+ // promise.then(null, error());
1737
+ // syncReject(deferred, "oops!");
1738
+ // expect(logStr()).toBe("error(oops!)->reject(oops!)");
1739
+ // },
1740
+ // );
1741
+
1742
+ // it("should allow registration of an errback without a success callback and resolve", () => {
1743
+ // promise.then(null, error());
1744
+ // syncResolve(deferred, "done");
1745
+ // expect(logStr()).toBe("");
1746
+ // });
1747
+
1748
+ // it("should allow registration of an errback without a progress callback and notify", () => {
1749
+ // promise.then(null, error());
1750
+ // syncNotify(deferred, "doing");
1751
+ // expect(logStr()).toBe("");
1752
+ // });
1753
+
1754
+ // it(
1755
+ // "should allow registration of a progressBack without a success or error callback and " +
1756
+ // "notify",
1757
+ // () => {
1758
+ // promise.then(null, null, progress());
1759
+ // syncNotify(deferred, "doing");
1760
+ // expect(logStr()).toBe("progress(doing)->doing");
1761
+ // },
1762
+ // );
1763
+
1764
+ // it("should allow registration of a progressBack without a success callback and resolve", () => {
1765
+ // promise.then(null, null, progress());
1766
+ // syncResolve(deferred, "done");
1767
+ // expect(logStr()).toBe("");
1768
+ // });
1769
+
1770
+ // it("should allow registration of a progressBack without a error callback and reject", () => {
1771
+ // promise.then(null, null, progress());
1772
+ // syncReject(deferred, "oops!");
1773
+ // expect(logStr()).toBe("");
1774
+ // });
1775
+
1776
+ // it("should resolve all callbacks with the original value", () => {
1777
+ // promise.then(success("A", "aVal"), error(), progress());
1778
+ // promise.then(success("B", "bErr", true), error(), progress());
1779
+ // promise.then(success("C", q.reject("cReason")), error(), progress());
1780
+ // promise.then(
1781
+ // success("D", q.reject("dReason"), true),
1782
+ // error(),
1783
+ // progress(),
1784
+ // );
1785
+ // promise.then(success("E", "eVal"), error(), progress());
1786
+
1787
+ // expect(logStr()).toBe("");
1788
+ // syncResolve(deferred, "yup");
1789
+ // expect(log).toEqual([
1790
+ // "successA(yup)->aVal",
1791
+ // "successB(yup)->throw(bErr)",
1792
+ // "successC(yup)->{}",
1793
+ // "successD(yup)->throw({})",
1794
+ // "successE(yup)->eVal",
1795
+ // ]);
1796
+ // });
1797
+
1798
+ // it("should reject all callbacks with the original reason", () => {
1799
+ // promise.then(success(), error("A", "aVal"), progress());
1800
+ // promise.then(success(), error("B", "bEr", true), progress());
1801
+ // promise.then(success(), error("C", q.reject("cReason")), progress());
1802
+ // promise.then(success(), error("D", "dVal"), progress());
1803
+
1804
+ // expect(logStr()).toBe("");
1805
+ // syncReject(deferred, "noo!");
1806
+ // expect(logStr()).toBe(
1807
+ // "errorA(noo!)->aVal; errorB(noo!)->throw(bEr); errorC(noo!)->{}; errorD(noo!)->dVal",
1808
+ // );
1809
+ // });
1810
+
1811
+ // it("should notify all callbacks with the original value", () => {
1812
+ // promise.then(success(), error(), progress("A", "aVal"));
1813
+ // promise.then(success(), error(), progress("B", "bErr", true));
1814
+ // promise.then(success(), error(), progress("C", q.reject("cReason")));
1815
+ // promise.then(
1816
+ // success(),
1817
+ // error(),
1818
+ // progress("C_reject", q.reject("cRejectReason"), true),
1819
+ // );
1820
+ // promise.then(success(), error(), progress("Z", "the end!"));
1821
+
1822
+ // expect(logStr()).toBe("");
1823
+ // syncNotify(deferred, "yup");
1824
+ // expect(log).toEqual([
1825
+ // "progressA(yup)->aVal",
1826
+ // "progressB(yup)->throw(bErr)",
1827
+ // "progressC(yup)->{}",
1828
+ // "progressC_reject(yup)->throw({})",
1829
+ // "progressZ(yup)->the end!",
1830
+ // ]);
1831
+ // });
1832
+
1833
+ // it("should propagate resolution and rejection between dependent promises", () => {
1834
+ // promise
1835
+ // .then(success(1, "x"), error("1"))
1836
+ // .then(success(2, "y", true), error("2"))
1837
+ // .then(success(3), error(3, "z", true))
1838
+ // .then(success(4), error(4, "done"))
1839
+ // .then(success(5), error(5));
1840
+
1841
+ // expect(logStr()).toBe("");
1842
+ // syncResolve(deferred, "sweet!");
1843
+ // expect(log).toEqual([
1844
+ // "success1(sweet!)->x",
1845
+ // "success2(x)->throw(y)",
1846
+ // "error3(y)->throw(z)",
1847
+ // "error4(z)->done",
1848
+ // "success5(done)->done",
1849
+ // ]);
1850
+ // });
1851
+
1852
+ // it("should propagate notification between dependent promises", () => {
1853
+ // promise
1854
+ // .then(success(), error(), progress(1, "a"))
1855
+ // .then(success(), error(), progress(2, "b"))
1856
+ // .then(success(), error(), progress(3, "c"))
1857
+ // .then(success(), error(), progress(4))
1858
+ // .then(success(), error(), progress(5));
1859
+
1860
+ // expect(logStr()).toBe("");
1861
+ // syncNotify(deferred, "wait");
1862
+ // expect(log).toEqual([
1863
+ // "progress1(wait)->a",
1864
+ // "progress2(a)->b",
1865
+ // "progress3(b)->c",
1866
+ // "progress4(c)->c",
1867
+ // "progress5(c)->c",
1868
+ // ]);
1869
+ // });
1870
+
1871
+ // it("should reject a derived promise if an exception is thrown while resolving its parent", () => {
1872
+ // promise
1873
+ // .then(success(1, "oops", true), error(1))
1874
+ // .then(success(2), error(2));
1875
+ // syncResolve(deferred, "done!");
1876
+ // expect(logStr()).toBe(
1877
+ // "success1(done!)->throw(oops); error2(oops)->reject(oops)",
1878
+ // );
1879
+ // });
1880
+
1881
+ // it("should reject a derived promise if an exception is thrown while rejecting its parent", () => {
1882
+ // promise.then(null, error(1, "oops", true)).then(success(2), error(2));
1883
+ // syncReject(deferred, "timeout");
1884
+ // expect(logStr()).toBe(
1885
+ // "error1(timeout)->throw(oops); error2(oops)->reject(oops)",
1886
+ // );
1887
+ // });
1888
+
1889
+ // it("should stop notification propagation in case of error", () => {
1890
+ // promise
1891
+ // .then(success(), error(), progress(1))
1892
+ // .then(success(), error(), progress(2, "ops!", true))
1893
+ // .then(success(), error(), progress(3));
1894
+
1895
+ // expect(logStr()).toBe("");
1896
+ // syncNotify(deferred, "wait");
1897
+ // expect(log).toEqual([
1898
+ // "progress1(wait)->wait",
1899
+ // "progress2(wait)->throw(ops!)",
1900
+ // ]);
1901
+ // });
1902
+
1903
+ // it("should call success callback in the next turn even if promise is already resolved", () => {
1904
+ // deferred.resolve("done!");
1905
+
1906
+ // promise.then(success());
1907
+ // expect(logStr()).toBe("");
1908
+
1909
+ // mockNextTick.flush();
1910
+ // expect(log).toEqual(["success(done!)->done!"]);
1911
+ // });
1912
+
1913
+ // it("should call error callback in the next turn even if promise is already rejected", () => {
1914
+ // deferred.reject("oops!");
1915
+
1916
+ // promise.then(null, error());
1917
+ // expect(logStr()).toBe("");
1918
+
1919
+ // mockNextTick.flush();
1920
+ // expect(log).toEqual(["error(oops!)->reject(oops!)"]);
1921
+ // });
1922
+
1923
+ // it("should forward success resolution when success callbacks are not functions", () => {
1924
+ // deferred.resolve("yay!");
1925
+
1926
+ // promise
1927
+ // .then(1)
1928
+ // .then(null)
1929
+ // .then({})
1930
+ // .then("gah!")
1931
+ // .then([])
1932
+ // .then(success());
1933
+
1934
+ // expect(logStr()).toBe("");
1935
+
1936
+ // mockNextTick.flush();
1937
+ // expect(log).toEqual(["success(yay!)->yay!"]);
1938
+ // });
1939
+
1940
+ // it("should forward error resolution when error callbacks are not functions", () => {
1941
+ // deferred.reject("oops!");
1942
+
1943
+ // promise
1944
+ // .then(null, 1)
1945
+ // .then(null, null)
1946
+ // .then(null, {})
1947
+ // .then(null, "gah!")
1948
+ // .then(null, [])
1949
+ // .then(null, error());
1950
+
1951
+ // expect(logStr()).toBe("");
1952
+
1953
+ // mockNextTick.flush();
1954
+ // expect(log).toEqual(["error(oops!)->reject(oops!)"]);
1955
+ // });
1956
+ // });
1957
+
1958
+ // describe("finally", () => {
1959
+ // it("should not take an argument", () => {
1960
+ // promise.finally(fin(1));
1961
+ // syncResolve(deferred, "foo");
1962
+ // expect(logStr()).toBe("finally1()");
1963
+ // });
1964
+
1965
+ // describe("when the promise is fulfilled", () => {
1966
+ // it("should call the callback", () => {
1967
+ // promise.then(success(1)).finally(fin(1));
1968
+ // syncResolve(deferred, "foo");
1969
+ // expect(logStr()).toBe("success1(foo)->foo; finally1()");
1970
+ // });
1971
+
1972
+ // it("should fulfill with the original value", () => {
1973
+ // promise
1974
+ // .finally(fin("B", "b"), error("B"))
1975
+ // .then(success("BB", "bb"), error("BB"));
1976
+ // syncResolve(deferred, "RESOLVED_VAL");
1977
+ // expect(log).toEqual([
1978
+ // "finallyB()->b",
1979
+ // "successBB(RESOLVED_VAL)->bb",
1980
+ // ]);
1981
+ // });
1982
+
1983
+ // it("should fulfill with the original value (larger test)", () => {
1984
+ // promise.then(success("A", "a"), error("A"));
1985
+ // promise
1986
+ // .finally(fin("B", "b"), error("B"))
1987
+ // .then(success("BB", "bb"), error("BB"));
1988
+ // promise
1989
+ // .then(success("C", "c"), error("C"))
1990
+ // .finally(fin("CC", "IGNORED"))
1991
+ // .then(success("CCC", "cc"), error("CCC"))
1992
+ // .then(success("CCCC", "ccc"), error("CCCC"));
1993
+ // syncResolve(deferred, "RESOLVED_VAL");
1994
+
1995
+ // expect(log).toEqual([
1996
+ // "successA(RESOLVED_VAL)->a",
1997
+ // "finallyB()->b",
1998
+ // "successC(RESOLVED_VAL)->c",
1999
+ // "finallyCC()->IGNORED",
2000
+ // "successBB(RESOLVED_VAL)->bb",
2001
+ // "successCCC(c)->cc",
2002
+ // "successCCCC(cc)->ccc",
2003
+ // ]);
2004
+ // });
2005
+
2006
+ // describe("when the callback returns a promise", () => {
2007
+ // describe("that is fulfilled", () => {
2008
+ // it("should fulfill with the original reason after that promise resolves", () => {
2009
+ // const returnedDef = defer();
2010
+ // returnedDef.resolve("bar");
2011
+
2012
+ // promise.finally(fin(1, returnedDef.promise)).then(success(2));
2013
+
2014
+ // syncResolve(deferred, "foo");
2015
+
2016
+ // expect(logStr()).toBe("finally1()->{}; success2(foo)->foo");
2017
+ // });
2018
+ // });
2019
+
2020
+ // describe("that is rejected", () => {
2021
+ // it("should reject with this new rejection reason", () => {
2022
+ // const returnedDef = defer();
2023
+ // returnedDef.reject("bar");
2024
+ // promise
2025
+ // .finally(fin(1, returnedDef.promise))
2026
+ // .then(success(2), error(1));
2027
+ // syncResolve(deferred, "foo");
2028
+ // expect(logStr()).toBe(
2029
+ // "finally1()->{}; error1(bar)->reject(bar)",
2030
+ // );
2031
+ // });
2032
+ // });
2033
+ // });
2034
+
2035
+ // describe("when the callback throws an exception", () => {
2036
+ // it("should reject with this new exception", () => {
2037
+ // promise
2038
+ // .finally(fin(1, "exception", true))
2039
+ // .then(success(1), error(2));
2040
+ // syncResolve(deferred, "foo");
2041
+ // expect(logStr()).toBe(
2042
+ // "finally1()->throw(exception); error2(exception)->reject(exception)",
2043
+ // );
2044
+ // });
2045
+ // });
2046
+ // });
2047
+
2048
+ // describe("when the promise is rejected", () => {
2049
+ // it("should call the callback", () => {
2050
+ // promise.finally(fin(1)).then(success(2), error(1));
2051
+ // syncReject(deferred, "foo");
2052
+ // expect(logStr()).toBe("finally1(); error1(foo)->reject(foo)");
2053
+ // });
2054
+
2055
+ // it("should reject with the original reason", () => {
2056
+ // promise.finally(fin(1), "hello").then(success(2), error(2));
2057
+ // syncReject(deferred, "original");
2058
+ // expect(logStr()).toBe(
2059
+ // "finally1(); error2(original)->reject(original)",
2060
+ // );
2061
+ // });
2062
+
2063
+ // describe("when the callback returns a promise", () => {
2064
+ // describe("that is fulfilled", () => {
2065
+ // it("should reject with the original reason after that promise resolves", () => {
2066
+ // const returnedDef = defer();
2067
+ // returnedDef.resolve("bar");
2068
+ // promise
2069
+ // .finally(fin(1, returnedDef.promise))
2070
+ // .then(success(2), error(2));
2071
+ // syncReject(deferred, "original");
2072
+ // expect(logStr()).toBe(
2073
+ // "finally1()->{}; error2(original)->reject(original)",
2074
+ // );
2075
+ // });
2076
+ // });
2077
+
2078
+ // describe("that is rejected", () => {
2079
+ // it("should reject with the new reason", () => {
2080
+ // const returnedDef = defer();
2081
+ // returnedDef.reject("bar");
2082
+ // promise
2083
+ // .finally(fin(1, returnedDef.promise))
2084
+ // .then(success(2), error(1));
2085
+ // syncResolve(deferred, "foo");
2086
+ // expect(logStr()).toBe(
2087
+ // "finally1()->{}; error1(bar)->reject(bar)",
2088
+ // );
2089
+ // });
2090
+ // });
2091
+ // });
2092
+
2093
+ // describe("when the callback throws an exception", () => {
2094
+ // it("should reject with this new exception", () => {
2095
+ // promise
2096
+ // .finally(fin(1, "exception", true))
2097
+ // .then(success(1), error(2));
2098
+ // syncResolve(deferred, "foo");
2099
+ // expect(logStr()).toBe(
2100
+ // "finally1()->throw(exception); error2(exception)->reject(exception)",
2101
+ // );
2102
+ // });
2103
+ // });
2104
+ // });
2105
+ // });
2106
+
2107
+ // describe("catch", () => {
2108
+ // it("should be a shorthand for defining promise error handlers", () => {
2109
+ // promise.catch(error(1)).then(null, error(2));
2110
+ // syncReject(deferred, "foo");
2111
+ // expect(logStr()).toBe(
2112
+ // "error1(foo)->reject(foo); error2(foo)->reject(foo)",
2113
+ // );
2114
+ // });
2115
+ // });
2116
+ // });
2117
+ // });
2118
+
2119
+ // describe("reject", () => {
2120
+ // it("should package a string into a rejected promise", () => {
2121
+ // const rejectedPromise = q.reject("not gonna happen");
2122
+ // promise.then(success(), error());
2123
+ // syncResolve(deferred, rejectedPromise);
2124
+ // expect(log).toEqual([
2125
+ // "error(not gonna happen)->reject(not gonna happen)",
2126
+ // ]);
2127
+ // });
2128
+
2129
+ // it("should package an exception into a rejected promise", () => {
2130
+ // const rejectedPromise = q.reject(new Error("not gonna happen"));
2131
+ // promise.then(success(), error());
2132
+ // syncResolve(deferred, rejectedPromise);
2133
+ // expect(log).toEqual([
2134
+ // "error(Error: not gonna happen)->reject(Error: not gonna happen)",
2135
+ // ]);
2136
+ // });
2137
+
2138
+ // it("should return a promise that forwards callbacks if the callbacks are missing", () => {
2139
+ // const rejectedPromise = q.reject("rejected");
2140
+ // promise.then(success(), error());
2141
+ // syncResolve(deferred, rejectedPromise.then());
2142
+ // expect(log).toEqual(["error(rejected)->reject(rejected)"]);
2143
+ // });
2144
+
2145
+ // it("should catch exceptions thrown in errback and forward them to derived promises", () => {
2146
+ // const rejectedPromise = q.reject("rejected");
2147
+ // rejectedPromise
2148
+ // .then(null, error("Broken", "catch me!", true))
2149
+ // .then(null, error("Affected"));
2150
+ // mockNextTick.flush();
2151
+ // expect(log).toEqual([
2152
+ // "errorBroken(rejected)->throw(catch me!)",
2153
+ // "errorAffected(catch me!)->reject(catch me!)",
2154
+ // ]);
2155
+ // });
2156
+
2157
+ // it("should have functions `finally` and `catch`", () => {
2158
+ // const rejectedPromise = q.reject("rejected");
2159
+ // expect(rejectedPromise.finally).not.toBeUndefined();
2160
+ // expect(rejectedPromise.catch).not.toBeUndefined();
2161
+ // rejectedPromise.catch(() => {});
2162
+ // mockNextTick.flush();
2163
+ // });
2164
+ // });
2165
+
2166
+ // describe("when", () => {
2167
+ // describe("resolution", () => {
2168
+ // it("should call the success callback in the next turn when the value is a non-promise", () => {
2169
+ // q.when("hello", success(), error());
2170
+ // expect(logStr()).toBe("");
2171
+ // mockNextTick.flush();
2172
+ // expect(logStr()).toBe("success(hello)->hello");
2173
+ // });
2174
+
2175
+ // it("should call the success callback in the next turn when the value is a resolved promise", () => {
2176
+ // deferred.resolve("hello");
2177
+ // q.when(deferred.promise, success(), error());
2178
+ // expect(logStr()).toBe("");
2179
+ // mockNextTick.flush();
2180
+ // expect(logStr()).toBe("success(hello)->hello");
2181
+ // });
2182
+
2183
+ // it("should call the errback in the next turn when the value is a rejected promise", () => {
2184
+ // deferred.reject("nope");
2185
+ // q.when(deferred.promise, success(), error());
2186
+ // expect(logStr()).toBe("");
2187
+ // mockNextTick.flush();
2188
+ // expect(logStr()).toBe("error(nope)->reject(nope)");
2189
+ // });
2190
+
2191
+ // it("should call the success callback after the original promise is resolved", () => {
2192
+ // q.when(deferred.promise, success(), error());
2193
+ // expect(logStr()).toBe("");
2194
+ // expect(logStr()).toBe("");
2195
+ // syncResolve(deferred, "hello");
2196
+ // expect(logStr()).toBe("success(hello)->hello");
2197
+ // });
2198
+
2199
+ // it("should call the errback after the original promise is rejected", () => {
2200
+ // q.when(deferred.promise, success(), error());
2201
+ // expect(logStr()).toBe("");
2202
+ // expect(logStr()).toBe("");
2203
+ // syncReject(deferred, "nope");
2204
+ // expect(logStr()).toBe("error(nope)->reject(nope)");
2205
+ // });
2206
+ // });
2207
+
2208
+ // describe("notification", () => {
2209
+ // it("should call the progressBack when the value is a promise and gets notified", () => {
2210
+ // q.when(deferred.promise, success(), error(), progress());
2211
+ // expect(logStr()).toBe("");
2212
+ // syncNotify(deferred, "notification");
2213
+ // expect(logStr()).toBe("progress(notification)->notification");
2214
+ // });
2215
+ // });
2216
+
2217
+ // describe("resolve", () => {
2218
+ // it('should be an alias of the "when" function', () => {
2219
+ // expect(q.resolve).toBeDefined();
2220
+ // expect(q.resolve).toEqual(q.when);
2221
+ // });
2222
+ // });
2223
+
2224
+ // describe("optional callbacks", () => {
2225
+ // it("should not require success callback and propagate resolution", () => {
2226
+ // q.when("hi", null, error()).then(success(2), error());
2227
+ // expect(logStr()).toBe("");
2228
+ // mockNextTick.flush();
2229
+ // expect(logStr()).toBe("success2(hi)->hi");
2230
+ // });
2231
+
2232
+ // it("should not require success callback and propagate rejection", () => {
2233
+ // q.when(q.reject("sorry"), null, error(1)).then(success(), error(2));
2234
+ // expect(logStr()).toBe("");
2235
+ // mockNextTick.flush();
2236
+ // expect(logStr()).toBe(
2237
+ // "error1(sorry)->reject(sorry); error2(sorry)->reject(sorry)",
2238
+ // );
2239
+ // });
2240
+
2241
+ // it("should not require errback and propagate resolution", () => {
2242
+ // q.when("hi", success(1, "hello")).then(success(2), error());
2243
+ // expect(logStr()).toBe("");
2244
+ // mockNextTick.flush();
2245
+ // expect(logStr()).toBe("success1(hi)->hello; success2(hello)->hello");
2246
+ // });
2247
+
2248
+ // it("should not require errback and propagate rejection", () => {
2249
+ // q.when(q.reject("sorry"), success()).then(success(2), error(2));
2250
+ // expect(logStr()).toBe("");
2251
+ // mockNextTick.flush();
2252
+ // expect(logStr()).toBe("error2(sorry)->reject(sorry)");
2253
+ // });
2254
+
2255
+ // it("should not require progressBack and propagate notification", () => {
2256
+ // q.when(deferred.promise).then(success(), error(), progress());
2257
+ // expect(logStr()).toBe("");
2258
+ // syncNotify(deferred, "notification");
2259
+ // expect(logStr()).toBe("progress(notification)->notification");
2260
+ // });
2261
+ // });
2262
+
2263
+ // describe("returned promise", () => {
2264
+ // it(
2265
+ // "should return a promise that can be resolved with a value returned from the success " +
2266
+ // "callback",
2267
+ // () => {
2268
+ // q.when("hello", success(1, "hi"), error()).then(success(2), error());
2269
+ // mockNextTick.flush();
2270
+ // expect(logStr()).toBe("success1(hello)->hi; success2(hi)->hi");
2271
+ // },
2272
+ // );
2273
+
2274
+ // it(
2275
+ // "should return a promise that can be rejected with a rejected promise returned from the " +
2276
+ // "success callback",
2277
+ // () => {
2278
+ // q.when("hello", success(1, q.reject("sorry")), error()).then(
2279
+ // success(),
2280
+ // error(2),
2281
+ // );
2282
+ // mockNextTick.flush();
2283
+ // expect(logStr()).toBe(
2284
+ // "success1(hello)->{}; error2(sorry)->reject(sorry)",
2285
+ // );
2286
+ // },
2287
+ // );
2288
+
2289
+ // it("should return a promise that can be resolved with a value returned from the errback", () => {
2290
+ // q.when(q.reject("sorry"), success(), error(1, "hi")).then(
2291
+ // success(2),
2292
+ // error(),
2293
+ // );
2294
+ // mockNextTick.flush();
2295
+ // expect(logStr()).toBe("error1(sorry)->hi; success2(hi)->hi");
2296
+ // });
2297
+
2298
+ // it(
2299
+ // "should return a promise that can be rejected with a rejected promise returned from the " +
2300
+ // "errback",
2301
+ // () => {
2302
+ // q.when(q.reject("sorry"), success(), error(1, q.reject("sigh"))).then(
2303
+ // success(),
2304
+ // error(2),
2305
+ // );
2306
+ // mockNextTick.flush();
2307
+ // expect(logStr()).toBe(
2308
+ // "error1(sorry)->{}; error2(sigh)->reject(sigh)",
2309
+ // );
2310
+ // },
2311
+ // );
2312
+
2313
+ // it(
2314
+ // "should return a promise that can be resolved with a promise returned from the success " +
2315
+ // "callback",
2316
+ // () => {
2317
+ // const deferred2 = defer();
2318
+ // q.when("hi", success(1, deferred2.promise), error()).then(
2319
+ // success(2),
2320
+ // error(),
2321
+ // );
2322
+ // mockNextTick.flush();
2323
+ // expect(logStr()).toBe("success1(hi)->{}");
2324
+ // syncResolve(deferred2, "finally!");
2325
+ // expect(logStr()).toBe(
2326
+ // "success1(hi)->{}; success2(finally!)->finally!",
2327
+ // );
2328
+ // },
2329
+ // );
2330
+
2331
+ // it(
2332
+ // "should return a promise that can be resolved with promise returned from the errback " +
2333
+ // "callback",
2334
+ // () => {
2335
+ // const deferred2 = defer();
2336
+ // q.when(
2337
+ // q.reject("sorry"),
2338
+ // success(),
2339
+ // error(1, deferred2.promise),
2340
+ // ).then(success(2), error());
2341
+ // mockNextTick.flush();
2342
+ // expect(logStr()).toBe("error1(sorry)->{}");
2343
+ // syncResolve(deferred2, "finally!");
2344
+ // expect(logStr()).toBe(
2345
+ // "error1(sorry)->{}; success2(finally!)->finally!",
2346
+ // );
2347
+ // },
2348
+ // );
2349
+ // });
2350
+
2351
+ // describe("security", () => {
2352
+ // it(
2353
+ // "should call success callback only once even if the original promise gets fulfilled " +
2354
+ // "multiple times",
2355
+ // () => {
2356
+ // const evilPromise = {
2357
+ // then(success, error, progress) {
2358
+ // evilPromise.success = success;
2359
+ // evilPromise.error = error;
2360
+ // evilPromise.progress = progress;
2361
+ // },
2362
+ // };
2363
+
2364
+ // q.when(evilPromise, success(), error());
2365
+ // expect(logStr()).toBe("");
2366
+ // evilPromise.success("done");
2367
+ // mockNextTick.flush(); // TODO(i) wrong queue, evil promise would be resolved outside of the
2368
+ // // scope.$apply lifecycle and in that case we should have some kind
2369
+ // // of fallback queue for calling our callbacks from. Otherwise the
2370
+ // // application will get stuck until something triggers next $apply.
2371
+ // expect(logStr()).toBe("success(done)->done");
2372
+
2373
+ // evilPromise.success("evil is me");
2374
+ // evilPromise.error("burn burn");
2375
+ // expect(logStr()).toBe("success(done)->done");
2376
+ // },
2377
+ // );
2378
+
2379
+ // it(
2380
+ // "should call errback only once even if the original promise gets fulfilled multiple " +
2381
+ // "times",
2382
+ // () => {
2383
+ // const evilPromise = {
2384
+ // then(success, error, progress) {
2385
+ // evilPromise.success = success;
2386
+ // evilPromise.error = error;
2387
+ // evilPromise.progress = progress;
2388
+ // },
2389
+ // };
2390
+
2391
+ // q.when(evilPromise, success(), error());
2392
+ // expect(logStr()).toBe("");
2393
+ // evilPromise.error("failed");
2394
+ // mockNextTick.flush();
2395
+ // expect(logStr()).toBe("error(failed)->reject(failed)");
2396
+
2397
+ // evilPromise.error("muhaha");
2398
+ // evilPromise.success("take this");
2399
+ // expect(logStr()).toBe("error(failed)->reject(failed)");
2400
+ // },
2401
+ // );
2402
+
2403
+ // it(
2404
+ // "should not call progressBack after promise gets fulfilled, even if original promise " +
2405
+ // "gets notified multiple times",
2406
+ // () => {
2407
+ // const evilPromise = {
2408
+ // then(success, error, progress) {
2409
+ // evilPromise.success = success;
2410
+ // evilPromise.error = error;
2411
+ // evilPromise.progress = progress;
2412
+ // },
2413
+ // };
2414
+
2415
+ // q.when(evilPromise, success(), error(), progress());
2416
+ // expect(logStr()).toBe("");
2417
+ // evilPromise.progress("notification");
2418
+ // evilPromise.success("ok");
2419
+ // mockNextTick.flush();
2420
+ // expect(logStr()).toBe(
2421
+ // "progress(notification)->notification; success(ok)->ok",
2422
+ // );
2423
+
2424
+ // evilPromise.progress("muhaha");
2425
+ // expect(logStr()).toBe(
2426
+ // "progress(notification)->notification; success(ok)->ok",
2427
+ // );
2428
+ // },
2429
+ // );
2430
+ // });
2431
+ // });
2432
+
2433
+ // describe("all (array)", () => {
2434
+ // it("should resolve all or nothing", () => {
2435
+ // let result;
2436
+ // q.all([]).then((r) => {
2437
+ // result = r;
2438
+ // });
2439
+ // mockNextTick.flush();
2440
+ // expect(result).toEqual([]);
2441
+ // });
2442
+
2443
+ // it("should take an array of promises and return a promise for an array of results", () => {
2444
+ // const deferred1 = defer();
2445
+ // const deferred2 = defer();
2446
+
2447
+ // q.all([promise, deferred1.promise, deferred2.promise]).then(
2448
+ // success(),
2449
+ // error(),
2450
+ // );
2451
+ // expect(logStr()).toBe("");
2452
+ // syncResolve(deferred, "hi");
2453
+ // expect(logStr()).toBe("");
2454
+ // syncResolve(deferred2, "cau");
2455
+ // expect(logStr()).toBe("");
2456
+ // syncResolve(deferred1, "hola");
2457
+ // expect(logStr()).toBe(
2458
+ // 'success(["hi","hola","cau"])->["hi","hola","cau"]',
2459
+ // );
2460
+ // });
2461
+
2462
+ // it("should reject the derived promise if at least one of the promises in the array is rejected", () => {
2463
+ // const deferred1 = defer();
2464
+ // const deferred2 = defer();
2465
+
2466
+ // q.all([promise, deferred1.promise, deferred2.promise]).then(
2467
+ // success(),
2468
+ // error(),
2469
+ // );
2470
+ // expect(logStr()).toBe("");
2471
+ // syncResolve(deferred2, "cau");
2472
+ // expect(logStr()).toBe("");
2473
+ // syncReject(deferred1, "oops");
2474
+ // expect(logStr()).toBe("error(oops)->reject(oops)");
2475
+ // });
2476
+
2477
+ // it("should not forward notifications from individual promises to the combined promise", () => {
2478
+ // const deferred1 = defer();
2479
+ // const deferred2 = defer();
2480
+
2481
+ // q.all([promise, deferred1.promise, deferred2.promise]).then(
2482
+ // success(),
2483
+ // error(),
2484
+ // progress(),
2485
+ // );
2486
+ // expect(logStr()).toBe("");
2487
+ // deferred.notify("x");
2488
+ // deferred2.notify("y");
2489
+ // expect(logStr()).toBe("");
2490
+ // mockNextTick.flush();
2491
+ // expect(logStr()).toBe("");
2492
+ // });
2493
+
2494
+ // it("should ignore multiple resolutions of an (evil) array promise", () => {
2495
+ // const evilPromise = {
2496
+ // then(success, error) {
2497
+ // evilPromise.success = success;
2498
+ // evilPromise.error = error;
2499
+ // },
2500
+ // };
2501
+
2502
+ // q.all([promise, evilPromise]).then(success(), error());
2503
+ // expect(logStr()).toBe("");
2504
+
2505
+ // evilPromise.success("first");
2506
+ // evilPromise.success("muhaha");
2507
+ // evilPromise.error("arghhh");
2508
+ // expect(logStr()).toBe("");
2509
+
2510
+ // syncResolve(deferred, "done");
2511
+ // expect(logStr()).toBe('success(["done","first"])->["done","first"]');
2512
+ // });
2513
+ // });
2514
+
2515
+ // describe("all (hash)", () => {
2516
+ // it("should resolve all or nothing", () => {
2517
+ // let result;
2518
+ // q.all({}).then((r) => {
2519
+ // result = r;
2520
+ // });
2521
+ // mockNextTick.flush();
2522
+ // expect(result).toEqual({});
2523
+ // });
2524
+
2525
+ // it("should take a hash of promises and return a promise for a hash of results", () => {
2526
+ // const deferred1 = defer();
2527
+ // const deferred2 = defer();
2528
+
2529
+ // q.all({ en: promise, fr: deferred1.promise, es: deferred2.promise }).then(
2530
+ // success(),
2531
+ // error(),
2532
+ // );
2533
+ // expect(logStr()).toBe("");
2534
+ // syncResolve(deferred, "hi");
2535
+ // expect(logStr()).toBe("");
2536
+ // syncResolve(deferred2, "hola");
2537
+ // expect(logStr()).toBe("");
2538
+ // syncResolve(deferred1, "salut");
2539
+ // expect(logStr()).toBe(
2540
+ // 'success({"en":"hi","es":"hola","fr":"salut"})->{"en":"hi","es":"hola","fr":"salut"}',
2541
+ // );
2542
+ // });
2543
+
2544
+ // it("should reject the derived promise if at least one of the promises in the hash is rejected", () => {
2545
+ // const deferred1 = defer();
2546
+ // const deferred2 = defer();
2547
+
2548
+ // q.all({ en: promise, fr: deferred1.promise, es: deferred2.promise }).then(
2549
+ // success(),
2550
+ // error(),
2551
+ // );
2552
+ // expect(logStr()).toBe("");
2553
+ // syncResolve(deferred2, "hola");
2554
+ // expect(logStr()).toBe("");
2555
+ // syncReject(deferred1, "oops");
2556
+ // expect(logStr()).toBe("error(oops)->reject(oops)");
2557
+ // });
2558
+
2559
+ // it("should ignore multiple resolutions of an (evil) hash promise", () => {
2560
+ // const evilPromise = {
2561
+ // then(success, error) {
2562
+ // evilPromise.success = success;
2563
+ // evilPromise.error = error;
2564
+ // },
2565
+ // };
2566
+
2567
+ // q.all({ good: promise, evil: evilPromise }).then(success(), error());
2568
+ // expect(logStr()).toBe("");
2569
+
2570
+ // evilPromise.success("first");
2571
+ // evilPromise.success("muhaha");
2572
+ // evilPromise.error("arghhh");
2573
+ // expect(logStr()).toBe("");
2574
+
2575
+ // syncResolve(deferred, "done");
2576
+ // expect(logStr()).toBe(
2577
+ // 'success({"evil":"first","good":"done"})->{"evil":"first","good":"done"}',
2578
+ // );
2579
+ // });
2580
+
2581
+ // it("should handle correctly situation when given the same promise several times", () => {
2582
+ // q.all({ first: promise, second: promise, third: promise }).then(
2583
+ // success(),
2584
+ // error(),
2585
+ // );
2586
+ // expect(logStr()).toBe("");
2587
+
2588
+ // syncResolve(deferred, "done");
2589
+ // expect(logStr()).toBe(
2590
+ // 'success({"first":"done","second":"done","third":"done"})->{"first":"done","second":"done","third":"done"}',
2591
+ // );
2592
+ // });
2593
+ // });
2594
+
2595
+ // describe("race (array)", () => {
2596
+ // it("should do nothing if given an empty array", () => {
2597
+ // q.race([]).then(success(), error());
2598
+ // expect(mockNextTick.queue.length).toBe(0);
2599
+ // expect(logStr()).toBe("");
2600
+ // });
2601
+
2602
+ // it("should resolve as soon as the first promise is settled by resolution", () => {
2603
+ // const deferred1 = defer();
2604
+ // const deferred2 = defer();
2605
+
2606
+ // q.race([promise, deferred1.promise, deferred2.promise]).then(
2607
+ // success(),
2608
+ // error(),
2609
+ // );
2610
+ // expect(logStr()).toBe("");
2611
+ // syncResolve(deferred1, "hi");
2612
+ // expect(logStr()).toBe("success(hi)->hi");
2613
+ // syncResolve(deferred2, "cau");
2614
+ // expect(logStr()).toBe("success(hi)->hi");
2615
+ // syncReject(deferred, "hola");
2616
+ // expect(logStr()).toBe("success(hi)->hi");
2617
+ // });
2618
+
2619
+ // it("should reject as soon as the first promise is settled by rejection", () => {
2620
+ // const deferred1 = defer();
2621
+ // const deferred2 = defer();
2622
+
2623
+ // q.race([promise, deferred1.promise, deferred2.promise]).then(
2624
+ // success(),
2625
+ // error(),
2626
+ // );
2627
+ // expect(logStr()).toBe("");
2628
+ // syncReject(deferred1, "hi");
2629
+ // expect(logStr()).toBe("error(hi)->reject(hi)");
2630
+ // syncResolve(deferred2, "cau");
2631
+ // expect(logStr()).toBe("error(hi)->reject(hi)");
2632
+ // syncReject(deferred, "hola");
2633
+ // expect(logStr()).toBe("error(hi)->reject(hi)");
2634
+ // });
2635
+ // });
2636
+
2637
+ // describe("race (hash)", () => {
2638
+ // it("should do nothing if given an empty object", () => {
2639
+ // q.race({}).then(success(), error());
2640
+ // expect(mockNextTick.queue.length).toBe(0);
2641
+ // expect(logStr()).toBe("");
2642
+ // });
2643
+
2644
+ // it("should resolve as soon as the first promise is settled by resolution", () => {
2645
+ // const deferred1 = defer();
2646
+ // const deferred2 = defer();
2647
+
2648
+ // q.race({ a: promise, b: deferred1.promise, c: deferred2.promise }).then(
2649
+ // success(),
2650
+ // error(),
2651
+ // );
2652
+ // expect(logStr()).toBe("");
2653
+ // syncResolve(deferred1, "hi");
2654
+ // expect(logStr()).toBe("success(hi)->hi");
2655
+ // syncResolve(deferred2, "cau");
2656
+ // expect(logStr()).toBe("success(hi)->hi");
2657
+ // syncReject(deferred, "hola");
2658
+ // expect(logStr()).toBe("success(hi)->hi");
2659
+ // });
2660
+
2661
+ // it("should reject as soon as the first promise is settled by rejection", () => {
2662
+ // const deferred1 = defer();
2663
+ // const deferred2 = defer();
2664
+
2665
+ // q.race({ a: promise, b: deferred1.promise, c: deferred2.promise }).then(
2666
+ // success(),
2667
+ // error(),
2668
+ // );
2669
+ // expect(logStr()).toBe("");
2670
+ // syncReject(deferred1, "hi");
2671
+ // expect(logStr()).toBe("error(hi)->reject(hi)");
2672
+ // syncResolve(deferred2, "cau");
2673
+ // expect(logStr()).toBe("error(hi)->reject(hi)");
2674
+ // syncReject(deferred, "hola");
2675
+ // expect(logStr()).toBe("error(hi)->reject(hi)");
2676
+ // });
2677
+ // });
2678
+
2679
+ // describe("exception logging", () => {
2680
+ // const mockExceptionLogger = {
2681
+ // log: [],
2682
+ // logger(e) {
2683
+ // mockExceptionLogger.log.push(e);
2684
+ // },
2685
+ // };
2686
+
2687
+ // beforeEach(() => {
2688
+ // q = qFactory(mockNextTick.nextTick, mockExceptionLogger.logger);
2689
+ // defer = q.defer;
2690
+ // deferred = defer();
2691
+ // promise = deferred.promise;
2692
+ // log = [];
2693
+ // mockExceptionLogger.log = [];
2694
+ // });
2695
+
2696
+ // describe("in then", () => {
2697
+ // it("should NOT log exceptions thrown in a success callback but reject the derived promise", () => {
2698
+ // const success1 = success(1, "oops", true);
2699
+ // promise
2700
+ // .then(success1)
2701
+ // .then(success(2), error(2))
2702
+ // .catch(() => {});
2703
+ // syncResolve(deferred, "done");
2704
+ // expect(logStr()).toBe(
2705
+ // "success1(done)->throw(oops); error2(oops)->reject(oops)",
2706
+ // );
2707
+ // expect(mockExceptionLogger.log).toEqual([]);
2708
+ // });
2709
+
2710
+ // it("should NOT log exceptions when a success callback returns rejected promise", () => {
2711
+ // promise
2712
+ // .then(success(1, q.reject("rejected")))
2713
+ // .then(success(2), error(2))
2714
+ // .catch(() => {});
2715
+ // syncResolve(deferred, "done");
2716
+ // expect(logStr()).toBe(
2717
+ // "success1(done)->{}; error2(rejected)->reject(rejected)",
2718
+ // );
2719
+ // expect(mockExceptionLogger.log).toEqual([]);
2720
+ // });
2721
+
2722
+ // it("should NOT log exceptions thrown in an errback but reject the derived promise", () => {
2723
+ // const error1 = error(1, "oops", true);
2724
+ // promise
2725
+ // .then(null, error1)
2726
+ // .then(success(2), error(2))
2727
+ // .catch(() => {});
2728
+ // syncReject(deferred, "nope");
2729
+ // expect(logStr()).toBe(
2730
+ // "error1(nope)->throw(oops); error2(oops)->reject(oops)",
2731
+ // );
2732
+ // expect(mockExceptionLogger.log).toEqual([]);
2733
+ // });
2734
+
2735
+ // it("should NOT log exceptions when an errback returns a rejected promise", () => {
2736
+ // promise
2737
+ // .then(null, error(1, q.reject("rejected")))
2738
+ // .then(success(2), error(2))
2739
+ // .catch(() => {});
2740
+ // syncReject(deferred, "nope");
2741
+ // expect(logStr()).toBe(
2742
+ // "error1(nope)->{}; error2(rejected)->reject(rejected)",
2743
+ // );
2744
+ // expect(mockExceptionLogger.log).toEqual([]);
2745
+ // });
2746
+
2747
+ // it(
2748
+ // "should log exceptions thrown in a progressBack and stop propagation, but should NOT reject " +
2749
+ // "the promise",
2750
+ // () => {
2751
+ // promise
2752
+ // .then(success(), error(), progress(1, "failed", true))
2753
+ // .then(null, error(1), progress(2))
2754
+ // .catch(() => {});
2755
+ // syncNotify(deferred, "10%");
2756
+ // expect(logStr()).toBe("progress1(10%)->throw(failed)");
2757
+ // expect(mockExceptionLogger.log).toEqual(["failed"]);
2758
+ // log = [];
2759
+ // syncResolve(deferred, "ok");
2760
+ // expect(logStr()).toBe("success(ok)->ok");
2761
+ // },
2762
+ // );
2763
+ // });
2764
+
2765
+ // describe("in when", () => {
2766
+ // it("should NOT log exceptions thrown in a success callback but reject the derived promise", () => {
2767
+ // const success1 = success(1, "oops", true);
2768
+ // q.when("hi", success1, error())
2769
+ // .then(success(), error(2))
2770
+ // .catch(() => {});
2771
+ // mockNextTick.flush();
2772
+ // expect(logStr()).toBe(
2773
+ // "success1(hi)->throw(oops); error2(oops)->reject(oops)",
2774
+ // );
2775
+ // expect(mockExceptionLogger.log).toEqual([]);
2776
+ // });
2777
+
2778
+ // it("should NOT log exceptions when a success callback returns rejected promise", () => {
2779
+ // q.when("hi", success(1, q.reject("rejected")))
2780
+ // .then(success(2), error(2))
2781
+ // .catch(() => {});
2782
+ // mockNextTick.flush();
2783
+ // expect(logStr()).toBe(
2784
+ // "success1(hi)->{}; error2(rejected)->reject(rejected)",
2785
+ // );
2786
+ // expect(mockExceptionLogger.log).toEqual([]);
2787
+ // });
2788
+
2789
+ // it("should NOT log exceptions thrown in a errback but reject the derived promise", () => {
2790
+ // const error1 = error(1, "oops", true);
2791
+ // q.when(q.reject("sorry"), success(), error1)
2792
+ // .then(success(), error(2))
2793
+ // .catch(() => {});
2794
+ // mockNextTick.flush();
2795
+ // expect(logStr()).toBe(
2796
+ // "error1(sorry)->throw(oops); error2(oops)->reject(oops)",
2797
+ // );
2798
+ // expect(mockExceptionLogger.log).toEqual([]);
2799
+ // });
2800
+
2801
+ // it("should NOT log exceptions when an errback returns a rejected promise", () => {
2802
+ // q.when(q.reject("sorry"), success(), error(1, q.reject("rejected")))
2803
+ // .then(success(2), error(2))
2804
+ // .catch(() => {});
2805
+ // mockNextTick.flush();
2806
+ // expect(logStr()).toBe(
2807
+ // "error1(sorry)->{}; error2(rejected)->reject(rejected)",
2808
+ // );
2809
+ // expect(mockExceptionLogger.log).toEqual([]);
2810
+ // });
2811
+ // });
2812
+ // });
2813
+
2814
+ // describe("when exceptionHandler is called", () => {
2815
+ // function CustomError() {}
2816
+ // CustomError.prototype = Object.create(Error.prototype);
2817
+
2818
+ // const errorEg = new Error("Fail");
2819
+ // const errorStr = toDebugString(errorEg);
2820
+
2821
+ // const customError = new CustomError("Custom");
2822
+ // const customErrorStr = toDebugString(customError);
2823
+
2824
+ // const nonErrorObj = { isATest: "this is" };
2825
+ // const nonErrorObjStr = toDebugString(nonErrorObj);
2826
+
2827
+ // const fixtures = [
2828
+ // {
2829
+ // type: "Error object",
2830
+ // value: errorEg,
2831
+ // expected: {
2832
+ // exception: errorEg,
2833
+ // reason: `Possibly unhandled rejection: ${errorStr}`,
2834
+ // },
2835
+ // },
2836
+ // {
2837
+ // type: "custom Error object",
2838
+ // value: customError,
2839
+ // expected: {
2840
+ // exception: customError,
2841
+ // reason: `Possibly unhandled rejection: ${customErrorStr}`,
2842
+ // },
2843
+ // },
2844
+ // {
2845
+ // type: "non-Error object",
2846
+ // value: nonErrorObj,
2847
+ // expected: {
2848
+ // reason: `Possibly unhandled rejection: ${nonErrorObjStr}`,
2849
+ // },
2850
+ // },
2851
+ // {
2852
+ // type: "string primitive",
2853
+ // value: "foo",
2854
+ // expected: {
2855
+ // reason: "Possibly unhandled rejection: foo",
2856
+ // },
2857
+ // },
2858
+ // ];
2859
+ // forEach(fixtures, (fixture) => {
2860
+ // const { type } = fixture;
2861
+ // const { value } = fixture;
2862
+ // const { expected } = fixture;
2863
+
2864
+ // describe(`with ${type}`, () => {
2865
+ // it("should log an unhandled rejected promise", () => {
2866
+ // const defer = q.defer();
2867
+ // defer.reject(value);
2868
+ // mockNextTick.flush();
2869
+ // expect(exceptionHandlerCalls).toEqual([expected]);
2870
+ // });
2871
+
2872
+ // it("should not log an unhandled rejected promise if disabled", () => {
2873
+ // const defer = q_no_error.defer();
2874
+ // defer.reject(value);
2875
+ // expect(exceptionHandlerCalls).toEqual([]);
2876
+ // });
2877
+
2878
+ // it("should log a handled rejected promise on a promise without rejection callbacks", () => {
2879
+ // const defer = q.defer();
2880
+ // defer.promise.then(() => {});
2881
+ // defer.reject(value);
2882
+ // mockNextTick.flush();
2883
+ // expect(exceptionHandlerCalls).toEqual([expected]);
2884
+ // });
2885
+
2886
+ // it("should not log a handled rejected promise", () => {
2887
+ // const defer = q.defer();
2888
+ // defer.promise.catch(() => {});
2889
+ // defer.reject(value);
2890
+ // mockNextTick.flush();
2891
+ // expect(exceptionHandlerCalls).toEqual([]);
2892
+ // });
2893
+
2894
+ // it("should not log a handled rejected promise that is handled in a future tick", () => {
2895
+ // const defer = q.defer();
2896
+ // defer.promise.catch(() => {});
2897
+ // defer.resolve(q.reject(value));
2898
+ // mockNextTick.flush();
2899
+ // expect(exceptionHandlerCalls).toEqual([]);
2900
+ // });
2901
+ // });
2902
+ // });
2903
+ // });
2904
+ });