This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
yada-yada is a term, not an operator
[perl5.git] / t / op / yadayada.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     require './test.pl';
6     set_up_inc('../lib');
7 }
8
9 use strict;
10
11 plan 12;
12
13 my $err;
14 my $err1 = "Unimplemented at $0 line ";
15 my $err2 = ".\n";
16
17 $err = $err1 . ( __LINE__ + 1 ) . $err2;
18 eval { ... };
19 is $@, $err, "Execution of ellipsis statement reported 'Unimplemented' code";
20 $@ = '';
21
22 note("RT #122661: Semicolon before ellipsis statement disambiguates to indicate block rather than hash reference");
23 my @input = (3..5);
24 my @transformed;
25 $err = $err1 . ( __LINE__ + 1 ) . $err2;
26 eval { @transformed = map {; ... } @input; };
27 is $@, $err, "Disambiguation case 1";
28 $@ = '';
29
30 $err = $err1 . ( __LINE__ + 1 ) . $err2;
31 eval { @transformed = map {;...} @input; };
32 is $@, $err, "Disambiguation case 2";
33 $@ = '';
34
35 $err = $err1 . ( __LINE__ + 1 ) . $err2;
36 eval { @transformed = map {; ...} @input; };
37 is $@, $err, "Disambiguation case 3";
38 $@ = '';
39
40 $err = $err1 . ( __LINE__ + 1 ) . $err2;
41 eval { @transformed = map {;... } @input; };
42 is $@, $err, "Disambiguation case 4";
43 $@ = '';
44
45 note("RT #132150: ... is a term, not an operator");
46 $err = $err1 . ( __LINE__ + 1 ) . $err2;
47 eval { ... + 0 };
48 is $@, $err, "... + 0 parses";
49 $@ = '';
50
51 $err = $err1 . ( __LINE__ + 1 ) . $err2;
52 eval { ... % 1 };
53 is $@, $err, "... % 1 parses";
54 $@ = '';
55
56 $err = $err1 . ( __LINE__ + 1 ) . $err2;
57 eval { ... / 1 };
58 is $@, $err, "... / 1 parses";
59 $@ = '';
60
61 #
62 # Regression tests, making sure ... is still parsable as an operator.
63 #
64 my @lines = split /\n/ => <<'--';
65
66 # Check simple range operator.
67 my @arr = 'A' ... 'D';
68
69 # Range operator with print.
70 print 'D' ... 'A';
71
72 # Without quotes, 'D' could be a file handle.
73 print  D  ...  A ;
74
75 # Another possible interaction with a file handle.
76 print ${\"D"}  ...  A ;
77 --
78
79 foreach my $line (@lines) {
80     next if $line =~ /^\s*#/ || $line !~ /\S/;
81     my $mess = qq {Parsing '...' in "$line" as a range operator};
82     eval qq {
83        {local *STDOUT; no strict "subs"; $line;}
84         pass \$mess;
85         1;
86     } or do {
87         my $err = $@;
88         $err =~ s/\n//g;
89         fail "$mess ($err)";
90     }
91 }