#! perl use strict; use warnings; use DynaLoader; use File::Spec::Functions; use Test::More tests => 19; use Test::Exception; my $module = 'P5NCI::Library'; use_ok( $module ) or exit; ok( $INC{'P5NCI.pm'}, 'P5NCI::Library should load P5NCI' ); can_ok( $module, 'new' ); throws_ok { $module->new() } qr/No library given/, 'new() should throw exception without library file named'; throws_ok { $module->new( library => 'not a real lib' ) } qr/No library found/, '... or if it cannot locate the library'; push @DynaLoader::dl_library_path, 'src'; my $lib; my %args = ( library => 'nci_test' ); lives_ok { $lib = $module->new( %args ) } '... but should load a real library appropriately'; ok( $lib->{lib}, '... pointing to the real library' ); isa_ok( $lib, $module ); can_ok( $lib, 'load_function' ); throws_ok { $lib->load_function() } qr/No function given/, 'load_function() should throw an exception without a function name'; throws_ok { $lib->load_function( 'foo' ) } qr/No signature given/, '... or without a signature'; throws_ok { $lib->load_function( 'foo', 'invalid' ) } qr/Don't understand NCI signature 'invalid'/, '... or with an invalid signature'; my $nci_func = $lib->load_function( 'double_int', 'ii' ); is( ref( $nci_func ), 'CODE', '... returning a code ref if it all works' ); can_ok( $lib, 'package' ); is( $lib->package(), 'main', "package() should return default of 'main'" ); $args{package} = 'NCI::Funcs'; $lib = $module->new( %args ); is( $lib->package(), 'NCI::Funcs', '... or package set in constructor' ); can_ok( $lib, 'install_function' ); $nci_func = $lib->install_function( 'double_int', 'ii' ); ok( NCI::Funcs->can( 'double_int' ), 'install_function() should install the named function into the package' ); is( $nci_func, \&NCI::Funcs::double_int, '... returning the installed function' );