OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 14 matching lines...) Expand all Loading... |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 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. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 // Flags: --allow-natives-syntax --harmony-tostring | 28 // Flags: --allow-natives-syntax --harmony-tostring |
29 | 29 |
30 // Make sure we don't rely on functions patchable by monkeys. | 30 // Make sure we don't rely on functions patchable by monkeys. |
31 var call = Function.prototype.call.call.bind(Function.prototype.call) | 31 var call = Function.prototype.call.call.bind(Function.prototype.call) |
32 var observe = Object.observe; | 32 var observe = Object.observe; |
33 var getOwnPropertyNames = Object.getOwnPropertyNames; | 33 var getOwnPropertyNames = Object.getOwnPropertyNames; |
34 var defineProperty = Object.defineProperty; | 34 var defineProperty = Object.defineProperty; |
| 35 var numberPrototype = Number.prototype; |
| 36 var symbolIterator = Symbol.iterator; |
35 | 37 |
36 | 38 |
37 (function() { | 39 (function() { |
38 // Test before clearing global (fails otherwise) | 40 // Test before clearing global (fails otherwise) |
39 assertEquals("[object Promise]", | 41 assertEquals("[object Promise]", |
40 Object.prototype.toString.call(new Promise(function() {}))); | 42 Object.prototype.toString.call(new Promise(function() {}))); |
41 })(); | 43 })(); |
42 | 44 |
43 | 45 |
44 function clear(o) { | 46 function clear(o) { |
(...skipping 585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
630 var p = deferred.promise | 632 var p = deferred.promise |
631 deferred.resolve(p) | 633 deferred.resolve(p) |
632 p.then( | 634 p.then( |
633 assertUnreachable, | 635 assertUnreachable, |
634 function(r) { assertAsync(r instanceof TypeError, "cyclic/deferred/then") } | 636 function(r) { assertAsync(r instanceof TypeError, "cyclic/deferred/then") } |
635 ) | 637 ) |
636 assertAsyncRan() | 638 assertAsyncRan() |
637 })(); | 639 })(); |
638 | 640 |
639 (function() { | 641 (function() { |
640 Promise.all({}).chain( | |
641 assertUnreachable, | |
642 function(r) { assertAsync(r instanceof TypeError, "all/no-array") } | |
643 ) | |
644 assertAsyncRan() | |
645 })(); | |
646 | |
647 (function() { | |
648 Promise.all([]).chain( | 642 Promise.all([]).chain( |
649 function(x) { assertAsync(x.length === 0, "all/resolve/empty") }, | 643 function(x) { assertAsync(x.length === 0, "all/resolve/empty") }, |
650 assertUnreachable | 644 assertUnreachable |
651 ) | 645 ) |
652 assertAsyncRan() | 646 assertAsyncRan() |
653 })(); | 647 })(); |
654 | 648 |
655 (function() { | 649 (function() { |
| 650 function testPromiseAllNonIterable(value) { |
| 651 Promise.all(value).chain( |
| 652 assertUnreachable, |
| 653 function(r) { |
| 654 assertAsync(r instanceof TypeError, 'all/non iterable'); |
| 655 }); |
| 656 assertAsyncRan(); |
| 657 } |
| 658 testPromiseAllNonIterable(null); |
| 659 testPromiseAllNonIterable(undefined); |
| 660 testPromiseAllNonIterable({}); |
| 661 testPromiseAllNonIterable(42); |
| 662 })(); |
| 663 |
| 664 (function() { |
| 665 var deferred = Promise.defer(); |
| 666 var p = deferred.promise; |
| 667 function* f() { |
| 668 yield 1; |
| 669 yield p; |
| 670 yield 3; |
| 671 } |
| 672 Promise.all(f()).chain( |
| 673 function(x) { |
| 674 assertAsync(x.length === 3, "all/resolve/iterable"); |
| 675 assertAsync(x[0] === 1, "all/resolve/iterable/0"); |
| 676 assertAsync(x[1] === 2, "all/resolve/iterable/1"); |
| 677 assertAsync(x[2] === 3, "all/resolve/iterable/2"); |
| 678 }, |
| 679 assertUnreachable); |
| 680 deferred.resolve(2); |
| 681 assertAsyncRan(); |
| 682 assertAsyncRan(); |
| 683 assertAsyncRan(); |
| 684 assertAsyncRan(); |
| 685 })(); |
| 686 |
| 687 |
| 688 (function() { |
656 var deferred1 = Promise.defer() | 689 var deferred1 = Promise.defer() |
657 var p1 = deferred1.promise | 690 var p1 = deferred1.promise |
658 var deferred2 = Promise.defer() | 691 var deferred2 = Promise.defer() |
659 var p2 = deferred2.promise | 692 var p2 = deferred2.promise |
660 var deferred3 = Promise.defer() | 693 var deferred3 = Promise.defer() |
661 var p3 = deferred3.promise | 694 var p3 = deferred3.promise |
662 Promise.all([p1, p2, p3]).chain( | 695 Promise.all([p1, p2, p3]).chain( |
663 function(x) { | 696 function(x) { |
664 assertAsync(x.length === 3, "all/resolve") | 697 assertAsync(x.length === 3, "all/resolve") |
665 assertAsync(x[0] === 1, "all/resolve/0") | 698 assertAsync(x[0] === 1, "all/resolve/0") |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
699 Promise.all([p1, p2, p3]).chain( | 732 Promise.all([p1, p2, p3]).chain( |
700 assertUnreachable, | 733 assertUnreachable, |
701 function(x) { assertAsync(x === 2, "all/reject") } | 734 function(x) { assertAsync(x === 2, "all/reject") } |
702 ) | 735 ) |
703 deferred1.resolve(1) | 736 deferred1.resolve(1) |
704 deferred3.resolve(3) | 737 deferred3.resolve(3) |
705 deferred2.reject(2) | 738 deferred2.reject(2) |
706 assertAsyncRan() | 739 assertAsyncRan() |
707 })(); | 740 })(); |
708 | 741 |
| 742 |
| 743 (function() { |
| 744 'use strict'; |
| 745 var getCalls = 0; |
| 746 var funcCalls = 0; |
| 747 var nextCalls = 0; |
| 748 defineProperty(numberPrototype, symbolIterator, { |
| 749 get: function() { |
| 750 assertEquals('number', typeof this); |
| 751 getCalls++; |
| 752 return function() { |
| 753 assertEquals('number', typeof this); |
| 754 funcCalls++; |
| 755 var n = this; |
| 756 var i = 0 |
| 757 return { |
| 758 next() { |
| 759 nextCalls++; |
| 760 return {value: i++, done: i > n}; |
| 761 } |
| 762 }; |
| 763 }; |
| 764 }, |
| 765 configurable: true |
| 766 }); |
| 767 |
| 768 Promise.all(3).chain( |
| 769 function(x) { |
| 770 assertAsync(x.length === 3, "all/iterable/number/length"); |
| 771 assertAsync(x[0] === 0, "all/iterable/number/0"); |
| 772 assertAsync(x[1] === 1, "all/iterable/number/1"); |
| 773 assertAsync(x[2] === 2, "all/iterable/number/2"); |
| 774 }, |
| 775 assertUnreachable); |
| 776 delete numberPrototype[symbolIterator]; |
| 777 |
| 778 assertEquals(getCalls, 1); |
| 779 assertEquals(funcCalls, 1); |
| 780 assertEquals(nextCalls, 3 + 1); // + 1 for {done: true} |
| 781 assertAsyncRan(); |
| 782 assertAsyncRan(); |
| 783 assertAsyncRan(); |
| 784 assertAsyncRan(); |
| 785 })(); |
| 786 |
| 787 |
709 (function() { | 788 (function() { |
710 Promise.race([]).chain( | 789 Promise.race([]).chain( |
711 assertUnreachable, | 790 assertUnreachable, |
712 assertUnreachable | 791 assertUnreachable |
713 ) | 792 ) |
714 })(); | 793 })(); |
715 | 794 |
716 (function() { | 795 (function() { |
717 var p1 = Promise.accept(1) | 796 var p1 = Promise.accept(1) |
718 var p2 = Promise.accept(2) | 797 var p2 = Promise.accept(2) |
(...skipping 10 matching lines...) Expand all Loading... |
729 var p2 = Promise.accept(2) | 808 var p2 = Promise.accept(2) |
730 var p3 = Promise.accept(3) | 809 var p3 = Promise.accept(3) |
731 Promise.race([0, p1, p2, p3]).chain( | 810 Promise.race([0, p1, p2, p3]).chain( |
732 function(x) { assertAsync(x === 0, "resolved-const/one") }, | 811 function(x) { assertAsync(x === 0, "resolved-const/one") }, |
733 assertUnreachable | 812 assertUnreachable |
734 ) | 813 ) |
735 assertAsyncRan() | 814 assertAsyncRan() |
736 })(); | 815 })(); |
737 | 816 |
738 (function() { | 817 (function() { |
739 Promise.race({}).chain( | |
740 assertUnreachable, | |
741 function(r) { assertAsync(r instanceof TypeError, "one/no-array") } | |
742 ) | |
743 assertAsyncRan() | |
744 })(); | |
745 | |
746 (function() { | |
747 var deferred1 = Promise.defer() | 818 var deferred1 = Promise.defer() |
748 var p1 = deferred1.promise | 819 var p1 = deferred1.promise |
749 var deferred2 = Promise.defer() | 820 var deferred2 = Promise.defer() |
750 var p2 = deferred2.promise | 821 var p2 = deferred2.promise |
751 var deferred3 = Promise.defer() | 822 var deferred3 = Promise.defer() |
752 var p3 = deferred3.promise | 823 var p3 = deferred3.promise |
753 Promise.race([p1, p2, p3]).chain( | 824 Promise.race([p1, p2, p3]).chain( |
754 function(x) { assertAsync(x === 3, "one/resolve") }, | 825 function(x) { assertAsync(x === 3, "one/resolve") }, |
755 assertUnreachable | 826 assertUnreachable |
756 ) | 827 ) |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
797 var p3 = deferred3.promise | 868 var p3 = deferred3.promise |
798 Promise.race([p1, p2, p3]).chain( | 869 Promise.race([p1, p2, p3]).chain( |
799 assertUnreachable, | 870 assertUnreachable, |
800 function(x) { assertAsync(x === 3, "one/reject/resolve") } | 871 function(x) { assertAsync(x === 3, "one/reject/resolve") } |
801 ) | 872 ) |
802 deferred3.reject(3) | 873 deferred3.reject(3) |
803 deferred1.resolve(1) | 874 deferred1.resolve(1) |
804 assertAsyncRan() | 875 assertAsyncRan() |
805 })(); | 876 })(); |
806 | 877 |
| 878 |
| 879 (function() { |
| 880 function testPromiseRaceNonIterable(value) { |
| 881 Promise.race(value).chain( |
| 882 assertUnreachable, |
| 883 function(r) { |
| 884 assertAsync(r instanceof TypeError, 'race/non iterable'); |
| 885 }); |
| 886 assertAsyncRan(); |
| 887 } |
| 888 testPromiseRaceNonIterable(null); |
| 889 testPromiseRaceNonIterable(undefined); |
| 890 testPromiseRaceNonIterable({}); |
| 891 testPromiseRaceNonIterable(42); |
| 892 })(); |
| 893 |
| 894 |
| 895 (function() { |
| 896 var deferred1 = Promise.defer() |
| 897 var p1 = deferred1.promise |
| 898 var deferred2 = Promise.defer() |
| 899 var p2 = deferred2.promise |
| 900 var deferred3 = Promise.defer() |
| 901 var p3 = deferred3.promise |
| 902 function* f() { |
| 903 yield p1; |
| 904 yield p2; |
| 905 yield p3; |
| 906 } |
| 907 Promise.race(f()).chain( |
| 908 function(x) { assertAsync(x === 3, "race/iterable/resolve/reject") }, |
| 909 assertUnreachable |
| 910 ) |
| 911 deferred3.resolve(3) |
| 912 deferred1.reject(1) |
| 913 assertAsyncRan() |
| 914 })(); |
| 915 |
| 916 (function() { |
| 917 var deferred1 = Promise.defer() |
| 918 var p1 = deferred1.promise |
| 919 var deferred2 = Promise.defer() |
| 920 var p2 = deferred2.promise |
| 921 var deferred3 = Promise.defer() |
| 922 var p3 = deferred3.promise |
| 923 function* f() { |
| 924 yield p1; |
| 925 yield p2; |
| 926 yield p3; |
| 927 } |
| 928 Promise.race(f()).chain( |
| 929 assertUnreachable, |
| 930 function(x) { assertAsync(x === 3, "race/iterable/reject/resolve") } |
| 931 ) |
| 932 deferred3.reject(3) |
| 933 deferred1.resolve(1) |
| 934 assertAsyncRan() |
| 935 })(); |
| 936 |
| 937 (function() { |
| 938 'use strict'; |
| 939 var getCalls = 0; |
| 940 var funcCalls = 0; |
| 941 var nextCalls = 0; |
| 942 defineProperty(numberPrototype, symbolIterator, { |
| 943 get: function() { |
| 944 assertEquals('number', typeof this); |
| 945 getCalls++; |
| 946 return function() { |
| 947 assertEquals('number', typeof this); |
| 948 funcCalls++; |
| 949 var n = this; |
| 950 var i = 0 |
| 951 return { |
| 952 next() { |
| 953 nextCalls++; |
| 954 return {value: i++, done: i > n}; |
| 955 } |
| 956 }; |
| 957 }; |
| 958 }, |
| 959 configurable: true |
| 960 }); |
| 961 |
| 962 Promise.race(3).chain( |
| 963 function(x) { |
| 964 assertAsync(x === 0, "race/iterable/number"); |
| 965 }, |
| 966 assertUnreachable); |
| 967 delete numberPrototype[symbolIterator]; |
| 968 |
| 969 assertEquals(getCalls, 1); |
| 970 assertEquals(funcCalls, 1); |
| 971 assertEquals(nextCalls, 3 + 1); // + 1 for {done: true} |
| 972 assertAsyncRan(); |
| 973 })(); |
| 974 |
807 (function() { | 975 (function() { |
808 var log | 976 var log |
809 function MyPromise(resolver) { | 977 function MyPromise(resolver) { |
810 log += "n" | 978 log += "n" |
811 var promise = new Promise(function(resolve, reject) { | 979 var promise = new Promise(function(resolve, reject) { |
812 resolver( | 980 resolver( |
813 function(x) { log += "x" + x; resolve(x) }, | 981 function(x) { log += "x" + x; resolve(x) }, |
814 function(r) { log += "r" + r; reject(r) } | 982 function(r) { log += "r" + r; reject(r) } |
815 ) | 983 ) |
816 }) | 984 }) |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 Promise.all([11, Promise.accept(12), 13, MyPromise.accept(14), 15, 16]) | 1028 Promise.all([11, Promise.accept(12), 13, MyPromise.accept(14), 15, 16]) |
861 assertTrue(log === "nx14n", "subclass/all/arg") | 1029 assertTrue(log === "nx14n", "subclass/all/arg") |
862 | 1030 |
863 log = "" | 1031 log = "" |
864 MyPromise.all([21, Promise.accept(22), 23, MyPromise.accept(24), 25, 26]) | 1032 MyPromise.all([21, Promise.accept(22), 23, MyPromise.accept(24), 25, 26]) |
865 assertTrue(log === "nx24nnx21nnx23nnnx25nnx26n", "subclass/all/self") | 1033 assertTrue(log === "nx24nnx21nnx23nnnx25nnx26n", "subclass/all/self") |
866 })(); | 1034 })(); |
867 | 1035 |
868 | 1036 |
869 assertAsyncDone() | 1037 assertAsyncDone() |
OLD | NEW |