selenium-webdriver 3.6.0 → 4.0.0-alpha.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 (97) hide show
  1. package/CHANGES.md +181 -0
  2. package/README.md +25 -27
  3. package/chrome.js +113 -127
  4. package/edge.js +42 -117
  5. package/example/chrome_android.js +8 -8
  6. package/example/chrome_mobile_emulation.js +8 -8
  7. package/example/firefox_channels.js +22 -18
  8. package/example/google_search_test.js +39 -26
  9. package/example/logging.js +39 -6
  10. package/firefox.js +769 -0
  11. package/http/index.js +41 -4
  12. package/http/util.js +11 -6
  13. package/ie.js +56 -97
  14. package/index.js +178 -114
  15. package/jasmine.json +11 -0
  16. package/lib/actions.js +68 -63
  17. package/lib/by.js +1 -1
  18. package/lib/capabilities.js +255 -192
  19. package/lib/command.js +26 -50
  20. package/lib/error.js +85 -44
  21. package/lib/http.js +133 -110
  22. package/lib/input.js +1044 -8
  23. package/lib/promise.js +222 -3323
  24. package/lib/proxy.js +134 -39
  25. package/lib/test/bootstrap_jasmine.js +28 -0
  26. package/lib/test/data/actions/click.html +24 -0
  27. package/lib/test/data/actions/drag.html +77 -0
  28. package/lib/test/data/actions/record_click.html +21 -0
  29. package/lib/test/data/chrome/download.html +2 -0
  30. package/lib/test/data/inputs.html +42 -0
  31. package/lib/test/data/selectPage.html +12 -0
  32. package/lib/test/data/simpleTest.html +5 -0
  33. package/lib/test/data/upload_invisible.html +45 -0
  34. package/lib/test/fileserver.js +23 -19
  35. package/lib/test/index.js +30 -212
  36. package/lib/test/resources.js +0 -1
  37. package/lib/webdriver.js +675 -936
  38. package/net/index.js +21 -25
  39. package/net/portprober.js +51 -68
  40. package/package.json +5 -3
  41. package/remote/index.js +5 -19
  42. package/safari.js +41 -128
  43. package/test/actions_test.js +173 -18
  44. package/test/{session_test.js → builder_test.js} +44 -37
  45. package/test/chrome/devtools_test.js +93 -0
  46. package/test/chrome/options_test.js +48 -154
  47. package/test/chrome/service_test.js +7 -7
  48. package/test/cookie_test.js +77 -63
  49. package/test/element_finding_test.js +206 -201
  50. package/test/execute_script_test.js +115 -114
  51. package/test/fingerprint_test.js +16 -15
  52. package/test/firefox_test.js +251 -0
  53. package/test/http/http_test.js +0 -1
  54. package/test/http/util_test.js +2 -2
  55. package/test/io/zip_test.js +6 -7
  56. package/test/lib/error_test.js +34 -7
  57. package/test/lib/http_test.js +8 -128
  58. package/test/lib/input_test.js +1379 -0
  59. package/test/lib/promise_test.js +473 -908
  60. package/test/lib/webdriver_test.js +296 -868
  61. package/test/logging_test.js +37 -43
  62. package/test/page_loading_test.js +71 -81
  63. package/test/proxy_test.js +64 -72
  64. package/test/rect_test.js +14 -25
  65. package/test/remote_test.js +10 -29
  66. package/test/safari_test.js +7 -71
  67. package/test/stale_element_test.js +20 -23
  68. package/test/tag_name_test.js +10 -9
  69. package/test/upload_test.js +27 -35
  70. package/test/window_test.js +72 -85
  71. package/testing/index.js +386 -314
  72. package/.npmignore +0 -2
  73. package/example/async_await_test.js +0 -69
  74. package/example/google_search_generator.js +0 -47
  75. package/example/parallel_flows.js +0 -51
  76. package/firefox/binary.js +0 -347
  77. package/firefox/extension.js +0 -224
  78. package/firefox/index.js +0 -576
  79. package/firefox/profile.js +0 -311
  80. package/lib/events.js +0 -210
  81. package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
  82. package/lib/test/data/firefox/sample.xpi +0 -0
  83. package/lib/test/promise.js +0 -79
  84. package/opera.js +0 -405
  85. package/phantomjs.js +0 -282
  86. package/test/firefox/extension_test.js +0 -120
  87. package/test/firefox/firefox_test.js +0 -244
  88. package/test/firefox/profile_test.js +0 -140
  89. package/test/lib/events_test.js +0 -177
  90. package/test/lib/promise_aplus_test.js +0 -78
  91. package/test/lib/promise_error_test.js +0 -884
  92. package/test/lib/promise_flow_test.js +0 -2288
  93. package/test/lib/promise_generator_test.js +0 -310
  94. package/test/phantomjs/execute_phantomjs_test.js +0 -59
  95. package/test/testing/assert_test.js +0 -373
  96. package/test/testing/index_test.js +0 -224
  97. package/testing/assert.js +0 -378
@@ -21,7 +21,6 @@ const assert = require('assert');
21
21
 
22
22
  const testutil = require('./testutil');
23
23
  const promise = require('../../lib/promise');
24
- const {enablePromiseManager, promiseManagerSuite} = require('../../lib/test/promise');
25
24
 
26
25
  // Aliases for readability.
27
26
  const NativePromise = Promise;
@@ -75,1035 +74,601 @@ describe('promise', function() {
75
74
  return p;
76
75
  }
77
76
 
78
- enablePromiseManager(() => {
79
- it('testCanDetectPromiseLikeObjects', function() {
80
- assertIsPromise(new promise.Promise(function(fulfill) {
81
- fulfill();
82
- }));
83
- assertIsPromise(new promise.Deferred().promise);
84
- assertIsPromise(Promise.resolve(123));
85
- assertIsPromise({then:function() {}});
86
-
87
- assertNotPromise(new promise.Deferred());
88
- assertNotPromise(undefined);
89
- assertNotPromise(null);
90
- assertNotPromise('');
91
- assertNotPromise(true);
92
- assertNotPromise(false);
93
- assertNotPromise(1);
94
- assertNotPromise({});
95
- assertNotPromise({then:1});
96
- assertNotPromise({then:true});
97
- assertNotPromise({then:''});
77
+ describe('fullyResolved', function() {
78
+ it('primitives', function() {
79
+ function runTest(value) {
80
+ var callback, errback;
81
+ return promise.fullyResolved(value)
82
+ .then((resolved) => assert.equal(value, resolved));
83
+ }
84
+ return runTest(true)
85
+ .then(() => runTest(function() {}))
86
+ .then(() => runTest(null))
87
+ .then(() => runTest(123))
88
+ .then(() => runTest('foo bar'))
89
+ .then(() => runTest(undefined));
98
90
  });
99
91
 
100
- describe('then', function() {
101
- it('returnsOwnPromiseIfNoCallbacksWereGiven', function() {
102
- var deferred = new promise.Deferred();
103
- assert.equal(deferred.promise, deferred.promise.then());
104
- assert.equal(deferred.promise, deferred.promise.catch());
105
- assert.equal(deferred.promise, promise.when(deferred.promise));
106
- });
107
-
108
- it('stillConsideredUnHandledIfNoCallbacksWereGivenOnCallsToThen', function() {
109
- promise.rejected(new StubError).then();
110
- var handler = callbackHelper(assertIsStubError);
111
-
112
- // so tearDown() doesn't throw
113
- app.removeAllListeners();
114
- app.on(promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION, handler);
115
- return NativePromise.resolve()
116
- // Macro yield so the uncaught exception has a chance to trigger.
117
- .then(() => new NativePromise(resolve => setTimeout(resolve, 0)))
118
- .then(() => handler.assertCalled());
92
+ it('arrayOfPrimitives', function() {
93
+ var fn = function() {};
94
+ var array = [true, fn, null, 123, '', undefined, 1];
95
+ return promise.fullyResolved(array).then(function(resolved) {
96
+ assert.equal(array, resolved);
97
+ assert.deepEqual([true, fn, null, 123, '', undefined, 1],
98
+ resolved);
119
99
  });
120
100
  });
121
101
 
122
- describe('finally', function() {
123
- it('nonFailingCallbackDoesNotSuppressOriginalError', function() {
124
- var done = callbackHelper(assertIsStubError);
125
- return promise.rejected(new StubError).
126
- finally(function() {}).
127
- catch(done).
128
- finally(done.assertCalled);
129
- });
130
-
131
- it('failingCallbackSuppressesOriginalError', function() {
132
- var done = callbackHelper(assertIsStubError);
133
- return promise.rejected(new Error('original')).
134
- finally(throwStubError).
135
- catch(done).
136
- finally(done.assertCalled);
137
- });
138
-
139
- it('callbackThrowsAfterFulfilledPromise', function() {
140
- var done = callbackHelper(assertIsStubError);
141
- return promise.fulfilled().
142
- finally(throwStubError).
143
- catch(done).
144
- finally(done.assertCalled);
145
- });
146
-
147
- it('callbackReturnsRejectedPromise', function() {
148
- var done = callbackHelper(assertIsStubError);
149
- return promise.fulfilled().
150
- finally(function() {
151
- return promise.rejected(new StubError);
152
- }).
153
- catch(done).
154
- finally(done.assertCalled);
155
- });
102
+ it('nestedArrayOfPrimitives', function() {
103
+ var fn = function() {};
104
+ var array = [true, [fn, null, 123], '', undefined];
105
+ return promise.fullyResolved(array)
106
+ .then(function(resolved) {
107
+ assert.equal(array, resolved);
108
+ assert.deepEqual([true, [fn, null, 123], '', undefined], resolved);
109
+ assert.deepEqual([fn, null, 123], resolved[1]);
110
+ });
156
111
  });
157
112
 
158
- describe('cancel', function() {
159
- it('passesTheCancellationReasonToReject', function() {
160
- var d = new promise.Deferred();
161
- var res = d.promise.then(assert.fail, function(e) {
162
- assert.ok(e instanceof promise.CancellationError);
163
- assert.equal('because i said so', e.message);
164
- });
165
- d.promise.cancel('because i said so');
166
- return res;
167
- });
168
-
169
- describe('can cancel original promise from its child;', function() {
170
- it('child created by then()', function() {
171
- var d = new promise.Deferred();
172
- var p = d.promise.then(assert.fail, function(e) {
173
- assert.ok(e instanceof promise.CancellationError);
174
- assert.equal('because i said so', e.message);
175
- return 123;
113
+ it('arrayWithPromisedPrimitive', function() {
114
+ return promise.fullyResolved([Promise.resolve(123)])
115
+ .then(function(resolved) {
116
+ assert.deepEqual([123], resolved);
176
117
  });
118
+ });
177
119
 
178
- p.cancel('because i said so');
179
- return p.then(v => assert.equal(123, v));
180
- });
181
-
182
- it('child linked by resolving with parent', function() {
183
- let parent = promise.defer();
184
- let child = new promise.Promise(resolve => resolve(parent.promise));
185
- child.cancel('all done');
186
-
187
- return parent.promise.then(
188
- () => assert.fail('expected a cancellation'),
189
- e => {
190
- assert.ok(e instanceof promise.CancellationError);
191
- assert.equal('all done', e.message);
192
- });
193
- });
194
-
195
- it('grand child through thenable chain', function() {
196
- let p = new promise.Promise(function() {/* never resolve*/});
197
-
198
- let noop = function() {};
199
- let gc = p.then(noop).then(noop).then(noop);
200
- gc.cancel('stop!');
201
-
202
- return p.then(
203
- () => assert.fail('expected to be cancelled'),
204
- (e) => {
205
- assert.ok(e instanceof promise.CancellationError);
206
- assert.equal('stop!', e.message);
207
- });
208
- });
209
-
210
- it('grand child through thenable chain started at resolve', function() {
211
- function noop() {}
212
-
213
- let parent = promise.defer();
214
- let child = new promise.Promise(resolve => resolve(parent.promise));
215
- let grandChild = child.then(noop).then(noop).then(noop);
216
- grandChild.cancel('all done');
217
-
218
- return parent.promise.then(
219
- () => assert.fail('expected a cancellation'),
220
- e => {
221
- assert.ok(e instanceof promise.CancellationError);
222
- assert.equal('all done', e.message);
223
- });
224
- });
225
-
226
- it('"parent" is a CancellableThenable', function() {
227
- function noop() {}
228
-
229
- class FakeThenable {
230
- constructor(p) {
231
- this.promise = p;
232
- }
233
-
234
- cancel(reason) {
235
- this.promise.cancel(reason);
236
- }
237
-
238
- then(cb, eb) {
239
- let result = this.promise.then(cb, eb);
240
- return new FakeThenable(result);
241
- }
242
- }
243
- promise.CancellableThenable.addImplementation(FakeThenable);
244
-
245
- let root = new promise.Promise(noop);
246
- let thenable = new FakeThenable(root);
247
- assert.ok(promise.Thenable.isImplementation(thenable));
248
- assert.ok(promise.CancellableThenable.isImplementation(thenable));
249
-
250
- let child = new promise.Promise(resolve => resolve(thenable));
251
- assert.ok(child instanceof promise.Promise);
252
- child.cancel('stop!');
253
-
254
- function assertStopped(p) {
255
- return p.then(
256
- () => assert.fail('not stopped!'),
257
- (e) => {
258
- assert.ok(e instanceof promise.CancellationError);
259
- assert.equal('stop!', e.message);
260
- });
261
- }
262
-
263
- return assertStopped(child).then(() => assertStopped(root));
264
- });
265
- });
266
-
267
- it('canCancelATimeout', function() {
268
- var p = promise.delayed(25)
269
- .then(assert.fail, (e) => e instanceof promise.CancellationError);
270
- setTimeout(() => p.cancel(), 20);
271
- p.cancel();
272
- return p;
273
- });
120
+ it('promiseResolvesToPrimitive', function() {
121
+ return promise.fullyResolved(Promise.resolve(123))
122
+ .then((resolved) => assert.equal(123, resolved));
123
+ });
274
124
 
275
- it('can cancel timeout from grandchild', function() {
276
- });
125
+ it('promiseResolvesToArray', function() {
126
+ var fn = function() {};
127
+ var array = [true, [fn, null, 123], '', undefined];
128
+ var aPromise = Promise.resolve(array);
277
129
 
278
- it('cancelIsANoopOnceAPromiseHasBeenFulfilled', function() {
279
- var p = promise.fulfilled(123);
280
- p.cancel();
281
- return p.then((v) => assert.equal(123, v));
130
+ var result = promise.fullyResolved(aPromise);
131
+ return result.then(function(resolved) {
132
+ assert.equal(array, resolved);
133
+ assert.deepEqual([true, [fn, null, 123], '', undefined],
134
+ resolved);
135
+ assert.deepEqual([fn, null, 123], resolved[1]);
282
136
  });
137
+ });
283
138
 
284
- it('cancelIsANoopOnceAPromiseHasBeenRejected', function() {
285
- var p = promise.rejected(new StubError);
286
- p.cancel();
287
-
288
- var pair = callbackPair(null, assertIsStubError);
289
- return p.then(assert.fail, assertIsStubError);
290
- });
139
+ it('promiseResolvesToArrayWithPromises', function() {
140
+ var nestedPromise = Promise.resolve(123);
141
+ var aPromise = Promise.resolve([true, nestedPromise]);
142
+ return promise.fullyResolved(aPromise)
143
+ .then(function(resolved) {
144
+ assert.deepEqual([true, 123], resolved);
145
+ });
146
+ });
291
147
 
292
- it('noopCancelTriggeredOnCallbackOfResolvedPromise', function() {
293
- var d = promise.defer();
294
- var p = d.promise.then();
148
+ it('rejectsIfArrayPromiseRejects', function() {
149
+ var nestedPromise = createRejectedPromise(new StubError);
150
+ var aPromise = Promise.resolve([true, nestedPromise]);
295
151
 
296
- d.fulfill();
297
- p.cancel(); // This should not throw.
298
- return p; // This should not trigger a failure.
299
- });
152
+ var pair = callbackPair(null, assertIsStubError);
153
+ return promise.fullyResolved(aPromise)
154
+ .then(assert.fail, assertIsStubError);
300
155
  });
301
- });
302
156
 
303
- promiseManagerSuite(() => {
304
- describe('fulfilled', function() {
305
- it('returns input value if it is already a valid promise', function() {
306
- let p = promise.createPromise(function() {});
307
- let r = promise.fulfilled(p);
308
- assert.strictEqual(p, r);
309
- });
157
+ it('rejectsOnFirstArrayRejection', function() {
158
+ var e1 = new Error('foo');
159
+ var e2 = new Error('bar');
160
+ var aPromise = Promise.resolve([
161
+ createRejectedPromise(e1),
162
+ createRejectedPromise(e2)
163
+ ]);
164
+
165
+ return promise.fullyResolved(aPromise)
166
+ .then(assert.fail, function(error) {
167
+ assert.strictEqual(e1, error);
168
+ });
169
+ });
310
170
 
311
- it('creates a new promise fulfilled with input', function() {
312
- return promise.fulfilled(1234).then(v => assert.equal(1234, v));
313
- });
171
+ it('rejectsIfNestedArrayPromiseRejects', function() {
172
+ var aPromise = Promise.resolve([
173
+ Promise.resolve([
174
+ createRejectedPromise(new StubError)
175
+ ])
176
+ ]);
314
177
 
315
- it('can convert thenables to valid promise', function() {
316
- let thenable = {then: function(cb) {cb(1234)}};
317
- let p = promise.fulfilled(thenable);
318
- assert.notStrictEqual(thenable, p);
319
- return p.then(v => assert.equal(1234, v));
320
- });
178
+ return promise.fullyResolved(aPromise)
179
+ .then(assert.fail, assertIsStubError);
321
180
  });
322
181
 
323
- describe('when', function() {
324
- it('ReturnsAResolvedPromiseIfGivenANonPromiseValue', function() {
325
- var ret = promise.when('abc');
326
- assertIsPromise(ret);
327
- return ret.then((value) => assert.equal('abc', value));
328
- });
182
+ it('simpleHash', function() {
183
+ var hash = {'a': 123};
184
+ return promise.fullyResolved(hash)
185
+ .then(function(resolved) {
186
+ assert.strictEqual(hash, resolved);
187
+ assert.deepEqual(hash, {'a': 123});
188
+ });
189
+ });
329
190
 
330
- it('PassesRawErrorsToCallbacks', function() {
331
- var error = new Error('boo!');
332
- return promise.when(error, function(value) {
333
- assert.equal(error, value);
334
- });
335
- });
191
+ it('nestedHash', function() {
192
+ var nestedHash = {'foo':'bar'};
193
+ var hash = {'a': 123, 'b': nestedHash};
336
194
 
337
- it('WaitsForValueToBeResolvedBeforeInvokingCallback', function() {
338
- let d = defer();
339
- let callback;
340
- let result = promise.when(d.promise, callback = callbackHelper(function(value) {
341
- assert.equal('hi', value);
342
- }));
343
- callback.assertNotCalled();
344
- d.resolve('hi');
345
- return result.then(callback.assertCalled);
346
- });
195
+ return promise.fullyResolved(hash)
196
+ .then(function(resolved) {
197
+ assert.strictEqual(hash, resolved);
198
+ assert.deepEqual({'a': 123, 'b': {'foo': 'bar'}}, resolved);
199
+ assert.strictEqual(nestedHash, resolved['b']);
200
+ });
347
201
  });
348
202
 
349
- describe('fullyResolved', function() {
350
- it('primitives', function() {
351
- function runTest(value) {
352
- var callback, errback;
353
- return promise.fullyResolved(value)
354
- .then((resolved) => assert.equal(value, resolved));
355
- }
356
- return runTest(true)
357
- .then(() => runTest(function() {}))
358
- .then(() => runTest(null))
359
- .then(() => runTest(123))
360
- .then(() => runTest('foo bar'))
361
- .then(() => runTest(undefined));
362
- });
203
+ it('promiseResolvesToSimpleHash', function() {
204
+ var hash = {'a': 123};
205
+ var aPromise = Promise.resolve(hash);
363
206
 
364
- it('arrayOfPrimitives', function() {
365
- var fn = function() {};
366
- var array = [true, fn, null, 123, '', undefined, 1];
367
- return promise.fullyResolved(array).then(function(resolved) {
368
- assert.equal(array, resolved);
369
- assert.deepEqual([true, fn, null, 123, '', undefined, 1],
370
- resolved);
371
- });
372
- });
207
+ return promise.fullyResolved(aPromise)
208
+ .then((resolved) => assert.strictEqual(hash, resolved));
209
+ });
373
210
 
374
- it('nestedArrayOfPrimitives', function() {
375
- var fn = function() {};
376
- var array = [true, [fn, null, 123], '', undefined];
377
- return promise.fullyResolved(array)
378
- .then(function(resolved) {
379
- assert.equal(array, resolved);
380
- assert.deepEqual([true, [fn, null, 123], '', undefined], resolved);
381
- assert.deepEqual([fn, null, 123], resolved[1]);
382
- });
383
- });
211
+ it('promiseResolvesToNestedHash', function() {
212
+ var nestedHash = {'foo':'bar'};
213
+ var hash = {'a': 123, 'b': nestedHash};
214
+ var aPromise = Promise.resolve(hash);
384
215
 
385
- it('arrayWithPromisedPrimitive', function() {
386
- return promise.fullyResolved([Promise.resolve(123)])
387
- .then(function(resolved) {
388
- assert.deepEqual([123], resolved);
389
- });
390
- });
216
+ return promise.fullyResolved(aPromise)
217
+ .then(function(resolved) {
218
+ assert.strictEqual(hash, resolved);
219
+ assert.strictEqual(nestedHash, resolved['b']);
220
+ assert.deepEqual(hash, {'a': 123, 'b': {'foo': 'bar'}});
221
+ });
222
+ });
391
223
 
392
- it('promiseResolvesToPrimitive', function() {
393
- return promise.fullyResolved(Promise.resolve(123))
394
- .then((resolved) => assert.equal(123, resolved));
224
+ it('promiseResolvesToHashWithPromises', function() {
225
+ var aPromise = Promise.resolve({
226
+ 'a': Promise.resolve(123)
395
227
  });
396
228
 
397
- it('promiseResolvesToArray', function() {
398
- var fn = function() {};
399
- var array = [true, [fn, null, 123], '', undefined];
400
- var aPromise = Promise.resolve(array);
401
-
402
- var result = promise.fullyResolved(aPromise);
403
- return result.then(function(resolved) {
404
- assert.equal(array, resolved);
405
- assert.deepEqual([true, [fn, null, 123], '', undefined],
406
- resolved);
407
- assert.deepEqual([fn, null, 123], resolved[1]);
408
- });
409
- });
229
+ return promise.fullyResolved(aPromise)
230
+ .then(function(resolved) {
231
+ assert.deepEqual({'a': 123}, resolved);
232
+ });
233
+ });
410
234
 
411
- it('promiseResolvesToArrayWithPromises', function() {
412
- var nestedPromise = Promise.resolve(123);
413
- var aPromise = Promise.resolve([true, nestedPromise]);
414
- return promise.fullyResolved(aPromise)
415
- .then(function(resolved) {
416
- assert.deepEqual([true, 123], resolved);
417
- });
235
+ it('rejectsIfHashPromiseRejects', function() {
236
+ var aPromise = Promise.resolve({
237
+ 'a': createRejectedPromise(new StubError)
418
238
  });
419
239
 
420
- it('rejectsIfArrayPromiseRejects', function() {
421
- var nestedPromise = createRejectedPromise(new StubError);
422
- var aPromise = Promise.resolve([true, nestedPromise]);
240
+ return promise.fullyResolved(aPromise)
241
+ .then(assert.fail, assertIsStubError);
242
+ });
423
243
 
424
- var pair = callbackPair(null, assertIsStubError);
425
- return promise.fullyResolved(aPromise)
426
- .then(assert.fail, assertIsStubError);
244
+ it('rejectsIfNestedHashPromiseRejects', function() {
245
+ var aPromise = Promise.resolve({
246
+ 'a': {'b': createRejectedPromise(new StubError)}
427
247
  });
428
248
 
429
- it('rejectsOnFirstArrayRejection', function() {
430
- var e1 = new Error('foo');
431
- var e2 = new Error('bar');
432
- var aPromise = Promise.resolve([
433
- createRejectedPromise(e1),
434
- createRejectedPromise(e2)
435
- ]);
436
-
437
- return promise.fullyResolved(aPromise)
438
- .then(assert.fail, function(error) {
439
- assert.strictEqual(e1, error);
440
- });
441
- });
249
+ return promise.fullyResolved(aPromise)
250
+ .then(assert.fail, assertIsStubError);
251
+ });
442
252
 
443
- it('rejectsIfNestedArrayPromiseRejects', function() {
444
- var aPromise = Promise.resolve([
445
- Promise.resolve([
446
- createRejectedPromise(new StubError)
447
- ])
448
- ]);
253
+ it('instantiatedObject', function() {
254
+ function Foo() {
255
+ this.bar = 'baz';
256
+ }
257
+ var foo = new Foo;
449
258
 
450
- return promise.fullyResolved(aPromise)
451
- .then(assert.fail, assertIsStubError);
259
+ return promise.fullyResolved(foo).then(function(resolvedFoo) {
260
+ assert.equal(foo, resolvedFoo);
261
+ assert.ok(resolvedFoo instanceof Foo);
262
+ assert.deepEqual(new Foo, resolvedFoo);
452
263
  });
264
+ });
453
265
 
454
- it('simpleHash', function() {
455
- var hash = {'a': 123};
456
- return promise.fullyResolved(hash)
457
- .then(function(resolved) {
458
- assert.strictEqual(hash, resolved);
459
- assert.deepEqual(hash, {'a': 123});
460
- });
266
+ it('withEmptyArray', function() {
267
+ return promise.fullyResolved([]).then(function(resolved) {
268
+ assert.deepEqual([], resolved);
461
269
  });
270
+ });
462
271
 
463
- it('nestedHash', function() {
464
- var nestedHash = {'foo':'bar'};
465
- var hash = {'a': 123, 'b': nestedHash};
466
-
467
- return promise.fullyResolved(hash)
468
- .then(function(resolved) {
469
- assert.strictEqual(hash, resolved);
470
- assert.deepEqual({'a': 123, 'b': {'foo': 'bar'}}, resolved);
471
- assert.strictEqual(nestedHash, resolved['b']);
472
- });
272
+ it('withEmptyHash', function() {
273
+ return promise.fullyResolved({}).then(function(resolved) {
274
+ assert.deepEqual({}, resolved);
473
275
  });
276
+ });
474
277
 
475
- it('promiseResolvesToSimpleHash', function() {
476
- var hash = {'a': 123};
477
- var aPromise = Promise.resolve(hash);
478
-
479
- return promise.fullyResolved(aPromise)
480
- .then((resolved) => assert.strictEqual(hash, resolved));
481
- });
278
+ it('arrayWithPromisedHash', function() {
279
+ var obj = {'foo': 'bar'};
280
+ var array = [Promise.resolve(obj)];
482
281
 
483
- it('promiseResolvesToNestedHash', function() {
484
- var nestedHash = {'foo':'bar'};
485
- var hash = {'a': 123, 'b': nestedHash};
486
- var aPromise = Promise.resolve(hash);
487
-
488
- return promise.fullyResolved(aPromise)
489
- .then(function(resolved) {
490
- assert.strictEqual(hash, resolved);
491
- assert.strictEqual(nestedHash, resolved['b']);
492
- assert.deepEqual(hash, {'a': 123, 'b': {'foo': 'bar'}});
493
- });
282
+ return promise.fullyResolved(array).then(function(resolved) {
283
+ assert.deepEqual(resolved, [obj]);
494
284
  });
285
+ });
286
+ });
495
287
 
496
- it('promiseResolvesToHashWithPromises', function() {
497
- var aPromise = Promise.resolve({
498
- 'a': Promise.resolve(123)
499
- });
500
-
501
- return promise.fullyResolved(aPromise)
502
- .then(function(resolved) {
503
- assert.deepEqual({'a': 123}, resolved);
504
- });
505
- });
288
+ describe('finally', function() {
289
+ it('successful callback does not suppress original error', async () => {
290
+ let p = Promise.reject(new StubError);
291
+ let called = false;
292
+
293
+ try {
294
+ await promise.finally(p, function() { called = true; });
295
+ fail('should have thrown');
296
+ } catch (e) {
297
+ assertIsStubError(e);
298
+ assert.ok(called);
299
+ }
300
+ });
506
301
 
507
- it('rejectsIfHashPromiseRejects', function() {
508
- var aPromise = Promise.resolve({
509
- 'a': createRejectedPromise(new StubError)
510
- });
302
+ it('failing callback suppresses original error', async () => {
303
+ let p = Promise.reject(Error('original'));
304
+ let called = false;
511
305
 
512
- return promise.fullyResolved(aPromise)
513
- .then(assert.fail, assertIsStubError);
514
- });
306
+ try {
307
+ await promise.finally(p, throwStubError);
308
+ fail('should have thrown');
309
+ } catch (e) {
310
+ assertIsStubError(e);
311
+ }
312
+ });
515
313
 
516
- it('rejectsIfNestedHashPromiseRejects', function() {
517
- var aPromise = Promise.resolve({
518
- 'a': {'b': createRejectedPromise(new StubError)}
519
- });
314
+ it('callback throws after fulfilled promise', async () => {
315
+ try {
316
+ await promise.finally(Promise.resolve(), throwStubError);
317
+ fail('should have thrown');
318
+ } catch (e) {
319
+ assertIsStubError(e);
320
+ }
321
+ });
520
322
 
521
- return promise.fullyResolved(aPromise)
522
- .then(assert.fail, assertIsStubError);
523
- });
323
+ it('callback returns rejected promise', async () => {
324
+ try {
325
+ await promise.finally(
326
+ Promise.resolve(), () => Promise.reject(new StubError));
327
+ fail('should have thrown');
328
+ } catch (e) {
329
+ assertIsStubError(e);
330
+ }
331
+ });
524
332
 
525
- it('instantiatedObject', function() {
526
- function Foo() {
527
- this.bar = 'baz';
528
- }
529
- var foo = new Foo;
333
+ it('returned promise resolves with callback result', async () => {
334
+ let value =
335
+ await promise.finally(Promise.resolve(1), () => 2);
336
+ assert.equal(value, 2);
337
+ });
338
+ });
530
339
 
531
- return promise.fullyResolved(foo).then(function(resolvedFoo) {
532
- assert.equal(foo, resolvedFoo);
533
- assert.ok(resolvedFoo instanceof Foo);
534
- assert.deepEqual(new Foo, resolvedFoo);
535
- });
536
- });
340
+ describe('checkedNodeCall', function() {
341
+ it('functionThrows', function() {
342
+ return promise.checkedNodeCall(throwStubError)
343
+ .then(assert.fail, assertIsStubError);
344
+ });
537
345
 
538
- it('withEmptyArray', function() {
539
- return promise.fullyResolved([]).then(function(resolved) {
540
- assert.deepEqual([], resolved);
541
- });
542
- });
346
+ it('functionReturnsAnError', function() {
347
+ return promise.checkedNodeCall(function(callback) {
348
+ callback(new StubError);
349
+ }).then(assert.fail, assertIsStubError);
350
+ });
543
351
 
544
- it('withEmptyHash', function() {
545
- return promise.fullyResolved({}).then(function(resolved) {
546
- assert.deepEqual({}, resolved);
547
- });
548
- });
352
+ it('functionReturnsSuccess', function() {
353
+ var success = 'success!';
354
+ return promise.checkedNodeCall(function(callback) {
355
+ callback(null, success);
356
+ }).then((value) => assert.equal(success, value));
357
+ });
549
358
 
550
- it('arrayWithPromisedHash', function() {
551
- var obj = {'foo': 'bar'};
552
- var array = [Promise.resolve(obj)];
359
+ it('functionReturnsAndThrows', function() {
360
+ var error = new Error('boom');
361
+ var error2 = new Error('boom again');
362
+ return promise.checkedNodeCall(function(callback) {
363
+ callback(error);
364
+ throw error2;
365
+ }).then(assert.fail, (e) => assert.equal(error, e));
366
+ });
553
367
 
554
- return promise.fullyResolved(array).then(function(resolved) {
555
- assert.deepEqual(resolved, [obj]);
556
- });
557
- });
368
+ it('functionThrowsAndReturns', function() {
369
+ var error = new Error('boom');
370
+ var error2 = new Error('boom again');
371
+ return promise.checkedNodeCall(function(callback) {
372
+ setTimeout(() => callback(error), 10);
373
+ throw error2;
374
+ }).then(assert.fail, (e) => assert.equal(error2, e));
558
375
  });
376
+ });
559
377
 
560
- describe('checkedNodeCall', function() {
561
- it('functionThrows', function() {
562
- return promise.checkedNodeCall(throwStubError)
563
- .then(assert.fail, assertIsStubError);
378
+ describe('map', function() {
379
+ it('(base case)', function() {
380
+ var a = [1, 2, 3];
381
+ return promise.map(a, function(value, index, a2) {
382
+ assert.equal(a, a2);
383
+ assert.equal('number', typeof index, 'not a number');
384
+ return value + 1;
385
+ }).then(function(value) {
386
+ assert.deepEqual([2, 3, 4], value);
564
387
  });
388
+ });
565
389
 
566
- it('functionReturnsAnError', function() {
567
- return promise.checkedNodeCall(function(callback) {
568
- callback(new StubError);
569
- }).then(assert.fail, assertIsStubError);
570
- });
390
+ it('omitsDeleted', function() {
391
+ var a = [0, 1, 2, 3, 4, 5, 6];
392
+ delete a[1];
393
+ delete a[3];
394
+ delete a[4];
395
+ delete a[6];
571
396
 
572
- it('functionReturnsSuccess', function() {
573
- var success = 'success!';
574
- return promise.checkedNodeCall(function(callback) {
575
- callback(null, success);
576
- }).then((value) => assert.equal(success, value));
577
- });
397
+ var expected = [0, 1, 4, 9, 16, 25, 36];
398
+ delete expected[1];
399
+ delete expected[3];
400
+ delete expected[4];
401
+ delete expected[6];
578
402
 
579
- it('functionReturnsAndThrows', function() {
580
- var error = new Error('boom');
581
- var error2 = new Error('boom again');
582
- return promise.checkedNodeCall(function(callback) {
583
- callback(error);
584
- throw error2;
585
- }).then(assert.fail, (e) => assert.equal(error, e));
403
+ return promise.map(a, function(value) {
404
+ return value * value;
405
+ }).then(function(value) {
406
+ assert.deepEqual(expected, value);
586
407
  });
408
+ });
587
409
 
588
- it('functionThrowsAndReturns', function() {
589
- var error = new Error('boom');
590
- var error2 = new Error('boom again');
591
- return promise.checkedNodeCall(function(callback) {
592
- setTimeout(() => callback(error), 10);
593
- throw error2;
594
- }).then(assert.fail, (e) => assert.equal(error2, e));
410
+ it('emptyArray', function() {
411
+ return promise.map([], function(value) {
412
+ return value + 1;
413
+ }).then(function(value) {
414
+ assert.deepEqual([], value);
595
415
  });
596
416
  });
597
417
 
598
- describe('all', function() {
599
- it('(base case)', function() {
600
- let deferredObjs = [defer(), defer()];
601
- var a = [
602
- 0, 1,
603
- deferredObjs[0].promise,
604
- deferredObjs[1].promise,
605
- 4, 5, 6
606
- ];
607
- delete a[5];
608
-
609
- var pair = callbackPair(function(value) {
610
- assert.deepEqual([0, 1, 2, 3, 4, undefined, 6], value);
611
- });
612
-
613
- var result = promise.all(a).then(pair.callback, pair.errback);
614
- pair.assertNeither();
615
-
616
- deferredObjs[0].resolve(2);
617
- pair.assertNeither();
618
-
619
- deferredObjs[1].resolve(3);
620
- return result.then(() => pair.assertCallback());
418
+ it('inputIsPromise', function() {
419
+ var input = defer();
420
+ var result = promise.map(input.promise, function(value) {
421
+ return value + 1;
621
422
  });
622
423
 
623
- it('empty array', function() {
624
- return promise.all([]).then((a) => assert.deepEqual([], a));
424
+ var pair = callbackPair(function(value) {
425
+ assert.deepEqual([2, 3, 4], value);
625
426
  });
427
+ result = result.then(pair.callback, pair.errback);
626
428
 
627
- it('usesFirstRejection', function() {
628
- let deferredObjs = [defer(), defer()];
629
- let a = [deferredObjs[0].promise, deferredObjs[1].promise];
429
+ setTimeout(function() {
430
+ pair.assertNeither();
431
+ input.resolve([1, 2, 3]);
432
+ }, 10);
630
433
 
631
- var result = promise.all(a).then(assert.fail, assertIsStubError);
632
- deferredObjs[1].reject(new StubError);
633
- setTimeout(() => deferredObjs[0].reject(Error('ignored')), 0);
634
- return result;
635
- });
434
+ return result;
636
435
  });
637
436
 
638
- describe('map', function() {
639
- it('(base case)', function() {
640
- var a = [1, 2, 3];
641
- return promise.map(a, function(value, index, a2) {
642
- assert.equal(a, a2);
643
- assert.equal('number', typeof index, 'not a number');
644
- return value + 1;
645
- }).then(function(value) {
646
- assert.deepEqual([2, 3, 4], value);
647
- });
648
- });
437
+ it('waitsForFunctionResultToResolve', function() {
438
+ var innerResults = [
439
+ defer(),
440
+ defer()
441
+ ];
649
442
 
650
- it('omitsDeleted', function() {
651
- var a = [0, 1, 2, 3, 4, 5, 6];
652
- delete a[1];
653
- delete a[3];
654
- delete a[4];
655
- delete a[6];
656
-
657
- var expected = [0, 1, 4, 9, 16, 25, 36];
658
- delete expected[1];
659
- delete expected[3];
660
- delete expected[4];
661
- delete expected[6];
662
-
663
- return promise.map(a, function(value) {
664
- return value * value;
665
- }).then(function(value) {
666
- assert.deepEqual(expected, value);
667
- });
443
+ var result = promise.map([1, 2], function(value, index) {
444
+ return innerResults[index].promise;
668
445
  });
669
446
 
670
- it('emptyArray', function() {
671
- return promise.map([], function(value) {
672
- return value + 1;
673
- }).then(function(value) {
674
- assert.deepEqual([], value);
675
- });
447
+ var pair = callbackPair(function(value) {
448
+ assert.deepEqual(['a', 'b'], value);
676
449
  });
450
+ result = result.then(pair.callback, pair.errback);
677
451
 
678
- it('inputIsPromise', function() {
679
- var input = defer();
680
- var result = promise.map(input.promise, function(value) {
681
- return value + 1;
682
- });
683
-
684
- var pair = callbackPair(function(value) {
685
- assert.deepEqual([2, 3, 4], value);
686
- });
687
- result = result.then(pair.callback, pair.errback);
688
-
689
- setTimeout(function() {
690
- pair.assertNeither();
691
- input.resolve([1, 2, 3]);
692
- }, 10);
452
+ return NativePromise.resolve()
453
+ .then(function() {
454
+ pair.assertNeither();
455
+ innerResults[0].resolve('a');
456
+ })
457
+ .then(function() {
458
+ pair.assertNeither();
459
+ innerResults[1].resolve('b');
460
+ return result;
461
+ })
462
+ .then(pair.assertCallback);
463
+ });
693
464
 
694
- return result;
695
- });
465
+ it('rejectsPromiseIfFunctionThrows', function() {
466
+ return promise.map([1], throwStubError)
467
+ .then(assert.fail, assertIsStubError);
468
+ });
696
469
 
697
- it('waitsForFunctionResultToResolve', function() {
698
- var innerResults = [
699
- defer(),
700
- defer()
701
- ];
702
-
703
- var result = promise.map([1, 2], function(value, index) {
704
- return innerResults[index].promise;
705
- });
706
-
707
- var pair = callbackPair(function(value) {
708
- assert.deepEqual(['a', 'b'], value);
709
- });
710
- result = result.then(pair.callback, pair.errback);
711
-
712
- return NativePromise.resolve()
713
- .then(function() {
714
- pair.assertNeither();
715
- innerResults[0].resolve('a');
716
- })
717
- .then(function() {
718
- pair.assertNeither();
719
- innerResults[1].resolve('b');
720
- return result;
721
- })
722
- .then(pair.assertCallback);
723
- });
470
+ it('rejectsPromiseIfFunctionReturnsRejectedPromise', function() {
471
+ return promise.map([1], function() {
472
+ return createRejectedPromise(new StubError);
473
+ }).then(assert.fail, assertIsStubError);
474
+ });
724
475
 
725
- it('rejectsPromiseIfFunctionThrows', function() {
726
- return promise.map([1], throwStubError)
727
- .then(assert.fail, assertIsStubError);
476
+ it('stopsCallingFunctionIfPreviousIterationFailed', function() {
477
+ var count = 0;
478
+ return promise.map([1, 2, 3, 4], function() {
479
+ count++;
480
+ if (count == 3) {
481
+ throw new StubError;
482
+ }
483
+ }).then(assert.fail, function(e) {
484
+ assertIsStubError(e);
485
+ assert.equal(3, count);
728
486
  });
487
+ });
729
488
 
730
- it('rejectsPromiseIfFunctionReturnsRejectedPromise', function() {
731
- return promise.map([1], function() {
732
- return createRejectedPromise(new StubError);
733
- }).then(assert.fail, assertIsStubError);
489
+ it('rejectsWithFirstRejectedPromise', function() {
490
+ var innerResult = [
491
+ Promise.resolve(),
492
+ createRejectedPromise(new StubError),
493
+ createRejectedPromise(Error('should be ignored'))
494
+ ];
495
+ var count = 0;
496
+ return promise.map([1, 2, 3, 4], function(value, index) {
497
+ count += 1;
498
+ return innerResult[index];
499
+ }).then(assert.fail, function(e) {
500
+ assertIsStubError(e);
501
+ assert.equal(2, count);
734
502
  });
503
+ });
735
504
 
736
- it('stopsCallingFunctionIfPreviousIterationFailed', function() {
737
- var count = 0;
738
- return promise.map([1, 2, 3, 4], function() {
739
- count++;
740
- if (count == 3) {
741
- throw new StubError;
742
- }
743
- }).then(assert.fail, function(e) {
744
- assertIsStubError(e);
745
- assert.equal(3, count);
746
- });
505
+ it('preservesOrderWhenMapReturnsPromise', function() {
506
+ var deferreds = [
507
+ defer(),
508
+ defer(),
509
+ defer(),
510
+ defer()
511
+ ];
512
+ var result = promise.map(deferreds, function(value) {
513
+ return value.promise;
747
514
  });
748
515
 
749
- it('rejectsWithFirstRejectedPromise', function() {
750
- var innerResult = [
751
- Promise.resolve(),
752
- createRejectedPromise(new StubError),
753
- createRejectedPromise(Error('should be ignored'))
754
- ];
755
- var count = 0;
756
- return promise.map([1, 2, 3, 4], function(value, index) {
757
- count += 1;
758
- return innerResult[index];
759
- }).then(assert.fail, function(e) {
760
- assertIsStubError(e);
761
- assert.equal(2, count);
762
- });
516
+ var pair = callbackPair(function(value) {
517
+ assert.deepEqual([0, 1, 2, 3], value);
763
518
  });
519
+ result = result.then(pair.callback, pair.errback);
764
520
 
765
- it('preservesOrderWhenMapReturnsPromise', function() {
766
- var deferreds = [
767
- defer(),
768
- defer(),
769
- defer(),
770
- defer()
771
- ];
772
- var result = promise.map(deferreds, function(value) {
773
- return value.promise;
774
- });
775
-
776
- var pair = callbackPair(function(value) {
777
- assert.deepEqual([0, 1, 2, 3], value);
778
- });
779
- result = result.then(pair.callback, pair.errback);
780
-
781
- return Promise.resolve()
782
- .then(function() {
783
- pair.assertNeither();
784
- for (let i = deferreds.length; i > 0; i -= 1) {
785
- deferreds[i - 1].resolve(i - 1);
786
- }
787
- return result;
788
- }).then(pair.assertCallback);
789
- });
521
+ return Promise.resolve()
522
+ .then(function() {
523
+ pair.assertNeither();
524
+ for (let i = deferreds.length; i > 0; i -= 1) {
525
+ deferreds[i - 1].resolve(i - 1);
526
+ }
527
+ return result;
528
+ }).then(pair.assertCallback);
790
529
  });
530
+ });
791
531
 
792
- describe('filter', function() {
793
- it('basicFiltering', function() {
794
- var a = [0, 1, 2, 3];
795
- return promise.filter(a, function(val, index, a2) {
796
- assert.equal(a, a2);
797
- assert.equal('number', typeof index, 'not a number');
798
- return val > 1;
799
- }).then(function(val) {
800
- assert.deepEqual([2, 3], val);
801
- });
532
+ describe('filter', function() {
533
+ it('basicFiltering', function() {
534
+ var a = [0, 1, 2, 3];
535
+ return promise.filter(a, function(val, index, a2) {
536
+ assert.equal(a, a2);
537
+ assert.equal('number', typeof index, 'not a number');
538
+ return val > 1;
539
+ }).then(function(val) {
540
+ assert.deepEqual([2, 3], val);
802
541
  });
542
+ });
803
543
 
804
- it('omitsDeleted', function() {
805
- var a = [0, 1, 2, 3, 4, 5, 6];
806
- delete a[3];
807
- delete a[4];
808
-
809
- return promise.filter(a, function(value) {
810
- return value > 1 && value < 6;
811
- }).then(function(val) {
812
- assert.deepEqual([2, 5], val);
813
- });
814
- });
544
+ it('omitsDeleted', function() {
545
+ var a = [0, 1, 2, 3, 4, 5, 6];
546
+ delete a[3];
547
+ delete a[4];
815
548
 
816
- it('preservesInputs', function() {
817
- var a = [0, 1, 2, 3];
818
-
819
- return promise.filter(a, function(value, i, a2) {
820
- assert.equal(a, a2);
821
- // Even if a function modifies the input array, the original value
822
- // should be inserted into the new array.
823
- a2[i] = a2[i] - 1;
824
- return a2[i] >= 1;
825
- }).then(function(val) {
826
- assert.deepEqual([2, 3], val);
827
- });
549
+ return promise.filter(a, function(value) {
550
+ return value > 1 && value < 6;
551
+ }).then(function(val) {
552
+ assert.deepEqual([2, 5], val);
828
553
  });
554
+ });
829
555
 
830
- it('inputIsPromise', function() {
831
- var input = defer();
832
- var result = promise.filter(input.promise, function(value) {
833
- return value > 1 && value < 3;
834
- });
835
-
836
- var pair = callbackPair(function(value) {
837
- assert.deepEqual([2], value);
838
- });
839
- result = result.then(pair.callback, pair.errback);
840
- return NativePromise.resolve()
841
- .then(function() {
842
- pair.assertNeither();
843
- input.resolve([1, 2, 3]);
844
- return result;
845
- })
846
- .then(pair.assertCallback);
847
- });
556
+ it('preservesInputs', function() {
557
+ var a = [0, 1, 2, 3];
848
558
 
849
- it('waitsForFunctionResultToResolve', function() {
850
- var innerResults = [
851
- defer(),
852
- defer()
853
- ];
854
-
855
- var result = promise.filter([1, 2], function(value, index) {
856
- return innerResults[index].promise;
857
- });
858
-
859
- var pair = callbackPair(function(value) {
860
- assert.deepEqual([2], value);
861
- });
862
- result = result.then(pair.callback, pair.errback);
863
- return NativePromise.resolve()
864
- .then(function() {
865
- pair.assertNeither();
866
- innerResults[0].resolve(false);
867
- })
868
- .then(function() {
869
- pair.assertNeither();
870
- innerResults[1].resolve(true);
871
- return result;
872
- })
873
- .then(pair.assertCallback);
559
+ return promise.filter(a, function(value, i, a2) {
560
+ assert.equal(a, a2);
561
+ // Even if a function modifies the input array, the original value
562
+ // should be inserted into the new array.
563
+ a2[i] = a2[i] - 1;
564
+ return a2[i] >= 1;
565
+ }).then(function(val) {
566
+ assert.deepEqual([2, 3], val);
874
567
  });
568
+ });
875
569
 
876
- it('rejectsPromiseIfFunctionReturnsRejectedPromise', function() {
877
- return promise.filter([1], function() {
878
- return createRejectedPromise(new StubError);
879
- }).then(assert.fail, assertIsStubError);
570
+ it('inputIsPromise', function() {
571
+ var input = defer();
572
+ var result = promise.filter(input.promise, function(value) {
573
+ return value > 1 && value < 3;
880
574
  });
881
575
 
882
- it('stopsCallingFunctionIfPreviousIterationFailed', function() {
883
- var count = 0;
884
- return promise.filter([1, 2, 3, 4], function() {
885
- count++;
886
- if (count == 3) {
887
- throw new StubError;
888
- }
889
- }).then(assert.fail, function(e) {
890
- assertIsStubError(e);
891
- assert.equal(3, count);
892
- });
576
+ var pair = callbackPair(function(value) {
577
+ assert.deepEqual([2], value);
893
578
  });
579
+ result = result.then(pair.callback, pair.errback);
580
+ return NativePromise.resolve()
581
+ .then(function() {
582
+ pair.assertNeither();
583
+ input.resolve([1, 2, 3]);
584
+ return result;
585
+ })
586
+ .then(pair.assertCallback);
587
+ });
894
588
 
895
- it('rejectsWithFirstRejectedPromise', function() {
896
- var innerResult = [
897
- Promise.resolve(),
898
- createRejectedPromise(new StubError),
899
- createRejectedPromise(Error('should be ignored'))
900
- ];
589
+ it('waitsForFunctionResultToResolve', function() {
590
+ var innerResults = [
591
+ defer(),
592
+ defer()
593
+ ];
901
594
 
902
- return promise.filter([1, 2, 3, 4], function(value, index) {
903
- assert.ok(index < innerResult.length);
904
- return innerResult[index];
905
- }).then(assert.fail, assertIsStubError);
595
+ var result = promise.filter([1, 2], function(value, index) {
596
+ return innerResults[index].promise;
906
597
  });
907
598
 
908
- it('preservesOrderWhenFilterReturnsPromise', function() {
909
- var deferreds = [
910
- defer(),
911
- defer(),
912
- defer(),
913
- defer()
914
- ];
915
- var result = promise.filter([0, 1, 2, 3], function(value, index) {
916
- return deferreds[index].promise;
917
- });
918
-
919
- var pair = callbackPair(function(value) {
920
- assert.deepEqual([1, 2], value);
921
- });
922
- result = result.then(pair.callback, pair.errback);
923
-
924
- return NativePromise.resolve()
925
- .then(function() {
926
- pair.assertNeither();
927
- for (let i = deferreds.length - 1; i >= 0; i -= 1) {
928
- deferreds[i].resolve(i > 0 && i < 3);
929
- }
930
- return result;
931
- }).then(pair.assertCallback);
599
+ var pair = callbackPair(function(value) {
600
+ assert.deepEqual([2], value);
932
601
  });
933
- });
934
- });
935
-
936
- enablePromiseManager(() => {
937
- it('firesUncaughtExceptionEventIfRejectionNeverHandled', function() {
938
- promise.rejected(new StubError);
939
- var handler = callbackHelper(assertIsStubError);
940
-
941
- // so tearDown() doesn't throw
942
- app.removeAllListeners();
943
- app.on(promise.ControlFlow.EventType.UNCAUGHT_EXCEPTION, handler);
944
-
602
+ result = result.then(pair.callback, pair.errback);
945
603
  return NativePromise.resolve()
946
- // Macro yield so the uncaught exception has a chance to trigger.
947
- .then(() => new NativePromise(resolve => setTimeout(resolve, 0)))
948
- .then(handler.assertCalled);
604
+ .then(function() {
605
+ pair.assertNeither();
606
+ innerResults[0].resolve(false);
607
+ })
608
+ .then(function() {
609
+ pair.assertNeither();
610
+ innerResults[1].resolve(true);
611
+ return result;
612
+ })
613
+ .then(pair.assertCallback);
949
614
  });
950
615
 
951
- it('cannotResolveADeferredWithItself', function() {
952
- var deferred = new promise.Deferred();
953
- assert.throws(() => deferred.fulfill(deferred));
954
- assert.throws(() => deferred.reject(deferred));
616
+ it('rejectsPromiseIfFunctionReturnsRejectedPromise', function() {
617
+ return promise.filter([1], function() {
618
+ return createRejectedPromise(new StubError);
619
+ }).then(assert.fail, assertIsStubError);
955
620
  });
956
621
 
957
- describe('testLongStackTraces', function() {
958
- beforeEach(() => promise.LONG_STACK_TRACES = false);
959
- afterEach(() => promise.LONG_STACK_TRACES = false);
960
-
961
- it('doesNotAppendStackIfFeatureDisabled', function() {
962
- promise.LONG_STACK_TRACES = false;
963
-
964
- var error = Error('hello');
965
- var originalStack = error.stack;
966
- return promise.rejected(error).
967
- then(fail).
968
- then(fail).
969
- then(fail).
970
- then(fail, function(e) {
971
- assert.equal(error, e);
972
- assert.equal(originalStack, e.stack);
973
- });
622
+ it('stopsCallingFunctionIfPreviousIterationFailed', function() {
623
+ var count = 0;
624
+ return promise.filter([1, 2, 3, 4], function() {
625
+ count++;
626
+ if (count == 3) {
627
+ throw new StubError;
628
+ }
629
+ }).then(assert.fail, function(e) {
630
+ assertIsStubError(e);
631
+ assert.equal(3, count);
974
632
  });
633
+ });
975
634
 
976
- function getStackMessages(error) {
977
- return error.stack.split(/\n/).filter(function(line) {
978
- return /^From: /.test(line);
979
- });
980
- }
981
-
982
- it('appendsInitialPromiseCreation_resolverThrows', function() {
983
- promise.LONG_STACK_TRACES = true;
984
-
985
- var error = Error('hello');
986
- var originalStack = '(placeholder; will be overwritten later)';
987
-
988
- return new promise.Promise(function() {
989
- try {
990
- throw error;
991
- } catch (e) {
992
- originalStack = e.stack;
993
- throw e;
994
- }
995
- }).then(fail, function(e) {
996
- assert.strictEqual(error, e);
997
- if (typeof originalStack !== 'string') {
998
- return;
999
- }
1000
- assert.notEqual(originalStack, e.stack);
1001
- assert.equal(e.stack.indexOf(originalStack), 0,
1002
- 'should start with original stack');
1003
- assert.deepEqual(['From: ManagedPromise: new'], getStackMessages(e));
1004
- });
1005
- });
635
+ it('rejectsWithFirstRejectedPromise', function() {
636
+ var innerResult = [
637
+ Promise.resolve(),
638
+ createRejectedPromise(new StubError),
639
+ createRejectedPromise(Error('should be ignored'))
640
+ ];
641
+
642
+ return promise.filter([1, 2, 3, 4], function(value, index) {
643
+ assert.ok(index < innerResult.length);
644
+ return innerResult[index];
645
+ }).then(assert.fail, assertIsStubError);
646
+ });
1006
647
 
1007
- it('appendsInitialPromiseCreation_rejectCalled', function() {
1008
- promise.LONG_STACK_TRACES = true;
1009
-
1010
- var error = Error('hello');
1011
- var originalStack = error.stack;
1012
-
1013
- return new promise.Promise(function(_, reject) {
1014
- reject(error);
1015
- }).then(fail, function(e) {
1016
- assert.equal(error, e);
1017
- if (typeof originalStack !== 'string') {
1018
- return;
1019
- }
1020
- assert.notEqual(originalStack, e.stack);
1021
- assert.equal(e.stack.indexOf(originalStack), 0,
1022
- 'should start with original stack');
1023
- assert.deepEqual(['From: ManagedPromise: new'], getStackMessages(e));
1024
- });
648
+ it('preservesOrderWhenFilterReturnsPromise', function() {
649
+ var deferreds = [
650
+ defer(),
651
+ defer(),
652
+ defer(),
653
+ defer()
654
+ ];
655
+ var result = promise.filter([0, 1, 2, 3], function(value, index) {
656
+ return deferreds[index].promise;
1025
657
  });
1026
658
 
1027
- it('appendsEachStepToRejectionError', function() {
1028
- promise.LONG_STACK_TRACES = true;
1029
-
1030
- var error = Error('hello');
1031
- var originalStack = '(placeholder; will be overwritten later)';
1032
-
1033
- return new promise.Promise(function() {
1034
- try {
1035
- throw error;
1036
- } catch (e) {
1037
- originalStack = e.stack;
1038
- throw e;
1039
- }
1040
- }).
1041
- then(fail).
1042
- catch(function(e) { throw e; }).
1043
- then(fail).
1044
- catch(function(e) { throw e; }).
1045
- then(fail, function(e) {
1046
- assert.equal(error, e);
1047
- if (typeof originalStack !== 'string') {
1048
- return;
1049
- }
1050
- assert.notEqual(originalStack, e.stack);
1051
- assert.equal(e.stack.indexOf(originalStack), 0,
1052
- 'should start with original stack');
1053
- assert.deepEqual([
1054
- 'From: ManagedPromise: new',
1055
- 'From: Promise: then',
1056
- 'From: Promise: catch',
1057
- 'From: Promise: then',
1058
- 'From: Promise: catch',
1059
- ], getStackMessages(e));
1060
- });
659
+ var pair = callbackPair(function(value) {
660
+ assert.deepEqual([1, 2], value);
1061
661
  });
662
+ result = result.then(pair.callback, pair.errback);
1062
663
 
1063
- it('errorOccursInCallbackChain', function() {
1064
- promise.LONG_STACK_TRACES = true;
1065
-
1066
- var error = Error('hello');
1067
- var originalStack = '(placeholder; will be overwritten later)';
1068
-
1069
- return promise.fulfilled().
1070
- then(function() {}).
1071
- then(function() {}).
1072
- then(function() {
1073
- try {
1074
- throw error;
1075
- } catch (e) {
1076
- originalStack = e.stack;
1077
- throw e;
1078
- }
1079
- }).
1080
- catch(function(e) { throw e; }).
1081
- then(fail, function(e) {
1082
- assert.equal(error, e);
1083
- if (typeof originalStack !== 'string') {
1084
- return;
1085
- }
1086
- assert.notEqual(originalStack, e.stack);
1087
- assert.equal(e.stack.indexOf(originalStack), 0,
1088
- 'should start with original stack');
1089
- assert.deepEqual([
1090
- 'From: Promise: then',
1091
- 'From: Promise: catch',
1092
- ], getStackMessages(e));
1093
- });
1094
- });
664
+ return NativePromise.resolve()
665
+ .then(function() {
666
+ pair.assertNeither();
667
+ for (let i = deferreds.length - 1; i >= 0; i -= 1) {
668
+ deferreds[i].resolve(i > 0 && i < 3);
669
+ }
670
+ return result;
671
+ }).then(pair.assertCallback);
1095
672
  });
1096
673
  });
1097
-
1098
- it('testAddThenableImplementation', function() {
1099
- function tmp() {}
1100
- assert.ok(!promise.Thenable.isImplementation(new tmp()));
1101
- promise.Thenable.addImplementation(tmp);
1102
- assert.ok(promise.Thenable.isImplementation(new tmp()));
1103
-
1104
- class tmpClass {}
1105
- assert.ok(!promise.Thenable.isImplementation(new tmpClass()));
1106
- promise.Thenable.addImplementation(tmpClass);
1107
- assert.ok(promise.Thenable.isImplementation(new tmpClass()));
1108
- });
1109
674
  });