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