#!/usr/bin/perl use strict; use warnings; use Test::More tests => 61; use Test::Exception; BEGIN { use_ok('IOC::Registry'); use_ok('IOC::Service'); use_ok('IOC::Container'); } can_ok("IOC::Registry", 'new'); my $reg = IOC::Registry->new(); isa_ok($reg, 'IOC::Registry'); isa_ok($reg, 'Class::StrongSingleton'); is($reg, IOC::Registry->new(), '... this really is a singleton'); my $test1 = IOC::Container->new('test 1'); isa_ok($test1, 'IOC::Container'); my $test2 = IOC::Container->new('test 2'); isa_ok($test2, 'IOC::Container'); my $test3 = IOC::Container->new('test 3'); isa_ok($test3, 'IOC::Container'); my $test_sub_2_2; lives_ok { $test1->addSubContainers( IOC::Container->new('sub test 1.1') ->register(IOC::Service->new('test service 1.1-1' => sub { '1.1-1' })) ->register(IOC::Service->new('test service 1.1-2' => sub { '1.1-2' })), IOC::Container->new('sub test 1.2') ->register(IOC::Service->new('test service 1.2-1' => sub { '1.2-1' })) ->register(IOC::Service->new('test service 1.2-2' => sub { '1.2-2' })) ->addSubContainers( IOC::Container->new('sub test 1.2.1') ->register(IOC::Service->new('test service 1.2.1-1' => sub { '1.2.1-1' })), IOC::Container->new('sub test 1.2.2') ->register(IOC::Service->new('test service 1.2.2-1' => sub { '1.2.2-1' })) ->register(IOC::Service->new('test service 1.2.2-2' => sub { '1.2.2-2' })) ) ); # this is embedded in $test2 $test_sub_2_2 = IOC::Container->new('sub test 2.2') ->register(IOC::Service->new('test service 2.2-1' => sub { '2.2-1' })) ->register(IOC::Service->new('test service 2.2-2' => sub { '2.2-2' })); $test2->addSubContainers( IOC::Container->new('sub test 2.1') ->register(IOC::Service->new('test service 2.1-1' => sub { '2.1-1' })) ->addSubContainers( IOC::Container->new('sub test 2.1.1') ->register(IOC::Service->new('test service 2.1.1-1' => sub { '2.1.1-1' })), IOC::Container->new('sub test 2.1.2') ->register(IOC::Service->new('test service 2.1.2-1' => sub { '2.1.2-1' })) ->register(IOC::Service->new('test service 2.1.2-2' => sub { '2.1.2-2' })) ), $test_sub_2_2 ); $test3->register(IOC::Service->new('test service 3-1' => sub { '3-1' })) ->register(IOC::Service->new('test service 3-2' => sub { '3-2' })); } '... created our hierarchy successfully'; $reg->registerContainer($test1); $reg->registerContainer($test2); $reg->registerContainer($test3); is($test1, $reg->getRegisteredContainer('test 1'), '... got the right container'); is($test2, $reg->getRegisteredContainer('test 2'), '... got the right container'); is($test3, $reg->getRegisteredContainer('test 3'), '... got the right container'); is_deeply( [ sort $reg->getRegisteredContainerList() ], [ 'test 1', 'test 2', 'test 3' ], '... got the list of containers we expected'); { my $service = $reg->searchForService('test service 2.1.2-2'); ok(defined($service), '... we found the service'); is($service, '2.1.2-2', '... and the service is what we expected'); } { my $service = $reg->searchForService('test service 2.1.5-2'); ok(!defined($service), '... we did not find the service'); } { my $container = $reg->searchForContainer('sub test 2.2'); ok(defined($container), '... we found the container'); isa_ok($container, 'IOC::Container'); is($container, $test_sub_2_2, '... and it is the container we expected'); } { my $container = $reg->searchForContainer('sub test 2.2-Nothing'); ok(!defined($container), '... we did not find the container'); } { my $service = $reg->locateService('test 2/sub test 2.1/sub test 2.1.2/test service 2.1.2-2'); ok(defined($service), '... we found the service'); is($service, '2.1.2-2', '... and the service is what we expected'); } { my $container = $reg->locateContainer('test 2/sub test 2.2'); ok(defined($container), '... we found the container'); isa_ok($container, 'IOC::Container'); is($container, $test_sub_2_2, '... and it is the container we expected'); } my $unreg_test2; ok($reg->hasRegisteredContainer('test 2'), '... we have this container'); lives_ok { $unreg_test2 = $reg->unregisterContainer($test2); } '... unregistered the container successfully'; ok(defined($unreg_test2), '... got the unregistered container'); isa_ok($unreg_test2, 'IOC::Container'); is($unreg_test2, $test2, '... and it is test2'); ok(!$reg->hasRegisteredContainer('test 2'), '... we no longer have this container'); throws_ok { $reg->getRegisteredContainer("test 2") } "IOC::ContainerNotFound", '... got an error'; is_deeply( [ sort $reg->getRegisteredContainerList() ], [ 'test 1', 'test 3' ], '... got the list of containers we expected'); my $unreg_test3; ok($reg->hasRegisteredContainer('test 3'), '... we have this container'); lives_ok { $unreg_test3 = $reg->unregisterContainer('test 3'); } '... unregistered the container successfully'; ok(defined($unreg_test3), '... got the unregistered container'); isa_ok($unreg_test3, 'IOC::Container'); is($unreg_test3, $test3, '... and it is test3'); ok(!$reg->hasRegisteredContainer('test 3'), '... we no longer have this container'); throws_ok { $reg->getRegisteredContainer("test 3") } "IOC::ContainerNotFound", '... got an error'; is_deeply( [ $reg->getRegisteredContainerList() ], [ 'test 1' ], '... got the list of containers we expected'); # check some errors # hasRegisteredContainer throws_ok { $reg->hasRegisteredContainer() } "IOC::InsufficientArguments", '... got an error'; # getRegisteredContainer throws_ok { $reg->getRegisteredContainer() } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->getRegisteredContainer("Fail") } "IOC::ContainerNotFound", '... got an error'; # registerContainer throws_ok { $reg->registerContainer() } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->registerContainer("Fail") } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->registerContainer([]) } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->registerContainer(bless {} => "Fail") } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->registerContainer(IOC::Container->new('test 1')) } "IOC::ContainerAlreadyExists", '... got an error'; # unregisterContainer throws_ok { $reg->unregisterContainer("Fail") } "IOC::ContainerNotFound", '... got an error'; throws_ok { $reg->unregisterContainer() } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->unregisterContainer([]) } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->unregisterContainer(bless {} => "Fail") } "IOC::InsufficientArguments", '... got an error'; # locateService throws_ok { $reg->locateService() } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->locateService("Fail/Fail") } "IOC::ContainerNotFound", '... got an error'; throws_ok { $reg->locateService("test 1/Fail") } "IOC::ServiceNotFound", '... got an error'; # locateContainer throws_ok { $reg->locateContainer() } "IOC::InsufficientArguments", '... got an error'; throws_ok { $reg->locateContainer("Fail/Fail") } "IOC::ContainerNotFound", '... got an error'; throws_ok { $reg->locateContainer("test 1/Fail") } "IOC::ContainerNotFound", '... got an error'; # just call destroy $reg->DESTROY();