The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Math::GSL::QRNG::Test;
use base q{Test::Class};
use Test::More tests => 24;
use Math::GSL::QRNG  qw/:all/;
use Math::GSL::Test  qw/:all/;
use Math::GSL::Errno qw/:all/;
use Data::Dumper;
use strict;
BEGIN { gsl_set_error_handler_off() }

sub make_fixture : Test(setup) {
    my $self = shift;
    $self->{sobol} = gsl_qrng_alloc($gsl_qrng_sobol, 2);
}

sub teardown : Test(teardown) {
    my $self = shift;
}

sub GSL_QRNG_ALLOC : Tests {
    my $qrng = gsl_qrng_alloc($gsl_qrng_sobol, 2);
    isa_ok( $qrng, 'Math::GSL::QRNG');
}

sub GSL_QRNG_STATE_SIZE : Tests {
    my $self  = shift;
    my $state = gsl_qrng_state($self->{sobol});
    my $size  = gsl_qrng_size($self->{sobol});

    ok( defined $state, "state is defined");
    cmp_ok($state,'>',0 , 'state is positive and non-zero');

    ok( defined $size, "size is defined");
    cmp_ok($size,'>',0 , 'size is positive and non-zero');
}

sub GSL_QRNG_CLONE : Tests {
    my $self  = shift;
    my $droid = gsl_qrng_clone($self->{sobol});
    isa_ok($droid, 'Math::GSL::QRNG' );
}

sub GSL_QRNG_NAME : Tests {
    my $self = shift;
    my $name = gsl_qrng_name($self->{sobol});
    cmp_ok($name,'eq','sobol', 'gsl_qrng_name == sobol' );
}

sub GSL_QRNG_GET : Tests {
    my $self = shift;

    my ($status, @values) = gsl_qrng_get($self->{sobol});

    is ($status, $GSL_SUCCESS);
    ok_similar( [ 0.5, 0.5 ], \@values, 'gsl_qrng_get returns multiple values' );

    ($status, @values) = gsl_qrng_get($self->{sobol});
    ok_similar( [ 0.75, 0.25 ], \@values, 'gsl_qrng_get returns correct values for sobol' );

    # Let's try with a bigger size generator
    my $tmp = gsl_qrng_alloc($gsl_qrng_sobol, 4);
    ($status, @values) = gsl_qrng_get($tmp);
    is (scalar(@values), 4, 'gsl_qrng_get returns correct number of samples');
}

sub GSL_QRNG_SOBOL : Tests {
    my $sobol = Math::GSL::QRNG::Sobol->new(2);
    isa_ok($sobol, "Math::GSL::QRNG::Sobol");
    isa_ok($sobol->{qrng}, "Math::GSL::QRNG");

    my @state = $sobol->get();
    ok_similar( [0.5, 0.5], \@state, "get returns correct number of samples");

    $sobol->reinit();
    @state = $sobol->get();
    ok_similar( [0.5, 0.5], \@state, "QRNG was reinitted");

    is($sobol->name(), "sobol", "QRNG name acessible");

    my $clone = $sobol->clone();
    isa_ok($clone, "Math::GSL::QRNG::Sobol");

    @state = $clone->get();
    ok_similar( [ 0.75, 0.25 ], \@state, 'clone clones the qrng status' );
}

sub GSL_QRNG_HALTON : Tests {
    my $halton = Math::GSL::QRNG::Halton->new(2);
    isa_ok($halton, "Math::GSL::QRNG::Halton");

    my @state = $halton->get();
    ok_similar( [0.5, 0.333333333], \@state, "get returns correct number of samples");
}

sub GSL_QRNG_REVERSE_HALTON : Tests {
    my $rhalton = Math::GSL::QRNG::ReverseHalton->new(2);
    isa_ok($rhalton, "Math::GSL::QRNG::ReverseHalton");

    my @state = $rhalton->get();
    ok_similar( [0.5, 0.666666666], \@state, "get returns correct number of samples");
}

sub GSL_QRNG_NIEDERREITER2 : Tests {
    my $niederreiter2 = Math::GSL::QRNG::Niederreiter2->new(2);
    isa_ok($niederreiter2, "Math::GSL::QRNG::Niederreiter2");

    my @state = $niederreiter2->get();
    ok_similar( [0, 0], \@state, "get returns correct number of samples");
}

Test::Class->runtests;