1use strict; 2use warnings; 3 4use FindBin; 5use Test::More; 6use Test::Exception; 7use Class::Inspector; 8 9use lib "$FindBin::Bin/lib"; 10 11plan tests => 25; 12 13BEGIN { 14 package TestPackage::A; 15 sub some_method {} 16} 17 18use_ok('MyModule'); 19 20MyModule->load_components('Foo'); 21 22# Clear down inc so ppl dont mess us up with installing modules that we 23# expect not to exist 24#@INC = (); 25# This breaks Carp1.08/perl 5.10.0; bah 26 27throws_ok { MyModule->load_components('+ClassC3ComponentFooThatShouldntExist'); } qr/^Can't locate ClassC3ComponentFooThatShouldntExist.pm in \@INC/; 28 29is(MyModule->new->message, "Foo MyModule", "it worked"); 30 31ok( MyModule->ensure_class_found('MyModule::Plugin::Foo'), 32 'loaded package MyModule::Plugin::Foo was found' ); 33ok( !Class::Inspector->loaded('MyModule::OwnComponent'), 34 'MyModule::OwnComponent not loaded yet' ); 35ok( MyModule->ensure_class_found('MyModule::OwnComponent'), 36 'package MyModule::OwnComponent was found' ); 37ok( !Class::Inspector->loaded('MyModule::OwnComponent'), 38 'MyModule::OwnComponent not loaded by ensure_class_found()' ); 39ok( MyModule->ensure_class_found('TestPackage::A'), 40 'anonymous package TestPackage::A found' ); 41ok( !MyModule->ensure_class_found('FAKE::WONT::BE::FOUND'), 42 'fake package not found' ); 43 44# Test load_optional_class 45my $retval = eval { MyModule->load_optional_class('ANOTHER::FAKE::PACKAGE') }; 46ok( !$@, 'load_optional_class on a nonexistent class did not throw' ); 47ok( !$retval, 'nonexistent package not loaded' ); 48$retval = eval { MyModule->load_optional_class('MyModule::OwnComponent') }; 49ok( !$@, 'load_optional_class on an existing class did not throw' ); 50ok( $retval, 'MyModule::OwnComponent loaded' ); 51throws_ok ( 52 sub { MyModule->load_optional_class('MyModule::ErrorComponent') }, 53 qr/did not return a true value/, 54 'MyModule::ErrorComponent threw ok' 55); 56 57eval { MyModule->load_optional_class('ENDS::WITH::COLONS::') }; 58like( $@, qr/Invalid class name 'ENDS::WITH::COLONS::'/, 'Throw on Class::' ); 59 60# Simulate a PAR environment 61{ 62 my @code; 63 local @INC = @INC; 64 unshift @INC, sub { 65 if ($_[1] =~ m{^VIRTUAL/PAR/PACKAGE[0-9]*\.pm$}) { 66 return (sub { return 0 unless @code; $_ = shift @code; 1; } ); 67 } 68 else { 69 return (); 70 } 71 }; 72 73 $retval = eval { MyModule->load_optional_class('FAKE::PAR::PACKAGE') }; 74 ok( !$@, 'load_optional_class on a nonexistent PAR class did not throw' ); 75 ok( !$retval, 'nonexistent PAR package not loaded' ); 76 77 78 # simulate a class which does load but does not return true 79 @code = ( 80 q/package VIRTUAL::PAR::PACKAGE1;/, 81 q/0;/, 82 ); 83 84 $retval = eval { MyModule->load_optional_class('VIRTUAL::PAR::PACKAGE1') }; 85 ok( $@, 'load_optional_class of a no-true-returning PAR module did throw' ); 86 ok( !$retval, 'no-true-returning PAR package not loaded' ); 87 88 # simulate a normal class 89 @code = ( 90 q/package VIRTUAL::PAR::PACKAGE2;/, 91 q/1;/, 92 ); 93 94 $retval = eval { MyModule->load_optional_class('VIRTUAL::PAR::PACKAGE2') }; 95 ok( !$@, 'load_optional_class of a PAR module did not throw' ); 96 ok( $retval, 'PAR package "loaded"' ); 97 98 # see if we can still load stuff with the coderef present 99 $retval = eval { MyModule->load_optional_class('AnotherModule') }; 100 ok( !$@, 'load_optional_class did not throw' ) || diag $@; 101 ok( $retval, 'AnotherModule loaded' ); 102 103 @code = ( 104 q/package VIRTUAL::PAR::PACKAGE3;/, 105 q/1;/, 106 ); 107 108 $retval = eval { MyModule->ensure_class_found('VIRTUAL::PAR::PACKAGE3') }; 109 ok( !$@, 'ensure_class_found of a PAR module did not throw' ); 110 ok( $retval, 'PAR package "found"' ); 111} 112