The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More tests => 3;

use Dist::Zilla::Plugin::NextVersion::Semantic;

{
    package MyTest;

    use Moose;

   has format => (
       isa => 'Str',
       is => 'rw',
       default => '%d.%d.%d'
   );

   has previous_version => (
       is => 'rw',
   );

    with 'Dist::Zilla::Plugin::NextVersion::Semantic::Incrementer';
}


sub incr {
    my( $inc, $level ) = @_;
    my $version = $inc->increment_version($level);
    $inc->previous_version($version);
    return $version;
}

my $format = '%d.%3d.%3d';
subtest $format => sub { 
    my $incrementer = MyTest->new(
        previous_version => 0,
        format => $format,
    );

    is incr( $incrementer, 'MAJOR' ) => '1.0.0';
    is incr( $incrementer, 'MAJOR') => '2.0.0';
    is incr( $incrementer, 'MINOR') => '2.1.0';
    is incr( $incrementer, 'PATCH') => '2.1.1';
    is incr( $incrementer ) => '2.1.2';
    is incr( $incrementer, 'MINOR' ) => '2.2.0';

    $incrementer->previous_version( "0.0.999" );
    is incr( $incrementer ) => '0.1.0', 'length exceeded';
};

$format = '%d.%d';
subtest $format => sub {
    my $incrementer = MyTest->new(
        previous_version => 0,
        format => $format,
    );

    is incr( $incrementer, 'MAJOR' ) => '1.0';
    is incr( $incrementer, 'MAJOR') => '2.0';
    is incr( $incrementer, 'MINOR') => '2.1';
    is incr( $incrementer, 'PATCH') => '2.2';
    is incr( $incrementer ) => '2.3';
    is incr( $incrementer, 'MINOR' ) => '2.4';
};

$format = '%d.%03d%03d';
subtest $format => sub {
    my $incrementer = MyTest->new(
        previous_version => 0,
        format => $format,
    );

    is incr( $incrementer, 'MAJOR' ) => '1.000000';
    is incr( $incrementer, 'MAJOR') => '2.000000';
    is incr( $incrementer, 'MINOR') => '2.001000';
    is incr( $incrementer, 'PATCH') => '2.001001';
    is incr( $incrementer ) => '2.001002';
    is incr( $incrementer, 'MINOR' ) => '2.002000';
};