#!/usr/bin/perl use strict; use warnings; use Test::More tests => 27; use Test::Exception; BEGIN { use_ok('IOC::Container'); use_ok('IOC::Service'); use_ok('IOC::Proxy'); } { package Test::Proxy::One; sub new { bless {} => $_[0] } sub test_proxy_one { return 'test_proxy_one' } package Test::Proxy::Two; sub new { bless {} => $_[0] } sub test_proxy_two { return 'test_proxy_two' } } my $container = IOC::Container->new('Test'); isa_ok($container, 'IOC::Container'); lives_ok { $container->register(IOC::Service->new('proxy_one' => sub { Test::Proxy::One->new() })); } '... registered the first service ok'; my $unproxy_one = $container->get('proxy_one'); isa_ok($unproxy_one, 'Test::Proxy::One'); ok(!UNIVERSAL::isa($unproxy_one, 'Test::Proxy::One::_::Proxy'), '... we are not proxied yet'); is($unproxy_one->test_proxy_one(), 'test_proxy_one', '... got the result we expected'); my @one_method_calls; my $proxy_one_server = IOC::Proxy->new({ on_method_call => sub { push @one_method_calls => \@_ } }); isa_ok($proxy_one_server, 'IOC::Proxy'); lives_ok { $container->addProxy('proxy_one' => $proxy_one_server); } '... added proxy to the first service ok'; my $proxy_one = $container->get('proxy_one'); isa_ok($unproxy_one, 'Test::Proxy::One::_::Proxy'); isa_ok($unproxy_one, 'Test::Proxy::One'); is($proxy_one->test_proxy_one(), 'test_proxy_one', '... got the result we expected'); is_deeply(\@one_method_calls, [ [ $proxy_one_server, 'test_proxy_one', 'Test::Proxy::One::test_proxy_one', [ $proxy_one ]] ], '... got the method calls we expected'); my $proxy_temp = $container->get('proxy_one'); # check to make sure we are not getting double proxied ok(!UNIVERSAL::isa($unproxy_one, 'Test::Proxy::One::_::Proxy::_::Proxy'), '... we are not being double proxied'); my @two_method_calls; my $proxy_two_server = IOC::Proxy->new({ on_method_call => sub { push @two_method_calls => \@_ } }); isa_ok($proxy_two_server, 'IOC::Proxy'); lives_ok { $container->registerWithProxy( IOC::Service->new('proxy_two' => sub { Test::Proxy::Two->new() }), $proxy_two_server ); } '... registered the second service ok'; my $proxy_two = $container->get('proxy_two'); isa_ok($proxy_two, 'Test::Proxy::Two::_::Proxy'); isa_ok($proxy_two, 'Test::Proxy::Two'); is($proxy_two->test_proxy_two(), 'test_proxy_two', '... got the result we expected'); is_deeply(\@two_method_calls, [ [ $proxy_two_server, 'test_proxy_two', 'Test::Proxy::Two::test_proxy_two', [ $proxy_two ]] ], '... got the method calls we expected'); # now check some errors throws_ok { $container->addProxy(); } 'IOC::InsufficientArguments', '... got the error we expected'; throws_ok { $container->addProxy('Fail'); } 'IOC::InsufficientArguments', '... got the error we expected'; throws_ok { $container->addProxy('Fail', 'Fail'); } 'IOC::InsufficientArguments', '... got the error we expected'; throws_ok { $container->addProxy('Fail', []); } 'IOC::InsufficientArguments', '... got the error we expected'; throws_ok { $container->addProxy('Fail', bless({}, 'Fail')); } 'IOC::InsufficientArguments', '... got the error we expected'; throws_ok { $container->addProxy('Fail', IOC::Proxy->new()); } 'IOC::ServiceNotFound', '... got the error we expected';