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