The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use constant {
    TESTS   => 10,
    MAX_NUM => 0x0FFFFFFF
};

use Test::More tests => TESTS * 5;

use Number::AnyBase;

{
    note TESTS . q( random roundtrips over 0..9, 'A'..'Z', 'a'..'z');
    my $conv = Number::AnyBase->new( [0..9, 'A'..'Z', 'a'..'z'] );
    for my $test (1 .. TESTS) {
        my $dec_num = int rand MAX_NUM;
        my $base_num = $conv->to_base($dec_num);
        is $conv->to_dec($base_num), $dec_num, "Roundtrip $dec_num > $base_num > $dec_num"
    }
}

{
    note TESTS . q( random roundtrips over uri-safe alphabet);
    my $conv = Number::AnyBase->new_urisafe;
    for my $test (1 .. TESTS) {
        my $dec_num = int rand MAX_NUM;
        my $base_num = $conv->to_base($dec_num);
        is $conv->to_dec($base_num), $dec_num, "Roundtrip $dec_num > $base_num > $dec_num"
    }
}

{
    note TESTS . q( random roundtrips over binary alphabet);
    my $conv = Number::AnyBase->new( '01' );
    for my $test (1 .. TESTS) {
        my $dec_num = int rand MAX_NUM;
        my $base_num = $conv->to_base($dec_num);
        is $conv->to_dec($base_num), $dec_num, "Roundtrip $dec_num > $base_num > $dec_num"
    }
}

{
    note TESTS . q( random roundtrips over hex alphabet);
    my $conv = Number::AnyBase->new( '0123456789ABCDEF' );
    for my $test (1 .. TESTS) {
        my $dec_num = int rand MAX_NUM;
        my $base_num = $conv->to_base($dec_num);
        is $conv->to_dec($base_num), $dec_num, "Roundtrip $dec_num > $base_num > $dec_num"
    }
}

{
    note TESTS . q( random roundtrips over ascii printable alphabet);
    no warnings;
    my $seq = Number::AnyBase->new_ascii;
    for my $test (1 .. TESTS) {
        my $dec_num = int rand MAX_NUM;
        my $base_num = $seq->to_base($dec_num);
        is $seq->to_dec($base_num), $dec_num, "Roundtrip $dec_num > $base_num > $dec_num"
    }
}