#! perl

# $Id: 91_ivp_sqlite.t,v 1.9 2008/02/27 10:51:54 jv Exp $  -*-perl-*-

use strict;
use warnings;

use Test::More
  $ENV{EB_SKIPDBTESTS} ? (skip_all => "Database tests skipped on request")
  : (tests => 43);

use warnings;
BEGIN { use_ok('IPC::Run3') }
BEGIN { use_ok('EB::Config', qw(ivp)) }
BEGIN { use_ok('EB') }
BEGIN { use_ok('File::Copy') }

my $dbdriver = $ENV{EB_DBDRIVER};
if ( !$dbdriver && $0 =~ /\d+_ivp_(.+).t/ ) {
    $dbdriver = $1;
}

my $dbddrv;
if ( !$dbdriver ) {
    $dbdriver = "postgres";
    $dbddrv = "DBD::Pg";
}
elsif ( $dbdriver eq "sqlite" ) {
    $dbddrv = "DBD::SQLite";
}
else {
    BAIL_OUT("Unsupported database driver: $dbdriver");
}

SKIP: {

eval "require $dbddrv";
skip("DBI $dbdriver driver ($dbddrv) not installed", 39) if $@;

chdir("t") if -d "t";
chdir("ivp") if -d "ivp";
my $f;
for ( qw(opening.eb relaties.eb mutaties.eb schema.dat) ) {
    ok(1, $_), next if -s $_;
    if ( $f = findlib("examples/$_") and -s $f ) {
	copy($f, $_);
    }
    ok(-s $_, $_);
}
for ( qw(ivp.conf opening.eb relaties.eb mutaties.eb reports.eb schema.dat ) ) {
    die("=== IVP configuratiefout: $_ ===\n") unless -s $_;
}

# Cleanup old files.
unlink(<*.sql>);
unlink(<*.log>);
unlink(<*.txt>);
unlink(<*.html>);
unlink(<*.csv>);

my @ebcmd = qw(-MEB::Main -e run -- -X -f ivp.conf --echo);
push(@ebcmd, "-D", "database:driver=$dbdriver") if $dbdriver;

unshift(@ebcmd, map { ("-I",
		       "../../$_"
		      ) } grep { /^\w\w/ } reverse @INC);
unshift(@ebcmd, $^X);

my $fail;

for my $log ( "createdb.log" ) {
    ok(syscmd([@ebcmd, qw(--createdb --schema=schema -c)], undef, $log), "createdb");
    checkerr($log);
}

for my $log ( "relaties.log" ) {
    ok(syscmd(\@ebcmd, "relaties.eb", $log), "relaties");
    checkerr($log);
}

for my $log ( "opening.log" ) {
    ok(syscmd(\@ebcmd, "opening.eb", $log), "openen administratie");
    checkerr($log);
}

for my $log ( "mutaties.log" ) {
    ok(syscmd(\@ebcmd, "mutaties.eb", $log), "mutaties");
    checkerr($log);
}

for my $log ( "reports.log" ) {
    ok(syscmd(\@ebcmd, "reports.eb", $log), "reports");
    checkerr($log);
}

# Verify: balans in varianten.
vfy([@ebcmd, qw(-c balans)           ], "balans.txt");
vfy([@ebcmd, qw(-c balans --detail=0)], "balans0.txt");
vfy([@ebcmd, qw(-c balans --detail=1)], "balans1.txt");
vfy([@ebcmd, qw(-c balans --detail=2)], "balans2.txt");
vfy([@ebcmd, qw(-c balans --verdicht)], "balans2.txt");
vfy([@ebcmd, qw(-c balans --opening) ], "obalans.txt");

# Verify: verlies/winst in varianten.
vfy([@ebcmd, qw(-c result)           ], "result.txt");
vfy([@ebcmd, qw(-c result --detail=0)], "result0.txt");
vfy([@ebcmd, qw(-c result --detail=1)], "result1.txt");
vfy([@ebcmd, qw(-c result --detail=2)], "result2.txt");
vfy([@ebcmd, qw(-c result --verdicht)], "result2.txt");

# Verify: Journaal.
vfy([@ebcmd, qw(-c journaal)            ], "journaal.txt");
# Verify: Journaal van dagboek.
vfy([@ebcmd, qw(-c journaal postbank)   ], "journaal-postbank.txt");
# Verify: Journaal van boekstuk.
vfy([@ebcmd, qw(-c journaal postbank:24)], "journaal-postbank24.txt");

# Verify: Proef- en Saldibalans in varianten.
vfy([@ebcmd, qw(-c proefensaldibalans)           ], "proef.txt");
vfy([@ebcmd, qw(-c proefensaldibalans --detail=0)], "proef0.txt");
vfy([@ebcmd, qw(-c proefensaldibalans --detail=1)], "proef1.txt");
vfy([@ebcmd, qw(-c proefensaldibalans --detail=2)], "proef2.txt");
vfy([@ebcmd, qw(-c proefensaldibalans --verdicht)], "proef2.txt");

# Verify: Grootboek in varianten.
vfy([@ebcmd, qw(-c grootboek)           ], "grootboek.txt");
vfy([@ebcmd, qw(-c grootboek --detail=0)], "grootboek0.txt");
vfy([@ebcmd, qw(-c grootboek --detail=1)], "grootboek1.txt");
vfy([@ebcmd, qw(-c grootboek --detail=2)], "grootboek2.txt");

# Verify: Crediteuren/Debiteuren.
vfy([@ebcmd, qw(-c crediteuren)         ], "crdrept.txt");
vfy([@ebcmd, qw(-c debiteuren)          ], "debrept.txt");

# Verify: BTW aangifte.
vfy([@ebcmd, qw(-c btwaangifte j)], "btw.txt");

# Verify: HTML generatie.
vfy([@ebcmd, qw(-c balans --detail=2 --gen-html)            ], "balans2.html");
vfy([@ebcmd, qw(-c balans --detail=2 --gen-html --style=xxx)], "balans2xxx.html");
vfy([@ebcmd, qw(-c btwaangifte j)], "btw.html");

# Verify: CSV generatie.
vfy([@ebcmd, qw(-c balans --detail=2 --gen-csv)], "balans2.csv");

}	# end SKIP section

################ subroutines ################

sub vfy {
    my ($cmd, $ref) = @_;
    my @c = @$cmd;
    while ( shift(@c) ne "-c" ) { }
    ok(!diff($ref), "@c --output=$ref");
}

sub vfyxx {
    my ($cmd, $ref) = @_;
    syscmd($cmd, undef, $ref);
    ok(!diff($ref), $ref);
}

use Encode;
sub diff {
    my ($file1, $file2) = @_;
    $file2 = "ref/$file1" unless $file2;
    my ($str1, $str2);
    local($/);
    open(my $fd1, "<", $file1) or die("$file1: $!\n");
    $str1 = <$fd1>;
    close($fd1);
    open(my $fd2, "<:encoding(iso-8859-1)", $file2) or die("$file2: $!\n");
    $str2 = <$fd2>;
    close($fd2);
    $str1 =~ s/^EekBoek \d.*Squirrel Consultancy\n//;
    $str1 =~ s/[\n\r]+/\n/;
    $str2 =~ s/[\n\r]+/\n/;
    return 0 if $str1 eq $str2;

    # If we're running in a Unicode environment, the data may be utf-8.
    $str2 = encode("utf8", $str2);
    if ( $str1 eq $str2 ) {
	diag("Data is UTF-8: $file1");
	return 0;
    }
    1;
}

sub syscmd {
    my ($cmd, $in, $out, $err) = @_;
    $in = \undef unless defined($in);
    $err = $out if @_ < 4;
    #warn("+ @$cmd\n");
    run3($cmd, $in, $out, $err);
    printf STDERR ("Exit status 0x%x\n", $?) if $?;
    $? == 0;
}

sub checkerr {
    my $fail;
    unless ( -s $_[0] ) {
	warn("$_[0]: Bestand ontbreekt, of is leeg\n");
	$fail++;
    }
    open(my $fd, "<", $_[0]) or die("$_[0]: $!\n");
    while ( <$fd> ) {
	next unless /(^\?|^ERROR| at .* line \d+)/;
	warn($_);
	$fail++;
    }
    close($fd);
    die("=== IVP afgebroken ===\n") if $fail;
}

1;