Adapt perlivp to the ext/ reorganisation for Compress modules
[p5sagit/p5-mst-13.2.git] / t / comp / parser.t
index e1eff35..2e23226 100644 (file)
@@ -8,8 +8,8 @@ BEGIN {
     @INC = '../lib';
 }
 
-require "./test.pl";
-plan( tests => 60 );
+BEGIN { require "./test.pl"; }
+plan( tests => 110 );
 
 eval '%@x=0;';
 like( $@, qr/^Can't modify hash dereference in repeat \(x\)/, '%@x=0' );
@@ -135,7 +135,7 @@ EOF
 {
     local $SIG{__WARN__} = sub { }; # silence mandatory warning
     eval q{ my $x = -F 1; };
-    like( $@, qr/(?:syntax|parse) error .* near "F 1"/, "unknown filetest operators" );
+    like( $@, qr/(?i:syntax|parse) error .* near "F 1"/, "unknown filetest operators" );
     is(
         eval q{ sub F { 42 } -F 1 },
        '-42',
@@ -210,3 +210,156 @@ like( $@, qr/Assignment to both a list and a scalar/, 'Assignment to both a list
 
 eval q{ s/x/#/e };
 is( $@, '', 'comments in s///e' );
+
+# these five used to coredump because the op cleanup on parse error could
+# be to the wrong pad
+
+eval q[
+    sub { our $a= 1;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;
+           sub { my $z
+];
+
+like($@, qr/Missing right curly/, 'nested sub syntax error' );
+
+eval q[
+    sub { my ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$q,$r,$s,$r);
+           sub { my $z
+];
+like($@, qr/Missing right curly/, 'nested sub syntax error 2' );
+
+eval q[
+    sub { our $a= 1;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;$a;
+           use DieDieDie;
+];
+
+like($@, qr/Can't locate DieDieDie.pm/, 'croak cleanup' );
+
+eval q[
+    sub { my ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$q,$r,$s,$r);
+           use DieDieDie;
+];
+
+like($@, qr/Can't locate DieDieDie.pm/, 'croak cleanup 2' );
+
+
+eval q[
+    my @a;
+    my ($a,$b,$c,$d,$e,$f,$g,$h,$i,$j,$k,$l,$m,$n,$o,$p,$q,$r,$s,$r);
+    @a =~ s/a/b/; # compile-time error
+    use DieDieDie;
+];
+
+like($@, qr/Can't modify/, 'croak cleanup 3' );
+
+# these might leak, or have duplicate frees, depending on the bugginess of
+# the parser stack 'fail in reduce' cleanup code. They're here mainly as
+# something to be run under valgrind, with PERL_DESTRUCT_LEVEL=1.
+
+eval q[ BEGIN { } ] for 1..10;
+is($@, "", 'BEGIN 1' );
+
+eval q[ BEGIN { my $x; $x = 1 } ] for 1..10;
+is($@, "", 'BEGIN 2' );
+
+eval q[ BEGIN { \&foo1 } ] for 1..10;
+is($@, "", 'BEGIN 3' );
+
+eval q[ sub foo2 { } ] for 1..10;
+is($@, "", 'BEGIN 4' );
+
+eval q[ sub foo3 { my $x; $x=1 } ] for 1..10;
+is($@, "", 'BEGIN 5' );
+
+eval q[ BEGIN { die } ] for 1..10;
+like($@, qr/BEGIN failed--compilation aborted/, 'BEGIN 6' );
+
+eval q[ BEGIN {\&foo4; die } ] for 1..10;
+like($@, qr/BEGIN failed--compilation aborted/, 'BEGIN 7' );
+
+# Add new tests HERE:
+
+# More awkward tests for #line. Keep these at the end, as they will screw
+# with sane line reporting for any other test failures
+
+sub check ($$$) {
+    my ($file, $line, $name) =  @_;
+    my (undef, $got_file, $got_line) = caller;
+    like ($got_file, $file, "file of $name");
+    is ($got_line, $line, "line of $name");
+}
+
+#line 3
+check(qr/parser\.t$/, 3, "bare line");
+
+# line 5
+check(qr/parser\.t$/, 5, "bare line with leading space");
+
+#line 7 
+check(qr/parser\.t$/, 7, "trailing space still valid");
+
+# line 11 
+check(qr/parser\.t$/, 11, "leading and trailing");
+
+#      line 13
+check(qr/parser\.t$/, 13, "leading tab");
+
+#line  17
+check(qr/parser\.t$/, 17, "middle tab");
+
+#line                                                                        19
+check(qr/parser\.t$/, 19, "loadsaspaces");
+
+#line 23 KASHPRITZA
+check(qr/^KASHPRITZA$/, 23, "bare filename");
+
+#line 29 "KAHEEEE"
+check(qr/^KAHEEEE$/, 29, "filename in quotes");
+
+#line 31 "CLINK CLOINK BZZT"
+check(qr/^CLINK CLOINK BZZT$/, 31, "filename with spaces in quotes");
+
+#line 37 "THOOM        THOOM"
+check(qr/^THOOM        THOOM$/, 37, "filename with tabs in quotes");
+
+#line 41 "GLINK PLINK GLUNK DINK" 
+check(qr/^GLINK PLINK GLUNK DINK$/, 41, "a space after the quotes");
+
+#line 43 "BBFRPRAFPGHPP
+check(qr/^"BBFRPRAFPGHPP$/, 43, "actually missing a quote is still valid");
+
+#line 47 bang eth
+check(qr/^"BBFRPRAFPGHPP$/, 46, "but spaces aren't allowed without quotes");
+
+eval <<'EOSTANZA'; die $@ if $@;
+#line 51 "With wonderful deathless ditties|We build up the world's great cities,|And out of a fabulous story|We fashion an empire's glory:|One man with a dream, at pleasure,|Shall go forth and conquer a crown;|And three with a new song's measure|Can trample a kingdom down."
+check(qr/^With.*down\.$/, 51, "Overflow the second small buffer check");
+EOSTANZA
+
+# And now, turn on the debugger flag for long names
+$^P = 0x100;
+
+#line 53 "For we are afar with the dawning|And the suns that are not yet high,|And out of the infinite morning|Intrepid you hear us cry-|How, spite of your human scorning,|Once more God's future draws nigh,|And already goes forth the warning|That ye of the past must die."
+check(qr/^For we.*must die\.$/, 53, "Our long line is set up");
+
+eval <<'EOT'; die $@ if $@;
+#line 59 " "
+check(qr/^ $/, 59, "Overflow the first small buffer check only");
+EOT
+
+eval <<'EOSTANZA'; die $@ if $@;
+#line 61 "Great hail! we cry to the comers|From the dazzling unknown shore;|Bring us hither your sun and your summers;|And renew our world as of yore;|You shall teach us your song's new numbers,|And things that we dreamed not before:|Yea, in spite of a dreamer who slumbers,|And a singer who sings no more."
+check(qr/^Great hail!.*no more\.$/, 61, "Overflow both small buffer checks");
+EOSTANZA
+
+{
+    my @x = 'string';
+    is(eval q{ "$x[0]->strung" }, 'string->strung',
+       'literal -> after an array subscript within ""');
+    @x = ['string'];
+    # this used to give "string"
+    like("$x[0]-> [0]", qr/^ARRAY\([^)]*\)-> \[0]\z/,
+       'literal -> [0] after an array subscript within ""');
+}
+
+__END__
+# Don't add new tests HERE. See note above