#!/usr/bin/perl -w use strict; use Test::More 'no_plan'; use constant NO_SUCH_FILE => "this_file_had_better_not_exist"; use autodie; eval { open(my $fh, '<', NO_SUCH_FILE); }; ok($@, "3-arg opening non-existent file fails"); like($@, qr/for reading/, "Well-formatted 3-arg open failure"); eval { open(my $fh, "< ".NO_SUCH_FILE) }; ok($@, "2-arg opening non-existent file fails"); like($@, qr/for reading/, "Well-formatted 2-arg open failure"); unlike($@, qr/GLOB\(0x/, "No ugly globs in 2-arg open messsage"); # RT 47520. 2-argument open without mode would repeat the file # and line number. eval { use autodie; open(my $fh, NO_SUCH_FILE); }; isa_ok($@, 'autodie::exception'); like( $@, qr/at \S+ line \d+/, "At least one mention"); unlike($@, qr/at \S+ line \d+\s+at \S+ line \d+/, "...but not too mentions"); # RT 47520-ish. 2-argument open without a mode should be marked # as 'for reading'. like($@, qr/for reading/, "Well formatted 2-arg open without mode"); # We also shouldn't get repeated messages, even if the default mode # was used. Single-arg open always falls through to the default # formatter. eval { use autodie; open( NO_SUCH_FILE . "" ); }; isa_ok($@, 'autodie::exception'); like( $@, qr/at \S+ line \d+/, "At least one mention"); unlike($@, qr/at \S+ line \d+\s+at \S+ line \d+/, "...but not too mentions"); # RT 52427. Piped open can have any many args. # Sniff to see if we can run 'true' on this system. Changes we can't # on non-Unix systems. use Config; my @true = ($^O =~ /android/ || ($Config{usecrosscompile} && $^O eq 'nto' )) ? ('sh', '-c', 'true $@', '--') : 'true'; eval { use autodie; die "Windows and VMS do not support multi-arg pipe" if $^O eq "MSWin32" or $^O eq 'VMS'; open(my $fh, '-|', @true); }; SKIP: { skip('true command or list pipe not available on this system', 1) if $@; eval { use autodie; my $fh; open $fh, "-|", @true; open $fh, "-|", @true, "foo"; open $fh, "-|", @true, "foo", "bar"; open $fh, "-|", @true, "foo", "bar", "baz"; }; is $@, '', "multi arg piped open does not fail"; } # Github 6 # Non-vanilla modes (such as <:utf8) would cause the formatter in # autodie::exception to fail. eval { use autodie; open(my $fh, '<:utf8', NO_SUCH_FILE); }; ok( $@, "Error thrown."); unlike($@, qr/Don't know how to format mode/, "No error on exotic open."); like( $@, qr/Can't open .*? with mode '<:utf8'/, "Nicer looking error.");