#!/usr/bin/perl
use strict;
use warnings;
use Test::More tests => 22;
my $class = 'Module::Release';
use_ok( $class );
can_ok( $class, 'dist_version_format' );
can_ok( $class, 'dist_version' );
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# Should fail if remote is not set
{
my $mock = bless { }, $class;
my $got = eval { $mock->dist_version };
my $at = $@;
ok( ! defined $got, "Without remote set, dist_version croaks" );
like( $at, qr/\QIt's not set/, "Without remote set, get right error message" );
}
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# How does the formatting work?
{
my $mock = bless { remote_file => 'Foo-1.12_03.tar.gz' }, $class;
{
my $got = $mock->dist_version_format( 1, 12, "_03" );
is( $got, '1.12_03', 'Development version stays in there' );
}
{
my $got = $mock->dist_version_format( 1, 12 );
is( $got, '1.12', "Without development version it's fine" );
}
{
my $got = $mock->dist_version;
is( $got, '1.12_03', 'Development version stays in there' );
}
{
my $mock = bless { remote_file => 'Foo-3.45.tar.gz' }, $class;
my $got = $mock->dist_version;
is( $got, '3.45', "Without development version it's fine" );
}
}
{
# Test three-part version numbers. Module::Build (at least)
# generates them with a leading 'v'
# (I am relying on CPANTS to test these cases with version.pm pre-
# and post-v0.77, and with earlier versions of Perl without any
# version.pm. Mocking that here would be more tricksy than I have
# time for right now).
my @cases = (
['Foo-v3.45.tar.gz' => 'v3.45.0', "Two-part version string with leading 'v'"],
['Foo-v3.45.1.tar.gz' => 'v3.45.1', "Three-part version string with leading 'v'"],
['Foo-v3.45_1.tar.gz' => 'v3.45_1', "Three-part development version string with leading 'v'"],
# Capitalisation, various suffixes
['Foo-V3.45.1.tar.gz' => 'v3.45.1', "Three-part version string with capitalised leading 'V'"],
['Foo-v3.45.1.TAR.GZ' => 'v3.45.1', "...with capitalised suffix"],
['Foo-v3.45.1' => 'v3.45.1', "...with no suffix"],
# Test three-part version numbers with no leading 'v'. Not sure if
# this occurs in the wild, but presumably this should result in the
# same as above.
['Foo-3.45.1.tar.gz' => 'v3.45.1', "Three-part version string with no leading 'v'"],
['Foo-3.45.1.TAR.GZ' => 'v3.45.1', "...with capitalised suffix"],
['Foo-3.45.1' => 'v3.45.1', "...with no suffix"],
# Test four-part version development numbers with no leading 'v'.
# (Note, four, since the three case must be backward compatible and return
# the same as the earlier test above.)
['Foo-3.45.1.1.tar.gz' => 'v3.45.1.1', "Four-part version string with no leading 'v'"],
['Foo-3.45.1_1.tar.gz' => 'v3.45.1_1', "Four-part development version string with no leading 'v'"],
# Test distros with no version
['Foo.tar.gz' => '', "No version"],
['Foo' => '', "...with no suffix"],
);
my $case;
foreach $case (@cases) {
my ($dist_name, $expected_version, $descr) = @$case;
my $mock = bless { remote_file => $dist_name }, $class;
my $got_version = $mock->dist_version;
is $got_version, $expected_version, $descr;
}
}