xref: /openbsd-src/gnu/usr.bin/perl/cpan/Module-Metadata/t/extract-version.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
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