The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# tr/td coderef testing

use Test::More;
use HTML::Tabulate;
use Data::Dumper;
use strict;
use FindBin qw($Bin);

# Load result strings
my %result = ();
my $test = "$Bin/t12";
die "missing data dir $test" unless -d $test;
opendir my $datadir, $test or die "can't open directory $test";
for (readdir $datadir) {
  next if m/^\./;
  open my $fh, "<$test/$_" or die "can't read $test/$_";
  { 
    local $/ = undef;
    $result{$_} = <$fh>;
  }
  close $fh;
}
close $datadir;

my $print = shift @ARGV || 0;
my $n = 1;
sub report {
  my ($data, $file, $inc) = @_;
  $inc ||= 1;
  if ($print == $n) {
    print STDERR "--> $file\n";
    print $data;
    exit 0;
  }
  $n += $inc;
}

# Setup
my $data = [ [ '123', 'Fred Flintstone', 'CEO', '19710430', ], 
             [ '456', 'Barney Rubble', 'Lackey', '19750808', ],
             [ '789', 'Dino', 'Pet' ] ];
my $t = HTML::Tabulate->new({
  fields => [ qw(emp_id emp_name emp_title emp_birth_dt) ],
});
my $table;

# tr sub
$table = $t->render($data, {
  tr => sub { my $r = shift; my $name = lc $r->[1]; $name =~ s! .*!!; { class => $name } },
});
report $table, "trsub";
is($table, $result{trsub}, "tr sub");

# tr attr sub
$table = $t->render($data, {
  tr => {
    class => sub { my $r = shift; my $name = $r->[1]; $name =~ s!\s.*!!; lc $name }, 
  },
});
report $table, "trsub";
is($table, $result{trsub}, "tr attr sub");

# tr attr sub2
$table = $t->render($data, {
  tr => {
    id => sub { my $r = shift; $r->[3] }, 
  },
});
report $table, "trsub2";
is($table, $result{trsub2}, "tr attr sub (undef)");

# th/td attr sub
$table = $t->render($data, {
  labels => 1,
  th => {
    class => sub { my ($d, $r, $f) = @_; $d =~ s/^Emp //; $d =~ s/\s+/_/g; lc $d },
  },
  td => { 
    class => sub { my ($d, $r, $f) = @_; my $class = ($d =~ m/^\d+$/ ? 'digits' : 'alpha'); $class },
  },
});
report $table, "thtdsub";
is($table, $result{thtdsub}, "th/td sub");

# th/td attr sub2 (undef)
$table = $t->render($data, {
  labels => 1,
  th => {
    class => sub { my ($d, $r, $f) = @_; return undef unless $d =~ m/(name|title)/i; $d =~ s/^Emp //; $d =~ s/\s+/_/g; lc $d },
  },
  td => { 
    class => sub { my ($d, $r, $f) = @_; my $class = ($d =~ m/^\d+$/ ? 'digits' : undef ); $class },
  },
});
report $table, "thtdsub2";
is($table, $result{thtdsub2}, "th/td sub2 (undef)");

# fattr sub1
$table = $t->render($data, {
  td => { class => 'td' },
  field_attr => {
    emp_id => { class => sub { my ($d, $r, $f) = @_; reverse $r->[0] } },
    emp_name => { class => sub { my ($d, $r, $f) = @_; lc $r->[2] eq 'ceo' ? 'red' : 'green' } },
  },
});
report $table, "fattrsub1";
is($table, $result{fattrsub1}, "fattr sub1");

# fattr sub2
$table = $t->render($data, {
  field_attr => {
    emp_id => { class => sub { my ($d, $r, $f) = @_; reverse $r->[0] } },
    emp_name => { 
      class => sub { 
        my ($d, $r, $f) = @_; return undef unless $r->[2] eq 'CEO'; 'red'
      },
    },
  },
});
report $table, "fattrsub2";
is($table, $result{fattrsub2}, "fattr sub2 (undef)");

# tr attr sub
$table = $t->render($data, {
  labels => [ qw(ID name title), 'Birth Date' ],
  labels => { 
    emp_id => 'ID',
    emp_name => 'Name', 
    emp_title => 'Title',
    emp_birth_dt => 'Birth Date',
  },
  style => 'across',
  tr => {
    class => sub { my ($d, $r) = @_; my $name = $r->[0]; $name =~ s!\s+!_!; lc "row_$name" }, 
  },
});
report $table, "trsub_across";
is($table, $result{trsub_across}, "tr attr sub, across");

# tr class sub with striping
$table = $t->render($data, {
  labels => [ qw(ID name title), 'Birth Date' ],
  labels => { 
    emp_id => 'ID',
    emp_name => 'Name', 
    emp_title => 'Title',
    emp_birth_dt => 'Birth Date',
  },
  style => 'down',
  stripe => => [ { class => 'o' }, { class => 'e' } ],
  tr => {
    class => sub { my ($r) = @_; my $name = $r->[0]; $name =~ s!\s+!_!; lc "row_$name" }, 
  },
});
report $table, "trsub_stripe";
is($table, $result{trsub_stripe}, "tr class sub w/striping");

done_testing;