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 => 8;
use constant EPS     => 1e-2;

BEGIN { use_ok('Statistics::ANOVA') }

my $aov = Statistics::ANOVA->new();
isa_ok( $aov, 'Statistics::ANOVA' );

# Example 1: Maxwell & Delaney (1990), pp. 555ff.
my @y1 = ( 2, 4, 6, 8, 10, 3, 6, 9 );
my @y2 = ( 3, 7, 8, 9, 13, 4, 9, 11 );
my @y3 = ( 5, 9, 8, 8, 15, 9, 8, 10 );

eval { $aov->load_data( { y1 => \@y1, y2 => \@y2, y3 => \@y3 } ); };
ok( !$@, $@ );

my %ref_vals = (    # PASW output
    ms_w => 1.667,
    t_12 => -6.110,
    t_23 => -1.323,
);

eval { $aov->anova( independent => 0, parametric => 1 ); };
ok( !$@, $@ );

ok(
    about_equal( $aov->{'_stat'}->{'ms_w'}, $ref_vals{'ms_w'} ),
    "F-test pair comparison: $aov->{'_stat'}->{'ms_w'} = $ref_vals{'ms_w'}"
);

my $pair_dat;
eval {
    $pair_dat = $aov->compare(
        independent => 0,
        parametric  => 1,
        ordinal     => 0,
        adjust_p    => 0,
        adjust_e    => 2,
        use_t       => 0
    );
};
ok( !$@, $@ );

ok(
    about_equal( $pair_dat->{"y1,y2"}->{'t_value'}, $ref_vals{'t_12'} ),
"t-test pair comparison y1,y2: $pair_dat->{'y1,y2'}->{'t_value'} = $ref_vals{'t_12'}"
);

ok(
    about_equal( $pair_dat->{"y2,y3"}->{'t_value'}, $ref_vals{'t_23'} ),
"t-test pair comparison: y2,y3: $pair_dat->{'y2,y3'}->{'t_value'} = $ref_vals{'t_23'}"
);

sub about_equal {
    return 0 if !defined $_[0] || !defined $_[1];
    return 1 if $_[0] + EPS > $_[1] and $_[0] - EPS < $_[1];
    return 0;
}
1;