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 => 6;
use Statistics::Benford;

{
    my $stats = Statistics::Benford->new(2, 0, 1);
    is_deeply({$stats->dist}, {1 => 1}, 'dist: base=1, pos=0, len=1');
}

{
    my $stats = Statistics::Benford->new;

    my @e = qw(0.301 0.176 0.125 0.097 0.079 0.067 0.058 0.051 0.046);
    my %e = map { $_ => $e[ $_ - 1 ] } (1 .. 9);

    my %d = $stats->dist;
    while (my ($k, $v) = each %d) {
        $d{$k} = sprintf "%.3f", $v;
    }

    is_deeply(\%d, \%e, 'dist: base=10, pos=0, len=1');
}

{
    my $stats = Statistics::Benford->new(10, 1, 1);

    my @e = qw(0.120 0.114 0.109 0.104 0.100 0.097 0.093 0.090 0.088 0.085);
    my %e = map { $_ => $e[ $_ ] } (0 .. 9);

    my %d = $stats->dist;
    while (my ($k, $v) = each %d) {
        $d{$k} = sprintf "%.3f", $v;
    }

    is_deeply(\%d, \%e, 'dist: base=10, pos=1, len=1');
}

{
    my $stats = Statistics::Benford->new(10, 0, 2);

    my @e = qw(
        0.041 0.038 0.035 0.032 0.030 0.028 0.026 0.025 0.023 0.022 0.021
        0.020 0.019 0.018 0.018 0.017 0.016 0.016 0.015 0.015 0.014 0.014
        0.013 0.013 0.013 0.012 0.012 0.012 0.011 0.011 0.011 0.010 0.010
        0.010 0.010 0.010 0.009 0.009 0.009 0.009 0.009 0.008 0.008 0.008
        0.008 0.008 0.008 0.008 0.007 0.007 0.007 0.007 0.007 0.007 0.007
        0.007 0.007 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.006 0.006
        0.006 0.006 0.006 0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.005
        0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.005 0.004
        0.004 0.004
   );
    my %e = map { $_ => $e[ $_ - 10 ] } (10 .. 99);

    my %d = $stats->dist;
    while (my ($k, $v) = each %d) {
        $d{$k} = sprintf "%.3f", $v;
    }

    is_deeply(\%d, \%e, 'dist: base=10, pos=0, len=2');
}

{
    my $stats = Statistics::Benford->new(16, 0, 1);

    my @e = qw(
        0.250 0.146 0.104 0.080 0.066 0.056 0.048 0.042 0.038 0.034 0.031
        0.029 0.027 0.025 0.023
   );
    my %e = map { $_ => $e[ $_ - 1 ] } (1 .. 15);

    my %d = $stats->dist;
    while (my ($k, $v) = each %d) {
        $d{$k} = sprintf "%.3f", $v;
    }

    is_deeply(\%d, \%e, 'dist: base=16, pos=0, len=1');
}

{
    my $stats = Statistics::Benford->new(8, 0, 1);

    my @e = qw(0.333 0.195 0.138 0.107 0.088 0.074 0.064);
    my %e = map { $_ => $e[ $_ - 1 ] } (1..7);

    my %d = $stats->dist;
    while (my ($k, $v) = each %d) {
        $d{$k} = sprintf "%.3f", $v;
    }

    is_deeply(\%d, \%e, 'dist: base=8, pos=0, len=1');
}