Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(744)

Side by Side Diff: test/mjsunit/es6/promises.js

Issue 948843004: Promise.all and race should work with iterables (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Update commment and todo Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/promise.js ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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()
OLDNEW
« no previous file with comments | « src/promise.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698