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.
- package/CHANGES.md +181 -0
- package/README.md +25 -27
- package/chrome.js +113 -127
- package/edge.js +42 -117
- package/example/chrome_android.js +8 -8
- package/example/chrome_mobile_emulation.js +8 -8
- package/example/firefox_channels.js +22 -18
- package/example/google_search_test.js +39 -26
- package/example/logging.js +39 -6
- package/firefox.js +769 -0
- package/http/index.js +41 -4
- package/http/util.js +11 -6
- package/ie.js +56 -97
- package/index.js +178 -114
- package/jasmine.json +11 -0
- package/lib/actions.js +68 -63
- package/lib/by.js +1 -1
- package/lib/capabilities.js +255 -192
- package/lib/command.js +26 -50
- package/lib/error.js +85 -44
- package/lib/http.js +133 -110
- package/lib/input.js +1044 -8
- package/lib/promise.js +222 -3323
- package/lib/proxy.js +134 -39
- package/lib/test/bootstrap_jasmine.js +28 -0
- package/lib/test/data/actions/click.html +24 -0
- package/lib/test/data/actions/drag.html +77 -0
- package/lib/test/data/actions/record_click.html +21 -0
- package/lib/test/data/chrome/download.html +2 -0
- package/lib/test/data/inputs.html +42 -0
- package/lib/test/data/selectPage.html +12 -0
- package/lib/test/data/simpleTest.html +5 -0
- package/lib/test/data/upload_invisible.html +45 -0
- package/lib/test/fileserver.js +23 -19
- package/lib/test/index.js +30 -212
- package/lib/test/resources.js +0 -1
- package/lib/webdriver.js +675 -936
- package/net/index.js +21 -25
- package/net/portprober.js +51 -68
- package/package.json +5 -3
- package/remote/index.js +5 -19
- package/safari.js +41 -128
- package/test/actions_test.js +173 -18
- package/test/{session_test.js → builder_test.js} +44 -37
- package/test/chrome/devtools_test.js +93 -0
- package/test/chrome/options_test.js +48 -154
- package/test/chrome/service_test.js +7 -7
- package/test/cookie_test.js +77 -63
- package/test/element_finding_test.js +206 -201
- package/test/execute_script_test.js +115 -114
- package/test/fingerprint_test.js +16 -15
- package/test/firefox_test.js +251 -0
- package/test/http/http_test.js +0 -1
- package/test/http/util_test.js +2 -2
- package/test/io/zip_test.js +6 -7
- package/test/lib/error_test.js +34 -7
- package/test/lib/http_test.js +8 -128
- package/test/lib/input_test.js +1379 -0
- package/test/lib/promise_test.js +473 -908
- package/test/lib/webdriver_test.js +296 -868
- package/test/logging_test.js +37 -43
- package/test/page_loading_test.js +71 -81
- package/test/proxy_test.js +64 -72
- package/test/rect_test.js +14 -25
- package/test/remote_test.js +10 -29
- package/test/safari_test.js +7 -71
- package/test/stale_element_test.js +20 -23
- package/test/tag_name_test.js +10 -9
- package/test/upload_test.js +27 -35
- package/test/window_test.js +72 -85
- package/testing/index.js +386 -314
- package/.npmignore +0 -2
- package/example/async_await_test.js +0 -69
- package/example/google_search_generator.js +0 -47
- package/example/parallel_flows.js +0 -51
- package/firefox/binary.js +0 -347
- package/firefox/extension.js +0 -224
- package/firefox/index.js +0 -576
- package/firefox/profile.js +0 -311
- package/lib/events.js +0 -210
- package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
- package/lib/test/data/firefox/sample.xpi +0 -0
- package/lib/test/promise.js +0 -79
- package/opera.js +0 -405
- package/phantomjs.js +0 -282
- package/test/firefox/extension_test.js +0 -120
- package/test/firefox/firefox_test.js +0 -244
- package/test/firefox/profile_test.js +0 -140
- package/test/lib/events_test.js +0 -177
- package/test/lib/promise_aplus_test.js +0 -78
- package/test/lib/promise_error_test.js +0 -884
- package/test/lib/promise_flow_test.js +0 -2288
- package/test/lib/promise_generator_test.js +0 -310
- package/test/phantomjs/execute_phantomjs_test.js +0 -59
- package/test/testing/assert_test.js +0 -373
- package/test/testing/index_test.js +0 -224
- package/testing/assert.js +0 -378
package/test/lib/promise_test.js
CHANGED
|
@@ -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
|
-
|
|
79
|
-
it('
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
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
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
assert.equal(
|
|
105
|
-
assert.
|
|
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
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
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
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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
|
-
|
|
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
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
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
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
148
|
+
it('rejectsIfArrayPromiseRejects', function() {
|
|
149
|
+
var nestedPromise = createRejectedPromise(new StubError);
|
|
150
|
+
var aPromise = Promise.resolve([true, nestedPromise]);
|
|
295
151
|
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
});
|
|
152
|
+
var pair = callbackPair(null, assertIsStubError);
|
|
153
|
+
return promise.fullyResolved(aPromise)
|
|
154
|
+
.then(assert.fail, assertIsStubError);
|
|
300
155
|
});
|
|
301
|
-
});
|
|
302
156
|
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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
|
-
|
|
312
|
-
|
|
313
|
-
|
|
171
|
+
it('rejectsIfNestedArrayPromiseRejects', function() {
|
|
172
|
+
var aPromise = Promise.resolve([
|
|
173
|
+
Promise.resolve([
|
|
174
|
+
createRejectedPromise(new StubError)
|
|
175
|
+
])
|
|
176
|
+
]);
|
|
314
177
|
|
|
315
|
-
|
|
316
|
-
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
-
|
|
331
|
-
|
|
332
|
-
|
|
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
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
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
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
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
|
-
|
|
386
|
-
|
|
387
|
-
.
|
|
388
|
-
|
|
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
|
-
|
|
393
|
-
|
|
394
|
-
|
|
224
|
+
it('promiseResolvesToHashWithPromises', function() {
|
|
225
|
+
var aPromise = Promise.resolve({
|
|
226
|
+
'a': Promise.resolve(123)
|
|
395
227
|
});
|
|
396
228
|
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
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
|
-
|
|
412
|
-
|
|
413
|
-
|
|
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
|
-
|
|
421
|
-
|
|
422
|
-
|
|
240
|
+
return promise.fullyResolved(aPromise)
|
|
241
|
+
.then(assert.fail, assertIsStubError);
|
|
242
|
+
});
|
|
423
243
|
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
244
|
+
it('rejectsIfNestedHashPromiseRejects', function() {
|
|
245
|
+
var aPromise = Promise.resolve({
|
|
246
|
+
'a': {'b': createRejectedPromise(new StubError)}
|
|
427
247
|
});
|
|
428
248
|
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
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
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
]);
|
|
253
|
+
it('instantiatedObject', function() {
|
|
254
|
+
function Foo() {
|
|
255
|
+
this.bar = 'baz';
|
|
256
|
+
}
|
|
257
|
+
var foo = new Foo;
|
|
449
258
|
|
|
450
|
-
|
|
451
|
-
|
|
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
|
-
|
|
455
|
-
|
|
456
|
-
|
|
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
|
-
|
|
464
|
-
|
|
465
|
-
|
|
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
|
-
|
|
476
|
-
|
|
477
|
-
|
|
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
|
-
|
|
484
|
-
|
|
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
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
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
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
});
|
|
302
|
+
it('failing callback suppresses original error', async () => {
|
|
303
|
+
let p = Promise.reject(Error('original'));
|
|
304
|
+
let called = false;
|
|
511
305
|
|
|
512
|
-
|
|
513
|
-
|
|
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
|
-
|
|
517
|
-
|
|
518
|
-
|
|
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
|
-
|
|
522
|
-
|
|
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
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
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
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
assert.
|
|
535
|
-
|
|
536
|
-
});
|
|
340
|
+
describe('checkedNodeCall', function() {
|
|
341
|
+
it('functionThrows', function() {
|
|
342
|
+
return promise.checkedNodeCall(throwStubError)
|
|
343
|
+
.then(assert.fail, assertIsStubError);
|
|
344
|
+
});
|
|
537
345
|
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
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
|
-
|
|
545
|
-
|
|
546
|
-
|
|
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
|
-
|
|
551
|
-
|
|
552
|
-
|
|
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
|
-
|
|
555
|
-
|
|
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
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
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
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
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
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
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
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
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
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
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
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
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
|
-
|
|
624
|
-
|
|
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
|
-
|
|
628
|
-
|
|
629
|
-
|
|
429
|
+
setTimeout(function() {
|
|
430
|
+
pair.assertNeither();
|
|
431
|
+
input.resolve([1, 2, 3]);
|
|
432
|
+
}, 10);
|
|
630
433
|
|
|
631
|
-
|
|
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
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
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
|
-
|
|
651
|
-
|
|
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
|
-
|
|
671
|
-
|
|
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
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
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
|
-
|
|
695
|
-
|
|
465
|
+
it('rejectsPromiseIfFunctionThrows', function() {
|
|
466
|
+
return promise.map([1], throwStubError)
|
|
467
|
+
.then(assert.fail, assertIsStubError);
|
|
468
|
+
});
|
|
696
469
|
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
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
|
-
|
|
726
|
-
|
|
727
|
-
|
|
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
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
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
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
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
|
-
|
|
750
|
-
|
|
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
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
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
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
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
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
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
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
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
|
-
|
|
831
|
-
|
|
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
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
];
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
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
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
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
|
-
|
|
883
|
-
|
|
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
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
];
|
|
589
|
+
it('waitsForFunctionResultToResolve', function() {
|
|
590
|
+
var innerResults = [
|
|
591
|
+
defer(),
|
|
592
|
+
defer()
|
|
593
|
+
];
|
|
901
594
|
|
|
902
|
-
|
|
903
|
-
|
|
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
|
-
|
|
909
|
-
|
|
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
|
-
|
|
947
|
-
|
|
948
|
-
|
|
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('
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
assert.
|
|
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
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
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
|
-
|
|
977
|
-
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
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
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
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
|
-
|
|
1028
|
-
|
|
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
|
-
|
|
1064
|
-
|
|
1065
|
-
|
|
1066
|
-
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
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
|
});
|