The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Math::Histogram;
use Test::More;
use File::Spec;

BEGIN { push @INC, -d "t" ? File::Spec->catdir(qw(t lib)) : "lib"; }
use Math::Histogram::Test;

my $bins = [1.1, 1.35, 1.6, 1.85, 2.1];
my @ax = (Math::Histogram::Axis->new(4, 1.1, 2.1),
          Math::Histogram::Axis->new($bins));
is(scalar(@ax), 2);
isa_ok($ax[0], 'Math::Histogram::Axis');
isa_ok($ax[1], 'Math::Histogram::Axis');

my @desc = qw(fixbin varbin);
foreach my $ax (@ax) {
  my $desc = shift @desc;

  is($ax->nbins, 4, "$desc: nbins");

  my @bad_methods = qw(binsize lower_boundary upper_boundary bin_center);
  foreach my $dying_method (@bad_methods) {
    foreach my $ibin (0, 5) {
      my $res = eval {$ax->$dying_method($ibin); 1};
      ok(!$res && $@ =~ /\boutside axis bin range\b/);
    }
  }

  is_approx($ax->min, 1.1, "$desc: min");
  is_approx($ax->max, 2.1, "$desc: max");
  is_approx($ax->width, $ax->max - $ax->min, "$desc: width");

  foreach my $ibin (0..3) {
    my $lower = $bins->[$ibin];
    my $upper = $bins->[$ibin+1];
    my $center = 0.5*($upper+$lower);
    my $binsize = $upper-$lower;
    is_approx($ax->binsize($ibin+1), $binsize, "$desc, $ibin: binsize");
    is_approx($ax->lower_boundary($ibin+1), $lower, "$desc, $ibin: lower bin boundary");
    is_approx($ax->upper_boundary($ibin+1), $upper, "$desc, $ibin: upper bin boundary");
    is_approx($ax->bin_center($ibin+1), $center, "$desc, $ibin: bin center");

    is($ax->find_bin($lower), $ibin+1, "$desc, $ibin: found lower bin boundary");
    is($ax->find_bin($center), $ibin+1, "$desc, $ibin: found bin center");
    is($ax->find_bin($upper), $ibin+2, "$desc, $ibin: found upper bin boundary");
  }
}


done_testing();