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 tests => 6;

BEGIN {
  use_ok( 'CGI::Application::Plugin::Output::XSV', qw(xsv_report) );
}

sub plus_one {
  my( $row, $fields )= @_;

  return [ map { $_ + 1 } @$row{@$fields} ];
}

my $report;

# test creating header list from values
# passing list of hashes
$report= xsv_report({
  fields     => [ qw(foo bar baz) ],
  values     => [ { foo => 1, bar => 2, baz => 3 }, ],
  row_filter => \&plus_one,
});

is( $report, "Foo,Bar,Baz\n2,3,4\n", "rows are filtered using user callback" );

sub some_other_data {
  return [ "Jolly",42 ];
}

$report= xsv_report({
  values          => [ [ 1, 2, 3 ], ],
  row_filter      => \&some_other_data,
  include_headers => 0,
});

is( $report, "Jolly,42\n", "rows are filtered using user callback" );

sub uppercase {
  my( $row, $fields )= @_;

  return [ map { uc } @$row{@$fields} ];
};

$report= xsv_report({
  fields          => [ qw(first second third) ],
  values          => [ { first => 'foo', second => 'bar', third => 'baz' }, ],
  row_filter      => \&uppercase,
  include_headers => 0,
});

is( $report, "FOO,BAR,BAZ\n", "rows are filtered using user callback" );

# row filter with iterator -- contrived to use fields parameter
# (can't think of a typical example where fields parameter would be used)
my @words = ( [ qw(foo bar baz) ], [ qw(qux quo quux) ] );

$report= xsv_report({
  fields     => [ 1..3 ],
  iterator   => sub {
    while ( @words ) {
      return shift @words;
    }
  },
  row_filter => sub {
    my ($row_ref, $fields_ref) = @_;

    foreach my $w ( @{$row_ref} ) {
      $w = join(":", @{$fields_ref}, scalar reverse $w);
    }

    return $row_ref;
  },
});

is( $report,
    "1,2,3\n1:2:3:oof,1:2:3:rab,1:2:3:zab\n1:2:3:xuq,1:2:3:ouq,1:2:3:xuuq\n",
    "rows are filtered using user callback" );

# row filter with iterator
my @nums = (1..3);
$report= xsv_report({
  include_headers => 0,
  iterator   => sub { while ( @nums ) { return [ shift @nums ] } },
  row_filter => sub { return [ map { $_ + 1 } @{$_[0]} ] },
});

is( $report, "2\n3\n4\n", "rows are filtered using user callback" );