IOC/t/033_IOC_Service_Prototype_test.t
#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 16;
use Test::Exception;
BEGIN {
use_ok('IOC::Service::Prototype');
use_ok('IOC::Container');
}
{ # create a package for a dummy service
package Logger;
sub new {
my $class = shift;
return bless {} => $class;
}
our $DESTROYED_Loggers = 0;
sub DESTROY {
$DESTROYED_Loggers++;
}
}
# this function will test that
# we got a container in our
# construction block
sub create_logger {
my ($container) = @_;
isa_ok($container, 'IOC::Container');
return Logger->new();
}
can_ok("IOC::Service::Prototype", 'new');
# create the service
my $service = IOC::Service::Prototype->new('logger' => \&create_logger );
isa_ok($service, 'IOC::Service::Prototype');
isa_ok($service, 'IOC::Service');
# check the interface
can_ok($service, 'instance');
# check instance errors
throws_ok {
$service->instance()
} "IOC::IllegalOperation", '... cannot create an instance without a container';
# create and set a container
my $container = IOC::Container->new();
isa_ok($container, 'IOC::Container');
lives_ok {
$service->setContainer($container);
} '... set container successfully';
{
my $logger = $service->instance('logger');
isa_ok($logger, 'Logger');
{
my $logger2 = $service->instance('logger');
isa_ok($logger2, 'Logger');
isnt($logger, $logger2, '... each logger instance is the same');
}
cmp_ok($Logger::DESTROYED_Loggers, '==', 1, '... one logger has been destoryed');
}
cmp_ok($Logger::DESTROYED_Loggers, '==', 2, '... two loggers were destoryed');