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

use strict;
use warnings;
use Test::More;
use Test::Exception;
use Role::Tiny;

my $pkg;
BEGIN {
    $pkg = 'Catmandu::Addable';
    use_ok $pkg;
}
require_ok $pkg;

my $data = [];

{
    package T::AddableWithoutAdd;
    use Moo;

    package T::Addable;
    use Moo;
    with $pkg;

    sub add {
        push @$data, $_[1];
    }

    package T::WithoutGenerator;
    use Moo;
    package T::WithGenerator;
    use Moo;
    sub generator { sub {} }
}

throws_ok { Role::Tiny->apply_role_to_package('T::AddableWithoutAdd', $pkg) } qr/missing add/;

my $a = T::Addable->new;
can_ok $a, 'add_many';

is_deeply $a->add({a=>'pony'}), {a=>'pony'}, 'add returns data added';

$data = [];
$a->add(undef);
is_deeply $data, [], 'undef gets rejected';

lives_ok { $a->add_many({}) } 'add_many takes a single hash ref';
lives_ok { $a->add_many([]) } 'add_many takes an array ref';
lives_ok { $a->add_many(sub {}) } 'add_many takes a generator code ref';
lives_ok { $a->add_many(T::WithGenerator->new) } 'add_many takes an object with a generator method';
throws_ok { $a->add_many(T::WithoutGenerator->new) } qr/should be able to generator/;

$data = [];
is $a->add_many([1,2,3]), 3, 'add_many returns count of data added';
is_deeply $data, [1,2,3], 'add_many passes all data to add';

done_testing 13;