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

=head1 TEST PURPOSE

These tests exercise the handling of collections in the exporter option lists.

=cut

use Test::More tests => 3;
use Data::OptList qw(mkopt_hash);

BEGIN { use_ok('Sub::Exporter'); }

sub is_defined {
  my ($class, $value, $arg) = @_;
  return defined $value;
}

my $counter = 0;

my $config = {
  exports    => [ qw(circsaw drill handsaw nailgun) ],
  collectors => [
    INIT => sub {
      my ($value, $arg) = @_;
      return 0 if @{$arg->{import_args}}; # in other words, fail if args
      $_[0] = [ $counter++ ];
      return 1;
    },
  ]
};

$config->{$_} = mkopt_hash($config->{$_}) for qw(exports collectors);

{
  my $collection = Sub::Exporter::_collect_collections(
    $config, 
    [ ],
    'main',
  );

  is_deeply(
    $collection,
    { INIT => [ 0 ] },
    "collection returned properly from collector",
  );
}

{
  my $collection = eval {
    Sub::Exporter::_collect_collections(
      $config, 
      [ [ handsaw => undef ] ],
      'main',
    );
  };

  like(
    $@,
    qr/INIT failed/,
    "the init collector is run even when other things are here",
  );
}