#!/usr/bin/perl use strict; use warnings; use Test::More tests => 37; use Test::Exception; BEGIN { use_ok('IOC::Service::SetterInjection'); use_ok('IOC::Container'); } { # create a package for a dummy service package Logger; sub new { my ($class) = @_; return bless {} => $class; } sub setLogFileHandle { my ($self, $file_handle) = @_; Test::More::is($file_handle, 'LogFileHandle', '... got the right log file handle'); } sub setLogFileFormat { my ($self, $file_format) = @_; Test::More::is($file_format, 'LogFileFormat', '... got the right log file format'); } } can_ok("IOC::Service::SetterInjection", 'new'); { my $container = IOC::Container->new(); isa_ok($container, 'IOC::Container'); $container->register(IOC::Service->new('log_file_handle' => sub { 'LogFileHandle' })); $container->register(IOC::Service->new('log_file_format' => sub { 'LogFileFormat' })); my $service = IOC::Service::SetterInjection->new('logger' => ('Logger', 'new', [ { setLogFileHandle => 'log_file_handle' }, { setLogFileFormat => 'log_file_format' } ])); isa_ok($service, 'IOC::Service::SetterInjection'); isa_ok($service, 'IOC::Service'); $service->setContainer($container); can_ok($service, 'instance'); my $instance = $service->instance(); isa_ok($instance, 'Logger'); } { # check getting service from the root my $log_file_container = IOC::Container->new('LogFile'); isa_ok($log_file_container, 'IOC::Container'); $log_file_container->register(IOC::Service->new('handle' => sub { 'LogFileHandle' })); $log_file_container->register(IOC::Service->new('format' => sub { 'LogFileFormat' })); my $service = IOC::Service::SetterInjection->new('logger' => ('Logger', 'new', [ { setLogFileHandle => '/LogFile/handle' }, { setLogFileFormat => '/LogFile/format' } ])); isa_ok($service, 'IOC::Service::SetterInjection'); isa_ok($service, 'IOC::Service'); my $logging_container = IOC::Container->new('Logging'); $service->setContainer($logging_container); my $container = IOC::Container->new('root'); $container->addSubContainer($logging_container); $container->addSubContainer($log_file_container); can_ok($service, 'instance'); my $instance = $service->instance(); isa_ok($instance, 'Logger'); } { # check getting service from the a sub container my $log_file_container = IOC::Container->new('LogFile'); isa_ok($log_file_container, 'IOC::Container'); $log_file_container->register(IOC::Service->new('handle' => sub { 'LogFileHandle' })); $log_file_container->register(IOC::Service->new('format' => sub { 'LogFileFormat' })); my $service = IOC::Service::SetterInjection->new('logger' => ('Logger', 'new', [ { setLogFileHandle => 'LogFile/handle' }, { setLogFileFormat => 'LogFile/format' } ])); isa_ok($service, 'IOC::Service::SetterInjection'); isa_ok($service, 'IOC::Service'); my $logging_container = IOC::Container->new('Logging'); $service->setContainer($logging_container); $logging_container->addSubContainer($log_file_container); can_ok($service, 'instance'); my $instance = $service->instance(); isa_ok($instance, 'Logger'); } { # load a service class my $container = IOC::Container->new('ClassLoading'); isa_ok($container, 'IOC::Container'); my $service = IOC::Service::SetterInjection->new('container' => ('IOC::Container::MethodResolution', 'new' => [])); isa_ok($service, 'IOC::Service::SetterInjection'); isa_ok($service, 'IOC::Service'); $container->register($service); my $instance; lives_ok { $instance = $service->instance(); } '... and the service loads correctly'; isa_ok($instance, 'IOC::Container::MethodResolution'); } # check some errors now { my $container = IOC::Container->new(); throws_ok { IOC::Service::SetterInjection->new('file'); } "IOC::InsufficientArguments", '... cannot create a setter injection without a component class'; throws_ok { IOC::Service::SetterInjection->new('file' => ("Fail")); } "IOC::InsufficientArguments", '... cannot create a setter injection without a component class constructor'; throws_ok { IOC::Service::SetterInjection->new('file' => ("Fail", 'new')); } "IOC::InsufficientArguments", '... cannot create a setter injection without a setter parameter list'; throws_ok { IOC::Service::SetterInjection->new('file' => ("Fail", 'new', "Fail")); } "IOC::InsufficientArguments", '... cannot create a setter injection without an array ref as setter parameter list'; throws_ok { IOC::Service::SetterInjection->new('file' => ("Fail", 'new', {})); } "IOC::InsufficientArguments", '... cannot create a setter injection without an array ref as setter parameter list'; throws_ok { IOC::Service::SetterInjection->new('file2' => ("Fail", 'new', []))->setContainer($container)->instance; } "IOC::ClassLoadingError", '... cannot create a setter injection with a bad object'; throws_ok { IOC::Service::SetterInjection->new('file3' => ("Logger", 'notNew', []))->setContainer($container)->instance; } "IOC::ConstructorNotFound", '... cannot create a setter injection with a bad constructor'; throws_ok { IOC::Service::SetterInjection->new('file4' => ("Logger", 'new', [ { noMethod => 'nuttin' } ]))->setContainer($container)->instance; } "IOC::MethodNotFound", '... cannot create a setter injection with a bad setter methods'; }