Redeclaration of var over let/const/class should be a syntax error.
[WebKit-https.git] / JSTests / stress / for-in-tests.js
1 function shouldThrowSyntaxError(script) {
2     let error;
3     try {
4         eval(script);
5     } catch (e) {
6         error = e;
7     }
8
9     if (!(error instanceof SyntaxError))
10         throw new Error('Expected SyntaxError!');
11 }
12
13 (function() {
14     // Iterate over an array with normal indexed properties.
15     var foo = function() {
16         var a = [1, 2, 3, 4, 5];
17         var sum = 0;
18         var result = "";
19         for (var p in a)
20             result += a[p];
21         return result;
22     };
23     noInline(foo);
24     for (var i = 0; i < 10000; ++i) {
25         if (foo() !== "12345")
26             throw new Error("bad result");
27     }
28     foo(null);
29 })();
30 (function() {
31     // Iterate over an object with normal non-indexed properties.
32     var foo = function() {
33         var o = {};
34         o.x = 1;
35         o.y = 2;
36         o.z = 3;
37         var result = "";
38         for (var p in o)
39             result += o[p];
40         return result;
41     };
42     noInline(foo);
43     for (var i = 0; i < 10000; ++i) {
44         if (foo() !== "123")
45             throw new Error("bad result");
46     }
47     foo(null);
48 })();
49 (function() {
50     // Iterate over an object with both indexed and non-indexed properties.
51     var foo = function() {
52         var o = {};
53         o.x = 1;
54         o.y = 2;
55         o.z = 3;
56         o[0] = 4;
57         o[1] = 5;
58         o[2] = 6;
59         var result = "";
60         for (var p in o)
61             result += o[p];
62         return result;
63     };
64     noInline(foo);
65     for (var i = 0; i < 10000; ++i) {
66         if (foo() != "456123")
67             throw new Error("bad result");
68     }
69     foo(null);
70 })();
71 (function() {
72     // Iterate over an array with both indexed and non-indexed properties.
73     var foo = function() {
74         var a = [4, 5, 6];
75         a.x = 1;
76         a.y = 2;
77         a.z = 3;
78         var result = "";
79         for (var p in a)
80             result += a[p];
81         return result;
82     };
83     noInline(foo);
84     for (var i = 0; i < 10000; ++i) {
85         if (foo() !== "456123")
86             throw new Error("bad result");
87     }
88     foo(null);
89 })();
90 (function() {
91     var foo = function(a, b) {
92         for (var p in b) {
93             var f1 = a[p];
94             var f2 = b[p];
95             if (f1 === f2)
96                 continue;
97             a[p] = b[p];
98         }
99     };
100     noInline(foo);
101     for (var i = 0; i < 10000; ++i) {
102         var o1 = {};
103         var o2 = {};
104         o2.x = 42;
105         o2.y = 53;
106         foo(o1, o2);
107         if (o1.x !== o2.x)
108             throw new Error("bad result: " + o1.x + "!==" + o2.x);
109         if (o1.y !== o2.y)
110             throw new Error("bad result: " + o1.y + "!==" + o2.y);
111     }
112 })();
113
114 (function() {
115     var foo = function(a, b) {
116         for (var p = b in a) {}
117         return p;
118     };
119     noInline(foo);
120     for (var i = 0; i < 10000; ++i) {
121         var expected = 'expected-result';
122         var result = foo({}, expected);
123         if (expected !== result)
124             throw new Error("bad result: " + result + "!==" + expected);
125     }
126     for (var i = 0; i < 10000; ++i) {
127         var expected = 'a';
128         var result = foo({a:'abcd'}, expected);
129         if (expected !== result)
130             throw new Error("bad result: " + result + "!==" + expected);
131     }
132     for (var i = 0; i < 10000; ++i) {
133         var expected = 'b';
134         var result = foo({a:'abcd', b: 'bcde'}, expected);
135         if (expected !== result)
136             throw new Error("bad result: " + result + "!==" + expected);
137     }
138
139     for (var i = 0; i < 10000; ++i) {
140         var expected = 'c';
141         var o = {a:'abcd', b: 'bcde'};
142         o.c = 'cdef';
143         var result = foo(o, expected);
144         if (expected !== result)
145             throw new Error("bad result: " + result + "!==" + expected);
146     }
147 })();
148
149 (function() {
150     var boo = function () { return 'expected-result'; };
151     var foo = function(a) {
152         for (var p = boo() in a) {}
153         return p;
154     };
155     noInline(foo);
156     for (var i = 0; i < 10000; ++i) {
157         var expected = 'expected-result';
158         var result = foo({});
159         if (expected !== result)
160             throw new Error("bad result: " + result + "!==" + expected);
161     }
162 })();
163
164 shouldThrowSyntaxError(
165     `function foo(a, b) {
166         {
167             let p = 'some-value';
168             for (var p = b in a) {}
169         }
170     }`
171 );
172
173 (function() {
174     var foo = function(a, b, c) {
175         for (var p = b + c in a) {}
176         return p;
177     };
178     noInline(foo);
179     for (var i = 0; i < 10000; ++i) {
180         var expected = 'expected-result';
181         var result = foo({}, 'expected', '-result');
182         if (expected !== result)
183             throw new Error("bad result: " + result + "!==" + expected);
184     }
185 })();
186
187 shouldThrowSyntaxError(
188     `function foo() {
189         'use strict';
190         for (var i = 0 in {}) {}
191     }`
192 );
193
194 shouldThrowSyntaxError(
195     `function foo() {
196         const i = 10;
197         for (var i = 0 in {}) {}
198     }`
199 );