xref: /openbsd-src/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-package.t (revision ae3cb403620ab940fbaabb3055fac045a63d56b7)
1use strict;
2use warnings;
3# vim:ts=8:sw=2:et:sta:sts=2
4
5use Test::More 0.82;
6use Module::Metadata;
7
8use lib 't/lib';
9use GeneratePackage;
10
11# parse package names
12# format: {
13#   name => test name
14#   code => code snippet (string)
15#   package => expected package names
16# }
17my @pkg_names = (
18{
19  name => 'package NAME',
20  package => [ 'Simple' ],
21  code => <<'---',
22package Simple;
23---
24},
25{
26  name => 'package NAME::SUBNAME',
27  package => [ 'Simple::Edward' ],
28  code => <<'---',
29package Simple::Edward;
30---
31},
32{
33  name => 'package NAME::SUBNAME::',
34  package => [ 'Simple::Edward::' ],
35  code => <<'---',
36package Simple::Edward::;
37---
38},
39{
40  name => "package NAME'SUBNAME",
41  package => [ "Simple'Edward" ],
42  code => <<'---',
43package Simple'Edward;
44---
45},
46{
47  name => "package NAME'SUBNAME::",
48  package => [ "Simple'Edward::" ],
49  code => <<'---',
50package Simple'Edward::;
51---
52},
53{
54  name => 'package NAME::::SUBNAME',
55  package => [ 'Simple::::Edward' ],
56  code => <<'---',
57package Simple::::Edward;
58---
59},
60{
61  name => 'package ::NAME::SUBNAME',
62  package => [ '::Simple::Edward' ],
63  code => <<'---',
64package ::Simple::Edward;
65---
66},
67{
68  name => 'package NAME:SUBNAME (fail)',
69  package => [ 'main' ],
70  code => <<'---',
71package Simple:Edward;
72---
73},
74{
75  name => "package NAME' (fail)",
76  package => [ 'main' ],
77  code => <<'---',
78package Simple';
79---
80},
81{
82  name => "package NAME::SUBNAME' (fail)",
83  package => [ 'main' ],
84  code => <<'---',
85package Simple::Edward';
86---
87},
88{
89  name => "package NAME''SUBNAME (fail)",
90  package => [ 'main' ],
91  code => <<'---',
92package Simple''Edward;
93---
94},
95{
96  name => 'package NAME-SUBNAME (fail)',
97  package => [ 'main' ],
98  code => <<'---',
99package Simple-Edward;
100---
101},
102{
103  name => 'no assumption of package merely if its $VERSION is referenced',
104  package => [ 'Simple' ],
105  code => <<'---',
106package Simple;
107$Foo::Bar::VERSION = '1.23';
108---
109},
110);
111
112my $test_num = 0;
113
114my $tmpdir = GeneratePackage::tmpdir();
115
116foreach my $test_case (@pkg_names) {
117    note '-------';
118    note $test_case->{name};
119    my $code = $test_case->{code};
120    my $expected_name = $test_case->{package};
121    local $TODO = $test_case->{TODO};
122
123    my $warnings = '';
124    local $SIG{__WARN__} = sub { $warnings .= $_ for @_ };
125
126    my $pm_info = Module::Metadata->new_from_file(generate_file(File::Spec->catdir($tmpdir, "Simple${test_num}"), 'Simple.pm', $code));
127
128    # whenever we drop support for 5.6, we can do this:
129    # open my $fh, '<', \(encode('UTF-8', $code, Encode::FB_CROAK))
130    #     or die "cannot open handle to code string: $!";
131    # my $pm_info = Module::Metadata->new_from_handle($fh, 'lib/Simple.pm');
132
133    # Test::Builder will prematurely numify objects, so use this form
134    my $errs;
135    my @got = $pm_info->packages_inside();
136    is_deeply( \@got, $expected_name,
137               "case $test_case->{name}: correct package names (expected '" . join(', ', @$expected_name) . "')" )
138            or $errs++;
139    is( $warnings, '', "case $test_case->{name}: no warnings from parsing" ) or $errs++;
140    diag "Got: '" . join(', ', @got) . "'\nModule contents:\n$code" if $errs;
141}
142continue {
143  ++$test_num;
144}
145
146done_testing;
147