OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --harmony-proxies --harmony-reflect | 5 // Flags: --harmony-proxies --harmony-reflect |
6 | 6 |
7 (function testArrayConcatArity() { | 7 (function testArrayConcatArity() { |
8 "use strict"; | 8 "use strict"; |
9 assertEquals(1, Array.prototype.concat.length); | 9 assertEquals(1, Array.prototype.concat.length); |
10 })(); | 10 })(); |
(...skipping 793 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
804 var obj = new Proxy(target, handler); | 804 var obj = new Proxy(target, handler); |
805 | 805 |
806 log.length = 0; | 806 log.length = 0; |
807 assertEquals([obj], [].concat(obj)); | 807 assertEquals([obj], [].concat(obj)); |
808 assertEquals(1, log.length); | 808 assertEquals(1, log.length); |
809 for (var i in log) assertSame(target, log[i][1]); | 809 for (var i in log) assertSame(target, log[i][1]); |
810 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[0]); | 810 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[0]); |
811 | 811 |
812 log.length = 0; | 812 log.length = 0; |
813 assertEquals([obj], Array.prototype.concat.apply(obj)); | 813 assertEquals([obj], Array.prototype.concat.apply(obj)); |
814 assertEquals(1, log.length); | 814 assertEquals(2, log.length); // An extra read for the constructor |
815 for (var i in log) assertSame(target, log[i][1]); | 815 for (var i in log) assertSame(target, log[i][1]); |
816 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[0]); | 816 assertEquals(["get", target, "constructor", obj], log[0]); |
| 817 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[1]); |
817 })(); | 818 })(); |
818 | 819 |
819 | 820 |
820 (function testSpreadableArrayLikeProxy() { | 821 (function testSpreadableArrayLikeProxy() { |
821 var target = ["a", "b"]; | 822 var target = ["a", "b"]; |
822 target[Symbol.isConcatSpreadable] = undefined; | 823 target[Symbol.isConcatSpreadable] = undefined; |
823 var obj = new Proxy(target, handler); | 824 var obj = new Proxy(target, handler); |
824 | 825 |
825 log.length = 0; | 826 log.length = 0; |
826 assertEquals(["a", "b"], [].concat(obj)); | 827 assertEquals(["a", "b"], [].concat(obj)); |
827 assertEquals(6, log.length); | 828 assertEquals(6, log.length); |
828 for (var i in log) assertSame(target, log[i][1]); | 829 for (var i in log) assertSame(target, log[i][1]); |
829 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[0]); | 830 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[0]); |
830 assertEquals(["get", target, "length", obj], log[1]); | 831 assertEquals(["get", target, "length", obj], log[1]); |
831 assertEquals(["has", target, "0"], log[2]); | 832 assertEquals(["has", target, "0"], log[2]); |
832 assertEquals(["get", target, "0", obj], log[3]); | 833 assertEquals(["get", target, "0", obj], log[3]); |
833 assertEquals(["has", target, "1"], log[4]); | 834 assertEquals(["has", target, "1"], log[4]); |
834 assertEquals(["get", target, "1", obj], log[5]); | 835 assertEquals(["get", target, "1", obj], log[5]); |
835 | 836 |
836 log.length = 0; | 837 log.length = 0; |
837 assertEquals(["a", "b"], Array.prototype.concat.apply(obj)); | 838 assertEquals(["a", "b"], Array.prototype.concat.apply(obj)); |
838 assertEquals(6, log.length); | 839 assertEquals(7, log.length); |
839 for (var i in log) assertSame(target, log[i][1]); | 840 for (var i in log) assertSame(target, log[i][1]); |
840 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[0]); | 841 assertEquals(["get", target, "constructor", obj], log[0]); |
841 assertEquals(["get", target, "length", obj], log[1]); | 842 assertEquals(["get", target, Symbol.isConcatSpreadable, obj], log[1]); |
842 assertEquals(["has", target, "0"], log[2]); | 843 assertEquals(["get", target, "length", obj], log[2]); |
843 assertEquals(["get", target, "0", obj], log[3]); | 844 assertEquals(["has", target, "0"], log[3]); |
844 assertEquals(["has", target, "1"], log[4]); | 845 assertEquals(["get", target, "0", obj], log[4]); |
845 assertEquals(["get", target, "1", obj], log[5]); | 846 assertEquals(["has", target, "1"], log[5]); |
| 847 assertEquals(["get", target, "1", obj], log[6]); |
846 })(); | 848 })(); |
847 | 849 |
848 | 850 |
849 (function testSpreadableArrayLikeProxyWithNontrivialLength() { | 851 (function testSpreadableArrayLikeProxyWithNontrivialLength() { |
850 var getTrap = function(t, key) { | 852 var getTrap = function(t, key) { |
851 if (key === "length") return {[Symbol.toPrimitive]() {return 3}}; | 853 if (key === "length") return {[Symbol.toPrimitive]() {return 3}}; |
852 if (key === "2") return "baz"; | 854 if (key === "2") return "baz"; |
853 if (key === "3") return "bar"; | 855 if (key === "3") return "bar"; |
854 }; | 856 }; |
855 var target = []; | 857 var target = []; |
856 var obj = new Proxy(target, {get: getTrap, has: () => true}); | 858 var obj = new Proxy(target, {get: getTrap, has: () => true}); |
857 | 859 |
858 assertEquals([undefined, undefined, "baz"], [].concat(obj)); | 860 assertEquals([undefined, undefined, "baz"], [].concat(obj)); |
859 assertEquals([undefined, undefined, "baz"], Array.prototype.concat.apply(obj)) | 861 assertEquals([undefined, undefined, "baz"], Array.prototype.concat.apply(obj)) |
860 })(); | 862 })(); |
861 | 863 |
862 | 864 |
863 (function testSpreadableArrayLikeProxyWithBogusLength() { | 865 (function testSpreadableArrayLikeProxyWithBogusLength() { |
864 var getTrap = function(t, key) { | 866 var getTrap = function(t, key) { |
865 if (key === "length") return Symbol(); | 867 if (key === "length") return Symbol(); |
866 if (key === "2") return "baz"; | 868 if (key === "2") return "baz"; |
867 if (key === "3") return "bar"; | 869 if (key === "3") return "bar"; |
868 }; | 870 }; |
869 var target = []; | 871 var target = []; |
870 var obj = new Proxy(target, {get: getTrap, has: () => true}); | 872 var obj = new Proxy(target, {get: getTrap, has: () => true}); |
871 | 873 |
872 assertThrows(() => [].concat(obj), TypeError); | 874 assertThrows(() => [].concat(obj), TypeError); |
873 assertThrows(() => Array.prototype.concat.apply(obj), TypeError); | 875 assertThrows(() => Array.prototype.concat.apply(obj), TypeError); |
874 })(); | 876 })(); |
OLD | NEW |