##############################################################################
#      $URL: http://perlcritic.tigris.org/svn/perlcritic/trunk/distributions/Perl-Critic/t/InputOutput/RequireBriefOpen.run $
#     $Date: 2011-02-25 13:58:41 -0800 (Fri, 25 Feb 2011) $
#   $Author: wyant $
# $Revision: 4045 $
##############################################################################

## name open .. close
## failures 0
## cut

open my $fh1, '<', $filename or die;
close $fh1;
open my $fh2, '<', $filename or die;
close $fh2;
if (open my $fh3, '<', $filename) {
    close $fh3;
}

my $fh4;
open $fh4, '<', $filename or die;
close $fh4;

#-----------------------------------------------------------------------------

## name OO
## failures 0
## cut

open my $fh1, '<', $filename or die;
$fh1->close;

#-----------------------------------------------------------------------------

## name else
## failures 0
## cut

if (!open my $fh3, '<', $filename) {
    croak;
} else {
    close $fh3;
}

#-----------------------------------------------------------------------------

## name while .. print
## failures 0
## cut

open my $fh1, '<', $filename or die;
while (<$fh1>) {
    print;
}
close $fh1;

if (open my $fh2, '<', $filename) {
    while (<$fh2>) {
        print;
    }
    close $fh2;
}

#-----------------------------------------------------------------------------

## name basic failures
## failures 2
## cut

open my $fh1, '<', $filename or die;
close $fh0;
if (open my $fh2, '<', $filename) {
    while (<$fh2>) {
        print;
    }
}

#-----------------------------------------------------------------------------

## name lexical wrong name failure
## failures 2
## cut

open my $fh1, '<', $filename or die;
close $fh2;
open my $fh3, '<', $filename or die;
$fh4->close;

#-----------------------------------------------------------------------------

## name scope failure
## failures 1
## cut

{
    open my $fh1, '<', $filename;
}
close $fh1;

#-----------------------------------------------------------------------------

## name glob scope failure; no longer fails w/ RT #64437 applied.
## failures 0
## cut

{
    open FH1, '<', $filename;
}
close FH1;

#-----------------------------------------------------------------------------

## name glob filehandle
## failures 0
## cut

local (*FH1);
open FH1, '<', $filename or die;
close FH1;

#-----------------------------------------------------------------------------

## name glob failure
## failures 2
## cut

local (*FH2);
open FH2, '<', $filename or die;
open *FH3, '<', $filename or die;

#-----------------------------------------------------------------------------

## name glob wrong name failure
## failures 1
## cut

local (*FH1);
open FH1, '<', $filename or die;
close FH2;

#-----------------------------------------------------------------------------

## name we do not flag non-uppercase globs -- maybe it is a sub call
## failures 0
## cut

local (*fh1);
open fh1, '<', $filename or die;

#-----------------------------------------------------------------------------

## name fail blocks
## failures 2
## cut

my $foo;
open {$foo}, '<', $filename or die;

open {*BAR}, '<', $filename or die;

#-----------------------------------------------------------------------------

## name allow std handles
## failures 0
## cut

open STDIN, '<', $filename or die;
open STDOUT, '>', $filename or die;
open STDERR, '>', $filename or die;

#-----------------------------------------------------------------------------

## name allow std globs in blocks
## failures 0
## cut

open {*STDIN}, '<', $filename or die;
open {*STDOUT}, '>', $filename or die;
open {*STDERR}, '>', $filename or die;

#-----------------------------------------------------------------------------

## name config - pass at default
## failures 0
## cut

open my $fh1, '<', $filename;
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
close $fh1;

#-----------------------------------------------------------------------------

## name config - fail at one after default
## failures 1
## cut

open my $fh1, '<', $filename;
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
close $fh1;

#-----------------------------------------------------------------------------

## name config - set lines to 2
## failures 1
## parms {lines => '2'}
## cut

open my $fh1, '<', $filename;
# 1
close $fh1;

open my $fh2, '<', $filename;
# 1
# 2
close $fh2;

#-----------------------------------------------------------------------------

## name nested sub
## failures 1
## cut

open my $fh1, '<', $filename;
sub not_a_recommended_idiom {
    close $fh1;
}

#-----------------------------------------------------------------------------

## name opener sub
## failures 0
## cut

sub my_open {
    my ($filename) = @_;
    open my $fh1, '<', $filename or return;
    return $fh1;
}

#-----------------------------------------------------------------------------

## name long opener sub failure
## failures 1
## cut

sub my_open {
    my ($filename) = @_;
    open my $fh1, '<', $filename or return;
    # 1
    # 2
    # 3
    # 4
    # 5
    # 6
    # 7
    # 8
    # 9
    return $fh1;
}

#-----------------------------------------------------------------------------

## name opener sub failure
## failures 1
## cut

sub my_open {
    my ($filename) = @_;
    open my $fh1, '<', $filename or return;
    return $fh2;
}

#-----------------------------------------------------------------------------

## name unusual lexical syntax
## failures 1
## TODO we do not recognize parenthesized lexical declarations
## cut

open my ($fh1), '<', $filename;

#-----------------------------------------------------------------------------

## name code coverage - unsupported open() calls
## failures 0
## cut

$self->open($door);
open($fh); # erroneous call
open(get_fh(), '<', $filename); # first arg returns a filehandle -- bad form
open(1 + 1, '<', $filename); # nonsense

#-----------------------------------------------------------------------------

## name code coverage - glob topic for method call
## failures 1
## cut

open FH1, '<', $filename;
FH1->close; # invalid code

#-----------------------------------------------------------------------------

## name code coverage - close is not a function or method call
## failures 1
## cut

open my $fh, '<', $filename;
$hash->{close};

#-----------------------------------------------------------------------------

## name code coverage - FH is not a glob or scalar
## failures 0
## cut

open @foo, '<', $filename; # nonsense
open @$foo, '<', $filename; # nonsense
open my @bar, '<', $filename; # nonsense

#-----------------------------------------------------------------------------

## name CORE::close() - RT #52391
## failures 0
## cut

open( my $fh, '<', $filename );
my $value = <$fh>;
CORE::close($fh);

#-----------------------------------------------------------------------------

## name CORE::GLOBAL::close()
## failures 0
## cut

open my $fh, '<', $filename;
my $value = <$fh>;
CORE::GLOBAL::close($fh);

#-----------------------------------------------------------------------------

## name CORE::open()
## failures 1
## cut

CORE::open my $fh, '<', $filename;

#-----------------------------------------------------------------------------

## name CORE::GLOBAL::open()
## failures 1
## cut

CORE::GLOBAL::open(my $fh, '<', $filename);

#-----------------------------------------------------------------------------

## name Handle declared in outer scope RT #64437
## failures 0
## cut

#!/usr/bin/perl

my $file = 'fubar';
my ($fh, @lines);

if (! open $fh, '<', $file) {
    croak "Error opening $file for reading: $!";
}
@lines = <$fh>;
if (! close $fh) {
    croak "Error closing $file after reading: $!";
}

#-----------------------------------------------------------------------------

# Local Variables:
#   mode: cperl
#   cperl-indent-level: 4
#   fill-column: 78
#   indent-tabs-mode: nil
#   c-indentation-style: bsd
# End:
# ex: set ts=8 sts=4 sw=4 tw=78 ft=perl expandtab shiftround :