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

=head1 NAME

00patch.t - testing of VCP::Patch

=cut

use strict ;

use Test ;

use constant SOURCE => 0 ;
use constant RESULT => 1 ;
use constant PATCH  => 2 ;

use Text::Diff qw( diff ) ;
use File::Spec::Functions qw( catfile tmpdir );
use VCP::Patch ;

my @lines = (
   [ map( "$_\n", qw( 1 2 3 4 5d 6 7 8 9 10 11 11d 12 13 ) ) ],
   [ map( "$_\n", qw( 1 2 3 4 5a 6 7 8 9 9a 10 11  12 13 ) ) ],
) ;

my @contents = map join( "", @$_ ), @lines ;

my @fns = map catfile( tmpdir, "vcp${$}_patch_$_" ), qw( source result patch ) ;

my $p_fn = $fns[PATCH];

sub slurp {
    my $fn = shift ;
    local $/ = undef ;
    open SLURP, "<$fn" or die "$!: $fn" ;
    my $guts = <SLURP> ;
    close SLURP        or die "$!: $fn" ;
    return $guts ;
}

my @tests = (
sub {
   my $fn = $fns[SOURCE] ;
   open F, ">$fn"        or die "$!: $fn" ;
   print F $contents[SOURCE] or die "$!: $fn" ;
   close F ;
   ok( 1 ) ;
},

sub {
   my $patch = "" ;
   open P, ">$p_fn" or die "$!: $p_fn";
   diff( @lines, { OUTPUT => \*P } ) ;
   close P;
   vcp_patch( @fns ) ;
   my $got = slurp $fns[RESULT] ;
   ok $got, $contents[RESULT], "diff" ;
},

sub {
   my $patch = "" ;
   open P, ">$p_fn" or die "$!: $p_fn";
   diff( @lines, { OUTPUT => \*P, CONTEXT_LINES => 3  } ) ;
   close P;
   vcp_patch( @fns ) ;
   my $got = slurp $fns[RESULT] ;
   ok $got, $contents[RESULT], "diff -U 3" ;
},

sub {
   my $patch = "" ;
   open P, ">$p_fn" or die "$!: $p_fn";
   diff( @lines, { OUTPUT => \*P, CONTEXT_LINES => 5  } ) ;
   close P;
   vcp_patch( @fns ) ;
   my $got = slurp $fns[RESULT] ;
   ok $got, $contents[RESULT], "diff -U 5" ;
},

) ;

plan tests => scalar( @tests ) ;

$_->() for @tests ;

for ( @fns ) {
   next unless -e $_ ;
   unlink $_ or warn "$! unlinking $_" ;
}