1b8851fccSafresh1use strict; 2b8851fccSafresh1use warnings; 3b8851fccSafresh1# vim:ts=8:sw=2:et:sta:sts=2 4b8851fccSafresh1 5b46d8ef2Safresh1use Test::More 0.88; 6b8851fccSafresh1use Module::Metadata; 7b8851fccSafresh1 8b8851fccSafresh1use lib 't/lib'; 9b8851fccSafresh1use GeneratePackage; 10b8851fccSafresh1 11b8851fccSafresh1my $undef; 12b8851fccSafresh1 13b8851fccSafresh1# parse various module $VERSION lines 14b8851fccSafresh1# format: { 15b8851fccSafresh1# name => test name 16b8851fccSafresh1# code => code snippet (string) 17b8851fccSafresh1# vers => expected version object (in stringified form), 18b8851fccSafresh1# } 19b8851fccSafresh1my @modules = ( 20b8851fccSafresh1{ 21b8851fccSafresh1 vers => $undef, 22b8851fccSafresh1 all_versions => {}, 23b8851fccSafresh1 name => 'no $VERSION line', 24b8851fccSafresh1 code => <<'---', 25b8851fccSafresh1package Simple; 26b8851fccSafresh1--- 27b8851fccSafresh1}, 28b8851fccSafresh1{ 29b8851fccSafresh1 vers => $undef, 30b8851fccSafresh1 all_versions => {}, 31b8851fccSafresh1 name => 'undefined $VERSION', 32b8851fccSafresh1 code => <<'---', 33b8851fccSafresh1package Simple; 34b8851fccSafresh1our $VERSION; 35b8851fccSafresh1--- 36b8851fccSafresh1}, 37b8851fccSafresh1{ 38b8851fccSafresh1 vers => '1.23', 39b8851fccSafresh1 all_versions => { Simple => '1.23' }, 40b8851fccSafresh1 name => 'declared & defined on same line with "our"', 41b8851fccSafresh1 code => <<'---', 42b8851fccSafresh1package Simple; 43b8851fccSafresh1our $VERSION = '1.23'; 44b8851fccSafresh1--- 45b8851fccSafresh1}, 46b8851fccSafresh1{ 47b8851fccSafresh1 vers => '1.23', 48b8851fccSafresh1 all_versions => { Simple => '1.23' }, 49b8851fccSafresh1 name => 'declared & defined on separate lines with "our"', 50b8851fccSafresh1 code => <<'---', 51b8851fccSafresh1package Simple; 52b8851fccSafresh1our $VERSION; 53b8851fccSafresh1$VERSION = '1.23'; 54b8851fccSafresh1--- 55b8851fccSafresh1}, 56b8851fccSafresh1{ 57b8851fccSafresh1 name => 'commented & defined on same line', 58b8851fccSafresh1 code => <<'---', 59b8851fccSafresh1package Simple; 60b8851fccSafresh1our $VERSION = '1.23'; # our $VERSION = '4.56'; 61b8851fccSafresh1--- 62b8851fccSafresh1 vers => '1.23', 63b8851fccSafresh1 all_versions => { Simple => '1.23' }, 64b8851fccSafresh1}, 65b8851fccSafresh1{ 66b8851fccSafresh1 name => 'commented & defined on separate lines', 67b8851fccSafresh1 code => <<'---', 68b8851fccSafresh1package Simple; 69b8851fccSafresh1# our $VERSION = '4.56'; 70b8851fccSafresh1our $VERSION = '1.23'; 71b8851fccSafresh1--- 72b8851fccSafresh1 vers =>'1.23', 73b8851fccSafresh1 all_versions => { Simple => '1.23' }, 74b8851fccSafresh1}, 75b8851fccSafresh1{ 76b8851fccSafresh1 name => 'use vars', 77b8851fccSafresh1 code => <<'---', 78b8851fccSafresh1package Simple; 79b8851fccSafresh1use vars qw( $VERSION ); 80b8851fccSafresh1$VERSION = '1.23'; 81b8851fccSafresh1--- 82b8851fccSafresh1 vers => '1.23', 83b8851fccSafresh1 all_versions => { Simple => '1.23' }, 84b8851fccSafresh1}, 85b8851fccSafresh1{ 86b8851fccSafresh1 name => 'choose the right default package based on package/file name', 87b8851fccSafresh1 code => <<'---', 88b8851fccSafresh1package Simple::_private; 89b8851fccSafresh1$VERSION = '0'; 90b8851fccSafresh1package Simple; 91b8851fccSafresh1$VERSION = '1.23'; # this should be chosen for version 92b8851fccSafresh1--- 93b8851fccSafresh1 vers => '1.23', 94b8851fccSafresh1 all_versions => { 'Simple' => '1.23', 'Simple::_private' => '0' }, 95b8851fccSafresh1}, 96b8851fccSafresh1{ 97b8851fccSafresh1 name => 'just read the first $VERSION line', 98b8851fccSafresh1 code => <<'---', 99b8851fccSafresh1package Simple; 100b8851fccSafresh1$VERSION = '1.23'; # we should see this line 101b8851fccSafresh1$VERSION = eval $VERSION; # and ignore this one 102b8851fccSafresh1--- 103b8851fccSafresh1 vers => '1.23', 104b8851fccSafresh1 all_versions => { Simple => '1.23' }, 105b8851fccSafresh1}, 106b8851fccSafresh1{ 107b8851fccSafresh1 name => 'just read the first $VERSION line in reopened package (1)', 108b8851fccSafresh1 code => <<'---', 109b8851fccSafresh1package Simple; 110b8851fccSafresh1$VERSION = '1.23'; 111b8851fccSafresh1package Error::Simple; 112b8851fccSafresh1$VERSION = '2.34'; 113b8851fccSafresh1package Simple; 114b8851fccSafresh1--- 115b8851fccSafresh1 vers => '1.23', 116b8851fccSafresh1 all_versions => { 'Error::Simple' => '2.34', Simple => '1.23' }, 117b8851fccSafresh1}, 118b8851fccSafresh1{ 119b8851fccSafresh1 name => 'just read the first $VERSION line in reopened package (2)', 120b8851fccSafresh1 code => <<'---', 121b8851fccSafresh1package Simple; 122b8851fccSafresh1package Error::Simple; 123b8851fccSafresh1$VERSION = '2.34'; 124b8851fccSafresh1package Simple; 125b8851fccSafresh1$VERSION = '1.23'; 126b8851fccSafresh1--- 127b8851fccSafresh1 vers => '1.23', 128b8851fccSafresh1 all_versions => { 'Error::Simple' => '2.34', Simple => '1.23' }, 129b8851fccSafresh1}, 130b8851fccSafresh1{ 131b8851fccSafresh1 name => 'mentions another module\'s $VERSION', 132b8851fccSafresh1 code => <<'---', 133b8851fccSafresh1package Simple; 134b8851fccSafresh1$VERSION = '1.23'; 135b8851fccSafresh1if ( $Other::VERSION ) { 136b8851fccSafresh1 # whatever 137b8851fccSafresh1} 138b8851fccSafresh1--- 139b8851fccSafresh1 vers => '1.23', 140b8851fccSafresh1 all_versions => { Simple => '1.23' }, 141b8851fccSafresh1}, 142b8851fccSafresh1{ 143b8851fccSafresh1 name => 'mentions another module\'s $VERSION in a different package', 144b8851fccSafresh1 code => <<'---', 145b8851fccSafresh1package Simple; 146b8851fccSafresh1$VERSION = '1.23'; 147b8851fccSafresh1package Simple2; 148b8851fccSafresh1if ( $Simple::VERSION ) { 149b8851fccSafresh1 # whatever 150b8851fccSafresh1} 151b8851fccSafresh1--- 152b8851fccSafresh1 vers => '1.23', 153b8851fccSafresh1 all_versions => { Simple => '1.23' }, 154b8851fccSafresh1}, 155b8851fccSafresh1{ 156b8851fccSafresh1 name => '$VERSION checked only in assignments, not regexp ops', 157b8851fccSafresh1 code => <<'---', 158b8851fccSafresh1package Simple; 159b8851fccSafresh1$VERSION = '1.23'; 160b8851fccSafresh1if ( $VERSION =~ /1\.23/ ) { 161b8851fccSafresh1 # whatever 162b8851fccSafresh1} 163b8851fccSafresh1--- 164b8851fccSafresh1 vers => '1.23', 165b8851fccSafresh1 all_versions => { Simple => '1.23' }, 166b8851fccSafresh1}, 167b8851fccSafresh1{ 168b8851fccSafresh1 name => '$VERSION checked only in assignments, not relational ops (1)', 169b8851fccSafresh1 code => <<'---', 170b8851fccSafresh1package Simple; 171b8851fccSafresh1$VERSION = '1.23'; 172b8851fccSafresh1if ( $VERSION == 3.45 ) { 173b8851fccSafresh1 # whatever 174b8851fccSafresh1} 175b8851fccSafresh1--- 176b8851fccSafresh1 vers => '1.23', 177b8851fccSafresh1 all_versions => { Simple => '1.23' }, 178b8851fccSafresh1}, 179b8851fccSafresh1{ 180b8851fccSafresh1 name => '$VERSION checked only in assignments, not relational ops (2)', 181b8851fccSafresh1 code => <<'---', 182b8851fccSafresh1package Simple; 183b8851fccSafresh1$VERSION = '1.23'; 184b8851fccSafresh1package Simple2; 185b8851fccSafresh1if ( $Simple::VERSION == 3.45 ) { 186b8851fccSafresh1 # whatever 187b8851fccSafresh1} 188b8851fccSafresh1--- 189b8851fccSafresh1 vers => '1.23', 190b8851fccSafresh1 all_versions => { Simple => '1.23' }, 191b8851fccSafresh1}, 192b8851fccSafresh1{ 193b8851fccSafresh1 name => 'Fully qualified $VERSION declared in package', 194b8851fccSafresh1 code => <<'---', 195b8851fccSafresh1package Simple; 196b8851fccSafresh1$Simple::VERSION = 1.23; 197b8851fccSafresh1--- 198b8851fccSafresh1 vers => '1.23', 199b8851fccSafresh1 all_versions => { Simple => '1.23' }, 200b8851fccSafresh1}, 201b8851fccSafresh1{ 202b8851fccSafresh1 name => 'Differentiate fully qualified $VERSION in a package', 203b8851fccSafresh1 code => <<'---', 204b8851fccSafresh1package Simple; 205b8851fccSafresh1$Simple2::VERSION = '999'; 206b8851fccSafresh1$Simple::VERSION = 1.23; 207b8851fccSafresh1--- 208b8851fccSafresh1 vers => '1.23', 209b8851fccSafresh1 all_versions => { Simple => '1.23', Simple2 => '999' }, 210b8851fccSafresh1}, 211b8851fccSafresh1{ 212b8851fccSafresh1 name => 'Differentiate fully qualified $VERSION and unqualified', 213b8851fccSafresh1 code => <<'---', 214b8851fccSafresh1package Simple; 215b8851fccSafresh1$Simple2::VERSION = '999'; 216b8851fccSafresh1$VERSION = 1.23; 217b8851fccSafresh1--- 218b8851fccSafresh1 vers => '1.23', 219b8851fccSafresh1 all_versions => { Simple => '1.23', Simple2 => '999' }, 220b8851fccSafresh1}, 221b8851fccSafresh1{ 222b8851fccSafresh1 name => 'Differentiate fully qualified $VERSION and unqualified, other order', 223b8851fccSafresh1 code => <<'---', 224b8851fccSafresh1package Simple; 225b8851fccSafresh1$VERSION = 1.23; 226b8851fccSafresh1$Simple2::VERSION = '999'; 227b8851fccSafresh1--- 228b8851fccSafresh1 vers => '1.23', 229b8851fccSafresh1 all_versions => { Simple => '1.23', Simple2 => '999' }, 230b8851fccSafresh1}, 231b8851fccSafresh1{ 232b8851fccSafresh1 name => '$VERSION declared as package variable from within "main" package', 233b8851fccSafresh1 code => <<'---', 234b8851fccSafresh1$Simple::VERSION = '1.23'; 235b8851fccSafresh1{ 236b8851fccSafresh1 package Simple; 237b8851fccSafresh1 $x = $y, $cats = $dogs; 238b8851fccSafresh1} 239b8851fccSafresh1--- 240b8851fccSafresh1 vers => '1.23', 241b8851fccSafresh1 all_versions => { Simple => '1.23' }, 242b8851fccSafresh1}, 243b8851fccSafresh1{ 244b8851fccSafresh1 name => '$VERSION wrapped in parens - space inside', 245b8851fccSafresh1 code => <<'---', 246b8851fccSafresh1package Simple; 247b8851fccSafresh1( $VERSION ) = '1.23'; 248b8851fccSafresh1--- 249b8851fccSafresh1 '1.23' => <<'---', # $VERSION wrapped in parens - no space inside 250b8851fccSafresh1package Simple; 251b8851fccSafresh1($VERSION) = '1.23'; 252b8851fccSafresh1--- 253b8851fccSafresh1 vers => '1.23', 254b8851fccSafresh1 all_versions => { Simple => '1.23' }, 255b8851fccSafresh1}, 256b8851fccSafresh1{ 257b8851fccSafresh1 name => '$VERSION follows a spurious "package" in a quoted construct', 258b8851fccSafresh1 code => <<'---', 259b8851fccSafresh1package Simple; 260b8851fccSafresh1__PACKAGE__->mk_accessors(qw( 261b8851fccSafresh1 program socket proc 262b8851fccSafresh1 package filename line codeline subroutine finished)); 263b8851fccSafresh1 264b8851fccSafresh1our $VERSION = "1.23"; 265b8851fccSafresh1--- 266b8851fccSafresh1 vers => '1.23', 267b8851fccSafresh1 all_versions => { Simple => '1.23' }, 268b8851fccSafresh1}, 269b8851fccSafresh1{ 270b8851fccSafresh1 name => '$VERSION using version.pm', 271b8851fccSafresh1 code => <<'---', 272b8851fccSafresh1 package Simple; 273b8851fccSafresh1 use version; our $VERSION = version->new('1.23'); 274b8851fccSafresh1--- 275b8851fccSafresh1 vers => '1.23', 276b8851fccSafresh1 all_versions => { Simple => '1.23' }, 277b8851fccSafresh1}, 278b8851fccSafresh1{ 279b8851fccSafresh1 name => '$VERSION using version.pm and qv()', 280b8851fccSafresh1 code => <<'---', 281b8851fccSafresh1 package Simple; 282b8851fccSafresh1 use version; our $VERSION = qv('1.230'); 283b8851fccSafresh1--- 284b8851fccSafresh1 vers => 'v1.230', 285b8851fccSafresh1 all_versions => { Simple => 'v1.230' }, 286b8851fccSafresh1}, 287b8851fccSafresh1{ 288b8851fccSafresh1 name => 'underscore version with an eval', 289b8851fccSafresh1 code => <<'---', 290b8851fccSafresh1 package Simple; 291b8851fccSafresh1 $VERSION = '1.23_01'; 292b8851fccSafresh1 $VERSION = eval $VERSION; 293b8851fccSafresh1--- 294b8851fccSafresh1 vers => '1.23_01', 295b8851fccSafresh1 all_versions => { Simple => '1.23_01' }, 296b8851fccSafresh1}, 297b8851fccSafresh1{ 298b8851fccSafresh1 name => 'Two version assignments, no package', 299b8851fccSafresh1 code => <<'---', 300b8851fccSafresh1 $Simple::VERSION = '1.230'; 301b8851fccSafresh1 $Simple::VERSION = eval $Simple::VERSION; 302b8851fccSafresh1--- 303b8851fccSafresh1 vers => $undef, 304b8851fccSafresh1 all_versions => { Simple => '1.230' }, 305b8851fccSafresh1}, 306b8851fccSafresh1{ 307b8851fccSafresh1 name => 'Two version assignments, should ignore second one', 308b8851fccSafresh1 code => <<'---', 309b8851fccSafresh1package Simple; 310b8851fccSafresh1 $Simple::VERSION = '1.230'; 311b8851fccSafresh1 $Simple::VERSION = eval $Simple::VERSION; 312b8851fccSafresh1--- 313b8851fccSafresh1 vers => '1.230', 314b8851fccSafresh1 all_versions => { Simple => '1.230' }, 315b8851fccSafresh1}, 316b8851fccSafresh1{ 317b8851fccSafresh1 name => 'declared & defined on same line with "our"', 318b8851fccSafresh1 code => <<'---', 319b8851fccSafresh1package Simple; 320b8851fccSafresh1our $VERSION = '1.23_00_00'; 321b8851fccSafresh1--- 322b8851fccSafresh1 vers => '1.230000', 323b8851fccSafresh1 all_versions => { Simple => '1.230000' }, 324b8851fccSafresh1}, 325b8851fccSafresh1{ 326b8851fccSafresh1 name => 'package NAME VERSION', 327b8851fccSafresh1 code => <<'---', 328b8851fccSafresh1 package Simple 1.23; 329b8851fccSafresh1--- 330b8851fccSafresh1 vers => '1.23', 331b8851fccSafresh1 all_versions => { Simple => '1.23' }, 332b8851fccSafresh1}, 333b8851fccSafresh1{ 334b8851fccSafresh1 name => 'package NAME VERSION', 335b8851fccSafresh1 code => <<'---', 336b8851fccSafresh1 package Simple 1.23_01; 337b8851fccSafresh1--- 338b8851fccSafresh1 vers => '1.23_01', 339b8851fccSafresh1 all_versions => { Simple => '1.23_01' }, 340b8851fccSafresh1}, 341b8851fccSafresh1{ 342b8851fccSafresh1 name => 'package NAME VERSION', 343b8851fccSafresh1 code => <<'---', 344b8851fccSafresh1 package Simple v1.2.3; 345b8851fccSafresh1--- 346b8851fccSafresh1 vers => 'v1.2.3', 347b8851fccSafresh1 all_versions => { Simple => 'v1.2.3' }, 348b8851fccSafresh1}, 349b8851fccSafresh1{ 350b8851fccSafresh1 name => 'package NAME VERSION', 351b8851fccSafresh1 code => <<'---', 352b8851fccSafresh1 package Simple v1.2_3; 353b8851fccSafresh1--- 354b8851fccSafresh1 vers => 'v1.2_3', 355b8851fccSafresh1 all_versions => { Simple => 'v1.2_3' }, 356b8851fccSafresh1}, 357b8851fccSafresh1{ 358*3d61058aSafresh1 name => 'class NAME VERSION', 359*3d61058aSafresh1 code => <<'---', 360*3d61058aSafresh1 class Simple 1.23; 361*3d61058aSafresh1--- 362*3d61058aSafresh1 vers => '1.23', 363*3d61058aSafresh1 all_versions => { Simple => '1.23' }, 364*3d61058aSafresh1}, 365*3d61058aSafresh1{ 366*3d61058aSafresh1 name => 'class NAME VERSION', 367*3d61058aSafresh1 code => <<'---', 368*3d61058aSafresh1 class Simple 1.23_01; 369*3d61058aSafresh1--- 370*3d61058aSafresh1 vers => '1.23_01', 371*3d61058aSafresh1 all_versions => { Simple => '1.23_01' }, 372*3d61058aSafresh1}, 373*3d61058aSafresh1{ 374*3d61058aSafresh1 name => 'class NAME VERSION', 375*3d61058aSafresh1 code => <<'---', 376*3d61058aSafresh1 class Simple v1.2.3; 377*3d61058aSafresh1--- 378*3d61058aSafresh1 vers => 'v1.2.3', 379*3d61058aSafresh1 all_versions => { Simple => 'v1.2.3' }, 380*3d61058aSafresh1}, 381*3d61058aSafresh1{ 382*3d61058aSafresh1 name => 'class NAME VERSION', 383*3d61058aSafresh1 code => <<'---', 384*3d61058aSafresh1 class Simple v1.2_3; 385*3d61058aSafresh1--- 386*3d61058aSafresh1 vers => 'v1.2_3', 387*3d61058aSafresh1 all_versions => { Simple => 'v1.2_3' }, 388*3d61058aSafresh1}, 389*3d61058aSafresh1{ 390b8851fccSafresh1 name => 'trailing crud', 391b8851fccSafresh1 code => <<'---', 392b8851fccSafresh1 package Simple; 393b8851fccSafresh1 our $VERSION; 394b8851fccSafresh1 $VERSION = '1.23-alpha'; 395b8851fccSafresh1--- 396b8851fccSafresh1 vers => '1.23', 397b8851fccSafresh1 all_versions => { Simple => '1.23' }, 398b8851fccSafresh1}, 399b8851fccSafresh1{ 400b8851fccSafresh1 name => 'trailing crud', 401b8851fccSafresh1 code => <<'---', 402b8851fccSafresh1 package Simple; 403b8851fccSafresh1 our $VERSION; 404b8851fccSafresh1 $VERSION = '1.23b'; 405b8851fccSafresh1--- 406b8851fccSafresh1 vers => '1.23', 407b8851fccSafresh1 all_versions => { Simple => '1.23' }, 408b8851fccSafresh1}, 409b8851fccSafresh1{ 410b8851fccSafresh1 name => 'multi_underscore', 411b8851fccSafresh1 code => <<'---', 412b8851fccSafresh1 package Simple; 413b8851fccSafresh1 our $VERSION; 414b8851fccSafresh1 $VERSION = '1.2_3_4'; 415b8851fccSafresh1--- 416b8851fccSafresh1 vers => '1.234', 417b8851fccSafresh1 all_versions => { Simple => '1.234' }, 418b8851fccSafresh1}, 419b8851fccSafresh1{ 420b8851fccSafresh1 name => 'non-numeric', 421b8851fccSafresh1 code => <<'---', 422b8851fccSafresh1 package Simple; 423b8851fccSafresh1 our $VERSION; 424b8851fccSafresh1 $VERSION = 'onetwothree'; 425b8851fccSafresh1--- 426b8851fccSafresh1 vers => '0', 427b8851fccSafresh1 all_versions => { Simple => '0' }, 428b8851fccSafresh1}, 429b8851fccSafresh1{ 430b8851fccSafresh1 name => 'package NAME BLOCK, undef $VERSION', 431b8851fccSafresh1 code => <<'---', 432b8851fccSafresh1package Simple { 433b8851fccSafresh1 our $VERSION; 434b8851fccSafresh1} 435b8851fccSafresh1--- 436b8851fccSafresh1 vers => $undef, 437b8851fccSafresh1 all_versions => {}, 438b8851fccSafresh1}, 439b8851fccSafresh1{ 440b8851fccSafresh1 name => 'package NAME BLOCK, with $VERSION', 441b8851fccSafresh1 code => <<'---', 442b8851fccSafresh1package Simple { 443b8851fccSafresh1 our $VERSION = '1.23'; 444b8851fccSafresh1} 445b8851fccSafresh1--- 446b8851fccSafresh1 vers => '1.23', 447b8851fccSafresh1 all_versions => { Simple => '1.23' }, 448b8851fccSafresh1}, 449b8851fccSafresh1{ 450b8851fccSafresh1 name => 'package NAME VERSION BLOCK (1)', 451b8851fccSafresh1 code => <<'---', 452b8851fccSafresh1package Simple 1.23 { 453b8851fccSafresh1 1; 454b8851fccSafresh1} 455b8851fccSafresh1--- 456b8851fccSafresh1 vers => '1.23', 457b8851fccSafresh1 all_versions => { Simple => '1.23' }, 458b8851fccSafresh1}, 459b8851fccSafresh1{ 460b8851fccSafresh1 name => 'package NAME VERSION BLOCK (2)', 461b8851fccSafresh1 code => <<'---', 462b8851fccSafresh1package Simple v1.2.3_4 { 463b8851fccSafresh1 1; 464b8851fccSafresh1} 465b8851fccSafresh1--- 466b8851fccSafresh1 vers => 'v1.2.3_4', 467b8851fccSafresh1 all_versions => { Simple => 'v1.2.3_4' }, 468b8851fccSafresh1}, 469b8851fccSafresh1{ 470*3d61058aSafresh1 name => 'class NAME BLOCK, undef $VERSION', 471*3d61058aSafresh1 code => <<'---', 472*3d61058aSafresh1class Simple { 473*3d61058aSafresh1 our $VERSION; 474*3d61058aSafresh1} 475*3d61058aSafresh1--- 476*3d61058aSafresh1 vers => $undef, 477*3d61058aSafresh1 all_versions => {}, 478*3d61058aSafresh1}, 479*3d61058aSafresh1{ 480*3d61058aSafresh1 name => 'class NAME BLOCK, with $VERSION', 481*3d61058aSafresh1 code => <<'---', 482*3d61058aSafresh1class Simple { 483*3d61058aSafresh1 our $VERSION = '1.23'; 484*3d61058aSafresh1} 485*3d61058aSafresh1--- 486*3d61058aSafresh1 vers => '1.23', 487*3d61058aSafresh1 all_versions => { Simple => '1.23' }, 488*3d61058aSafresh1}, 489*3d61058aSafresh1{ 490*3d61058aSafresh1 name => 'class NAME VERSION BLOCK (1)', 491*3d61058aSafresh1 code => <<'---', 492*3d61058aSafresh1class Simple 1.23 { 493*3d61058aSafresh1 1; 494*3d61058aSafresh1} 495*3d61058aSafresh1--- 496*3d61058aSafresh1 vers => '1.23', 497*3d61058aSafresh1 all_versions => { Simple => '1.23' }, 498*3d61058aSafresh1}, 499*3d61058aSafresh1{ 500*3d61058aSafresh1 name => 'class NAME VERSION BLOCK (2)', 501*3d61058aSafresh1 code => <<'---', 502*3d61058aSafresh1class Simple v1.2.3_4 { 503*3d61058aSafresh1 1; 504*3d61058aSafresh1} 505*3d61058aSafresh1--- 506*3d61058aSafresh1 vers => 'v1.2.3_4', 507*3d61058aSafresh1 all_versions => { Simple => 'v1.2.3_4' }, 508*3d61058aSafresh1}, 509*3d61058aSafresh1{ 510b8851fccSafresh1 name => 'set from separately-initialised variable, two lines', 511b8851fccSafresh1 code => <<'---', 512b8851fccSafresh1package Simple; 513b8851fccSafresh1 our $CVSVERSION = '$Revision: 1.7 $'; 514b8851fccSafresh1 our ($VERSION) = ($CVSVERSION =~ /(\d+\.\d+)/); 515b8851fccSafresh1} 516b8851fccSafresh1--- 517b8851fccSafresh1 vers => '0', 518b8851fccSafresh1 all_versions => { Simple => '0' }, 519b8851fccSafresh1}, 520b8851fccSafresh1{ 521b8851fccSafresh1 name => 'our + bare v-string', 522b8851fccSafresh1 code => <<'---', 523b8851fccSafresh1package Simple; 524b8851fccSafresh1our $VERSION = v2.2.102.2; 525b8851fccSafresh1--- 526b8851fccSafresh1 vers => 'v2.2.102.2', 527b8851fccSafresh1 all_versions => { Simple => 'v2.2.102.2' }, 528b8851fccSafresh1}, 529b8851fccSafresh1{ 530b8851fccSafresh1 name => 'our + dev release', 531b8851fccSafresh1 code => <<'---', 532b8851fccSafresh1package Simple; 533b8851fccSafresh1our $VERSION = "0.0.9_1"; 534b8851fccSafresh1--- 535b8851fccSafresh1 vers => '0.0.9_1', 536b8851fccSafresh1 all_versions => { Simple => '0.0.9_1' }, 537b8851fccSafresh1}, 538b8851fccSafresh1{ 539b8851fccSafresh1 name => 'our + crazy string and substitution code', 540b8851fccSafresh1 code => <<'---', 541b8851fccSafresh1package Simple; 542b8851fccSafresh1our $VERSION = '1.12.B55J2qn'; our $WTF = $VERSION; $WTF =~ s/^\d+\.\d+\.//; # attempts to rationalize $WTF go here. 543b8851fccSafresh1--- 544b8851fccSafresh1 vers => '1.12', 545b8851fccSafresh1 all_versions => { Simple => '1.12' }, 546b8851fccSafresh1}, 547b8851fccSafresh1{ 548b8851fccSafresh1 name => 'our in braces, as in Dist::Zilla::Plugin::PkgVersion with use_our = 1', 549b8851fccSafresh1 code => <<'---', 550b8851fccSafresh1package Simple; 551b8851fccSafresh1{ our $VERSION = '1.12'; } 552b8851fccSafresh1--- 553b8851fccSafresh1 vers => '1.12', 554b8851fccSafresh1 all_versions => { Simple => '1.12' }, 555b8851fccSafresh1}, 556b8851fccSafresh1{ 557b8851fccSafresh1 name => 'calculated version - from Acme-Pi-3.14', 558b8851fccSafresh1 code => <<'---', 559b8851fccSafresh1package Simple; 560b8851fccSafresh1my $version = atan2(1,1) * 4; $Simple::VERSION = "$version"; 561b8851fccSafresh11; 562b8851fccSafresh1--- 563b8851fccSafresh1 vers => sub { defined $_[0] and $_[0] =~ /^3\.14159/ }, 564b8851fccSafresh1 all_versions => sub { ref $_[0] eq 'HASH' 565b8851fccSafresh1 and keys %{$_[0]} == 1 566b8851fccSafresh1 and (keys%{$_[0]})[0] eq 'Simple' 567b8851fccSafresh1 and (values %{$_[0]})[0] =~ /^3\.14159/ 568b8851fccSafresh1 }, 569b8851fccSafresh1}, 570b8851fccSafresh1{ 571b8851fccSafresh1 name => 'set from separately-initialised variable, one line', 572b8851fccSafresh1 code => <<'---', 573b8851fccSafresh1package Simple; 574b8851fccSafresh1 my $CVSVERSION = '$Revision: 1.7 $'; our ($VERSION) = ($CVSVERSION =~ /(\d+\.\d+)/); 575b8851fccSafresh1} 576b8851fccSafresh1--- 577b8851fccSafresh1 vers => '1.7', 578b8851fccSafresh1 all_versions => { Simple => '1.7' }, 579b8851fccSafresh1}, 580b8851fccSafresh1{ 581b8851fccSafresh1 name => 'from Lingua-StopWords-0.09/devel/gen_modules.plx', 582b8851fccSafresh1 code => <<'---', 583b8851fccSafresh1package Foo; 584b8851fccSafresh1our $VERSION = $Bar::VERSION; 585b8851fccSafresh1--- 586b8851fccSafresh1 vers => $undef, 587b8851fccSafresh1 all_versions => { Foo => '0' }, 588b8851fccSafresh1}, 589b8851fccSafresh1{ 590b8851fccSafresh1 name => 'from XML-XSH2-2.1.17/lib/XML/XSH2/Parser.pm', 591b8851fccSafresh1 code => <<'---', 592b8851fccSafresh1our $VERSION = # Hide from PAUSE 593b8851fccSafresh1 '1.967009'; 594b8851fccSafresh1$VERSION = eval $VERSION; 595b8851fccSafresh1--- 596b8851fccSafresh1 vers => $undef, 597b8851fccSafresh1 all_versions => { main => '0' }, 598b8851fccSafresh1}, 599b8851fccSafresh1{ 600b8851fccSafresh1 name => 'from MBARBON/Module-Info-0.30.tar.gz', 601b8851fccSafresh1 code => <<'---', 602b8851fccSafresh1package Simple; 603b8851fccSafresh1$VERSION = eval 'use version; 1' ? 'version'->new('0.30') : '0.30'; 604b8851fccSafresh1--- 605b8851fccSafresh1 vers => '0.30', 606b8851fccSafresh1 all_versions => { Simple => '0.30' }, 607b8851fccSafresh1}, 608b8851fccSafresh1{ 609b8851fccSafresh1 name => '$VERSION inside BEGIN block', 610b8851fccSafresh1 code => <<'---', 611b8851fccSafresh1package Simple; 612b8851fccSafresh1 BEGIN { $VERSION = '1.23' } 613b8851fccSafresh1} 614b8851fccSafresh1--- 615b8851fccSafresh1 vers => '1.23', 616b8851fccSafresh1 all_versions => { Simple => '1.23' }, 617b8851fccSafresh1 TODO_scalar => 'apply fix from ExtUtils-MakeMaker PR#135', 618b8851fccSafresh1 TODO_all_versions => 'apply fix from ExtUtils-MakeMaker PR#135', 619b8851fccSafresh1}, 620b8851fccSafresh1{ 621b8851fccSafresh1 name => 'our $VERSION inside BEGIN block', 622b8851fccSafresh1 code => <<'---', 623b8851fccSafresh1 '1.23' => <<'---', # our + BEGIN 624b8851fccSafresh1package Simple; 625b8851fccSafresh1 BEGIN { our $VERSION = '1.23' } 626b8851fccSafresh1} 627b8851fccSafresh1--- 628b8851fccSafresh1 vers => '1.23', 629b8851fccSafresh1 all_versions => { Simple => '1.23' }, 630b8851fccSafresh1 TODO_scalar => 'apply fix from ExtUtils-MakeMaker PR#135', 631b8851fccSafresh1 TODO_all_versions => 'apply fix from ExtUtils-MakeMaker PR#135', 632b8851fccSafresh1}, 633b8851fccSafresh1{ 634b8851fccSafresh1 name => 'no assumption of primary version merely if a package\'s $VERSION is referenced', 635b8851fccSafresh1 code => <<'---', 636b8851fccSafresh1package Simple; 637b8851fccSafresh1$Foo::Bar::VERSION = '1.23'; 638b8851fccSafresh1--- 639b8851fccSafresh1 vers => undef, 640b8851fccSafresh1 all_versions => { 'Foo::Bar' => '1.23' }, 641b8851fccSafresh1}, 642b8851fccSafresh1{ 643b8851fccSafresh1 name => 'no package statement; bare $VERSION', 644b8851fccSafresh1 code => <<'---', 645b8851fccSafresh1$VERSION = '1.23'; 646b8851fccSafresh1--- 647b8851fccSafresh1 vers => undef, 648b8851fccSafresh1 all_versions => { '____caller' => '1.23' }, 649b8851fccSafresh1 TODO_all_versions => 'FIXME! RT#74741', 650b8851fccSafresh1}, 651b8851fccSafresh1{ 652b8851fccSafresh1 name => 'no package statement; bare $VERSION with our', 653b8851fccSafresh1 code => <<'---', 654b8851fccSafresh1our $VERSION = '1.23'; 655b8851fccSafresh1--- 656b8851fccSafresh1 vers => undef, 657b8851fccSafresh1 all_versions => { '____caller' => '1.23' }, 658b8851fccSafresh1 TODO_all_versions => 'FIXME! RT#74741', 659b8851fccSafresh1}, 660b8851fccSafresh1{ 661b8851fccSafresh1 name => 'no package statement; fully-qualified $VERSION for main', 662b8851fccSafresh1 code => <<'---', 663b8851fccSafresh1$::VERSION = '1.23'; 664b8851fccSafresh1--- 665b8851fccSafresh1 vers => undef, 666b8851fccSafresh1 all_versions => { 'main' => '1.23' }, 667b8851fccSafresh1}, 668b8851fccSafresh1{ 669b8851fccSafresh1 name => 'no package statement; fully-qualified $VERSION for other package', 670b8851fccSafresh1 code => <<'---', 671b8851fccSafresh1$Foo::Bar::VERSION = '1.23'; 672b8851fccSafresh1--- 673b8851fccSafresh1 vers => undef, 674b8851fccSafresh1 all_versions => { 'Foo::Bar' => '1.23' }, 675b8851fccSafresh1}, 6765759b3d2Safresh1{ 6775759b3d2Safresh1 name => 'package statement that does not quite match the filename', 6785759b3d2Safresh1 filename => 'Simple.pm', 6795759b3d2Safresh1 code => <<'---', 6805759b3d2Safresh1package ThisIsNotSimple; 6815759b3d2Safresh1our $VERSION = '1.23'; 6825759b3d2Safresh1--- 6835759b3d2Safresh1 vers => $undef, 6845759b3d2Safresh1 all_versions => { 'ThisIsNotSimple' => '1.23' }, 6855759b3d2Safresh1}, 686b8851fccSafresh1); 687b8851fccSafresh1 688b8851fccSafresh1my $test_num = 0; 689b8851fccSafresh1 690b8851fccSafresh1my $tmpdir = GeneratePackage::tmpdir(); 691b8851fccSafresh1 692b8851fccSafresh1# iterate through @modules 693b8851fccSafresh1foreach my $test_case (@modules) { 694*3d61058aSafresh1 note ''; 695b8851fccSafresh1 note '-------'; 696b8851fccSafresh1 note $test_case->{name}; 697b8851fccSafresh1 my $code = $test_case->{code}; 698b8851fccSafresh1 my $expected_version = $test_case->{vers}; 699b8851fccSafresh1 700b8851fccSafresh1 SKIP: { 701b8851fccSafresh1 skip( "No our() support until perl 5.6", (defined $expected_version ? 3 : 2) ) 7025759b3d2Safresh1 if "$]" < 5.006 && $code =~ /\bour\b/; 703b8851fccSafresh1 skip( "No package NAME VERSION support until perl 5.11.1", (defined $expected_version ? 3 : 2) ) 7045759b3d2Safresh1 if "$]" < 5.011001 && $code =~ /package\s+[\w\:\']+\s+v?[0-9._]+/; 705b8851fccSafresh1 706b8851fccSafresh1 my $warnings = ''; 707b8851fccSafresh1 local $SIG{__WARN__} = sub { $warnings .= $_ for @_ }; 708b8851fccSafresh1 7095759b3d2Safresh1 my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catfile($tmpdir, "Simple${test_num}"), 'Simple.pm', $code)); 710b8851fccSafresh1 711b8851fccSafresh1 # whenever we drop support for 5.6, we can do this: 712b8851fccSafresh1 # open my $fh, '<', \(encode('UTF-8', $code, Encode::FB_CROAK)) 713b8851fccSafresh1 # or die "cannot open handle to code string: $!"; 714b8851fccSafresh1 # my $pm_info = Module::Metadata->new_from_handle($fh, 'lib/Simple.pm'); 715b8851fccSafresh1 716b8851fccSafresh1 my $errs; 717b8851fccSafresh1 my $got = $pm_info->version; 718b8851fccSafresh1 719b8851fccSafresh1 # note that in Test::More 0.94 and earlier, is() stringifies first before comparing; 720b8851fccSafresh1 # from 0.95_01 and later, it just lets the objects figure out how to handle 'eq' 721b8851fccSafresh1 # We want to ensure we preserve the original, as long as it's legal, so we 722b8851fccSafresh1 # explicitly check the stringified form. 723b8851fccSafresh1 { 724b46d8ef2Safresh1 local $TODO = !defined($got) && ($test_case->{TODO_code_sub} || $test_case->{TODO_scalar}) ? 1 : undef; 7255759b3d2Safresh1 isa_ok($got, 'version') or $errs++ if defined $expected_version; 726b8851fccSafresh1 } 727b8851fccSafresh1 728b8851fccSafresh1 if (ref($expected_version) eq 'CODE') { 729b8851fccSafresh1 local $TODO = $test_case->{TODO_code_sub}; 730b8851fccSafresh1 ok( 731b8851fccSafresh1 $expected_version->($got), 732b8851fccSafresh1 "case '$test_case->{name}': module version passes match sub" 733b8851fccSafresh1 ) 734b8851fccSafresh1 or $errs++; 735b8851fccSafresh1 } 736b8851fccSafresh1 else { 737b8851fccSafresh1 local $TODO = $test_case->{TODO_scalar}; 738b8851fccSafresh1 is( 739b8851fccSafresh1 (defined $got ? "$got" : $got), 740b8851fccSafresh1 $expected_version, 741b8851fccSafresh1 "case '$test_case->{name}': correct module version (" 742b8851fccSafresh1 . (defined $expected_version? "'$expected_version'" : 'undef') 743b8851fccSafresh1 . ')' 744b8851fccSafresh1 ) 745b8851fccSafresh1 or $errs++; 746b8851fccSafresh1 } 747b8851fccSafresh1 748b8851fccSafresh1 if (exists $test_case->{all_versions}) { 749b8851fccSafresh1 local $TODO = $test_case->{TODO_all_versions}; 750b8851fccSafresh1 if (ref($expected_version) eq 'CODE') { 751b8851fccSafresh1 ok( 752b8851fccSafresh1 $test_case->{all_versions}->($pm_info->{versions}), 753b8851fccSafresh1 "case '$test_case->{name}': all extracted versions passes match sub" 7545759b3d2Safresh1 ) or $errs++; 755b8851fccSafresh1 } 756b8851fccSafresh1 else { 757b8851fccSafresh1 is_deeply( 758b8851fccSafresh1 $pm_info->{versions}, 759b8851fccSafresh1 $test_case->{all_versions}, 760b8851fccSafresh1 'correctly found all $VERSIONs', 7615759b3d2Safresh1 ) or $errs++; 762b8851fccSafresh1 } 763b8851fccSafresh1 } 764b8851fccSafresh1 765b8851fccSafresh1 is( $warnings, '', "case '$test_case->{name}': no warnings from parsing" ) or $errs++; 766b46d8ef2Safresh1 diag 'parsed module: ', explain($pm_info) if $errs and not $ENV{PERL_CORE} 767b46d8ef2Safresh1 and ($ENV{AUTHOR_TESTING} or $ENV{AUTOMATED_TESTING}); 768b8851fccSafresh1 } 769b8851fccSafresh1} 770b8851fccSafresh1continue { 771b8851fccSafresh1 ++$test_num; 772b8851fccSafresh1} 773b8851fccSafresh1 774b8851fccSafresh1done_testing; 775