| use strict; |
| use warnings; |
| use Test::More tests => 9; |
| BEGIN { use_ok 'director_constructor' } |
| require_ok 'director_constructor'; |
| |
| { |
| package Test; |
| use base 'director_constructor::Foo'; |
| sub doubleit { my($self) = @_; |
| $self->{a} *= 2; |
| } |
| sub test { 3 } |
| } |
| my $t = Test->new(5); |
| isa_ok $t, 'Test'; |
| is $t->getit, 5; |
| is $t->do_test, 3; |
| |
| $t->doubleit(); |
| |
| is $t->getit, 10; |
| |
| { |
| package Wrong; |
| use base 'director_constructor::Foo'; |
| sub doubleit { my($self) = @_; |
| # calling this should trigger a type error on attribute |
| # assignment |
| $self->{a} = {}; |
| } |
| sub test { |
| # if c++ calls this, retval copyout should trigger a type error |
| return bless {}, 'TotallyBogus'; |
| } |
| } |
| |
| # TODO: these TypeErrors in director classes should be more detailed |
| my $w = Wrong->new(12); |
| is eval { $w->doubleit() }, undef; |
| like $@, qr/TypeError/; |
| is $w->getit(), 12, 'W.a should be unaffected'; |
| |
| # TODO: this is giving an unhandled C++ exception right now |
| #is eval { $W->do_test() }, undef; |
| #like $@, qr/TypeError/; |