1// Copyright 2013 the V8 project authors. All rights reserved. 2// Redistribution and use in source and binary forms, with or without 3// modification, are permitted provided that the following conditions are 4// met: 5// 6// * Redistributions of source code must retain the above copyright 7// notice, this list of conditions and the following disclaimer. 8// * Redistributions in binary form must reproduce the above 9// copyright notice, this list of conditions and the following 10// disclaimer in the documentation and/or other materials provided 11// with the distribution. 12// * Neither the name of Google Inc. nor the names of its 13// contributors may be used to endorse or promote products derived 14// from this software without specific prior written permission. 15// 16// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 28// Flags: --harmony-promises --harmony-observation --allow-natives-syntax 29 30var asyncAssertsExpected = 0; 31 32function assertAsyncRan() { ++asyncAssertsExpected } 33 34function assertAsync(b, s) { 35 if (b) { 36 print(s, "succeeded") 37 } else { 38 %AbortJS(s + " FAILED!") // Simply throwing here will have no effect. 39 } 40 --asyncAssertsExpected 41} 42 43function assertAsyncDone(iteration) { 44 var iteration = iteration || 0 45 var dummy = {} 46 Object.observe(dummy, 47 function() { 48 if (asyncAssertsExpected === 0) 49 assertAsync(true, "all") 50 else if (iteration > 10) // Shouldn't take more. 51 assertAsync(false, "all") 52 else 53 assertAsyncDone(iteration + 1) 54 } 55 ) 56 dummy.dummy = dummy 57} 58 59 60(function() { 61 assertThrows(function() { new Promise(5) }, TypeError) 62})(); 63 64(function() { 65 assertThrows(function() { new Promise(function() { throw 5 }) }, 5) 66})(); 67 68(function() { 69 Promise.resolved(5); 70 Promise.resolved(5).chain(undefined, assertUnreachable).chain( 71 function(x) { assertAsync(x === 5, "resolved/chain-nohandler") }, 72 assertUnreachable 73 ) 74 assertAsyncRan() 75})(); 76 77(function() { 78 Promise.rejected(5).chain(assertUnreachable, undefined).chain( 79 assertUnreachable, 80 function(r) { assertAsync(r === 5, "rejected/chain-nohandler") } 81 ) 82 assertAsyncRan() 83})(); 84 85(function() { 86 Promise.resolved(5).then(undefined, assertUnreachable).chain( 87 function(x) { assertAsync(x === 5, "resolved/then-nohandler") }, 88 assertUnreachable 89 ) 90 assertAsyncRan() 91})(); 92 93(function() { 94 Promise.rejected(5).then(assertUnreachable, undefined).chain( 95 assertUnreachable, 96 function(r) { assertAsync(r === 5, "rejected/then-nohandler") } 97 ) 98 assertAsyncRan() 99})(); 100 101(function() { 102 var p1 = Promise.resolved(5) 103 var p2 = Promise.resolved(p1) 104 var p3 = Promise.resolved(p2) 105 p3.chain( 106 function(x) { assertAsync(x === p2, "resolved/chain") }, 107 assertUnreachable 108 ) 109 assertAsyncRan() 110})(); 111 112(function() { 113 var p1 = Promise.resolved(5) 114 var p2 = Promise.resolved(p1) 115 var p3 = Promise.resolved(p2) 116 p3.then( 117 function(x) { assertAsync(x === 5, "resolved/then") }, 118 assertUnreachable 119 ) 120 assertAsyncRan() 121})(); 122 123(function() { 124 var p1 = Promise.rejected(5) 125 var p2 = Promise.resolved(p1) 126 var p3 = Promise.resolved(p2) 127 p3.chain( 128 function(x) { assertAsync(x === p2, "rejected/chain") }, 129 assertUnreachable 130 ) 131 assertAsyncRan() 132})(); 133 134(function() { 135 var p1 = Promise.rejected(5) 136 var p2 = Promise.resolved(p1) 137 var p3 = Promise.resolved(p2) 138 p3.then( 139 assertUnreachable, 140 function(x) { assertAsync(x === 5, "rejected/then") } 141 ) 142 assertAsyncRan() 143})(); 144 145(function() { 146 var p1 = Promise.resolved(5) 147 var p2 = Promise.resolved(p1) 148 var p3 = Promise.resolved(p2) 149 p3.chain(function(x) { return x }, assertUnreachable).chain( 150 function(x) { assertAsync(x === p1, "resolved/chain/chain") }, 151 assertUnreachable 152 ) 153 assertAsyncRan() 154})(); 155 156(function() { 157 var p1 = Promise.resolved(5) 158 var p2 = Promise.resolved(p1) 159 var p3 = Promise.resolved(p2) 160 p3.chain(function(x) { return x }, assertUnreachable).then( 161 function(x) { assertAsync(x === 5, "resolved/chain/then") }, 162 assertUnreachable 163 ) 164 assertAsyncRan() 165})(); 166 167(function() { 168 var p1 = Promise.resolved(5) 169 var p2 = Promise.resolved(p1) 170 var p3 = Promise.resolved(p2) 171 p3.chain(function(x) { return 6 }, assertUnreachable).chain( 172 function(x) { assertAsync(x === 6, "resolved/chain/chain2") }, 173 assertUnreachable 174 ) 175 assertAsyncRan() 176})(); 177 178(function() { 179 var p1 = Promise.resolved(5) 180 var p2 = Promise.resolved(p1) 181 var p3 = Promise.resolved(p2) 182 p3.chain(function(x) { return 6 }, assertUnreachable).then( 183 function(x) { assertAsync(x === 6, "resolved/chain/then2") }, 184 assertUnreachable 185 ) 186 assertAsyncRan() 187})(); 188 189(function() { 190 var p1 = Promise.resolved(5) 191 var p2 = Promise.resolved(p1) 192 var p3 = Promise.resolved(p2) 193 p3.then(function(x) { return x + 1 }, assertUnreachable).chain( 194 function(x) { assertAsync(x === 6, "resolved/then/chain") }, 195 assertUnreachable 196 ) 197 assertAsyncRan() 198})(); 199 200(function() { 201 var p1 = Promise.resolved(5) 202 var p2 = Promise.resolved(p1) 203 var p3 = Promise.resolved(p2) 204 p3.then(function(x) { return x + 1 }, assertUnreachable).then( 205 function(x) { assertAsync(x === 6, "resolved/then/then") }, 206 assertUnreachable 207 ) 208 assertAsyncRan() 209})(); 210 211(function() { 212 var p1 = Promise.resolved(5) 213 var p2 = Promise.resolved(p1) 214 var p3 = Promise.resolved(p2) 215 p3.then(function(x){ return Promise.resolved(x+1) }, assertUnreachable).chain( 216 function(x) { assertAsync(x === 6, "resolved/then/chain2") }, 217 assertUnreachable 218 ) 219 assertAsyncRan() 220})(); 221 222(function() { 223 var p1 = Promise.resolved(5) 224 var p2 = Promise.resolved(p1) 225 var p3 = Promise.resolved(p2) 226 p3.then(function(x) { return Promise.resolved(x+1) }, assertUnreachable).then( 227 function(x) { assertAsync(x === 6, "resolved/then/then2") }, 228 assertUnreachable 229 ) 230 assertAsyncRan() 231})(); 232 233(function() { 234 var p1 = Promise.resolved(5) 235 var p2 = Promise.resolved(p1) 236 var p3 = Promise.resolved(p2) 237 p3.chain(function(x) { throw 6 }, assertUnreachable).chain( 238 assertUnreachable, 239 function(x) { assertAsync(x === 6, "resolved/chain-throw/chain") } 240 ) 241 assertAsyncRan() 242})(); 243 244(function() { 245 var p1 = Promise.resolved(5) 246 var p2 = Promise.resolved(p1) 247 var p3 = Promise.resolved(p2) 248 p3.chain(function(x) { throw 6 }, assertUnreachable).then( 249 assertUnreachable, 250 function(x) { assertAsync(x === 6, "resolved/chain-throw/then") } 251 ) 252 assertAsyncRan() 253})(); 254 255(function() { 256 var p1 = Promise.resolved(5) 257 var p2 = Promise.resolved(p1) 258 var p3 = Promise.resolved(p2) 259 p3.then(function(x) { throw 6 }, assertUnreachable).chain( 260 assertUnreachable, 261 function(x) { assertAsync(x === 6, "resolved/then-throw/chain") } 262 ) 263 assertAsyncRan() 264})(); 265 266(function() { 267 var p1 = Promise.resolved(5) 268 var p2 = Promise.resolved(p1) 269 var p3 = Promise.resolved(p2) 270 p3.then(function(x) { throw 6 }, assertUnreachable).then( 271 assertUnreachable, 272 function(x) { assertAsync(x === 6, "resolved/then-throw/then") } 273 ) 274 assertAsyncRan() 275})(); 276 277(function() { 278 var p1 = Promise.resolved(5) 279 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 280 var p3 = Promise.resolved(p2) 281 p3.chain( 282 function(x) { assertAsync(x === p2, "resolved/thenable/chain") }, 283 assertUnreachable 284 ) 285 assertAsyncRan() 286})(); 287 288(function() { 289 var p1 = Promise.resolved(5) 290 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 291 var p3 = Promise.resolved(p2) 292 p3.then( 293 function(x) { assertAsync(x === 5, "resolved/thenable/then") }, 294 assertUnreachable 295 ) 296 assertAsyncRan() 297})(); 298 299(function() { 300 var p1 = Promise.rejected(5) 301 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 302 var p3 = Promise.resolved(p2) 303 p3.chain( 304 function(x) { assertAsync(x === p2, "rejected/thenable/chain") }, 305 assertUnreachable 306 ) 307 assertAsyncRan() 308})(); 309 310(function() { 311 var p1 = Promise.rejected(5) 312 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 313 var p3 = Promise.resolved(p2) 314 p3.then( 315 assertUnreachable, 316 function(x) { assertAsync(x === 5, "rejected/thenable/then") } 317 ) 318 assertAsyncRan() 319})(); 320 321(function() { 322 var deferred = Promise.deferred() 323 var p1 = deferred.promise 324 var p2 = Promise.resolved(p1) 325 var p3 = Promise.resolved(p2) 326 p3.chain( 327 function(x) { assertAsync(x === p2, "chain/resolve") }, 328 assertUnreachable 329 ) 330 deferred.resolve(5) 331 assertAsyncRan() 332})(); 333 334(function() { 335 var deferred = Promise.deferred() 336 var p1 = deferred.promise 337 var p2 = Promise.resolved(p1) 338 var p3 = Promise.resolved(p2) 339 p3.then( 340 function(x) { assertAsync(x === 5, "then/resolve") }, 341 assertUnreachable 342 ) 343 deferred.resolve(5) 344 assertAsyncRan() 345})(); 346 347(function() { 348 var deferred = Promise.deferred() 349 var p1 = deferred.promise 350 var p2 = Promise.resolved(p1) 351 var p3 = Promise.resolved(p2) 352 p3.chain( 353 function(x) { assertAsync(x === p2, "chain/reject") }, 354 assertUnreachable 355 ) 356 deferred.reject(5) 357 assertAsyncRan() 358})(); 359 360(function() { 361 var deferred = Promise.deferred() 362 var p1 = deferred.promise 363 var p2 = Promise.resolved(p1) 364 var p3 = Promise.resolved(p2) 365 p3.then( 366 assertUnreachable, 367 function(x) { assertAsync(x === 5, "then/reject") } 368 ) 369 deferred.reject(5) 370 assertAsyncRan() 371})(); 372 373(function() { 374 var deferred = Promise.deferred() 375 var p1 = deferred.promise 376 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 377 var p3 = Promise.resolved(p2) 378 p3.chain( 379 function(x) { assertAsync(x === p2, "chain/resolve/thenable") }, 380 assertUnreachable 381 ) 382 deferred.resolve(5) 383 assertAsyncRan() 384})(); 385 386(function() { 387 var deferred = Promise.deferred() 388 var p1 = deferred.promise 389 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 390 var p3 = Promise.resolved(p2) 391 p3.then( 392 function(x) { assertAsync(x === 5, "then/resolve/thenable") }, 393 assertUnreachable 394 ) 395 deferred.resolve(5) 396 assertAsyncRan() 397})(); 398 399(function() { 400 var deferred = Promise.deferred() 401 var p1 = deferred.promise 402 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 403 var p3 = Promise.resolved(p2) 404 p3.chain( 405 function(x) { assertAsync(x === p2, "chain/reject/thenable") }, 406 assertUnreachable 407 ) 408 deferred.reject(5) 409 assertAsyncRan() 410})(); 411 412(function() { 413 var deferred = Promise.deferred() 414 var p1 = deferred.promise 415 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 416 var p3 = Promise.resolved(p2) 417 p3.then( 418 assertUnreachable, 419 function(x) { assertAsync(x === 5, "then/reject/thenable") } 420 ) 421 deferred.reject(5) 422 assertAsyncRan() 423})(); 424 425(function() { 426 var p1 = Promise.resolved(5) 427 var p2 = Promise.resolved(p1) 428 var deferred = Promise.deferred() 429 var p3 = deferred.promise 430 p3.chain( 431 function(x) { assertAsync(x === p2, "chain/resolve2") }, 432 assertUnreachable 433 ) 434 deferred.resolve(p2) 435 assertAsyncRan() 436})(); 437 438(function() { 439 var p1 = Promise.resolved(5) 440 var p2 = Promise.resolved(p1) 441 var deferred = Promise.deferred() 442 var p3 = deferred.promise 443 p3.then( 444 function(x) { assertAsync(x === 5, "then/resolve2") }, 445 assertUnreachable 446 ) 447 deferred.resolve(p2) 448 assertAsyncRan() 449})(); 450 451(function() { 452 var p1 = Promise.resolved(5) 453 var p2 = Promise.resolved(p1) 454 var deferred = Promise.deferred() 455 var p3 = deferred.promise 456 p3.chain( 457 assertUnreachable, 458 function(x) { assertAsync(x === 5, "chain/reject2") } 459 ) 460 deferred.reject(5) 461 assertAsyncRan() 462})(); 463 464(function() { 465 var p1 = Promise.resolved(5) 466 var p2 = Promise.resolved(p1) 467 var deferred = Promise.deferred() 468 var p3 = deferred.promise 469 p3.then( 470 assertUnreachable, 471 function(x) { assertAsync(x === 5, "then/reject2") } 472 ) 473 deferred.reject(5) 474 assertAsyncRan() 475})(); 476 477(function() { 478 var p1 = Promise.resolved(5) 479 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 480 var deferred = Promise.deferred() 481 var p3 = deferred.promise 482 p3.chain( 483 function(x) { assertAsync(x === p2, "chain/resolve/thenable2") }, 484 assertUnreachable 485 ) 486 deferred.resolve(p2) 487 assertAsyncRan() 488})(); 489 490(function() { 491 var p1 = Promise.resolved(5) 492 var p2 = {then: function(onResolve, onReject) { onResolve(p1) }} 493 var deferred = Promise.deferred() 494 var p3 = deferred.promise 495 p3.then( 496 function(x) { assertAsync(x === 5, "then/resolve/thenable2") }, 497 assertUnreachable 498 ) 499 deferred.resolve(p2) 500 assertAsyncRan() 501})(); 502 503(function() { 504 var p1 = Promise.resolved(0) 505 var p2 = p1.chain(function(x) { return p2 }, assertUnreachable) 506 p2.chain( 507 assertUnreachable, 508 function(r) { assertAsync(r instanceof TypeError, "cyclic/chain") } 509 ) 510 assertAsyncRan() 511})(); 512 513(function() { 514 var p1 = Promise.resolved(0) 515 var p2 = p1.then(function(x) { return p2 }, assertUnreachable) 516 p2.chain( 517 assertUnreachable, 518 function(r) { assertAsync(r instanceof TypeError, "cyclic/then") } 519 ) 520 assertAsyncRan() 521})(); 522 523(function() { 524 var deferred = Promise.deferred() 525 var p = deferred.promise 526 deferred.resolve(p) 527 p.chain( 528 function(x) { assertAsync(x === p, "cyclic/deferred/chain") }, 529 assertUnreachable 530 ) 531 assertAsyncRan() 532})(); 533 534(function() { 535 var deferred = Promise.deferred() 536 var p = deferred.promise 537 deferred.resolve(p) 538 p.then( 539 assertUnreachable, 540 function(r) { assertAsync(r instanceof TypeError, "cyclic/deferred/then") } 541 ) 542 assertAsyncRan() 543})(); 544 545(function() { 546 Promise.all([]).chain( 547 function(x) { assertAsync(x.length === 0, "all/resolve/empty") }, 548 assertUnreachable 549 ) 550 assertAsyncRan() 551})(); 552 553(function() { 554 var deferred1 = Promise.deferred() 555 var p1 = deferred1.promise 556 var deferred2 = Promise.deferred() 557 var p2 = deferred2.promise 558 var deferred3 = Promise.deferred() 559 var p3 = deferred3.promise 560 Promise.all([p1, p2, p3]).chain( 561 function(x) { 562 assertAsync(x.length === 3, "all/resolve") 563 assertAsync(x[0] === 1, "all/resolve/0") 564 assertAsync(x[1] === 2, "all/resolve/1") 565 assertAsync(x[2] === 3, "all/resolve/2") 566 }, 567 assertUnreachable 568 ) 569 deferred1.resolve(1) 570 deferred3.resolve(3) 571 deferred2.resolve(2) 572 assertAsyncRan() 573 assertAsyncRan() 574 assertAsyncRan() 575 assertAsyncRan() 576})(); 577 578(function() { 579 var deferred = Promise.deferred() 580 var p1 = deferred.promise 581 var p2 = Promise.resolved(2) 582 var p3 = Promise.deferred().promise 583 Promise.all([p1, p2, p3]).chain( 584 assertUnreachable, 585 assertUnreachable 586 ) 587 deferred.resolve(1) 588})(); 589 590(function() { 591 var deferred1 = Promise.deferred() 592 var p1 = deferred1.promise 593 var deferred2 = Promise.deferred() 594 var p2 = deferred2.promise 595 var deferred3 = Promise.deferred() 596 var p3 = deferred3.promise 597 Promise.all([p1, p2, p3]).chain( 598 assertUnreachable, 599 function(x) { assertAsync(x === 2, "all/reject") } 600 ) 601 deferred1.resolve(1) 602 deferred3.resolve(3) 603 deferred2.reject(2) 604 assertAsyncRan() 605})(); 606 607(function() { 608 Promise.one([]).chain( 609 assertUnreachable, 610 assertUnreachable 611 ) 612})(); 613 614(function() { 615 var p1 = Promise.resolved(1) 616 var p2 = Promise.resolved(2) 617 var p3 = Promise.resolved(3) 618 Promise.one([p1, p2, p3]).chain( 619 function(x) { assertAsync(x === 1, "resolved/all") }, 620 assertUnreachable 621 ) 622 assertAsyncRan() 623})(); 624 625(function() { 626 var p1 = Promise.resolved(1) 627 var p2 = Promise.resolved(2) 628 var p3 = Promise.resolved(3) 629 Promise.one([0, p1, p2, p3]).chain( 630 function(x) { assertAsync(x === 0, "resolved-const/all") }, 631 assertUnreachable 632 ) 633 assertAsyncRan() 634})(); 635 636(function() { 637 var deferred1 = Promise.deferred() 638 var p1 = deferred1.promise 639 var deferred2 = Promise.deferred() 640 var p2 = deferred2.promise 641 var deferred3 = Promise.deferred() 642 var p3 = deferred3.promise 643 Promise.one([p1, p2, p3]).chain( 644 function(x) { assertAsync(x === 3, "one/resolve") }, 645 assertUnreachable 646 ) 647 deferred3.resolve(3) 648 deferred1.resolve(1) 649 assertAsyncRan() 650})(); 651 652(function() { 653 var deferred = Promise.deferred() 654 var p1 = deferred.promise 655 var p2 = Promise.resolved(2) 656 var p3 = Promise.deferred().promise 657 Promise.one([p1, p2, p3]).chain( 658 function(x) { assertAsync(x === 2, "resolved/one") }, 659 assertUnreachable 660 ) 661 deferred.resolve(1) 662 assertAsyncRan() 663})(); 664 665(function() { 666 var deferred1 = Promise.deferred() 667 var p1 = deferred1.promise 668 var deferred2 = Promise.deferred() 669 var p2 = deferred2.promise 670 var deferred3 = Promise.deferred() 671 var p3 = deferred3.promise 672 Promise.one([p1, p2, p3]).chain( 673 function(x) { assertAsync(x === 3, "one/resolve/reject") }, 674 assertUnreachable 675 ) 676 deferred3.resolve(3) 677 deferred1.reject(1) 678 assertAsyncRan() 679})(); 680 681(function() { 682 var deferred1 = Promise.deferred() 683 var p1 = deferred1.promise 684 var deferred2 = Promise.deferred() 685 var p2 = deferred2.promise 686 var deferred3 = Promise.deferred() 687 var p3 = deferred3.promise 688 Promise.one([p1, p2, p3]).chain( 689 assertUnreachable, 690 function(x) { assertAsync(x === 3, "one/reject/resolve") } 691 ) 692 deferred3.reject(3) 693 deferred1.resolve(1) 694 assertAsyncRan() 695})(); 696 697(function() { 698 var log 699 function MyPromise(resolver) { 700 log += "n" 701 Promise.call(this, 702 function(resolve, reject) { 703 resolver( 704 function(x) { log += "x" + x; resolve(x) }, 705 function(r) { log += "r" + r; reject(r) } 706 ) 707 } 708 ) 709 } 710 711 MyPromise.__proto__ = Promise 712 MyPromise.deferred = function() { 713 log += "d" 714 return this.__proto__.deferred.call(this) 715 } 716 717 MyPromise.prototype.__proto__ = Promise.prototype 718 MyPromise.prototype.chain = function(resolve, reject) { 719 log += "w" 720 return this.__proto__.__proto__.chain.call(this, resolve, reject) 721 } 722 723 log = "" 724 var p1 = new MyPromise(function(resolve, reject) { resolve(1) }) 725 var p2 = new MyPromise(function(resolve, reject) { reject(2) }) 726 var d3 = MyPromise.deferred() 727 assertTrue(d3.promise instanceof MyPromise, "subclass/instance3") 728 assertTrue(log === "nx1nr2dn", "subclass/create") 729 730 log = "" 731 var p4 = MyPromise.resolved(4) 732 var p5 = MyPromise.rejected(5) 733 assertTrue(p4 instanceof MyPromise, "subclass/instance4") 734 assertTrue(p5 instanceof MyPromise, "subclass/instance5") 735 d3.resolve(3) 736 assertTrue(log === "nx4nr5x3", "subclass/resolve") 737 738 log = "" 739 var d6 = MyPromise.deferred() 740 d6.promise.chain(function(x) { return new Promise(x) }).chain(function() {}) 741 d6.resolve(6) 742 assertTrue(log === "dnwnwnx6", "subclass/chain") 743 744 log = "" 745 Promise.all([11, Promise.resolved(12), 13, MyPromise.resolved(14), 15, 16]) 746 assertTrue(log === "nx14wn", "subclass/all/arg") 747 748 log = "" 749 MyPromise.all([21, Promise.resolved(22), 23, MyPromise.resolved(24), 25, 26]) 750 assertTrue(log === "nx24dnnx21wnnx23wnwnnx25wnnx26wn", "subclass/all/self") 751})(); 752 753 754assertAsyncDone() 755