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 11b8851fccSafresh1# parse package names 12b8851fccSafresh1# format: { 13b8851fccSafresh1# name => test name 14b8851fccSafresh1# code => code snippet (string) 15b8851fccSafresh1# package => expected package names 16b8851fccSafresh1# } 17b8851fccSafresh1my @pkg_names = ( 18b8851fccSafresh1{ 19b8851fccSafresh1 name => 'package NAME', 20b8851fccSafresh1 package => [ 'Simple' ], 21b8851fccSafresh1 code => <<'---', 22b8851fccSafresh1package Simple; 23b8851fccSafresh1--- 24b8851fccSafresh1}, 25b8851fccSafresh1{ 26b8851fccSafresh1 name => 'package NAME::SUBNAME', 27b8851fccSafresh1 package => [ 'Simple::Edward' ], 28b8851fccSafresh1 code => <<'---', 29b8851fccSafresh1package Simple::Edward; 30b8851fccSafresh1--- 31b8851fccSafresh1}, 32b8851fccSafresh1{ 33b8851fccSafresh1 name => 'package NAME::SUBNAME::', 34b8851fccSafresh1 package => [ 'Simple::Edward::' ], 35b8851fccSafresh1 code => <<'---', 36b8851fccSafresh1package Simple::Edward::; 37b8851fccSafresh1--- 38b8851fccSafresh1}, 39b8851fccSafresh1{ 40b8851fccSafresh1 name => "package NAME'SUBNAME", 41b8851fccSafresh1 package => [ "Simple'Edward" ], 42b8851fccSafresh1 code => <<'---', 43b8851fccSafresh1package Simple'Edward; 44b8851fccSafresh1--- 45b8851fccSafresh1}, 46b8851fccSafresh1{ 47b8851fccSafresh1 name => "package NAME'SUBNAME::", 48b8851fccSafresh1 package => [ "Simple'Edward::" ], 49b8851fccSafresh1 code => <<'---', 50b8851fccSafresh1package Simple'Edward::; 51b8851fccSafresh1--- 52b8851fccSafresh1}, 53b8851fccSafresh1{ 54b8851fccSafresh1 name => 'package NAME::::SUBNAME', 55b8851fccSafresh1 package => [ 'Simple::::Edward' ], 56b8851fccSafresh1 code => <<'---', 57b8851fccSafresh1package Simple::::Edward; 58b8851fccSafresh1--- 59b8851fccSafresh1}, 60b8851fccSafresh1{ 61b8851fccSafresh1 name => 'package ::NAME::SUBNAME', 62b8851fccSafresh1 package => [ '::Simple::Edward' ], 63b8851fccSafresh1 code => <<'---', 64b8851fccSafresh1package ::Simple::Edward; 65b8851fccSafresh1--- 66b8851fccSafresh1}, 67b8851fccSafresh1{ 68b8851fccSafresh1 name => 'package NAME:SUBNAME (fail)', 69b8851fccSafresh1 package => [ 'main' ], 70b8851fccSafresh1 code => <<'---', 71b8851fccSafresh1package Simple:Edward; 72b8851fccSafresh1--- 73b8851fccSafresh1}, 74b8851fccSafresh1{ 75b8851fccSafresh1 name => "package NAME' (fail)", 76b8851fccSafresh1 package => [ 'main' ], 77b8851fccSafresh1 code => <<'---', 78b8851fccSafresh1package Simple'; 79b8851fccSafresh1--- 80b8851fccSafresh1}, 81b8851fccSafresh1{ 82b8851fccSafresh1 name => "package NAME::SUBNAME' (fail)", 83b8851fccSafresh1 package => [ 'main' ], 84b8851fccSafresh1 code => <<'---', 85b8851fccSafresh1package Simple::Edward'; 86b8851fccSafresh1--- 87b8851fccSafresh1}, 88b8851fccSafresh1{ 89b8851fccSafresh1 name => "package NAME''SUBNAME (fail)", 90b8851fccSafresh1 package => [ 'main' ], 91b8851fccSafresh1 code => <<'---', 92b8851fccSafresh1package Simple''Edward; 93b8851fccSafresh1--- 94b8851fccSafresh1}, 95b8851fccSafresh1{ 96b8851fccSafresh1 name => 'package NAME-SUBNAME (fail)', 97b8851fccSafresh1 package => [ 'main' ], 98b8851fccSafresh1 code => <<'---', 99b8851fccSafresh1package Simple-Edward; 100b8851fccSafresh1--- 101b8851fccSafresh1}, 102b8851fccSafresh1{ 103b8851fccSafresh1 name => 'no assumption of package merely if its $VERSION is referenced', 104b8851fccSafresh1 package => [ 'Simple' ], 105b8851fccSafresh1 code => <<'---', 106b8851fccSafresh1package Simple; 107b8851fccSafresh1$Foo::Bar::VERSION = '1.23'; 108b8851fccSafresh1--- 109b8851fccSafresh1}, 1105759b3d2Safresh1{ 1115759b3d2Safresh1 name => 'script 7 from t/metadata.t', # TODO merge these 1125759b3d2Safresh1 package => [ '_private', 'main' ], 1135759b3d2Safresh1 TODO => '$::VERSION indicates main namespace is referenced', 1145759b3d2Safresh1 code => <<'---', 1155759b3d2Safresh1package _private; 1165759b3d2Safresh1$::VERSION = 0.01; 1175759b3d2Safresh1$VERSION = '999'; 1185759b3d2Safresh1--- 1195759b3d2Safresh1}, 1205759b3d2Safresh1{ 1215759b3d2Safresh1 name => 'script 8 from t/metadata.t', # TODO merge these 1225759b3d2Safresh1 package => [ '_private', 'main' ], 1235759b3d2Safresh1 TODO => '$::VERSION indicates main namespace is referenced', 1245759b3d2Safresh1 code => <<'---', 1255759b3d2Safresh1package _private; 1265759b3d2Safresh1$VERSION = '999'; 1275759b3d2Safresh1$::VERSION = 0.01; 1285759b3d2Safresh1--- 1295759b3d2Safresh1}, 130*3d61058aSafresh1{ 131*3d61058aSafresh1 name => 'class NAME::SUBNAME', 132*3d61058aSafresh1 package => [ 'Simple::Edward' ], 133*3d61058aSafresh1 code => <<'---', 134*3d61058aSafresh1class Simple::Edward; 135*3d61058aSafresh1--- 136*3d61058aSafresh1}, 137*3d61058aSafresh1{ 138*3d61058aSafresh1 name => 'class NAME::SUBNAME', 139*3d61058aSafresh1 package => [ 'main', 'Simple::Edward' ], 140*3d61058aSafresh1 code => <<'---', 141*3d61058aSafresh1our $foo = 1; 142*3d61058aSafresh1class Simple::Edward; 143*3d61058aSafresh1--- 144*3d61058aSafresh1}, 145b8851fccSafresh1); 146b8851fccSafresh1 147b8851fccSafresh1my $test_num = 0; 148b8851fccSafresh1 149b8851fccSafresh1my $tmpdir = GeneratePackage::tmpdir(); 150b8851fccSafresh1 151b8851fccSafresh1foreach my $test_case (@pkg_names) { 152b8851fccSafresh1 note '-------'; 153b8851fccSafresh1 note $test_case->{name}; 154b8851fccSafresh1 my $code = $test_case->{code}; 155b8851fccSafresh1 my $expected_name = $test_case->{package}; 156b8851fccSafresh1 157b8851fccSafresh1 my $warnings = ''; 158b8851fccSafresh1 local $SIG{__WARN__} = sub { $warnings .= $_ for @_ }; 159b8851fccSafresh1 1605759b3d2Safresh1 my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catfile($tmpdir, "Simple${test_num}"), 'Simple.pm', $code)); 161b8851fccSafresh1 162b8851fccSafresh1 # whenever we drop support for 5.6, we can do this: 163b8851fccSafresh1 # open my $fh, '<', \(encode('UTF-8', $code, Encode::FB_CROAK)) 164b8851fccSafresh1 # or die "cannot open handle to code string: $!"; 165b8851fccSafresh1 # my $pm_info = Module::Metadata->new_from_handle($fh, 'lib/Simple.pm'); 166b8851fccSafresh1 167b8851fccSafresh1 # Test::Builder will prematurely numify objects, so use this form 168b8851fccSafresh1 my $errs; 169b8851fccSafresh1 my @got = $pm_info->packages_inside(); 1705759b3d2Safresh1 { 1715759b3d2Safresh1 local $TODO = $test_case->{TODO}; 172b8851fccSafresh1 is_deeply( \@got, $expected_name, 173b8851fccSafresh1 "case $test_case->{name}: correct package names (expected '" . join(', ', @$expected_name) . "')" ) 174b8851fccSafresh1 or $errs++; 1755759b3d2Safresh1 } 176b8851fccSafresh1 is( $warnings, '', "case $test_case->{name}: no warnings from parsing" ) or $errs++; 177b46d8ef2Safresh1 diag "Got: '" . join(', ', @got) . "'\nModule contents:\n$code" 178b46d8ef2Safresh1 if $errs and not $ENV{PERL_CORE} and ($ENV{AUTHOR_TESTING} or $ENV{AUTOMATED_TESTING}); 179b8851fccSafresh1} 180b8851fccSafresh1continue { 181b8851fccSafresh1 ++$test_num; 182b8851fccSafresh1} 183b8851fccSafresh1 184b8851fccSafresh1done_testing; 185