1#!perl 2 3use Test::More; 4use strict; 5use warnings; 6use Config; 7 8# 9# Module::Load; test new features: 10# autoload; 11# remote_load 12# autload_remote 13# and options: '','none',undef,'all','load','autoload','load_remote' 14# 15# License: This library is free software; you may redistribute and/or modify it under the same terms as Perl itself. 16# 17# Author (jabber/email) : reisub@yandex.ru 18# 19 20my ($afx, $cnt, $r, $tcode) = ('TestXYZ_', 0); 21 22sub _reset{ 23 undef %{Data::Dumper::}; 24 undef %{XYZ::Module::}; 25 no warnings q[uninitialized]; 26 eval "undef %{$afx$cnt::}"; 27 delete $INC{'Data/Dumper.pm'}; 28} 29 30sub _test{ 31 $cnt++; 32 $tcode = "package $afx$cnt; my \$WORLD='PEACE';" . join '', @_; 33# print "tcode:$tcode\n"; 34 $r = eval($tcode) || $@; 35} 36 37sub is_peace_in_world{ 38 like $r, qr/(WORLD\W+)?PEACE/o, $_[0] || '.'; 39 goto &_reset; 40} 41 42sub isnt_peace_in_world{ 43 unlike $r, qr/(WORLD\W+)?PEACE/o, $_[0] || '.'; 44 goto &_reset; 45} 46 47sub isnt_def_sub{ 48 like $r, qr/Undefined\s+subroutine/io, $_[0] || '.'; 49 goto &_reset; 50} 51 52sub cant_locate{ 53 like $r, qr/Can't\s+locate/io, $_[0] || '.'; 54 goto &_reset; 55} 56 57subtest 'load/prevcompat' => sub{ 58 _test('use Module::Load; 59 load("Data::Dumper"); 60 Data::Dumper->Dump([$WORLD]);'); 61 is_peace_in_world('default import'); 62 63 _test('use Module::Load "load"; 64 load("Data::Dumper"); 65 Data::Dumper->Dump([$WORLD]);'); 66 is_peace_in_world(); 67 68 _test('use Module::Load; 69 load("Data::Dumper"); 70 Dumper([$WORLD]);'); 71 isnt_def_sub(); 72 73 _test('use Module::Load; 74 load("Data::Dumper","Dumper"); 75 Data::Dumper->Dump([$WORLD]);'); 76 is_peace_in_world(); 77 78 _test('use Module::Load "all"; 79 load("______");'); 80 cant_locate(); 81 82 _test('use Module::Load ""; 83 load("Data::Dumper"); 84 Data::Dumper->Dump([$WORLD]);'); 85 isnt_def_sub(); 86 87 _test('use Module::Load "none"; 88 load("Data::Dumper"); 89 Data::Dumper->Dump([$WORLD]);'); 90 isnt_def_sub(); 91 92 _test('use Module::Load undef; 93 load("Data::Dumper"); 94 Data::Dumper->Dump([$WORLD]);'); 95 isnt_def_sub(); 96 97 done_testing(); 98}; 99 100subtest 'autoload' => sub{ 101 _test('use Module::Load; 102 autoload("Data::Dumper"); 103 Data::Dumper->Dump([$WORLD]);'); 104 is_peace_in_world('default import'); 105 106 _test('use Module::Load; 107 Module::Load::autoload("Data::Dumper"); 108 Data::Dumper->Dump([$WORLD]);'); 109 is_peace_in_world(); 110 111 _test('use Module::Load; 112 Module::Load::autoload("Data::Dumper"); 113 Dumper($WORLD);'); 114 is_peace_in_world(); 115 116 _test('use Module::Load; 117 Module::Load::autoload("Data::Dumper","Dumper"); 118 Dumper($WORLD);'); 119 is_peace_in_world(); 120 121 _test('use Module::Load "autoload"; 122 autoload("Data::Dumper"); 123 Dumper($WORLD);'); 124 is_peace_in_world(); 125 126 _test('use Module::Load "all"; 127 autoload("Data::Dumper"); 128 Dumper($WORLD);'); 129 is_peace_in_world(); 130 131 _test('use Module::Load "all"; 132 autoload("______");'); 133 cant_locate(); 134 135 _test('use Module::Load ""; 136 autoload("Data::Dumper"); 137 Data::Dumper->Dump([$WORLD]);'); 138 isnt_def_sub(); 139 140 _test('use Module::Load "none"; 141 autoload("Data::Dumper"); 142 Data::Dumper->Dump([$WORLD]);'); 143 isnt_def_sub(); 144 145 _test('use Module::Load undef; 146 autoload("Data::Dumper"); 147 Data::Dumper->Dump([$WORLD]);'); 148 isnt_def_sub(); 149 150 done_testing(); 151}; 152 153subtest 'noimport' => sub{ 154 for my $asq('"none"', '""', 'undef'){ 155 _test('use Module::Load '.$asq.'; 156 load("Data::Dumper"); 157 Data::Dumper->Dump([$WORLD]);'); 158 isnt_def_sub(); 159 160 _test('use Module::Load '.$asq.'; 161 autoload("Data::Dumper"); 162 Data::Dumper->Dump([$WORLD]);'); 163 isnt_def_sub(); 164 165 _test('use Module::Load '.$asq.'; 166 load_remote("XYZ::Module" => "Data::Dumper"); 167 Data::Dumper->Dump([$WORLD]);'); 168 isnt_def_sub(); 169 170 _test('use Module::Load '.$asq.'; 171 autoload_remote("XYZ::Module" => "Data::Dumper"); 172 Data::Dumper->Dump([$WORLD]);'); 173 isnt_def_sub(); 174 } 175 done_testing(); 176}; 177 178subtest 'load_remote' => sub{ 179 _test('use Module::Load; 180 load_remote("XYZ::Module","Data::Dumper"); 181 Data::Dumper->Dump([$WORLD]);'); 182 isnt_def_sub(); 183 184 _test('use Module::Load; 185 load_remote("XYZ::Module","Data::Dumper"); 186 Dumper([$WORLD]);'); 187 isnt_def_sub(); 188 189 _test('use Module::Load; 190 Module::Load::load_remote("XYZ::Module","Data::Dumper"); 191 Data::Dumper->Dump([$WORLD]);'); 192 is_peace_in_world(); 193 194 _test('use Module::Load; 195 Module::Load::load_remote("XYZ::Module","Data::Dumper"); 196 XYZ::Module::Dumper($WORLD);'); 197 isnt_def_sub(); 198 199 _test('use Module::Load; 200 Module::Load::load_remote("XYZ::Module","Data::Dumper","Dumper"); 201 XYZ::Module::Dumper($WORLD);'); 202 is_peace_in_world(); 203 204 _test('use Module::Load "all"; 205 load_remote("XYZ::Module","______","Data::Dumper"); 206 XYZ::Module::Dumper($WORLD);'); 207 cant_locate(); 208 209 done_testing(); 210}; 211 212subtest 'autoload_remote' => sub{ 213 _test('use Module::Load; 214 autoload_remote("XYZ::Module","Data::Dumper"); 215 Data::Dumper->Dump([$WORLD]);'); 216 isnt_def_sub(); 217 218 _test('use Module::Load; 219 autoload_remote("XYZ::Module","Data::Dumper"); 220 Dumper([$WORLD]);'); 221 isnt_def_sub(); 222 223 _test('use Module::Load; 224 Module::Load::autoload_remote("XYZ::Module","Data::Dumper"); 225 Data::Dumper->Dump([$WORLD]);'); 226 is_peace_in_world(); 227 228 _test('use Module::Load; 229 Module::Load::autoload_remote("XYZ::Module","Data::Dumper"); 230 XYZ::Module::Dumper($WORLD);'); 231 is_peace_in_world(); 232 233 _test('use Module::Load "all"; 234 autoload_remote("XYZ::Module","______","Data::Dumper"); 235 XYZ::Module::Dumper($WORLD);'); 236 cant_locate(); 237 238 done_testing(); 239}; 240 241subtest 'complex' => sub{ 242 _test('use Module::Load "load","autoload","none"; 243 load("Data::Dumper"); 244 Data::Dumper->Dump([$WORLD]);'); 245 isnt_def_sub(); 246 247 _test('use Module::Load "load","autoload","none"; 248 autoload("Data::Dumper"); 249 Data::Dumper->Dump([$WORLD]);'); 250 isnt_def_sub(); 251 252 _test('use Module::Load "load","autoload","none"; 253 load_remote("Data::Dumper"); 254 Data::Dumper->Dump([$WORLD]);'); 255 isnt_def_sub(); 256 257 _test('use Module::Load "load","autoload","none"; 258 autoload_remote("Data::Dumper"); 259 Data::Dumper->Dump([$WORLD]);'); 260 isnt_def_sub(); 261 262 _test('use Module::Load "load","autoload"; 263 load("Data::Dumper", "Dumper"); 264 autoload("Carp"); 265 croak( Dumper([$WORLD]) );'); 266 is_peace_in_world(); 267 268 _test('use Module::Load "load","autoload"; 269 load_remote("Data::Dumper");'); 270 isnt_def_sub(); 271 272 _test('use Module::Load "load","autoload"; 273 autoload_remote("Data::Dumper");'); 274 isnt_def_sub(); 275 276 _test('use Module::Load "load","autoload","none"; 277 autoload_remote("Data::Dumper"); 278 Data::Dumper->Dump([$WORLD]);'); 279 isnt_def_sub(); 280 281 _test('use Module::Load "load","autoload","load_remote","autoload_remote"; 282 load("Carp"); 283 autoload("Data::Dumper"); 284 load_remote("XYZ::Module", "Carp"); 285 autoload_remote("XYZ::Module", "Carp"); 286 Dumper([$WORLD]);'); 287 is_peace_in_world(); 288 289 _test('use Module::Load "all"; 290 load("Carp"); 291 autoload("Data::Dumper"); 292 load_remote("XYZ::Module" => "Carp"); 293 autoload_remote("XYZ::Module" => "Carp"); 294 Dumper([$WORLD]);'); 295 is_peace_in_world(); 296 297 _test('use Module::Load "all",""; 298 load("Carp");'); 299 isnt_def_sub(); 300 301 done_testing(); 302}; 303 304subtest 'dumpxs' => sub{ 305 unless ( $Config::Config{usedl} ) { 306 plan skip_all => 'Statically linked perl'; 307 } 308 _test('use Module::Load; 309 load("Data::Dumper","Dumper","DumperX"); 310 Data::Dumper->Dump([$WORLD]);'); 311 is_peace_in_world(); 312 313 _test('use Module::Load "all"; 314 load("Data::Dumper","Dumper","DumperX"); 315 DumperX([$WORLD]);'); 316 is_peace_in_world(); 317 318 _test('use Module::Load; 319 Module::Load::autoload("Data::Dumper","Dumper","DumperX"); 320 DumperX($WORLD);'); 321 is_peace_in_world(); 322 323 _test('use Module::Load "all"; 324 autoload("Data::Dumper","Dumper","DumperX"); 325 DumperX($WORLD);'); 326 is_peace_in_world(); 327 328 _test('use Module::Load; 329 Module::Load::load_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 330 XYZ::Module::Dumper($WORLD);'); 331 is_peace_in_world(); 332 333 _test('use Module::Load "load_remote"; 334 load_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 335 XYZ::Module::Dumper($WORLD);'); 336 is_peace_in_world(); 337 338 _test('use Module::Load "all"; 339 load_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 340 XYZ::Module::Dumper($WORLD);'); 341 is_peace_in_world(); 342 343 _test('use Module::Load; 344 Module::Load::autoload_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 345 XYZ::Module::DumperX($WORLD);'); 346 is_peace_in_world(); 347 348 _test('use Module::Load "autoload_remote"; 349 autoload_remote("XYZ::Module","Data::Dumper","Dumper","DumperX"); 350 XYZ::Module::Dumper($WORLD);'); 351 is_peace_in_world(); 352 353 done_testing(); 354}; 355 356done_testing(); 357 358