This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #65838] Allow here-doc with no final newline
[perl5.git] / t / op / heredoc.t
1 # tests for heredocs besides what is tested in base/lex.t
2
3 BEGIN {
4    chdir 't' if -d 't';
5    @INC = '../lib';
6    require './test.pl';
7 }
8
9 use strict;
10 plan(tests => 7);
11
12
13 # heredoc without newline (#65838)
14 {
15     my $string = <<'HEREDOC';
16 testing for 65838
17 HEREDOC
18
19     my $code = "<<'HEREDOC';\n${string}HEREDOC";  # HD w/o newline, in eval-string
20     my $hd = eval $code or warn "$@ ---";
21     is($hd, $string, "no terminating newline in string-eval");
22 }
23
24
25 # here-doc edge cases
26 {
27     my $string = "testing for 65838";
28
29     fresh_perl_is(
30         "print <<'HEREDOC';\n${string}\nHEREDOC",
31         $string,
32         {},
33         "heredoc at EOF without trailing newline"
34     );
35
36     fresh_perl_is(
37         "print <<;\n$string\n",
38         $string,
39         { switches => ['-X'] },
40         "blank-terminated heredoc at EOF"
41     );
42     fresh_perl_is(
43         "print <<\n$string\n",
44         $string,
45         { switches => ['-X'] },
46         "blank-terminated heredoc at EOF and no semicolon"
47     );
48 }
49
50
51 # here-doc parse failures
52 {
53     fresh_perl_like(
54         "print <<HEREDOC;\nwibble\n HEREDOC",
55         qr/find string terminator/,
56         {},
57         "string terminator must start at newline"
58     );
59
60     fresh_perl_like(
61         "print <<;\nno more newlines",
62         qr/find string terminator/,
63         { switches => ['-X'] },
64         "empty string terminator still needs a newline"
65     );
66
67     fresh_perl_like(
68         "print <<ThisTerminatorIsLongerThanTheData;\nno more newlines",
69         qr/find string terminator/,
70         {},
71         "long terminator fails correctly"
72     );
73 }