The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 13;

use Graphics::Primitive::Component;
use Graphics::Primitive::Container;

BEGIN {
    use_ok('Graphics::Primitive::ComponentList');
}

my $list = Graphics::Primitive::ComponentList->new;
isa_ok($list, 'Graphics::Primitive::ComponentList');

my $comp1 = Graphics::Primitive::Component->new(name => 'first', class => 'bar');
$list->add_component($comp1);
cmp_ok($list->component_count, '==', 1, 'component_count');

my $comp2 = Graphics::Primitive::Component->new(name => 'second', class => 'bar');
$list->add_component($comp2);
cmp_ok($list->component_count, '==', 2, 'component_count');

my $comp3 = Graphics::Primitive::Component->new(name => 'three', class => '2');
$list->add_component($comp3);

my $foundi = $list->find_component('first');
my $found = $list->get_component($foundi);
cmp_ok($found->name, 'eq', 'first', 'found first by name');

my $index1 = $list->get_component(0);
cmp_ok($index1->name, 'eq', 'first', 'found first by index');

my $index2 = $list->get_component(1);
cmp_ok($index2->name, 'eq', 'second', 'found second by index');

my $flist = $list->find(sub{ my ($comp, $const) = @_; return $comp->class eq 'bar' });
cmp_ok($flist->component_count, '==', 2, 'find list count');

$flist->each(sub { my ($comp, $const) = @_; $comp->name('foo'); });
cmp_ok($comp1->name, 'eq', 'foo', 'each changed component 1');
cmp_ok($comp2->name, 'eq', 'foo', 'each changed component 2');

$list->find(sub { my ($comp, $const) = @_; return $comp->name eq 'foo' })
    ->each(sub { my ($comp, $const) = @_; $comp->class('bar') });
cmp_ok($comp1->class, 'eq', 'bar', 'find->each changed component 1 class');
cmp_ok($comp2->class, 'eq', 'bar', 'find->each changed component 2 class');

my $cont1 = Graphics::Primitive::Container->new;
$cont1->add_component($comp1);
$cont1->add_component($comp2);
$cont1->add_component($comp3);

my $comp4 = Graphics::Primitive::Component->new(name => 'four', class => 'gorch');
my $comp5 = Graphics::Primitive::Component->new(name => 'five', class => 'baz');
my $cont2 = Graphics::Primitive::Container->new;
$cont2->add_component($comp4);
$cont2->add_component($comp5);

my $comp6 = Graphics::Primitive::Component->new(name => 'six', class => 'gorch');
my $cont3 = Graphics::Primitive::Container->new;
$cont3->add_component($comp6);

$cont1->add_component($cont2);
$cont1->add_component($cont3);

my $gorchlist = $cont1->find(sub {
    my ($comp, $const) = @_;
    return 0 unless defined($comp->class);
    return $comp->class eq 'gorch'
});
cmp_ok($gorchlist->component_count, '==', 2, 'sub-container find count');