Refactor inclusion of system.i to one place
[Math-GSL.git] / t / Min.t
blob384a9b879c7257d76e1561bce16a6b7b4878c1ef
1 package Math::GSL::Min::Test;
2 use base q{Test::Class};
3 use strict;
4 use Test::More tests => 23;
5 use Math::GSL        qw/:all/;
6 use Math::GSL::Min   qw/:all/;
7 use Math::GSL::Test  qw/:all/;
8 use Math::GSL::Errno qw/:all/;
9 use Math::GSL::Const qw/$M_PI/;
10 #use Devel::Trace     qw/trace/;
11 use Data::Dumper;
13 #trace 'off';
15 BEGIN { gsl_set_error_handler_off(); }
17 sub trace { }
19 sub make_fixture : Test(setup) {
20     my $self = shift;
21     $self->{min} = gsl_min_fminimizer_alloc($gsl_min_fminimizer_goldensection);
22     $self->{brent} = gsl_min_fminimizer_alloc($gsl_min_fminimizer_brent);
25 sub teardown : Test(teardown) {
26     my $self = shift;
27     #gsl_min_fminimizer_free($self->{min});
28     #gsl_min_fminimizer_free($self->{brent});
31 sub GSL_MIN_TYPES : Tests { 
33     my $m = gsl_min_fminimizer_alloc($gsl_min_fminimizer_goldensection);
34     isa_ok($m, 'Math::GSL::Min');
36     my $n = gsl_min_fminimizer_alloc($gsl_min_fminimizer_brent);
37     isa_ok($n, 'Math::GSL::Min');
40 sub GSL_MIN_NAME : Tests {
41     my $self = shift;
42     cmp_ok( 'goldensection', 'eq', gsl_min_fminimizer_name($self->{min}) );
43     cmp_ok( 'brent', 'eq', gsl_min_fminimizer_name($self->{brent}) );
46 sub GSL_MIN_SET : Tests {
47     my $self = shift;
48     my $mini = $self->{min};
49     ok_status(
50             gsl_min_fminimizer_set($mini, 
51                 sub { cos($_[0]) }, 3, 0, 2*$M_PI     
52             )
53     );
54     # These are the first guesses first the initial iteration
55     cmp_ok( $mini->{x_minimum}, '==', 3 );
56     cmp_ok( $mini->{x_lower}, '==', 0 );
57     isa_ok( $mini->{function} , 'Math::GSL::Min::gsl_function_struct');
58     ok_similar([$mini->{x_upper}], [2*$M_PI] );
59     ok_similar([$mini->{f_minimum}], [cos(3)] );
60     ok_similar([$mini->{f_lower}], [cos(0)] );
61     ok_similar([$mini->{f_upper}], [cos(2*$M_PI)] );
63     ok_similar([gsl_min_fminimizer_x_lower($mini)],[0],'x_lower');
64     ok_similar([gsl_min_fminimizer_x_upper($mini)],[2*$M_PI],'x_upper');
65     ok_similar([gsl_min_fminimizer_x_minimum($mini)],[3],'x_minimum');
67     ok_similar([gsl_min_fminimizer_f_lower($mini)],[cos(0)],'f_lower');
68     ok_similar([gsl_min_fminimizer_f_upper($mini)],[cos(2*$M_PI)],'f_upper');
69     ok_similar([gsl_min_fminimizer_f_minimum($mini)],[cos(3)],'f_minimum');
72 sub GSL_MIN_TEST_INTERVAL : Tests {
73     my $self = shift;
74     my $mini = $self->{min};
76     my ($x_lower, $x_upper, $epsabs, $epsrel) = (0,1e-7, 1e-3,1e-5);
77     ok_status(gsl_min_test_interval ($x_lower, $x_upper, $epsabs, $epsrel),
78         $GSL_SUCCESS, 'gsl_min_test_interval'
79     ); 
81     ($x_lower, $x_upper, $epsabs, $epsrel) = (0,1e-2, 1e-3,1e-5);
82     ok_status(gsl_min_test_interval ($x_lower, $x_upper, $epsabs, $epsrel),
83         $GSL_CONTINUE, 'gsl_min_test_interval'
84     ); 
87 sub GSL_MIN_ITERATE : Tests {
88     my $self = shift;
89     my $mini = $self->{min};
90     #warn Dumper [ $mini, $mini->{state} ];
91     ok_status(gsl_min_fminimizer_set_with_values($mini, 
92         sub { cos($_[0]) }, 
93         3, cos(3),
94         0, cos(0),
95         2*$M_PI, cos(2*$M_PI)     
96     ));
97     #warn Dumper [ $mini, $mini->{state} ];
98     #trace 'on';
99     #warn Dumper [map { $mini->{$_} } qw(x_minimum x_lower x_upper f_minimum f_lower f_upper) ];
100     local $TODO = 'iterate does not work';
101     # This blows up
102     #ok_status( gsl_min_fminimizer_iterate($mini));
103     #trace 'off';
106 sub GSL_MIN_NEW_FREE : Tests {
107     my $self = shift;
108     my $min = $self->{min};
109     isa_ok($min, 'Math::GSL::Min');
111     gsl_min_fminimizer_free($min);
112     ok(!$@, 'gsl_min_fminimizer_free');
115 Test::Class->runtests;