1 package Math
::GSL
::Vector
::Test
;
2 use base
q{Test::Class};
4 use Math
::GSL
::Vector qw
/:all/;
5 use Math
::GSL qw
/:all/;
7 use Math
::GSL
::Errno qw
/:all/;
10 # This allows us to eval code
11 BEGIN{ gsl_set_error_handler_off
(); }
13 sub make_fixture
: Test
(setup
) {
15 $self->{vector
} = gsl_vector_alloc
(5);
18 sub teardown
: Test
(teardown
) {
19 unlink 'vector' if -f
'vector';
22 sub GSL_VECTOR_ALLOC
: Tests
{
23 my $vector = gsl_vector_alloc
(5);
24 isa_ok
($vector, 'Math::GSL::Vector');
26 sub GSL_VECTOR_SET_GET
: Tests
{
28 gsl_vector_set
($self->{vector
}, 0, 42 );
29 my $elem = gsl_vector_get
($self->{vector
}, 0);
30 ok
( $elem == 42, 'gsl_vector_set/gsl_vector_get' );
33 sub GSL_VECTOR_ISNONNEG
: Tests
{
35 map { gsl_vector_set
($self->{vector
}, $_, -1 ) } (0..4);
36 ok
( !gsl_vector_isnonneg
($self->{vector
}),'gsl_vector_isnonneg' );
37 map { gsl_vector_set
($self->{vector
}, $_, 1 ) } (0..4);
38 ok
( gsl_vector_isnonneg
($self->{vector
}),'gsl_vector_isnonneg' );
41 sub GSL_VECTOR_ISNULL
: Tests
{
43 ok
( !gsl_vector_isnull
($self->{vector
}), 'gsl_vector_isnull' );
44 map { gsl_vector_set
($self->{vector
}, $_, 0 ) } (0..4);
45 ok
( gsl_vector_isnull
($self->{vector
}),'gsl_vector_isnull' );
46 gsl_vector_set
($self->{vector
}, 0, 5 );
47 ok
( !gsl_vector_isnull
($self->{vector
}), 'gsl_vector_isnull' );
50 sub GSL_VECTOR_ISPOS
: Tests
{
52 map { gsl_vector_set
($self->{vector
}, $_, -1 ) } (0..4);
53 ok
( !gsl_vector_ispos
($self->{vector
}),'gsl_vector_pos' );
54 map { gsl_vector_set
($self->{vector
}, $_, 1 ) } (0..4);
55 ok
( gsl_vector_ispos
($self->{vector
}),'gsl_vector_pos' );
58 sub GSL_VECTOR_ISNEG
: Tests
{
61 map { gsl_vector_set
($self->{vector
}, $_, -$_ ) } (0..4);
62 ok
( !gsl_vector_isneg
($self->{vector
}),'gsl_vector_neg' );
64 gsl_vector_set
($self->{vector
}, 0, -1 );
66 ok
( gsl_vector_isneg
($self->{vector
}),'gsl_vector_neg' );
69 sub GSL_VECTOR_MAX
: Tests
{
71 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
72 ok
( is_similar
( gsl_vector_max
($self->{vector
}) ,16), 'gsl_vector_max' );
74 sub GSL_VECTOR_NEW
: Tests
{
75 my $vec = Math
::GSL
::Vector
->new( [ map { $_ ** 2 } (1..10) ] );
76 isa_ok
( $vec, 'Math::GSL::Vector', 'Math::GSL::Vector->new($values)' );
78 eval { Math
::GSL
::Vector
->new(-1) };
79 ok
( $@
, 'new takes only positive indices');
81 eval { Math
::GSL
::Vector
->new(3.14) };
82 ok
( $@
, 'new takes only integer indices');
84 eval { Math
::GSL
::Vector
->new([]) };
85 ok
( $@
, 'new takes only nonempty array refs');
87 sub GSL_VECTOR_GET
: Tests
{
88 my $vec = Math
::GSL
::Vector
->new( [ map { $_ ** 2 } (reverse 1..10) ] );
89 my @x = $vec->get([0..9]);
90 is_deeply
( \
@x, [map { $_ ** 2 } (reverse 1..10)] );
93 sub GSL_VECTOR_SET
: Tests
{
94 my $vec = Math
::GSL
::Vector
->new( [ map { $_ ** 2 } (1..10) ] );
95 $vec->set( [ 0..4] , [ reverse 1..5 ] );
96 my ($x) = $vec->get([0]);
97 ok
( $x == 5, "gsl_vector_set: $x ?= 5" );
99 sub GSL_VECTOR_MIN
: Tests
{
101 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
102 ok
( is_similar
( gsl_vector_min
($self->{vector
}) ,0), 'gsl_vector_min' );
105 sub GSL_VECTOR_FREAD_FWRITE
: Tests
{
107 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
109 my $fh = fopen
("vector", "w");
110 my $status = gsl_vector_fwrite
($fh, $self->{vector
} );
111 ok
( ! $status, 'gsl_vector_fwrite' );
112 ok
( -f
"vector", 'gsl_vector_fwrite' );
115 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 3 ) } (0..4);
117 $fh = fopen
("vector", "r");
119 gsl_vector_fread
($fh, $self->{vector
} );
120 is_deeply
( [ map { gsl_vector_get
($self->{vector
}, $_) } (0..4) ],
121 [ map { $_ ** 2 } (0..4) ],
126 sub GSL_VECTOR_SUBVECTOR
: Tests
{
128 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
129 my $vec_sub = gsl_vector_subvector
($self->{vector
}, 2, 3);
131 ok_similar
( [ map { gsl_vector_get
($vec_sub->{vector
}, $_) } (0..2) ],
136 sub GSL_VECTOR_CALLOC
: Tests
{
137 my $vector = gsl_vector_calloc
(5);
138 isa_ok
($vector, 'Math::GSL::Vector');
140 my @got = map { gsl_vector_get
($vector, $_) } (0..4);
142 map { is
($got[$_] , 0 ) } (0..4);
145 sub GSL_VECTOR_SET_ALL
: Tests
{
147 gsl_vector_set_all
($self->{vector
}, 4);
148 map { is
(gsl_vector_get
($self->{vector
} , $_ ), 4) } (0..4);
151 sub GSL_VECTOR_SET_ZERO
: Tests
{
153 gsl_vector_set_zero
($self->{vector
});
154 map { is
(gsl_vector_get
($self->{vector
} , $_ ), 0) } (0..4);
157 sub GSL_VECTOR_SET_BASIS
: Tests
{
159 my $x = gsl_vector_set_basis
($self->{vector
}, 0);
160 is
(gsl_vector_get
($self->{vector
} , 0 ), 1);
161 is
($x, 0, "output");
162 map { is
(gsl_vector_get
($self->{vector
} , $_ ), 0) } (1..4);
165 sub GSL_VECTOR_SUBVECTOR_WITH_STRIDE
: Tests
{
167 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
168 my $sub_stride = gsl_vector_subvector_with_stride
($self->{vector
}, 0, 2, 3);
169 is
(gsl_vector_get
($sub_stride->{vector
} , 0 ), 0, "first element");
170 is
(gsl_vector_get
($sub_stride->{vector
} , 1 ), 4, "second element");
171 is
(gsl_vector_get
($sub_stride->{vector
} , 2 ), 16, "third element");
174 sub GSL_VECTOR_MAX_INDEX
: Tests
{
176 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
177 my $index = gsl_vector_max_index
($self->{vector
});
178 is
($index, 4, "Position of the maximum");
181 sub GSL_VECTOR_MIN_INDEX
: Tests
{
183 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
184 my $index = gsl_vector_min_index
($self->{vector
});
185 is
($index, 0, "Position of the minimum");
188 sub GSL_VECTOR_MINMAX_INDEX
: Tests
{
190 my ($min,$max)=(0,0);
191 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
193 ($min, $max) = Math
::GSL
::Vector
::gsl_vector_minmax_index
($self->{vector
}, $min, $max);
194 ok_similar
( [ 0, 4 ], [ $min, $max], 'gsl_vector_minmax_index' );
197 sub GSL_VECTOR_MINMAX
: Tests
{
198 my ($min, $max) = (17,42);
199 my $vector->{vector
} = gsl_vector_alloc
(5);
200 map { gsl_vector_set
($vector->{vector
}, $_, $_ ** 2 ) } (0..4); ;
202 ($min, $max) = Math
::GSL
::Vector
::gsl_vector_minmax
($vector->{vector
}, $min, $max);
204 ok_similar
( [ 0, 16 ], [ $min, $max], 'gsl_vector_minmax' );
207 sub GSL_VECTOR_MEMCPY
: Tests
{
209 my $copy->{vector
} = gsl_vector_alloc
(5);
210 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
211 is
( gsl_vector_memcpy
($copy->{vector
}, $self->{vector
}), 0);
212 map { is
(gsl_vector_get
($copy->{vector
}, $_), $_ ** 2 ) } (0..4); ;
215 sub GSL_VECTOR_VIEW_ARRAY
: Tests
{
216 my @array = [1,2,3,4,5,6];
217 my $vec_view->{vector
} = gsl_vector_alloc
(2);
218 $vec_view = gsl_vector_view_array
(@array, 2);
219 map { is
(gsl_vector_get
($vec_view->{vector
}, $_), $_+1 ) } (0..1); ;
222 sub GSL_VECTOR_REVERSE
: Tests
{
224 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
225 is
( gsl_vector_reverse
($self->{vector
}), 0);
226 ok_similar
( [ 16, 9, 4, 1, 0], [ map { gsl_vector_get
($self->{vector
}, $_) } 0..4 ] );
229 sub GSL_VECTOR_SWAP_ELEMENTS
: Tests
{
231 map { gsl_vector_set
($self->{vector
}, $_, $_ ** 2 ) } (0..4); ;
232 is
( gsl_vector_swap_elements
($self->{vector
}, 0, 4), 0);
233 is
(gsl_vector_get
($self->{vector
}, 0), 16);
234 is
(gsl_vector_get
($self->{vector
}, 4), 0);
235 map { is
(gsl_vector_get
($self->{vector
}, $_), $_ ** 2 ) } (1..3); ;
238 sub GSL_VECTOR_ADD
: Tests
{
240 my $second_vec->{vector
} = gsl_vector_alloc
(5);
241 map { gsl_vector_set
($self->{vector
}, $_, $_ ) } (0..4); ;
242 map { gsl_vector_set
($second_vec->{vector
}, $_, $_ ) } (0..4); ;
243 is
(gsl_vector_reverse
($second_vec->{vector
}),0);
244 is
( gsl_vector_add
($self->{vector
}, $second_vec->{vector
}), 0);
245 map { is
(gsl_vector_get
($self->{vector
}, $_), 4 ) } (0..4); ;
248 sub GSL_VECTOR_SUB
: Tests
{
250 my $second_vec->{vector
} = gsl_vector_alloc
(5);
251 map { gsl_vector_set
($self->{vector
}, $_, $_ ) } (0..4); ;
252 map { gsl_vector_set
($second_vec->{vector
}, $_, 1) } (0..4); ;
253 is
( gsl_vector_sub
($self->{vector
}, $second_vec->{vector
}), 0);
254 map { is
(gsl_vector_get
($self->{vector
}, $_), $_ - 1 ) } (0..4); ;
257 sub GSL_VECTOR_MUL
: Tests
{
259 my $second_vec->{vector
} = gsl_vector_alloc
(5);
260 map { gsl_vector_set
($self->{vector
}, $_, $_ ) } (0..4); ;
261 map { gsl_vector_set
($second_vec->{vector
}, $_, 2) } (0..4); ;
262 is
( gsl_vector_mul
($self->{vector
}, $second_vec->{vector
}), 0);
263 map { is
(gsl_vector_get
($self->{vector
}, $_), $_ * 2 ) } (0..4); ;
266 sub GSL_VECTOR_DIV
: Tests
{
268 my $second_vec->{vector
} = gsl_vector_alloc
(5);
269 map { gsl_vector_set
($self->{vector
}, $_, $_*2 ) } (0..4); ;
270 map { gsl_vector_set
($second_vec->{vector
}, $_, 2) } (0..4); ;
271 is
( gsl_vector_div
($self->{vector
}, $second_vec->{vector
}), 0);
272 map { is
(gsl_vector_get
($self->{vector
}, $_), $_ ) } (0..4); ;
275 sub GSL_VECTOR_SCALE
: Tests
{
277 map { gsl_vector_set
($self->{vector
}, $_, $_ ) } (0..4); ;
278 is
( gsl_vector_scale
($self->{vector
}, 2), 0);
279 map { is
(gsl_vector_get
($self->{vector
}, $_), $_ * 2 ) } (0..4); ;
282 sub GSL_VECTOR_SWAP
: Tests
{
284 my @idx = (0..(5+int rand(5)));
285 my $vec1 = gsl_vector_alloc
($#idx+1);
286 my $vec2 = gsl_vector_alloc
($#idx+1);
288 map { gsl_vector_set
($vec1, $_, $_**2 ) } @idx;
289 map { gsl_vector_set
($vec2, $_, $_) } @idx;
291 is
( gsl_vector_swap
($vec1, $vec2), 0);
293 ok_similar
( [ map { gsl_vector_get
($vec1, $_) } @idx ],
296 ok_similar
( [ map { gsl_vector_get
($vec2, $_) } @idx ],
297 [ map { $_**2 } @idx ],
301 sub GSL_VECTOR_FPRINTF_FSCANF
: Tests
{
303 map { gsl_vector_set
($self->{vector
}, $_, $_**2) } (0..4);
305 my $fh = fopen
("vector", "w");
306 is
( gsl_vector_fprintf
($fh, $self->{vector
}, "%f"), 0);
309 map { gsl_vector_set
($self->{vector
}, $_, $_**3) } (0..4);
311 $fh = fopen
("vector", "r");
313 is
(gsl_vector_fscanf
($fh, $self->{vector
}), 0);
314 map { is
(gsl_vector_get
($self->{vector
}, $_), $_**2) } (0..4);