1use strict;
2use less;
3use Test::More  'no_plan';
4
5my $Class   = 'Module::Loaded';
6my @Funcs   = qw[mark_as_loaded mark_as_unloaded is_loaded];
7my $Mod     = 'Foo::Bar'.$$;
8my $Strict  = $ENV{'PERL_CORE'} ? 'less' : 'strict';
9
10### load the thing
11{   use_ok( $Class );
12    can_ok( $Class, @Funcs );
13}
14
15{   ok( !is_loaded($Mod),       "$Mod not loaded yet" );
16    ok( mark_as_loaded($Mod),   "   $Mod now marked as loaded" );
17    is( is_loaded($Mod), $0,    "   $Mod is loaded from $0" );
18
19    my $rv = eval "require $Mod; 1";
20    ok( $rv,                    "$Mod required" );
21    ok( !$@,                    "   require did not die" );
22}
23
24### unload again
25{   ok( mark_as_unloaded($Mod), "$Mod now marked as unloaded" );
26    ok( !is_loaded($Mod),       "   $Mod now longer loaded" );
27
28    my $rv = eval "require $Mod; 1";
29    ok( !$rv,                   "$Mod require failed" );
30    ok( $@,                     "   require died" );
31    like( $@, qr/locate/,       "       with expected error" );
32}
33
34### check for an already loaded module
35{   my $where = is_loaded( $Strict );
36    ok( $where,                 "$Strict loaded" );
37    ok( mark_as_unloaded( $Strict ),
38                                "   $Strict unloaded" );
39
40    ### redefining subs, quell warnings
41    {   local $SIG{__WARN__} = sub {};
42        my $rv = eval "require $Strict; 1";
43        ok( $rv,                "$Strict loaded again" );
44    }
45
46    is( is_loaded( $Strict ), $where,
47                                "   $Strict is loaded" );
48}
49