The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use warnings;
use strict;
use Games::Go::Rank;
use Test::More tests => 87;

sub gt_ok ($$) {
    my ($rank1, $rank2) = @_;
    ok( Games::Go::Rank->new(rank => $rank1) >
          Games::Go::Rank->new(rank => $rank2),
        "both OO: $rank1 > $rank2"
    );
    ok(Games::Go::Rank->new(rank => $rank1) > $rank2,
        "lhs OO: $rank1 > $rank2");
    ok($rank1 > Games::Go::Rank->new(rank => $rank2),
        "rhs OO: $rank1 > $rank2");
    lt_ok($rank2, $rank1);
}

sub lt_ok ($$) {
    my ($rank1, $rank2) = @_;
    ok( Games::Go::Rank->new(rank => $rank1) <
          Games::Go::Rank->new(rank => $rank2),
        "both OO: $rank1 < $rank2"
    );
    ok(Games::Go::Rank->new(rank => $rank1) < $rank2,
        "lhs OO: $rank1 < $rank2");
    ok($rank1 < Games::Go::Rank->new(rank => $rank2),
        "rhs OO: $rank1 < $rank2");
}

sub value_ok ($$) {
    my ($rank, $value) = @_;
    is(Games::Go::Rank->new(rank => $rank)->as_value,
        $value, "value of $rank is $value");
    is(Games::Go::Rank->new->from_value($value)->rank,
        $rank, "rank of value $value is $rank");
}

sub normalized_value_ok ($$) {
    my ($rank, $value) = @_;
    is(Games::Go::Rank->new(rank => $rank)->as_value,
        $value, "value of $rank is $value");
}
value_ok '20k',               -19;
value_ok '2k',                -1;
value_ok '1k',                0;
value_ok '1d',                1;
value_ok '4d',                4;
value_ok '7d',                7;
value_ok '1p',                8;
value_ok '9p',                16;
normalized_value_ok '20 kyu', -19;
normalized_value_ok '1-dan',  1;
normalized_value_ok '1d?',    1;
normalized_value_ok '1d*',    1;
normalized_value_ok '9-pro',  16;
gt_ok '20k',                  '21k';
gt_ok '1k',                   '2k';
gt_ok '1d',                   '1k';
gt_ok '2d',                   '1d';
gt_ok '7d',                   '4d';
gt_ok '1p',                   '7d';
gt_ok '2p',                   '1p';
gt_ok '9p',                   '8p';
gt_ok '1p',                   '1k';
gt_ok '1-pro',                '6-dan';
gt_ok '3d?',                  '2d*'