This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ff0f208554668109e5bf7dc2f2b038b3f84b2743
[perl5.git] / t / io / crlf.t
1 #!./perl -w
2
3 BEGIN {
4     chdir 't' if -d 't';
5     @INC = qw(. ../lib);
6     require "test.pl";
7     skip_all_without_perlio();
8 }
9
10 use Config;
11
12
13 my $file = tempfile();
14
15 {
16     plan(tests => 16);
17     ok(open(FOO,">:crlf",$file));
18     ok(print FOO 'a'.((('a' x 14).qq{\n}) x 2000) || close(FOO));
19     ok(open(FOO,"<:crlf",$file));
20
21     my $text;
22     { local $/; $text = <FOO> }
23     is(count_chars($text, "\015\012"), 0);
24     is(count_chars($text, "\n"), 2000);
25
26     binmode(FOO);
27     seek(FOO,0,0);
28     { local $/; $text = <FOO> }
29     is(count_chars($text, "\015\012"), 2000);
30
31     SKIP:
32     {
33         skip_if_miniperl("miniperl can't rely on loading PerlIO::scalar");
34         skip("no PerlIO::scalar") unless $Config{extensions} =~ m!\bPerlIO/scalar\b!;
35         require PerlIO::scalar;
36         my $fcontents = join "", map {"$_\015\012"} "a".."zzz";
37         open my $fh, "<:crlf", \$fcontents;
38         local $/ = "xxx";
39         local $_ = <$fh>;
40         my $pos = tell $fh; # pos must be behind "xxx", before "\nxxy\n"
41         seek $fh, $pos, 0;
42         $/ = "\n";
43         $s = <$fh>.<$fh>;
44         is($s, "\nxxy\n");
45     }
46
47     ok(close(FOO));
48
49     # binmode :crlf should not cumulate.
50     # Try it first once and then twice so that even UNIXy boxes
51     # get to exercise this, for DOSish boxes even once is enough.
52     # Try also pushing :utf8 first so that there are other layers
53     # in between (this should not matter: CRLF layers still should
54     # not accumulate).
55     for my $utf8 ('', ':utf8') {
56         for my $binmode (1..2) {
57             open(FOO, ">$file");
58             # require PerlIO; print PerlIO::get_layers(FOO), "\n";
59             binmode(FOO, "$utf8:crlf") for 1..$binmode;
60             # require PerlIO; print PerlIO::get_layers(FOO), "\n";
61             print FOO "Hello\n";
62             close FOO;
63             open(FOO, "<$file");
64             binmode(FOO);
65             my $foo = scalar <FOO>;
66             close FOO;
67             print join(" ", "#", map { sprintf("%02x", $_) } unpack("C*", $foo)),
68             "\n";
69             like($foo, qr/\x0d\x0a$/);
70             unlike($foo, qr/\x0d\x0d/);
71         }
72     }
73 }
74
75 sub count_chars {
76     my($text, $chars) = @_;
77     my $seen = 0;
78     $seen++ while $text =~ /$chars/g;
79     return $seen;
80 }