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 => 17;
use Test::Exception;

BEGIN { 
    use_ok('IOC::Container::MethodResolution');  
    use_ok('IOC::Service');  
}

can_ok("IOC::Container::MethodResolution", 'new');

my $container = IOC::Container::MethodResolution->new('MyMethodResolutionTest');
isa_ok($container, 'IOC::Container::MethodResolution');
isa_ok($container, 'IOC::Container');

can_ok($container, 'register');
$container->register(IOC::Service->new('log' => sub { 'Log' }));

can_ok($container, 'name');
is($container->name(), 'MyMethodResolutionTest', '... the name is as we expect it to be');

my $value;
lives_ok {
    $value = $container->log();
} '... the method resolved correctly';

is($value, 'Log', '... and the value is as we expected');

throws_ok {
    $container->Fail();
} "IOC::NotFound", '... the service must exists or we get an exception';

my $value2;
lives_ok {
    $value2 = $container->root()->log();
} '... the method resolved correctly';

is($value2, 'Log', '... and the value is as we expected');

my $sub_container = IOC::Container::MethodResolution->new('sub');
isa_ok($sub_container, 'IOC::Container::MethodResolution');
isa_ok($sub_container, 'IOC::Container');

$sub_container->register(IOC::Service->new('log' => sub { 'Log' }));

$container->addSubContainer($sub_container);

my $value3;
lives_ok {
    $value3 = $container->sub()->log();
} '... the method resolved correctly';

is($value3, 'Log', '... and the value is as we expected');