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..85\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'; 152{ 153 my $warnings = ""; 154 local $SIG{__WARN__} = sub { $warnings .= $_[0] }; 155 eval 'use 5.012; use 5.01; ${"foo"} = "bar"'; 156 is $@, "", 'use 5.01 overrides implicit strict from prev ver decl'; 157 like $warnings, qr/^Downgrading a use VERSION declaration to below v5.11 is deprecated, and will become fatal in Perl 5.40 at /, 158 'use 5.01 after use 5.012 provokes deprecation warning'; 159} 160eval 'no strict "subs"; use 5.012; ${"foo"} = "bar"'; 161ok $@, 'no strict subs allows ver decl to enable refs'; 162eval 'no strict "subs"; use 5.012; $nonexistent_pack_var'; 163ok $@, 'no strict subs allows ver decl to enable vars'; 164eval 'no strict "refs"; use 5.012; fancy_bareword'; 165ok $@, 'no strict refs allows ver decl to enable subs'; 166eval 'no strict "refs"; use 5.012; $nonexistent_pack_var'; 167ok $@, 'no strict refs allows ver decl to enable subs'; 168eval 'no strict "vars"; use 5.012; ${"foo"} = "bar"'; 169ok $@, 'no strict vars allows ver decl to enable refs'; 170eval 'no strict "vars"; use 5.012; ursine_word'; 171ok $@, 'no strict vars allows ver decl to enable subs'; 172 173 174{ use test_use } # check that subparse saves pending tokens 175 176use test_use { () }; 177is ref $test_use::got[0], 'HASH', 'use parses arguments in term lexing cx'; 178 179local $test_use::VERSION = 1.0; 180 181eval "use test_use 0.9"; 182is ($@, ''); 183 184eval "use test_use 1.0"; 185is ($@, ''); 186 187eval "use test_use 1.01"; 188isnt ($@, ''); 189 190eval "use test_use 0.9 qw(fred)"; 191is ($@, ''); 192 193is("@test_use::got", "fred"); 194 195eval "use test_use 1.0 qw(joe)"; 196is ($@, ''); 197 198is("@test_use::got", "joe"); 199 200eval "use test_use 1.01 qw(freda)"; 201isnt($@, ''); 202 203is("@test_use::got", "joe"); 204 205{ 206 local $test_use::VERSION = 35.36; 207 eval "use test_use v33.55"; 208 is ($@, ''); 209 210 eval "use test_use v100.105"; 211 like ($@, qr/\Qtest_use version v100.105.0 required--this is only version v35.360.0\E/); 212 213 eval "use test_use 33.55"; 214 is ($@, ''); 215 216 eval "use test_use 100.105"; 217 like ($@, qr/\Qtest_use version 100.105 required--this is only version 35.36\E/); 218 219 local $test_use::VERSION = '35.36'; 220 eval "use test_use v33.55"; 221 like ($@, ''); 222 223 eval "use test_use v100.105"; 224 like ($@, qr/\Qtest_use version v100.105.0 required--this is only version v35.360.0\E/); 225 226 eval "use test_use 33.55"; 227 is ($@, ''); 228 229 eval "use test_use 100.105"; 230 like ($@, qr/\Qtest_use version 100.105 required--this is only version 35.36\E/); 231 232 local $test_use::VERSION = v35.36; 233 eval "use test_use v33.55"; 234 is ($@, ''); 235 236 eval "use test_use v100.105"; 237 like ($@, qr/\Qtest_use version v100.105.0 required--this is only version v35.36.0\E/); 238 239 eval "use test_use 33.55"; 240 is ($@, ''); 241 242 eval "use test_use 100.105"; 243 like ($@, qr/\Qtest_use version 100.105 required--this is only version v35.36\E/); 244} 245 246 247{ 248 # Regression test for patch 14937: 249 # Check that a .pm file with no package or VERSION doesn't core. 250 # (git commit 2658f4d9934aba5f8b23afcc078dc12b3a40223) 251 eval "use test_use_14937 3"; 252 like ($@, qr/^\Qtest_use_14937 defines neither package nor VERSION--version check failed at\E/); 253} 254 255my @ver = split /\./, sprintf "%vd", $^V; 256 257foreach my $index (-3..+3) { 258 foreach my $v (0, 1) { 259 my @parts = @ver; 260 if ($index) { 261 if ($index < 0) { 262 # Jiggle one of the parts down 263 --$parts[-$index - 1]; 264 if ($parts[-$index - 1] < 0) { 265 # perl's version number ends with '.0' 266 $parts[-$index - 1] = 0; 267 $parts[-$index - 2] -= 2; 268 } 269 } else { 270 # Jiggle one of the parts up 271 ++$parts[$index - 1]; 272 } 273 } 274 my $v_version = sprintf "v%d.%d.%d", @parts; 275 my $version; 276 if ($v) { 277 $version = $v_version; 278 } else { 279 $version = $parts[0] + $parts[1] / 1000 + $parts[2] / 1000000; 280 } 281 282 eval "use $version"; 283 if ($index > 0) { 284 # The future 285 like ($@, 286 qr/\QPerl $v_version required--this is only $^V, stopped\E/, 287 "use $version"); 288 } else { 289 # The present or past 290 is ($@, '', "use $version"); 291 } 292 293 eval "no $version"; 294 if ($index <= 0) { 295 # The present or past 296 like ($@, 297 qr/\QPerls since $v_version too modern--this is $^V, stopped\E/, 298 "no $version"); 299 } else { 300 # future 301 is ($@, '', "no $version"); 302 } 303 } 304} 305 306