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