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..73\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 } else { 26 die "Unexpected type '$type'$name"; 27 } 28 if ($result) { 29 if ($name) { 30 print "ok $test - $name\n"; 31 } else { 32 print "ok $test\n"; 33 } 34 } else { 35 if ($name) { 36 print "not ok $test - $name\n"; 37 } else { 38 print "not ok $test\n"; 39 } 40 my @caller = caller(1); 41 print "# Failed test at $caller[1] line $caller[2]\n"; 42 print "# Got '$got'\n"; 43 if ($type eq 'is') { 44 print "# Expected '$expected'\n"; 45 } elsif ($type eq 'isnt') { 46 print "# Expected not '$expected'\n"; 47 } elsif ($type eq 'like') { 48 print "# Expected $expected\n"; 49 } 50 } 51 $test = $test + 1; 52 $result; 53} 54 55sub like ($$;$) { 56 _ok ('like', @_); 57} 58sub is ($$;$) { 59 _ok ('is', @_); 60} 61sub isnt ($$;$) { 62 _ok ('isnt', @_); 63} 64 65eval "use 5"; # implicit semicolon 66is ($@, ''); 67 68eval "use 5;"; 69is ($@, ''); 70 71eval "{use 5}"; # [perl #70884] 72is ($@, ''); 73 74eval "{use 5 }"; # [perl #70884] 75is ($@, ''); 76 77# new style version numbers 78 79eval q{ use v5.5.630; }; 80is ($@, ''); 81 82eval q{ use 10.0.2; }; 83like ($@, qr/^Perl v10\.0\.2 required/); 84 85eval "use 5.000"; # implicit semicolon 86is ($@, ''); 87 88eval "use 5.000;"; 89is ($@, ''); 90 91eval "use 6.000;"; 92like ($@, qr/Perl v6\.0\.0 required--this is only \Q$^V\E, stopped/); 93 94eval "no 6.000;"; 95is ($@, ''); 96 97eval "no 5.000;"; 98like ($@, qr/Perls since v5\.0\.0 too modern--this is \Q$^V\E, stopped/); 99 100eval "use 5.6;"; 101like ($@, qr/Perl v5\.600\.0 required \(did you mean v5\.6\.0\?\)--this is only \Q$^V\E, stopped/); 102 103eval "use 5.8;"; 104like ($@, qr/Perl v5\.800\.0 required \(did you mean v5\.8\.0\?\)--this is only \Q$^V\E, stopped/); 105 106eval "use 5.9;"; 107like ($@, qr/Perl v5\.900\.0 required \(did you mean v5\.9\.0\?\)--this is only \Q$^V\E, stopped/); 108 109eval "use 5.10;"; 110like ($@, qr/Perl v5\.100\.0 required \(did you mean v5\.10\.0\?\)--this is only \Q$^V\E, stopped/); 111 112eval "use 5.11;"; 113like ($@, qr/Perl v5\.110\.0 required \(did you mean v5\.11\.0\?\)--this is only \Q$^V\E, stopped/); 114 115eval sprintf "use %.6f;", $]; 116is ($@, ''); 117 118 119eval sprintf "use %.6f;", $] - 0.000001; 120is ($@, ''); 121 122eval sprintf("use %.6f;", $] + 1); 123like ($@, qr/Perl v6.\d+.\d+ required--this is only \Q$^V\E, stopped/); 124 125eval sprintf "use %.6f;", $] + 0.00001; 126like ($@, qr/Perl v5.\d+.\d+ required--this is only \Q$^V\E, stopped/); 127 128# check that "use 5.11.0" (and higher) loads strictures 129eval 'use 5.11.0; ${"foo"} = "bar";'; 130like ($@, qr/Can't use string \("foo"\) as a SCALAR ref while "strict refs" in use/); 131# but that they can be disabled 132eval 'use 5.11.0; no strict "refs"; ${"foo"} = "bar";'; 133is ($@, ""); 134# and they are properly scoped 135eval '{use 5.11.0;} ${"foo"} = "bar";'; 136is ($@, ""); 137 138{ use test_use } # check that subparse saves pending tokens 139 140local $test_use::VERSION = 1.0; 141 142eval "use test_use 0.9"; 143is ($@, ''); 144 145eval "use test_use 1.0"; 146is ($@, ''); 147 148eval "use test_use 1.01"; 149isnt ($@, ''); 150 151eval "use test_use 0.9 qw(fred)"; 152is ($@, ''); 153 154is("@test_use::got", "fred"); 155 156eval "use test_use 1.0 qw(joe)"; 157is ($@, ''); 158 159is("@test_use::got", "joe"); 160 161eval "use test_use 1.01 qw(freda)"; 162isnt($@, ''); 163 164is("@test_use::got", "joe"); 165 166{ 167 local $test_use::VERSION = 35.36; 168 eval "use test_use v33.55"; 169 is ($@, ''); 170 171 eval "use test_use v100.105"; 172 like ($@, qr/test_use version v100.105.0 required--this is only version v35\.360\.0/); 173 174 eval "use test_use 33.55"; 175 is ($@, ''); 176 177 eval "use test_use 100.105"; 178 like ($@, qr/test_use version 100.105 required--this is only version 35.36/); 179 180 local $test_use::VERSION = '35.36'; 181 eval "use test_use v33.55"; 182 like ($@, ''); 183 184 eval "use test_use v100.105"; 185 like ($@, qr/test_use version v100.105.0 required--this is only version v35\.360\.0/); 186 187 eval "use test_use 33.55"; 188 is ($@, ''); 189 190 eval "use test_use 100.105"; 191 like ($@, qr/test_use version 100.105 required--this is only version 35.36/); 192 193 local $test_use::VERSION = v35.36; 194 eval "use test_use v33.55"; 195 is ($@, ''); 196 197 eval "use test_use v100.105"; 198 like ($@, qr/test_use version v100.105.0 required--this is only version v35\.36\.0/); 199 200 eval "use test_use 33.55"; 201 is ($@, ''); 202 203 eval "use test_use 100.105"; 204 like ($@, qr/test_use version 100.105 required--this is only version v35.36/); 205} 206 207 208{ 209 # Regression test for patch 14937: 210 # Check that a .pm file with no package or VERSION doesn't core. 211 # (git commit 2658f4d9934aba5f8b23afcc078dc12b3a40223) 212 eval "use test_use_14937 3"; 213 like ($@, qr/^test_use_14937 defines neither package nor VERSION--version check failed at/); 214} 215 216my @ver = split /\./, sprintf "%vd", $^V; 217 218foreach my $index (-3..+3) { 219 foreach my $v (0, 1) { 220 my @parts = @ver; 221 if ($index) { 222 if ($index < 0) { 223 # Jiggle one of the parts down 224 --$parts[-$index - 1]; 225 if ($parts[-$index - 1] < 0) { 226 # perl's version number ends with '.0' 227 $parts[-$index - 1] = 0; 228 $parts[-$index - 2] -= 2; 229 } 230 } else { 231 # Jiggle one of the parts up 232 ++$parts[$index - 1]; 233 } 234 } 235 my $v_version = sprintf "v%d.%d.%d", @parts; 236 my $version; 237 if ($v) { 238 $version = $v_version; 239 } else { 240 $version = $parts[0] + $parts[1] / 1000 + $parts[2] / 1000000; 241 } 242 243 eval "use $version"; 244 if ($index > 0) { 245 # The future 246 like ($@, 247 qr/Perl $v_version required--this is only \Q$^V\E, stopped/, 248 "use $version"); 249 } else { 250 # The present or past 251 is ($@, '', "use $version"); 252 } 253 254 eval "no $version"; 255 if ($index <= 0) { 256 # The present or past 257 like ($@, 258 qr/Perls since $v_version too modern--this is \Q$^V\E, stopped/, 259 "no $version"); 260 } else { 261 # future 262 is ($@, '', "no $version"); 263 } 264 } 265} 266 267