16fb12b70Safresh1#!perl 26fb12b70Safresh1 36fb12b70Safresh1use strict; 46fb12b70Safresh1use warnings; 5*256a93a4Safresh1 6*256a93a4Safresh1use Test::More; 76fb12b70Safresh1use Config; 86fb12b70Safresh1 96fb12b70Safresh1# 106fb12b70Safresh1# Module::Load; test new features: 116fb12b70Safresh1# autoload; 126fb12b70Safresh1# remote_load 136fb12b70Safresh1# autload_remote 146fb12b70Safresh1# and options: '','none',undef,'all','load','autoload','load_remote' 156fb12b70Safresh1# 166fb12b70Safresh1# License: This library is free software; you may redistribute and/or modify it under the same terms as Perl itself. 176fb12b70Safresh1# 186fb12b70Safresh1# Author (jabber/email) : reisub@yandex.ru 196fb12b70Safresh1# 206fb12b70Safresh1 216fb12b70Safresh1my ($afx, $cnt, $r, $tcode) = ('TestXYZ_', 0); 226fb12b70Safresh1 236fb12b70Safresh1sub _reset{ 246fb12b70Safresh1 undef %{Data::Dumper::}; 256fb12b70Safresh1 undef %{XYZ::Module::}; 266fb12b70Safresh1 no warnings q[uninitialized]; 276fb12b70Safresh1 eval "undef %{$afx$cnt::}"; 286fb12b70Safresh1 delete $INC{'Data/Dumper.pm'}; 296fb12b70Safresh1} 306fb12b70Safresh1 316fb12b70Safresh1sub _test{ 326fb12b70Safresh1 $cnt++; 336fb12b70Safresh1 $tcode = "package $afx$cnt; my \$WORLD='PEACE';" . join '', @_; 346fb12b70Safresh1# print "tcode:$tcode\n"; 356fb12b70Safresh1 $r = eval($tcode) || $@; 366fb12b70Safresh1} 376fb12b70Safresh1 386fb12b70Safresh1sub is_peace_in_world{ 396fb12b70Safresh1 like $r, qr/(WORLD\W+)?PEACE/o, $_[0] || '.'; 406fb12b70Safresh1 goto &_reset; 416fb12b70Safresh1} 426fb12b70Safresh1 436fb12b70Safresh1sub isnt_peace_in_world{ 446fb12b70Safresh1 unlike $r, qr/(WORLD\W+)?PEACE/o, $_[0] || '.'; 456fb12b70Safresh1 goto &_reset; 466fb12b70Safresh1} 476fb12b70Safresh1 486fb12b70Safresh1sub isnt_def_sub{ 496fb12b70Safresh1 like $r, qr/Undefined\s+subroutine/io, $_[0] || '.'; 506fb12b70Safresh1 goto &_reset; 516fb12b70Safresh1} 526fb12b70Safresh1 536fb12b70Safresh1sub cant_locate{ 546fb12b70Safresh1 like $r, qr/Can't\s+locate/io, $_[0] || '.'; 556fb12b70Safresh1 goto &_reset; 566fb12b70Safresh1} 576fb12b70Safresh1 586fb12b70Safresh1subtest 'load/prevcompat' => sub{ 596fb12b70Safresh1 _test('use Module::Load; 606fb12b70Safresh1 load("Data::Dumper"); 616fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 626fb12b70Safresh1 is_peace_in_world('default import'); 636fb12b70Safresh1 646fb12b70Safresh1 _test('use Module::Load "load"; 656fb12b70Safresh1 load("Data::Dumper"); 666fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 676fb12b70Safresh1 is_peace_in_world(); 686fb12b70Safresh1 696fb12b70Safresh1 _test('use Module::Load; 706fb12b70Safresh1 load("Data::Dumper"); 716fb12b70Safresh1 Dumper([$WORLD]);'); 726fb12b70Safresh1 isnt_def_sub(); 736fb12b70Safresh1 746fb12b70Safresh1 _test('use Module::Load; 756fb12b70Safresh1 load("Data::Dumper","Dumper"); 766fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 776fb12b70Safresh1 is_peace_in_world(); 786fb12b70Safresh1 796fb12b70Safresh1 _test('use Module::Load "all"; 806fb12b70Safresh1 load("______");'); 816fb12b70Safresh1 cant_locate(); 826fb12b70Safresh1 836fb12b70Safresh1 _test('use Module::Load ""; 846fb12b70Safresh1 load("Data::Dumper"); 856fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 866fb12b70Safresh1 isnt_def_sub(); 876fb12b70Safresh1 886fb12b70Safresh1 _test('use Module::Load "none"; 896fb12b70Safresh1 load("Data::Dumper"); 906fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 916fb12b70Safresh1 isnt_def_sub(); 926fb12b70Safresh1 936fb12b70Safresh1 _test('use Module::Load undef; 946fb12b70Safresh1 load("Data::Dumper"); 956fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 966fb12b70Safresh1 isnt_def_sub(); 976fb12b70Safresh1 986fb12b70Safresh1 done_testing(); 996fb12b70Safresh1}; 1006fb12b70Safresh1 1016fb12b70Safresh1subtest 'autoload' => sub{ 1026fb12b70Safresh1 _test('use Module::Load; 1036fb12b70Safresh1 autoload("Data::Dumper"); 1046fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1056fb12b70Safresh1 is_peace_in_world('default import'); 1066fb12b70Safresh1 1076fb12b70Safresh1 _test('use Module::Load; 1086fb12b70Safresh1 Module::Load::autoload("Data::Dumper"); 1096fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1106fb12b70Safresh1 is_peace_in_world(); 1116fb12b70Safresh1 1126fb12b70Safresh1 _test('use Module::Load; 1136fb12b70Safresh1 Module::Load::autoload("Data::Dumper"); 1146fb12b70Safresh1 Dumper($WORLD);'); 1156fb12b70Safresh1 is_peace_in_world(); 1166fb12b70Safresh1 1176fb12b70Safresh1 _test('use Module::Load; 1186fb12b70Safresh1 Module::Load::autoload("Data::Dumper","Dumper"); 1196fb12b70Safresh1 Dumper($WORLD);'); 1206fb12b70Safresh1 is_peace_in_world(); 1216fb12b70Safresh1 1226fb12b70Safresh1 _test('use Module::Load "autoload"; 1236fb12b70Safresh1 autoload("Data::Dumper"); 1246fb12b70Safresh1 Dumper($WORLD);'); 1256fb12b70Safresh1 is_peace_in_world(); 1266fb12b70Safresh1 1276fb12b70Safresh1 _test('use Module::Load "all"; 1286fb12b70Safresh1 autoload("Data::Dumper"); 1296fb12b70Safresh1 Dumper($WORLD);'); 1306fb12b70Safresh1 is_peace_in_world(); 1316fb12b70Safresh1 1326fb12b70Safresh1 _test('use Module::Load "all"; 1336fb12b70Safresh1 autoload("______");'); 1346fb12b70Safresh1 cant_locate(); 1356fb12b70Safresh1 1366fb12b70Safresh1 _test('use Module::Load ""; 1376fb12b70Safresh1 autoload("Data::Dumper"); 1386fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1396fb12b70Safresh1 isnt_def_sub(); 1406fb12b70Safresh1 1416fb12b70Safresh1 _test('use Module::Load "none"; 1426fb12b70Safresh1 autoload("Data::Dumper"); 1436fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1446fb12b70Safresh1 isnt_def_sub(); 1456fb12b70Safresh1 1466fb12b70Safresh1 _test('use Module::Load undef; 1476fb12b70Safresh1 autoload("Data::Dumper"); 1486fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1496fb12b70Safresh1 isnt_def_sub(); 1506fb12b70Safresh1 1516fb12b70Safresh1 done_testing(); 1526fb12b70Safresh1}; 1536fb12b70Safresh1 1546fb12b70Safresh1subtest 'noimport' => sub{ 1556fb12b70Safresh1 for my $asq('"none"', '""', 'undef'){ 1566fb12b70Safresh1 _test('use Module::Load '.$asq.'; 1576fb12b70Safresh1 load("Data::Dumper"); 1586fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1596fb12b70Safresh1 isnt_def_sub(); 1606fb12b70Safresh1 1616fb12b70Safresh1 _test('use Module::Load '.$asq.'; 1626fb12b70Safresh1 autoload("Data::Dumper"); 1636fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1646fb12b70Safresh1 isnt_def_sub(); 1656fb12b70Safresh1 1666fb12b70Safresh1 _test('use Module::Load '.$asq.'; 1676fb12b70Safresh1 load_remote("XYZ::Module" => "Data::Dumper"); 1686fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1696fb12b70Safresh1 isnt_def_sub(); 1706fb12b70Safresh1 1716fb12b70Safresh1 _test('use Module::Load '.$asq.'; 1726fb12b70Safresh1 autoload_remote("XYZ::Module" => "Data::Dumper"); 1736fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1746fb12b70Safresh1 isnt_def_sub(); 1756fb12b70Safresh1 } 1766fb12b70Safresh1 done_testing(); 1776fb12b70Safresh1}; 1786fb12b70Safresh1 1796fb12b70Safresh1subtest 'load_remote' => sub{ 1806fb12b70Safresh1 _test('use Module::Load; 1816fb12b70Safresh1 load_remote("XYZ::Module","Data::Dumper"); 1826fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1836fb12b70Safresh1 isnt_def_sub(); 1846fb12b70Safresh1 1856fb12b70Safresh1 _test('use Module::Load; 1866fb12b70Safresh1 load_remote("XYZ::Module","Data::Dumper"); 1876fb12b70Safresh1 Dumper([$WORLD]);'); 1886fb12b70Safresh1 isnt_def_sub(); 1896fb12b70Safresh1 1906fb12b70Safresh1 _test('use Module::Load; 1916fb12b70Safresh1 Module::Load::load_remote("XYZ::Module","Data::Dumper"); 1926fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 1936fb12b70Safresh1 is_peace_in_world(); 1946fb12b70Safresh1 1956fb12b70Safresh1 _test('use Module::Load; 1966fb12b70Safresh1 Module::Load::load_remote("XYZ::Module","Data::Dumper"); 1976fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 1986fb12b70Safresh1 isnt_def_sub(); 1996fb12b70Safresh1 2006fb12b70Safresh1 _test('use Module::Load; 2016fb12b70Safresh1 Module::Load::load_remote("XYZ::Module","Data::Dumper","Dumper"); 2026fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 2036fb12b70Safresh1 is_peace_in_world(); 2046fb12b70Safresh1 2056fb12b70Safresh1 _test('use Module::Load "all"; 2066fb12b70Safresh1 load_remote("XYZ::Module","______","Data::Dumper"); 2076fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 2086fb12b70Safresh1 cant_locate(); 2096fb12b70Safresh1 2106fb12b70Safresh1 done_testing(); 2116fb12b70Safresh1}; 2126fb12b70Safresh1 2136fb12b70Safresh1subtest 'autoload_remote' => sub{ 2146fb12b70Safresh1 _test('use Module::Load; 2156fb12b70Safresh1 autoload_remote("XYZ::Module","Data::Dumper"); 2166fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2176fb12b70Safresh1 isnt_def_sub(); 2186fb12b70Safresh1 2196fb12b70Safresh1 _test('use Module::Load; 2206fb12b70Safresh1 autoload_remote("XYZ::Module","Data::Dumper"); 2216fb12b70Safresh1 Dumper([$WORLD]);'); 2226fb12b70Safresh1 isnt_def_sub(); 2236fb12b70Safresh1 2246fb12b70Safresh1 _test('use Module::Load; 2256fb12b70Safresh1 Module::Load::autoload_remote("XYZ::Module","Data::Dumper"); 2266fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2276fb12b70Safresh1 is_peace_in_world(); 2286fb12b70Safresh1 2296fb12b70Safresh1 _test('use Module::Load; 2306fb12b70Safresh1 Module::Load::autoload_remote("XYZ::Module","Data::Dumper"); 2316fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 2326fb12b70Safresh1 is_peace_in_world(); 2336fb12b70Safresh1 2346fb12b70Safresh1 _test('use Module::Load "all"; 2356fb12b70Safresh1 autoload_remote("XYZ::Module","______","Data::Dumper"); 2366fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 2376fb12b70Safresh1 cant_locate(); 2386fb12b70Safresh1 2396fb12b70Safresh1 done_testing(); 2406fb12b70Safresh1}; 2416fb12b70Safresh1 2426fb12b70Safresh1subtest 'complex' => sub{ 2436fb12b70Safresh1 _test('use Module::Load "load","autoload","none"; 2446fb12b70Safresh1 load("Data::Dumper"); 2456fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2466fb12b70Safresh1 isnt_def_sub(); 2476fb12b70Safresh1 2486fb12b70Safresh1 _test('use Module::Load "load","autoload","none"; 2496fb12b70Safresh1 autoload("Data::Dumper"); 2506fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2516fb12b70Safresh1 isnt_def_sub(); 2526fb12b70Safresh1 2536fb12b70Safresh1 _test('use Module::Load "load","autoload","none"; 2546fb12b70Safresh1 load_remote("Data::Dumper"); 2556fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2566fb12b70Safresh1 isnt_def_sub(); 2576fb12b70Safresh1 2586fb12b70Safresh1 _test('use Module::Load "load","autoload","none"; 2596fb12b70Safresh1 autoload_remote("Data::Dumper"); 2606fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2616fb12b70Safresh1 isnt_def_sub(); 2626fb12b70Safresh1 2636fb12b70Safresh1 _test('use Module::Load "load","autoload"; 2646fb12b70Safresh1 load("Data::Dumper", "Dumper"); 2656fb12b70Safresh1 autoload("Carp"); 2666fb12b70Safresh1 croak( Dumper([$WORLD]) );'); 2676fb12b70Safresh1 is_peace_in_world(); 2686fb12b70Safresh1 2696fb12b70Safresh1 _test('use Module::Load "load","autoload"; 2706fb12b70Safresh1 load_remote("Data::Dumper");'); 2716fb12b70Safresh1 isnt_def_sub(); 2726fb12b70Safresh1 2736fb12b70Safresh1 _test('use Module::Load "load","autoload"; 2746fb12b70Safresh1 autoload_remote("Data::Dumper");'); 2756fb12b70Safresh1 isnt_def_sub(); 2766fb12b70Safresh1 2776fb12b70Safresh1 _test('use Module::Load "load","autoload","none"; 2786fb12b70Safresh1 autoload_remote("Data::Dumper"); 2796fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 2806fb12b70Safresh1 isnt_def_sub(); 2816fb12b70Safresh1 2826fb12b70Safresh1 _test('use Module::Load "load","autoload","load_remote","autoload_remote"; 2836fb12b70Safresh1 load("Carp"); 2846fb12b70Safresh1 autoload("Data::Dumper"); 2856fb12b70Safresh1 load_remote("XYZ::Module", "Carp"); 2866fb12b70Safresh1 autoload_remote("XYZ::Module", "Carp"); 2876fb12b70Safresh1 Dumper([$WORLD]);'); 2886fb12b70Safresh1 is_peace_in_world(); 2896fb12b70Safresh1 2906fb12b70Safresh1 _test('use Module::Load "all"; 2916fb12b70Safresh1 load("Carp"); 2926fb12b70Safresh1 autoload("Data::Dumper"); 2936fb12b70Safresh1 load_remote("XYZ::Module" => "Carp"); 2946fb12b70Safresh1 autoload_remote("XYZ::Module" => "Carp"); 2956fb12b70Safresh1 Dumper([$WORLD]);'); 2966fb12b70Safresh1 is_peace_in_world(); 2976fb12b70Safresh1 2986fb12b70Safresh1 _test('use Module::Load "all",""; 2996fb12b70Safresh1 load("Carp");'); 3006fb12b70Safresh1 isnt_def_sub(); 3016fb12b70Safresh1 3026fb12b70Safresh1 done_testing(); 3036fb12b70Safresh1}; 3046fb12b70Safresh1 3056fb12b70Safresh1subtest 'dumpxs' => sub{ 3066fb12b70Safresh1 unless ( $Config::Config{usedl} ) { 3076fb12b70Safresh1 plan skip_all => 'Statically linked perl'; 3086fb12b70Safresh1 } 3096fb12b70Safresh1 _test('use Module::Load; 3106fb12b70Safresh1 load("Data::Dumper","Dumper","DumperX"); 3116fb12b70Safresh1 Data::Dumper->Dump([$WORLD]);'); 3126fb12b70Safresh1 is_peace_in_world(); 3136fb12b70Safresh1 3146fb12b70Safresh1 _test('use Module::Load "all"; 3156fb12b70Safresh1 load("Data::Dumper","Dumper","DumperX"); 3166fb12b70Safresh1 DumperX([$WORLD]);'); 3176fb12b70Safresh1 is_peace_in_world(); 3186fb12b70Safresh1 3196fb12b70Safresh1 _test('use Module::Load; 3206fb12b70Safresh1 Module::Load::autoload("Data::Dumper","Dumper","DumperX"); 3216fb12b70Safresh1 DumperX($WORLD);'); 3226fb12b70Safresh1 is_peace_in_world(); 3236fb12b70Safresh1 3246fb12b70Safresh1 _test('use Module::Load "all"; 3256fb12b70Safresh1 autoload("Data::Dumper","Dumper","DumperX"); 3266fb12b70Safresh1 DumperX($WORLD);'); 3276fb12b70Safresh1 is_peace_in_world(); 3286fb12b70Safresh1 3296fb12b70Safresh1 _test('use Module::Load; 3306fb12b70Safresh1 Module::Load::load_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 3316fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 3326fb12b70Safresh1 is_peace_in_world(); 3336fb12b70Safresh1 3346fb12b70Safresh1 _test('use Module::Load "load_remote"; 3356fb12b70Safresh1 load_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 3366fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 3376fb12b70Safresh1 is_peace_in_world(); 3386fb12b70Safresh1 3396fb12b70Safresh1 _test('use Module::Load "all"; 3406fb12b70Safresh1 load_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 3416fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 3426fb12b70Safresh1 is_peace_in_world(); 3436fb12b70Safresh1 3446fb12b70Safresh1 _test('use Module::Load; 3456fb12b70Safresh1 Module::Load::autoload_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 3466fb12b70Safresh1 XYZ::Module::DumperX($WORLD);'); 3476fb12b70Safresh1 is_peace_in_world(); 3486fb12b70Safresh1 3496fb12b70Safresh1 _test('use Module::Load "autoload_remote"; 3506fb12b70Safresh1 autoload_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 3516fb12b70Safresh1 XYZ::Module::Dumper($WORLD);'); 3526fb12b70Safresh1 is_peace_in_world(); 3536fb12b70Safresh1 3546fb12b70Safresh1 done_testing(); 3556fb12b70Safresh1}; 3566fb12b70Safresh1 3576fb12b70Safresh1done_testing(); 3586fb12b70Safresh1 359