Commit | Line | Data |
---|---|---|
e150f77d JK |
1 | #!./perl |
2 | ||
3 | BEGIN { | |
4 | require "test.pl"; | |
5 | } | |
6 | ||
031c6d82 | 7 | plan(106); |
e150f77d JK |
8 | |
9 | # A lot of tests to check that reversed for works. | |
e150f77d JK |
10 | |
11 | @array = ('A', 'B', 'C'); | |
12 | for (@array) { | |
13 | $r .= $_; | |
14 | } | |
15 | is ($r, 'ABC', 'Forwards for array'); | |
16 | $r = ''; | |
17 | for (1,2,3) { | |
18 | $r .= $_; | |
19 | } | |
20 | is ($r, '123', 'Forwards for list'); | |
21 | $r = ''; | |
22 | for (map {$_} @array) { | |
23 | $r .= $_; | |
24 | } | |
25 | is ($r, 'ABC', 'Forwards for array via map'); | |
26 | $r = ''; | |
27 | for (map {$_} 1,2,3) { | |
28 | $r .= $_; | |
29 | } | |
30 | is ($r, '123', 'Forwards for list via map'); | |
31 | $r = ''; | |
32 | for (1 .. 3) { | |
33 | $r .= $_; | |
34 | } | |
35 | is ($r, '123', 'Forwards for list via ..'); | |
36 | $r = ''; | |
37 | for ('A' .. 'C') { | |
38 | $r .= $_; | |
39 | } | |
40 | is ($r, 'ABC', 'Forwards for list via ..'); | |
41 | ||
42 | $r = ''; | |
43 | for (reverse @array) { | |
44 | $r .= $_; | |
45 | } | |
46 | is ($r, 'CBA', 'Reverse for array'); | |
47 | $r = ''; | |
48 | for (reverse 1,2,3) { | |
49 | $r .= $_; | |
50 | } | |
51 | is ($r, '321', 'Reverse for list'); | |
52 | $r = ''; | |
53 | for (reverse map {$_} @array) { | |
54 | $r .= $_; | |
55 | } | |
56 | is ($r, 'CBA', 'Reverse for array via map'); | |
57 | $r = ''; | |
58 | for (reverse map {$_} 1,2,3) { | |
59 | $r .= $_; | |
60 | } | |
61 | is ($r, '321', 'Reverse for list via map'); | |
62 | $r = ''; | |
63 | for (reverse 1 .. 3) { | |
64 | $r .= $_; | |
65 | } | |
66 | is ($r, '321', 'Reverse for list via ..'); | |
67 | $r = ''; | |
68 | for (reverse 'A' .. 'C') { | |
69 | $r .= $_; | |
70 | } | |
71 | is ($r, 'CBA', 'Reverse for list via ..'); | |
72 | ||
73 | $r = ''; | |
74 | for my $i (@array) { | |
75 | $r .= $i; | |
76 | } | |
77 | is ($r, 'ABC', 'Forwards for array with var'); | |
78 | $r = ''; | |
79 | for my $i (1,2,3) { | |
80 | $r .= $i; | |
81 | } | |
82 | is ($r, '123', 'Forwards for list with var'); | |
83 | $r = ''; | |
84 | for my $i (map {$_} @array) { | |
85 | $r .= $i; | |
86 | } | |
87 | is ($r, 'ABC', 'Forwards for array via map with var'); | |
88 | $r = ''; | |
89 | for my $i (map {$_} 1,2,3) { | |
90 | $r .= $i; | |
91 | } | |
92 | is ($r, '123', 'Forwards for list via map with var'); | |
93 | $r = ''; | |
94 | for my $i (1 .. 3) { | |
95 | $r .= $i; | |
96 | } | |
97 | is ($r, '123', 'Forwards for list via .. with var'); | |
98 | $r = ''; | |
99 | for my $i ('A' .. 'C') { | |
100 | $r .= $i; | |
101 | } | |
102 | is ($r, 'ABC', 'Forwards for list via .. with var'); | |
103 | ||
104 | $r = ''; | |
105 | for my $i (reverse @array) { | |
106 | $r .= $i; | |
107 | } | |
108 | is ($r, 'CBA', 'Reverse for array with var'); | |
109 | $r = ''; | |
110 | for my $i (reverse 1,2,3) { | |
111 | $r .= $i; | |
112 | } | |
113 | is ($r, '321', 'Reverse for list with var'); | |
114 | $r = ''; | |
115 | for my $i (reverse map {$_} @array) { | |
116 | $r .= $i; | |
117 | } | |
118 | is ($r, 'CBA', 'Reverse for array via map with var'); | |
119 | $r = ''; | |
120 | for my $i (reverse map {$_} 1,2,3) { | |
121 | $r .= $i; | |
122 | } | |
123 | is ($r, '321', 'Reverse for list via map with var'); | |
124 | $r = ''; | |
125 | for my $i (reverse 1 .. 3) { | |
126 | $r .= $i; | |
127 | } | |
128 | is ($r, '321', 'Reverse for list via .. with var'); | |
129 | $r = ''; | |
130 | for my $i (reverse 'A' .. 'C') { | |
131 | $r .= $i; | |
132 | } | |
133 | is ($r, 'CBA', 'Reverse for list via .. with var'); | |
134 | ||
135 | # For some reason the generate optree is different when $_ is implicit. | |
136 | $r = ''; | |
137 | for $_ (@array) { | |
138 | $r .= $_; | |
139 | } | |
140 | is ($r, 'ABC', 'Forwards for array with explicit $_'); | |
141 | $r = ''; | |
142 | for $_ (1,2,3) { | |
143 | $r .= $_; | |
144 | } | |
145 | is ($r, '123', 'Forwards for list with explicit $_'); | |
146 | $r = ''; | |
147 | for $_ (map {$_} @array) { | |
148 | $r .= $_; | |
149 | } | |
150 | is ($r, 'ABC', 'Forwards for array via map with explicit $_'); | |
151 | $r = ''; | |
152 | for $_ (map {$_} 1,2,3) { | |
153 | $r .= $_; | |
154 | } | |
155 | is ($r, '123', 'Forwards for list via map with explicit $_'); | |
156 | $r = ''; | |
157 | for $_ (1 .. 3) { | |
158 | $r .= $_; | |
159 | } | |
160 | is ($r, '123', 'Forwards for list via .. with var with explicit $_'); | |
161 | $r = ''; | |
162 | for $_ ('A' .. 'C') { | |
163 | $r .= $_; | |
164 | } | |
165 | is ($r, 'ABC', 'Forwards for list via .. with var with explicit $_'); | |
166 | ||
167 | $r = ''; | |
168 | for $_ (reverse @array) { | |
169 | $r .= $_; | |
170 | } | |
171 | is ($r, 'CBA', 'Reverse for array with explicit $_'); | |
172 | $r = ''; | |
173 | for $_ (reverse 1,2,3) { | |
174 | $r .= $_; | |
175 | } | |
176 | is ($r, '321', 'Reverse for list with explicit $_'); | |
177 | $r = ''; | |
178 | for $_ (reverse map {$_} @array) { | |
179 | $r .= $_; | |
180 | } | |
181 | is ($r, 'CBA', 'Reverse for array via map with explicit $_'); | |
182 | $r = ''; | |
183 | for $_ (reverse map {$_} 1,2,3) { | |
184 | $r .= $_; | |
185 | } | |
186 | is ($r, '321', 'Reverse for list via map with explicit $_'); | |
187 | $r = ''; | |
188 | for $_ (reverse 1 .. 3) { | |
189 | $r .= $_; | |
190 | } | |
191 | is ($r, '321', 'Reverse for list via .. with var with explicit $_'); | |
192 | $r = ''; | |
193 | for $_ (reverse 'A' .. 'C') { | |
194 | $r .= $_; | |
195 | } | |
196 | is ($r, 'CBA', 'Reverse for list via .. with var with explicit $_'); | |
197 | ||
198 | # I don't think that my is that different from our in the optree. But test a | |
199 | # few: | |
200 | $r = ''; | |
201 | for our $i (reverse @array) { | |
202 | $r .= $i; | |
203 | } | |
204 | is ($r, 'CBA', 'Reverse for array with our var'); | |
205 | $r = ''; | |
206 | for our $i (reverse 1,2,3) { | |
207 | $r .= $i; | |
208 | } | |
209 | is ($r, '321', 'Reverse for list with our var'); | |
210 | $r = ''; | |
211 | for our $i (reverse map {$_} @array) { | |
212 | $r .= $i; | |
213 | } | |
214 | is ($r, 'CBA', 'Reverse for array via map with our var'); | |
215 | $r = ''; | |
216 | for our $i (reverse map {$_} 1,2,3) { | |
217 | $r .= $i; | |
218 | } | |
219 | is ($r, '321', 'Reverse for list via map with our var'); | |
220 | $r = ''; | |
221 | for our $i (reverse 1 .. 3) { | |
222 | $r .= $i; | |
223 | } | |
224 | is ($r, '321', 'Reverse for list via .. with our var'); | |
225 | $r = ''; | |
226 | for our $i (reverse 'A' .. 'C') { | |
227 | $r .= $i; | |
228 | } | |
229 | is ($r, 'CBA', 'Reverse for list via .. with our var'); | |
230 | ||
231 | ||
232 | $r = ''; | |
233 | for (1, reverse @array) { | |
234 | $r .= $_; | |
235 | } | |
236 | is ($r, '1CBA', 'Reverse for array with leading value'); | |
237 | $r = ''; | |
238 | for ('A', reverse 1,2,3) { | |
239 | $r .= $_; | |
240 | } | |
241 | is ($r, 'A321', 'Reverse for list with leading value'); | |
242 | $r = ''; | |
243 | for (1, reverse map {$_} @array) { | |
244 | $r .= $_; | |
245 | } | |
246 | is ($r, '1CBA', 'Reverse for array via map with leading value'); | |
247 | $r = ''; | |
248 | for ('A', reverse map {$_} 1,2,3) { | |
249 | $r .= $_; | |
250 | } | |
251 | is ($r, 'A321', 'Reverse for list via map with leading value'); | |
252 | $r = ''; | |
253 | for ('A', reverse 1 .. 3) { | |
254 | $r .= $_; | |
255 | } | |
256 | is ($r, 'A321', 'Reverse for list via .. with leading value'); | |
257 | $r = ''; | |
258 | for (1, reverse 'A' .. 'C') { | |
259 | $r .= $_; | |
260 | } | |
261 | is ($r, '1CBA', 'Reverse for list via .. with leading value'); | |
262 | ||
263 | $r = ''; | |
264 | for (reverse (@array), 1) { | |
265 | $r .= $_; | |
266 | } | |
267 | is ($r, 'CBA1', 'Reverse for array with trailing value'); | |
268 | $r = ''; | |
269 | for (reverse (1,2,3), 'A') { | |
270 | $r .= $_; | |
271 | } | |
272 | is ($r, '321A', 'Reverse for list with trailing value'); | |
273 | $r = ''; | |
274 | for (reverse (map {$_} @array), 1) { | |
275 | $r .= $_; | |
276 | } | |
277 | is ($r, 'CBA1', 'Reverse for array via map with trailing value'); | |
278 | $r = ''; | |
279 | for (reverse (map {$_} 1,2,3), 'A') { | |
280 | $r .= $_; | |
281 | } | |
282 | is ($r, '321A', 'Reverse for list via map with trailing value'); | |
283 | $r = ''; | |
284 | for (reverse (1 .. 3), 'A') { | |
285 | $r .= $_; | |
286 | } | |
287 | is ($r, '321A', 'Reverse for list via .. with trailing value'); | |
288 | $r = ''; | |
289 | for (reverse ('A' .. 'C'), 1) { | |
290 | $r .= $_; | |
291 | } | |
292 | is ($r, 'CBA1', 'Reverse for list via .. with trailing value'); | |
293 | ||
294 | ||
295 | $r = ''; | |
296 | for $_ (1, reverse @array) { | |
297 | $r .= $_; | |
298 | } | |
299 | is ($r, '1CBA', 'Reverse for array with leading value with explicit $_'); | |
300 | $r = ''; | |
301 | for $_ ('A', reverse 1,2,3) { | |
302 | $r .= $_; | |
303 | } | |
304 | is ($r, 'A321', 'Reverse for list with leading value with explicit $_'); | |
305 | $r = ''; | |
306 | for $_ (1, reverse map {$_} @array) { | |
307 | $r .= $_; | |
308 | } | |
309 | is ($r, '1CBA', | |
310 | 'Reverse for array via map with leading value with explicit $_'); | |
311 | $r = ''; | |
312 | for $_ ('A', reverse map {$_} 1,2,3) { | |
313 | $r .= $_; | |
314 | } | |
315 | is ($r, 'A321', 'Reverse for list via map with leading value with explicit $_'); | |
316 | $r = ''; | |
317 | for $_ ('A', reverse 1 .. 3) { | |
318 | $r .= $_; | |
319 | } | |
320 | is ($r, 'A321', 'Reverse for list via .. with leading value with explicit $_'); | |
321 | $r = ''; | |
322 | for $_ (1, reverse 'A' .. 'C') { | |
323 | $r .= $_; | |
324 | } | |
325 | is ($r, '1CBA', 'Reverse for list via .. with leading value with explicit $_'); | |
326 | ||
327 | $r = ''; | |
328 | for $_ (reverse (@array), 1) { | |
329 | $r .= $_; | |
330 | } | |
331 | is ($r, 'CBA1', 'Reverse for array with trailing value with explicit $_'); | |
332 | $r = ''; | |
333 | for $_ (reverse (1,2,3), 'A') { | |
334 | $r .= $_; | |
335 | } | |
336 | is ($r, '321A', 'Reverse for list with trailing value with explicit $_'); | |
337 | $r = ''; | |
338 | for $_ (reverse (map {$_} @array), 1) { | |
339 | $r .= $_; | |
340 | } | |
341 | is ($r, 'CBA1', | |
342 | 'Reverse for array via map with trailing value with explicit $_'); | |
343 | $r = ''; | |
344 | for $_ (reverse (map {$_} 1,2,3), 'A') { | |
345 | $r .= $_; | |
346 | } | |
347 | is ($r, '321A', | |
348 | 'Reverse for list via map with trailing value with explicit $_'); | |
349 | $r = ''; | |
350 | for $_ (reverse (1 .. 3), 'A') { | |
351 | $r .= $_; | |
352 | } | |
353 | is ($r, '321A', 'Reverse for list via .. with trailing value with explicit $_'); | |
354 | $r = ''; | |
355 | for $_ (reverse ('A' .. 'C'), 1) { | |
356 | $r .= $_; | |
357 | } | |
358 | is ($r, 'CBA1', 'Reverse for list via .. with trailing value with explicit $_'); | |
359 | ||
360 | $r = ''; | |
361 | for my $i (1, reverse @array) { | |
362 | $r .= $i; | |
363 | } | |
364 | is ($r, '1CBA', 'Reverse for array with leading value and var'); | |
365 | $r = ''; | |
366 | for my $i ('A', reverse 1,2,3) { | |
367 | $r .= $i; | |
368 | } | |
369 | is ($r, 'A321', 'Reverse for list with leading value and var'); | |
370 | $r = ''; | |
371 | for my $i (1, reverse map {$_} @array) { | |
372 | $r .= $i; | |
373 | } | |
374 | is ($r, '1CBA', 'Reverse for array via map with leading value and var'); | |
375 | $r = ''; | |
376 | for my $i ('A', reverse map {$_} 1,2,3) { | |
377 | $r .= $i; | |
378 | } | |
379 | is ($r, 'A321', 'Reverse for list via map with leading value and var'); | |
380 | $r = ''; | |
381 | for my $i ('A', reverse 1 .. 3) { | |
382 | $r .= $i; | |
383 | } | |
384 | is ($r, 'A321', 'Reverse for list via .. with leading value and var'); | |
385 | $r = ''; | |
386 | for my $i (1, reverse 'A' .. 'C') { | |
387 | $r .= $i; | |
388 | } | |
389 | is ($r, '1CBA', 'Reverse for list via .. with leading value and var'); | |
390 | ||
391 | $r = ''; | |
392 | for my $i (reverse (@array), 1) { | |
393 | $r .= $i; | |
394 | } | |
395 | is ($r, 'CBA1', 'Reverse for array with trailing value and var'); | |
396 | $r = ''; | |
397 | for my $i (reverse (1,2,3), 'A') { | |
398 | $r .= $i; | |
399 | } | |
400 | is ($r, '321A', 'Reverse for list with trailing value and var'); | |
401 | $r = ''; | |
402 | for my $i (reverse (map {$_} @array), 1) { | |
403 | $r .= $i; | |
404 | } | |
405 | is ($r, 'CBA1', 'Reverse for array via map with trailing value and var'); | |
406 | $r = ''; | |
407 | for my $i (reverse (map {$_} 1,2,3), 'A') { | |
408 | $r .= $i; | |
409 | } | |
410 | is ($r, '321A', 'Reverse for list via map with trailing value and var'); | |
411 | $r = ''; | |
412 | for my $i (reverse (1 .. 3), 'A') { | |
413 | $r .= $i; | |
414 | } | |
415 | is ($r, '321A', 'Reverse for list via .. with trailing value and var'); | |
416 | $r = ''; | |
417 | for my $i (reverse ('A' .. 'C'), 1) { | |
418 | $r .= $i; | |
419 | } | |
420 | is ($r, 'CBA1', 'Reverse for list via .. with trailing value and var'); | |
421 | ||
422 | ||
423 | $r = ''; | |
424 | for (reverse 1, @array) { | |
425 | $r .= $_; | |
426 | } | |
427 | is ($r, 'CBA1', 'Reverse for value and array'); | |
428 | $r = ''; | |
429 | for (reverse map {$_} 1, @array) { | |
430 | $r .= $_; | |
431 | } | |
432 | is ($r, 'CBA1', 'Reverse for value and array via map'); | |
433 | $r = ''; | |
434 | for (reverse 1 .. 3, @array) { | |
435 | $r .= $_; | |
436 | } | |
437 | is ($r, 'CBA321', 'Reverse for .. and array'); | |
438 | $r = ''; | |
439 | for (reverse 'X' .. 'Z', @array) { | |
440 | $r .= $_; | |
441 | } | |
442 | is ($r, 'CBAZYX', 'Reverse for .. and array'); | |
443 | $r = ''; | |
444 | for (reverse map {$_} 1 .. 3, @array) { | |
445 | $r .= $_; | |
446 | } | |
447 | is ($r, 'CBA321', 'Reverse for .. and array via map'); | |
448 | $r = ''; | |
449 | for (reverse map {$_} 'X' .. 'Z', @array) { | |
450 | $r .= $_; | |
451 | } | |
452 | is ($r, 'CBAZYX', 'Reverse for .. and array via map'); | |
453 | ||
454 | $r = ''; | |
455 | for (reverse (@array, 1)) { | |
456 | $r .= $_; | |
457 | } | |
458 | is ($r, '1CBA', 'Reverse for array and value'); | |
459 | $r = ''; | |
460 | for (reverse (map {$_} @array, 1)) { | |
461 | $r .= $_; | |
462 | } | |
463 | is ($r, '1CBA', 'Reverse for array and value via map'); | |
464 | ||
465 | $r = ''; | |
466 | for $_ (reverse 1, @array) { | |
467 | $r .= $_; | |
468 | } | |
469 | is ($r, 'CBA1', 'Reverse for value and array with explicit $_'); | |
470 | $r = ''; | |
471 | for $_ (reverse map {$_} 1, @array) { | |
472 | $r .= $_; | |
473 | } | |
474 | is ($r, 'CBA1', 'Reverse for value and array via map with explicit $_'); | |
475 | $r = ''; | |
476 | for $_ (reverse 1 .. 3, @array) { | |
477 | $r .= $_; | |
478 | } | |
479 | is ($r, 'CBA321', 'Reverse for .. and array with explicit $_'); | |
480 | $r = ''; | |
481 | for $_ (reverse 'X' .. 'Z', @array) { | |
482 | $r .= $_; | |
483 | } | |
484 | is ($r, 'CBAZYX', 'Reverse for .. and array with explicit $_'); | |
485 | $r = ''; | |
486 | for $_ (reverse map {$_} 1 .. 3, @array) { | |
487 | $r .= $_; | |
488 | } | |
489 | is ($r, 'CBA321', 'Reverse for .. and array via map with explicit $_'); | |
490 | $r = ''; | |
491 | for $_ (reverse map {$_} 'X' .. 'Z', @array) { | |
492 | $r .= $_; | |
493 | } | |
494 | is ($r, 'CBAZYX', 'Reverse for .. and array via map with explicit $_'); | |
495 | ||
496 | $r = ''; | |
497 | for $_ (reverse (@array, 1)) { | |
498 | $r .= $_; | |
499 | } | |
500 | is ($r, '1CBA', 'Reverse for array and value with explicit $_'); | |
501 | $r = ''; | |
502 | for $_ (reverse (map {$_} @array, 1)) { | |
503 | $r .= $_; | |
504 | } | |
505 | is ($r, '1CBA', 'Reverse for array and value via map with explicit $_'); | |
506 | ||
507 | ||
508 | $r = ''; | |
509 | for my $i (reverse 1, @array) { | |
510 | $r .= $i; | |
511 | } | |
512 | is ($r, 'CBA1', 'Reverse for value and array with var'); | |
513 | $r = ''; | |
514 | for my $i (reverse map {$_} 1, @array) { | |
515 | $r .= $i; | |
516 | } | |
517 | is ($r, 'CBA1', 'Reverse for value and array via map with var'); | |
518 | $r = ''; | |
519 | for my $i (reverse 1 .. 3, @array) { | |
520 | $r .= $i; | |
521 | } | |
522 | is ($r, 'CBA321', 'Reverse for .. and array with var'); | |
523 | $r = ''; | |
524 | for my $i (reverse 'X' .. 'Z', @array) { | |
525 | $r .= $i; | |
526 | } | |
527 | is ($r, 'CBAZYX', 'Reverse for .. and array with var'); | |
528 | $r = ''; | |
529 | for my $i (reverse map {$_} 1 .. 3, @array) { | |
530 | $r .= $i; | |
531 | } | |
532 | is ($r, 'CBA321', 'Reverse for .. and array via map with var'); | |
533 | $r = ''; | |
534 | for my $i (reverse map {$_} 'X' .. 'Z', @array) { | |
535 | $r .= $i; | |
536 | } | |
537 | is ($r, 'CBAZYX', 'Reverse for .. and array via map with var'); | |
538 | ||
539 | $r = ''; | |
540 | for my $i (reverse (@array, 1)) { | |
541 | $r .= $i; | |
542 | } | |
543 | is ($r, '1CBA', 'Reverse for array and value with var'); | |
544 | $r = ''; | |
545 | for my $i (reverse (map {$_} @array, 1)) { | |
546 | $r .= $i; | |
547 | } | |
548 | is ($r, '1CBA', 'Reverse for array and value via map with var'); | |
549 | ||
550 | TODO: { | |
551 | if (do {17; foreach (1, 2) { 1; } } != 17) { | |
552 | #print "not "; | |
553 | todo_skip("RT #1085: what should be output of perl -we 'print do { foreach (1, 2) { 1; } }'"); | |
554 | } | |
555 | } | |
556 | ||
557 | TODO: { | |
558 | local $TODO = "RT #2166: foreach spuriously autovivifies"; | |
559 | my %h; | |
560 | foreach (@h{a, b}) {} | |
561 | if(keys(%h)) { | |
562 | todo_skip("RT #2166: foreach spuriously autovivifies"); | |
563 | } | |
564 | } | |
a600f7e6 FC |
565 | |
566 | sub { | |
567 | foreach (@_) { | |
568 | is eval { \$_ }, \undef, 'foreach (@array_containing_undef)' | |
569 | } | |
570 | }->(undef); | |
031c6d82 FC |
571 | |
572 | SKIP: { | |
573 | skip "No XS::APItest under miniperl", 1, if is_miniperl; | |
7a258a81 | 574 | skip "no XS::APItest", 1 if !eval { require XS::APItest }; |
031c6d82 FC |
575 | my @a; |
576 | sub { | |
031c6d82 FC |
577 | XS::APItest::alias_av(\@a, 0, undef); |
578 | eval { \$_[0] } | |
579 | }->($a[0]); | |
580 | is $@, "", 'vivify_defelem does not croak on &PL_sv_undef elements'; | |
581 | } |