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 30 var asyncAssertsExpected = 0; 31 32 function assertAsyncRan() { ++asyncAssertsExpected } 33 34 function 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 43 function 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 754 assertAsyncDone() 755