The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;

use Test::More;
my $tests;
plan tests => $tests;
use Data::Dumper;

use_ok('Spreadsheet::ParseExcel');
BEGIN { $tests += 1; }


# these tests were created based on the values received using 0.27
# to create regressions tests

{
    # historically Parse returned and unblessed reference on missing file 
    my $excel = Spreadsheet::ParseExcel::Workbook->Parse('no_such_file.xls');
    is(ref($excel), 'HASH', 'failed Parse method returns HASH ref');
    isa_ok($excel->{_Excel}, 'Spreadsheet::ParseExcel', 
            'failed Parse method creates _Excel object');
    BEGIN { $tests += 2; }
}
{
    # historically Parse returned and unblessed reference on failure (e.g.
    # input file is not an Excel file)
    my $excel = Spreadsheet::ParseExcel::Workbook->Parse($0);
    is(ref($excel), 'HASH', 'failed Parse method returns HASH ref');
    isa_ok($excel->{_Excel}, 'Spreadsheet::ParseExcel', 
            'failed Parse method creates _Excel object');
    BEGIN { $tests += 2; }
}

my $workbook_1;
{
    my $workbook = Spreadsheet::ParseExcel::Workbook->Parse('sample/Excel/Test95.xls');
    $workbook_1 = $workbook;
    use Data::Dumper;
    #diag Dumper $excel;
    #_save_file('dump.txt', Dumper $excel);
    is(ref($workbook), 'Spreadsheet::ParseExcel::Workbook',
            'Spreadsheet::ParseExcel::Workbook created');
    my $excel = $workbook->{_Excel};
    isa_ok($excel, 'Spreadsheet::ParseExcel', 
            'Parse method creates _Excel object');
    is(ref($excel->{FuncTbl}), 'HASH');
    is(ref($excel->{GetContent}), 'CODE');


    # meta data
    is($workbook->{_CurSheet_}, 1, 'current sheet is 1');
    is($workbook->{_CurSheet}, 1);
    is($workbook->{Flg1904}, 0);
    isa_ok($workbook->{FmtClass}, 'Spreadsheet::ParseExcel::FmtDefault');
    
    # TODO more tests in Format
    is(ref($workbook->{Format}), 'ARRAY');
    my $formats = $workbook->{Format};
    is(scalar(@$formats), 22);
    # all but 2 are 'Spreadsheet::ParseExcel::Format' objects
    is(ref($workbook->{FormatStr}), 'HASH');
    is($workbook->{SheetCount}, 2);
    my $fonts = $workbook->{Font};
    is(ref($fonts), 'ARRAY');
    is(scalar(@$fonts), 6); 

    is($workbook->{Version}, 1280);
    is($workbook->{BIFFVersion}, 8);
    is($workbook->{File}, 'sample/Excel/Test95.xls');
    is($workbook->{Author}, 'kawait');



    my @sheets = @{$workbook->{Worksheet}};
    is (@sheets, 2, "two sheets");
    is($sheets[0]->{Name}, 'Sheet1-ASC');     # Open Office shows: 'Sheet1_ASC'
    is($sheets[1]->{Name}, 'Sheet1-ASC (2)'); # OO shows 'Sheet1_ASC_2_' 

    is($sheets[0]->{MinRow}, 0);
    is($sheets[0]->{MaxRow}, 7);
    #diag Dumper $sheets[0]->{Cells};
    #qw(ASC Date INTEGER Float Double Formula)
    is($sheets[0]->{Cells}[0][0]->{Val}, 'ASC');
    #diag Dumper $sheets[0]->{Cells}[0][0];


    is($sheets[1]->{MinRow}, 0);
    is($sheets[1]->{MaxRow}, 5);


    BEGIN { $tests += 26; }
}

eval "require IO::Scalar";
if ($@) {
    ok (1, "Skipped - no IO::Scalar") for 1..6;
    }
else {
{
    open my $fh, '<','t/excel_files/Test95.xls';
    my $workbook = Spreadsheet::ParseExcel::Workbook->Parse($fh);
    isnt($workbook, $workbook_1);
    delete $workbook_1->{File};  # when give a filehandlres this field is not set
    is_deeply($workbook, $workbook_1);
    BEGIN { $tests += 2; }
}

# pass a reference to a scalar containing the file content
{
    my $data;
    if (open my $fh, '<','t/excel_files/Test95.xls') {
        binmode($fh);
        local $/ = undef;
        $data = <$fh>;
    }
    my $workbook = Spreadsheet::ParseExcel::Workbook->Parse(\$data);
    isnt($workbook, $workbook_1);
    is_deeply($workbook, $workbook_1);
    BEGIN { $tests += 2; }
}
{
    open my $fh, '<','t/excel_files/Test95.xls';
    binmode($fh);
    my @data = <$fh>;
    my $workbook = Spreadsheet::ParseExcel::Workbook->Parse(\@data);
    isnt($workbook, $workbook_1);
    $workbook_1->{File} = undef;
    is_deeply($workbook, $workbook_1);
    BEGIN { $tests += 2; }
}
}

eval "require IO::Wrap";
if ($@) {
    ok (1, "Skipped - no IO::Wrap") for 1..4;
    }
else {
{
    open my $fh, '<','t/excel_files/Test95.xls';
    my $workbook = Spreadsheet::ParseExcel::Workbook->Parse($fh);
    isnt($workbook, $workbook_1);
    delete $workbook_1->{File};  # when give a filehandlres this field is not set
    is_deeply($workbook, $workbook_1);
    BEGIN { $tests += 2; }
}

# pass an IO::Wrap object
{
    my $data;
    my $fh;
    if (open my $real_fh, '<','t/excel_files/Test95.xls') {
        binmode($real_fh);
        $fh = IO::Wrap::wraphandle($real_fh);
    }
    my $workbook = Spreadsheet::ParseExcel::Workbook->Parse($fh);
    isnt($workbook, $workbook_1);
    is_deeply($workbook, $workbook_1);
    BEGIN { $tests += 2; }
}
}


sub _save_file {
    my ($file, $data) = @_;
    if (open my $fh, '>', $file) {
        print {$fh} $data;
    }
}