The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl -w

use strict;
use Test;
use Text::Diff;

my @A = map "$_\n", qw( 1 2 3 4 );
my @B = map "$_\n", qw( 1 2 3 5 );

my $A = join "", @A;
my $B = join "", @B;

my $Af = "io_A";
my $Bf = "io_B";

open A, ">$Af" or die $!; print A @A or die $! ; close A or die $! ;
open B, ">$Bf" or die $!; print B @B or die $! ; close B or die $! ;

my @tests = (
sub { ok !diff \@A, \@A },
sub {
    my $d = diff \@A, \@B;
    $d =~ /-4.*\+5/s ? ok 1 : ok $d, "a valid diff";
},
sub { ok !diff \$A, \$A },
sub {
    my $d = diff \$A, \$B;
    $d =~ /-4.*\+5/s ? ok 1 : ok $d, "a valid diff";
},
sub { ok !diff $Af, $Af },
sub {
    my $d = diff $Af, $Bf;
    $d =~ /-4.*\+5/s ? ok 1 : ok $d, "a valid diff";
},
sub { 
    open A1, "<$Af" or die $!;
    open A2, "<$Af" or die $!;
    ok !diff \*A1, \*A2;
    close A1;
    close A2;
},
sub { 
    open A, "<$Af" or die $!;
    open B, "<$Bf" or die $!;
    my $d = diff \*A, \*B;
    $d =~ /-4.*\+5/s ? ok 1 : ok $d, "a valid diff";
    close A;
    close B;
},
sub {
    ok !diff sub { \@A}, sub { \@A };
},
sub {
    my $d = diff sub { \@A }, sub { \@B };
    $d =~ /-4.*\+5/s ? ok 1 : ok $d, "a valid diff";
},
);

plan tests => scalar @tests;

$_->() for @tests;

unlink "io_A" or warn $!;
unlink "io_B" or warn $!;