1#!/usr/bin/perl 2 3use strict; 4use warnings; 5 6use Test::More; 7use Test::Moose; 8use Test::Fatal; 9 10use Bread::Board::SetterInjection; 11use Bread::Board::Literal; 12 13{ 14 package Needle; 15 use Moose; 16 17 package Mexican::Black::Tar; 18 use Moose; 19 20 package Addict; 21 use Moose; 22 23 sub shoot_up_good { shift->new(@_, overdose => 1) } 24 25 has 'needle' => (is => 'rw'); 26 has 'spoon' => (is => 'rw'); 27 has 'stash' => (is => 'rw'); 28 has 'overdose' => (is => 'ro', isa => 'Bool', default => 0); 29} 30 31my $s = Bread::Board::SetterInjection->new( 32 name => 'William', 33 class => 'Addict', 34 dependencies => { 35 needle => Bread::Board::SetterInjection->new(name => 'spike', class => 'Needle'), 36 spoon => Bread::Board::Literal->new(name => 'works', value => 'Spoon!'), 37 }, 38 parameters => { 39 stash => { isa => 'Mexican::Black::Tar' } 40 } 41); 42isa_ok($s, 'Bread::Board::SetterInjection'); 43does_ok($s, 'Bread::Board::Service::WithClass'); 44does_ok($s, 'Bread::Board::Service::WithDependencies'); 45does_ok($s, 'Bread::Board::Service::WithParameters'); 46does_ok($s, 'Bread::Board::Service'); 47 48{ 49 my $i = $s->get(stash => Mexican::Black::Tar->new); 50 51 isa_ok($i, 'Addict'); 52 isa_ok($i->needle, 'Needle'); 53 is($i->spoon, 'Spoon!', '... got our literal service'); 54 isa_ok($i->stash, 'Mexican::Black::Tar'); 55 56 57 { 58 my $i2 = $s->get(stash => Mexican::Black::Tar->new); 59 isnt($i, $i2, '... calling it again returns an new object'); 60 } 61} 62 63$s->constructor_name('shoot_up_good'); 64 65{ 66 my $i = $s->get(stash => Mexican::Black::Tar->new); 67 68 isa_ok($i, 'Addict'); 69 ok $i->overdose, 'Alternate constructor called'; 70} 71 72is($s->name, 'William', '... got the right name'); 73is($s->class, 'Addict', '... got the right class'); 74 75my $deps = $s->dependencies; 76is_deeply([ sort keys %$deps ], [qw/needle spoon/], '... got the right dependency keys'); 77 78my $needle = $s->get_dependency('needle'); 79isa_ok($needle, 'Bread::Board::Dependency'); 80isa_ok($needle->service, 'Bread::Board::SetterInjection'); 81 82is($needle->service->name, 'spike', '... got the right name'); 83is($needle->service->class, 'Needle', '... got the right class'); 84 85my $spoon = $s->get_dependency('spoon'); 86isa_ok($spoon, 'Bread::Board::Dependency'); 87isa_ok($spoon->service, 'Bread::Board::Literal'); 88 89is($spoon->service->name, 'works', '... got the right name'); 90is($spoon->service->value, 'Spoon!', '... got the right literal value'); 91 92my $params = $s->parameters; 93is_deeply([ sort keys %$params ], [qw/stash/], '... got the right paramter keys'); 94is_deeply($params->{stash}, { isa => 'Mexican::Black::Tar' }, '... got the right parameter spec'); 95 96## some errors 97 98isnt(exception { $s->get }, undef, 99 '... you must supply the required parameters'); 100 101isnt(exception { $s->get(stash => []) }, undef, 102 '... you must supply the required parameters as correct types'); 103 104isnt(exception { $s->get(stash => Mexican::Black::Tar->new, foo => 10) }, undef, 105 '... you must supply the required parameters (and no more)'); 106 107done_testing; 108