1#!./perl 2 3BEGIN { 4 chdir 't' if -d 't'; 5 @INC = ('../lib', 'lib'); 6 $INC{"feature.pm"} = 1; # so we don't attempt to load feature.pm 7} 8 9print "1..87\n"; 10 11# Can't require test.pl, as we're testing the use/require mechanism here. 12 13my $test = 1; 14 15sub _ok { 16 my ($type, $got, $expected, $name) = @_; 17 18 my $result; 19 if ($type eq 'is') { 20 $result = $got eq $expected; 21 } elsif ($type eq 'isnt') { 22 $result = $got ne $expected; 23 } elsif ($type eq 'like') { 24 $result = $got =~ $expected; 25 } elsif ($type eq 'ok') { 26 $result = not not $got; 27 } else { 28 die "Unexpected type '$type'$name"; 29 } 30 if ($result) { 31 if ($name) { 32 print "ok $test - $name\n"; 33 } else { 34 print "ok $test\n"; 35 } 36 } else { 37 if ($name) { 38 print "not ok $test - $name\n"; 39 } else { 40 print "not ok $test\n"; 41 } 42 my @caller = caller(1); 43 print "# Failed test at $caller[1] line $caller[2]\n"; 44 print "# Got '$got'\n"; 45 if ($type eq 'is') { 46 print "# Expected '$expected'\n"; 47 } elsif ($type eq 'isnt') { 48 print "# Expected not '$expected'\n"; 49 } elsif ($type eq 'like') { 50 print "# Expected $expected\n"; 51 } elsif ($type eq 'ok') { 52 print "# Expected a true value\n"; 53 } 54 } 55 $test = $test + 1; 56 $result; 57} 58 59sub like ($$;$) { 60 _ok ('like', @_); 61} 62sub is ($$;$) { 63 _ok ('is', @_); 64} 65sub isnt ($$;$) { 66 _ok ('isnt', @_); 67} 68sub ok($;$) { 69 _ok ('ok', shift, undef, @_); 70} 71 72eval "use 5"; # implicit semicolon 73is ($@, ''); 74 75eval "use 5;"; 76is ($@, ''); 77 78eval "{use 5}"; # [perl #70884] 79is ($@, ''); 80 81eval "{use 5 }"; # [perl #70884] 82is ($@, ''); 83 84# new style version numbers 85 86eval q{ use v5.5.630; }; 87is ($@, ''); 88 89eval q{ use 10.0.2; }; 90like ($@, qr/^\QPerl v10.0.2 required\E/); 91 92eval "use 5.000"; # implicit semicolon 93is ($@, ''); 94 95eval "use 5.000;"; 96is ($@, ''); 97 98eval "use 6.000;"; 99like ($@, qr/\QPerl v6.0.0 required--this is only $^V, stopped\E/); 100 101eval "no 6.000;"; 102is ($@, ''); 103 104eval "no 5.000;"; 105like ($@, qr/\QPerls since v5.0.0 too modern--this is $^V, stopped\E/); 106 107eval "use 5.6;"; 108like ($@, qr/\QPerl v5.600.0 required (did you mean v5.6.0?)--this is only $^V, stopped\E/); 109 110eval "use 5.8;"; 111like ($@, qr/\QPerl v5.800.0 required (did you mean v5.8.0?)--this is only $^V, stopped\E/); 112 113eval "use 5.9;"; 114like ($@, qr/\QPerl v5.900.0 required (did you mean v5.9.0?)--this is only $^V, stopped\E/); 115 116eval "use 5.10;"; 117like ($@, qr/\QPerl v5.100.0 required (did you mean v5.10.0?)--this is only $^V, stopped\E/); 118 119eval "use 5.11;"; 120like ($@, qr/\QPerl v5.110.0 required (did you mean v5.11.0?)--this is only $^V, stopped\E/); 121 122eval sprintf "use %.6f;", $]; 123is ($@, ''); 124 125 126eval sprintf "use %.6f;", $] - 0.000001; 127is ($@, ''); 128 129eval sprintf("use %.6f;", $] + 1); 130like ($@, qr/Perl v6\.\d+\.\d+ required--this is only \Q$^V\E, stopped/a); 131 132eval sprintf "use %.6f;", $] + 0.00001; 133like ($@, qr/Perl v5\.\d+\.\d+ required--this is only \Q$^V\E, stopped/a); 134 135# check that "use 5.11.0" (and higher) loads strictures 136eval 'use 5.11.0; ${"foo"} = "bar";'; 137like ($@, qr/\QCan't use string ("foo") as a SCALAR ref while "strict refs" in use\E/); 138# but that they can be disabled 139eval 'use 5.11.0; no strict "refs"; ${"foo"} = "bar";'; 140is ($@, ""); 141# and they are properly scoped 142eval '{use 5.11.0;} ${"foo"} = "bar";'; 143is ($@, ""); 144eval 'no strict; use 5.012; ${"foo"} = "bar"'; 145is $@, "", 'explicit "no strict" overrides later ver decl'; 146eval 'use strict; use 5.01; ${"foo"} = "bar"'; 147like $@, qr/^Can't use string/, 148 'explicit use strict overrides later use 5.01'; 149eval 'use strict "subs"; use 5.012; ${"foo"} = "bar"'; 150like $@, qr/^Can't use string/, 151 'explicit use strict "subs" does not stop ver decl from enabling refs'; 152eval 'no strict "subs"; use 5.012; ${"foo"} = "bar"'; 153ok $@, 'no strict subs allows ver decl to enable refs'; 154eval 'no strict "subs"; use 5.012; $nonexistent_pack_var'; 155ok $@, 'no strict subs allows ver decl to enable vars'; 156eval 'no strict "refs"; use 5.012; fancy_bareword'; 157ok $@, 'no strict refs allows ver decl to enable subs'; 158eval 'no strict "refs"; use 5.012; $nonexistent_pack_var'; 159ok $@, 'no strict refs allows ver decl to enable subs'; 160eval 'no strict "vars"; use 5.012; ${"foo"} = "bar"'; 161ok $@, 'no strict vars allows ver decl to enable refs'; 162eval 'no strict "vars"; use 5.012; ursine_word'; 163ok $@, 'no strict vars allows ver decl to enable subs'; 164 165# check that "use 5.39.0" and higher imports builtins 166{ 167 my $result; 168 169 $result = eval 'use 5.39.0; my $t = true; $t eq "1"'; 170 is ($@, "", 'builtin funcs available after use 5.39.0'); 171 ok ($result, 'imported true is eq "1"'); 172} 173 174{ 175 my $result; 176 177 $result = eval 'use builtin "true"; use v5.36; my $t = true; $t eq "1"'; 178 is ($@, "", 'builtin funcs not removed after use v5.36'); 179 ok ($result, 'imported true is eq "1"'); 180} 181 182{ use test_use } # check that subparse saves pending tokens 183 184use test_use { () }; 185is ref $test_use::got[0], 'HASH', 'use parses arguments in term lexing cx'; 186 187local $test_use::VERSION = 1.0; 188 189eval "use test_use 0.9"; 190is ($@, ''); 191 192eval "use test_use 1.0"; 193is ($@, ''); 194 195eval "use test_use 1.01"; 196isnt ($@, ''); 197 198eval "use test_use 0.9 qw(fred)"; 199is ($@, ''); 200 201is("@test_use::got", "fred"); 202 203eval "use test_use 1.0 qw(joe)"; 204is ($@, ''); 205 206is("@test_use::got", "joe"); 207 208eval "use test_use 1.01 qw(freda)"; 209isnt($@, ''); 210 211is("@test_use::got", "joe"); 212 213{ 214 local $test_use::VERSION = 35.36; 215 eval "use test_use v33.55"; 216 is ($@, ''); 217 218 eval "use test_use v100.105"; 219 like ($@, qr/\Qtest_use version v100.105.0 required--this is only version v35.360.0\E/); 220 221 eval "use test_use 33.55"; 222 is ($@, ''); 223 224 eval "use test_use 100.105"; 225 like ($@, qr/\Qtest_use version 100.105 required--this is only version 35.36\E/); 226 227 local $test_use::VERSION = '35.36'; 228 eval "use test_use v33.55"; 229 like ($@, ''); 230 231 eval "use test_use v100.105"; 232 like ($@, qr/\Qtest_use version v100.105.0 required--this is only version v35.360.0\E/); 233 234 eval "use test_use 33.55"; 235 is ($@, ''); 236 237 eval "use test_use 100.105"; 238 like ($@, qr/\Qtest_use version 100.105 required--this is only version 35.36\E/); 239 240 local $test_use::VERSION = v35.36; 241 eval "use test_use v33.55"; 242 is ($@, ''); 243 244 eval "use test_use v100.105"; 245 like ($@, qr/\Qtest_use version v100.105.0 required--this is only version v35.36.0\E/); 246 247 eval "use test_use 33.55"; 248 is ($@, ''); 249 250 eval "use test_use 100.105"; 251 like ($@, qr/\Qtest_use version 100.105 required--this is only version v35.36\E/); 252} 253 254 255{ 256 # Regression test for patch 14937: 257 # Check that a .pm file with no package or VERSION doesn't core. 258 # (git commit 2658f4d9934aba5f8b23afcc078dc12b3a40223) 259 eval "use test_use_14937 3"; 260 like ($@, qr/^\Qtest_use_14937 defines neither package nor VERSION--version check failed at\E/); 261} 262 263my @ver = split /\./, sprintf "%vd", $^V; 264 265foreach my $index (-3..+3) { 266 foreach my $v (0, 1) { 267 my @parts = @ver; 268 if ($index) { 269 if ($index < 0) { 270 # Jiggle one of the parts down 271 --$parts[-$index - 1]; 272 if ($parts[-$index - 1] < 0) { 273 # perl's version number ends with '.0' 274 $parts[-$index - 1] = 0; 275 $parts[-$index - 2] -= 2; 276 } 277 } else { 278 # Jiggle one of the parts up 279 ++$parts[$index - 1]; 280 } 281 } 282 my $v_version = sprintf "v%d.%d.%d", @parts; 283 my $version; 284 if ($v) { 285 $version = $v_version; 286 } else { 287 $version = $parts[0] + $parts[1] / 1000 + $parts[2] / 1000000; 288 } 289 290 eval "use $version"; 291 if ($index > 0) { 292 # The future 293 like ($@, 294 qr/\QPerl $v_version required--this is only $^V, stopped\E/, 295 "use $version"); 296 } else { 297 # The present or past 298 is ($@, '', "use $version"); 299 } 300 301 eval "no $version"; 302 if ($index <= 0) { 303 # The present or past 304 like ($@, 305 qr/\QPerls since $v_version too modern--this is $^V, stopped\E/, 306 "no $version"); 307 } else { 308 # future 309 is ($@, '', "no $version"); 310 } 311 } 312} 313 314