xref: /openbsd-src/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t (revision 3d61058aa5c692477b6d18acfbbdb653a9930ff9)
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