Skip to content
Fetching contributors…
Cannot retrieve contributors at this time
586 lines (484 sloc) 14.9 KB
package Math::GSL::Complex::Test;
use strict;
use warnings;
use base q{Test::Class};
use Test::Most;
use Math::GSL::Complex qw/:all/;
use Math::GSL::Test qw/:all/;
use Math::GSL::Errno qw/:all/;
use Math::GSL::Const qw/:all/;
use Math::GSL qw/:all/;
use Data::Dumper;
BEGIN { gsl_set_error_handler_off() }
sub make_fixture : Test(setup) {
my $self = shift;
$self->{gsl_complex} = Math::GSL::Complex::gsl_complex->new;
}
sub teardown : Test(teardown) {
}
sub GSL_COMPLEX_NEW : Tests {
my $self = shift;
my $x = $self->{gsl_complex};
isa_ok( $x, 'Math::GSL::Complex::gsl_complex' );
isa_ok( Math::GSL::Complex->new(0,0), 'Math::GSL::Complex' );
}
sub GSL_COMPLEX_RECT : Tests(2) {
my $x = gsl_complex_rect(5,3);
ok_similar( [ gsl_parts($x) ], [ 5, 3 ], 'gsl_complex_rect' );
my $a = gsl_complex_rect(1.2, 3.4);
ok_similar( [ gsl_parts($a) ],
[ 1.2, 3.4 ],
'gsl_complex_rect with floats'
);
}
sub GSL_COMPLEX_POLAR : Tests {
my $x = gsl_complex_polar(1.0,0.1);
my ($r,$theta) = ( gsl_complex_abs($x), gsl_complex_arg($x) );
print "x=$r * e^(i $theta)*I\n" if $ENV{DEBUG};
ok( is_similar($r,1.0), 'gsl_complex_polar r, res=' .($r-1.) . "\n");
ok( is_similar($theta,0.1), 'gsl_complex_polar theta, res=' .($theta-0.1) . "\n");
}
sub GSL_COMPLEX_ABS : Tests {
my $x = gsl_complex_rect(5,3);
my $abs = gsl_complex_abs($x);
ok ( is_similar($abs, sqrt(34)), 'gsl_complex_abs');
}
sub GSL_COMPLEX_ABS2 : Tests {
my $x = gsl_complex_rect(5,3);
my $abs = gsl_complex_abs2($x);
ok( is_similar($abs, 34), 'gsl_complex_abs2' );
}
sub GSL_COMPLEX_LOGABS : Tests {
my $x = gsl_complex_rect(5,3);
my $abs = gsl_complex_logabs($x);
ok ( is_similar($abs, log(sqrt(34)) ), 'gsl_complex_logabs' );
}
sub GSL_COMPLEX_LOG : Tests {
my $x = gsl_complex_rect($M_E,0);
$x = gsl_complex_log($x);
ok_similar([ gsl_parts($x) ] ,
[ 1.0 , 0.0 ],
'gsl_complex_log'
);
}
sub GSL_COMPLEX_LOG10 : Tests {
my $x = gsl_complex_rect(10,0);
$x = gsl_complex_log10($x);
ok_similar([ gsl_parts($x) ] ,
[ 1.0 , 0.0 ],
'gsl_complex_log10'
);
}
sub GSL_COMPLEX_LOG_B : Tests {
my $z = gsl_complex_rect(5.0,0);
my $base = gsl_complex_rect(5.0,0);
$z = gsl_complex_log_b($z, $base);
ok_similar([ gsl_parts($z) ] ,
[ 1.0 , 0.0 ],
'gsl_complex_log_b'
);
}
sub GSL_COMPLEX_EXP : Tests {
my $z = gsl_complex_rect(2, 5);
$z = gsl_complex_exp($z);
ok_similar( [ gsl_parts($z) ],
[ $M_E**2*cos(5), $M_E**2*sin(5) ]
);
}
sub GSL_COMPLEX_EXP_EULERS_IDENTITY : Tests { # e^(i pi) + 1 = 0
my $z = gsl_complex_rect(0, $M_PI);
$z = gsl_complex_exp($z);
$z = gsl_complex_add_real($z, 1);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ]
);
}
sub GSL_COMPLEX_ADD : Tests {
my $x = gsl_complex_rect(5,3);
my $y = gsl_complex_rect(1,2);
my $z = gsl_complex_add($x, $y);
ok_similar( [ gsl_parts($z) ], [ 6, 5 ], 'gsl_complex_add' );
}
sub GSL_COMPLEX_SUB : Tests {
my $x = gsl_complex_rect(5,3);
my $y = gsl_complex_rect(1,2);
my $z = gsl_complex_sub($x, $y);
ok_similar( [ gsl_parts($z) ], [ 4, 1 ], 'gsl_complex_sub' );
}
sub GSL_COMPLEX_MUL : Tests {
my $x = gsl_complex_rect(5,3);
my $y = gsl_complex_rect(1,2);
my $z = gsl_complex_mul($x, $y);
ok_similar( [ gsl_parts($z) ], [ -1, 13 ], 'gsl_complex_mul' );
}
sub GSL_COMPLEX_DIV : Tests {
my $x = gsl_complex_rect(4,5);
my $y = gsl_complex_rect(2,1);
my $z = gsl_complex_div($x, $y);
ok_similar( [ gsl_parts($z) ], [ 13/5, 6/5 ], 'gsl_complex_div' );
}
sub GSL_COMPLEX_EQ : Tests {
my $x = gsl_complex_rect(4,5);
my $y = gsl_complex_rect(2,1);
ok(! gsl_complex_eq($x,$y), 'gsl_complex_eq' );
$y = gsl_complex_rect(4,5);
ok( gsl_complex_eq($x,$y), 'gsl_complex_eq' );
}
sub GSL_COMPLEX_ADD_REAL : Tests {
my $x = gsl_complex_rect(5,3);
my $z = gsl_complex_add_real($x, 1);
ok( gsl_real($z) == 6, 'gsl_complex_add_real');
}
sub GSL_COMPLEX_SUB_REAL : Tests {
my $x = gsl_complex_rect(5,3);
my $z = gsl_complex_sub_real($x, 1);
ok( gsl_real($z) == 4, 'gsl_complex_sub_real');
}
sub GSL_COMPLEX_MUL_REAL : Tests {
my $x = gsl_complex_rect(5,3);
my $z = gsl_complex_mul_real($x, 2);
ok( gsl_real($z) == 10, 'gsl_complex_mul_real');
}
sub GSL_COMPLEX_DIV_REAL : Tests {
my $x = gsl_complex_rect(6,3);
my $z = gsl_complex_div_real($x, 2);
ok( gsl_real($z) == 3, 'gsl_complex_div_real');
}
sub GSL_COMPLEX_ADD_IMAG : Tests {
my $x = gsl_complex_rect(6,3);
my $z = gsl_complex_add_imag($x, 2);
ok( gsl_imag($z) == 5, 'gsl_complex_add_imag');
}
sub GSL_COMPLEX_SUB_IMAG : Tests {
my $x = gsl_complex_rect(6,3);
my $z = gsl_complex_sub_imag($x, 2);
ok( gsl_imag($z) == 1, 'gsl_complex_sub_imag');
}
sub GSL_COMPLEX_MUL_IMAG : Tests {
my $x = gsl_complex_rect(6,3);
my $z = gsl_complex_mul_imag($x, 2);
ok_similar( [ gsl_parts($z) ], [ -6, 12 ], 'gsl_complex_mul_imag' );
}
sub GSL_COMPLEX_DIV_IMAG : Tests {
my $x = gsl_complex_rect(6,4);
my $z = gsl_complex_div_imag($x, 2);
ok_similar( [ gsl_parts($z) ], [ 2, -3 ], 'gsl_complex_div_imag' );
}
sub GSL_COMPLEX_CONJUGATE : Tests {
my $x = gsl_complex_rect(6,4);
my $z = gsl_complex_conjugate($x);
ok_similar( [ gsl_parts($z) ], [6, -4], 'gsl_complex_conjugate');
}
sub GSL_COMPLEX_NEGATIVE : Tests {
my $x = gsl_complex_rect(6,4);
my $z = gsl_complex_negative($x);
ok_similar( [ gsl_parts($z) ], [-6, -4], 'gsl_complex_negative');
}
sub GSL_COMPLEX_SQRT : Tests {
my $x = gsl_complex_rect(-7,24);
my $z = gsl_complex_sqrt($x);
ok_similar( [ gsl_parts($z) ], [ 3 , 4 ] ,'gsl_complex_sqrt' );
}
sub GSL_COMPLEX_SQRT_REAL : Tests {
my $x = gsl_complex_rect(9,4);
my $z = gsl_complex_sqrt_real(-4);
ok( gsl_imag($z) == 2, 'gsl_complex_sqrt_real');
}
sub GSL_COMPLEX_POW : Tests {
my $x = gsl_complex_rect(0,1);
my $y = gsl_complex_rect(2,0);
my $z = gsl_complex_pow($x, $y);
ok_similar( [ gsl_parts($z) ], [-1, 0 ], 'gsl_complex_pow' );
$x = gsl_complex_rect(3,4);
$z = gsl_complex_pow($x, $y);
ok_similar( [gsl_parts($z) ], [ 3**2 - 4**2, 2*3*4 ], 'gsl_complex_pow' );
}
sub GSL_COMPLEX_SET_REAL : Tests {
my $x = gsl_complex_rect(3,4);
gsl_set_real($x, 5);
ok_similar( [ gsl_parts($x) ], [ 5, 4 ], 'gsl_complex_set_real');
}
sub GSL_COMPLEX_SET_IMAG : Tests {
my $x = gsl_complex_rect(3,4);
gsl_set_imag($x, 5);
ok_similar( [ gsl_parts($x) ], [ 3, 5 ], 'gsl_complex_set_imag');
}
sub GSL_COMPLEX_SET_COMPLEX : Tests {
my $x = gsl_complex_rect(3,4);
gsl_set_complex($x, 5, 3);
ok_similar( [ gsl_parts($x) ], [ 5, 3 ], 'gsl_complex_set_complex');
}
sub GSL_COMPLEX_SIN : Tests {
my $x = gsl_complex_rect(3,2);
my $z = gsl_complex_sin($x);
ok_similar( [ gsl_parts($z) ],
[ 0.53092108624852, -3.59056458998578 ],
'gsl_complex_sin'
);
}
sub GSL_COMPLEX_ARCSIN : Tests {
my $x = gsl_complex_rect(1,0);
my $z = gsl_complex_arcsin($x);
ok_similar( [ gsl_parts($z) ],
[ $M_PI/2, 0.0 ],
'gsl_complex_arcsin'
);
}
sub GSL_COMPLEX_SINH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_sinh($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ],
'gsl_complex_sinh'
);
}
sub GSL_COMPLEX_ARCSINH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arcsinh($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ],
'gsl_complex_arcsinh'
);
}
sub GSL_COMPLEX_COS : Tests {
my $x = gsl_complex_rect(3,2);
my $z = gsl_complex_cos($x);
ok_similar( [ gsl_parts($z) ],
[ -3.72454550491532, -0.511822569987385],
'gsl_complex_cos'
);
}
sub GSL_COMPLEX_ARCCOS : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arccos($x);
ok_similar( [ gsl_parts($z)],
[ $M_PI/2, 0.0 ],
'gsl_complex_arccos'
);
}
sub GSL_COMPLEX_COSH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_cosh($x);
ok_similar( [ gsl_parts($z) ],
[ 1, 0.0 ],
'gsl_complex_cosh'
);
}
sub GSL_COMPLEX_ARCCOSH : Tests {
my $x = gsl_complex_rect(1,0);
my $z = gsl_complex_arccosh($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ],
'gsl_complex_arccosh'
);
}
sub GSL_COMPLEX_TAN : Tests {
my $x = gsl_complex_rect(3,2);
my $z = gsl_complex_tan($x);
ok_similar( [ gsl_parts($z) ],
[ -0.0098843750383225, 0.965385879022133 ],
'gsl_complex_tan'
);
}
sub GSL_COMPLEX_ARCTAN : Tests {
my $x = gsl_complex_rect(1,0);
my $z = gsl_complex_arctan($x);
ok_similar( [ gsl_parts($z) ],
[ $M_PI/4 , 0.0 ],
'gsl_complex_arctan'
);
}
sub GSL_COMPLEX_TANH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_tan($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ],
'gsl_complex_tanh'
);
}
sub GSL_COMPLEX_ARCTANH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arctan($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ],
'gsl_complex_arctanh'
);
}
sub GSL_COMPLEX_SEC : Tests {
my $x = gsl_complex_rect(3,2);
my $z = gsl_complex_sec($x);
ok_similar( [ gsl_parts($z) ],
[ -0.263512975158389, 0.0362116365587685 ],
'gsl_complex_sec'
);
}
sub GSL_COMPLEX_ARCSEC : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arcsec($x);
ok_similar( [ gsl_parts($z) ],
[ $M_PI/2, 0.0 ],
'gsl_complex_arcsec'
);
}
sub GSL_COMPLEX_SECH : Tests {
my $x = gsl_complex_rect(1,0);
my $z = gsl_complex_sech($x);
ok_similar( [ gsl_parts($z) ],
[ 2/(exp(1)+exp(-1)), 0.0 ],
'gsl_complex_sech'
);
}
sub GSL_COMPLEX_ARCSECH : Tests {
my $x = gsl_complex_rect(2/(exp(1)+exp(-1)),0);
my $z = gsl_complex_arcsech($x);
ok_similar( [ gsl_parts($z) ],
[ 1.0 , 0.0 ],
'gsl_complex_arcsech'
);
}
sub GSL_COMPLEX_CSC : Tests {
my $x = gsl_complex_rect(3,2);
my $z = gsl_complex_csc($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0403005788568915, 0.27254866146294],
'gsl_complex_csc'
);
}
sub GSL_COMPLEX_ARCCSC : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arccsc($x);
ok_similar( [ gsl_parts($z)],
[ 0.0, 0.0 ],
'gsl_complex_arccsc'
);
}
sub GSL_COMPLEX_CSCH : Tests {
my $x = gsl_complex_rect(0,1);
my $z = gsl_complex_csch($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0 , -1/sin(1)],
'gsl_complex_csch'
);
}
sub GSL_COMPLEX_ARCCSCH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arccsch($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0 , 0.0 ],
'gsl_complex_arccsch'
);
}
sub GSL_COMPLEX_COT : Tests {
my $x = gsl_complex_rect(3,2);
my $z = gsl_complex_cot($x);
ok_similar( [ gsl_parts($z) ],
[ -0.0106047834703371, -1.035746637765],
'gsl_complex_cot'
);
}
sub GSL_COMPLEX_ARCCOT : Tests {
my $x = gsl_complex_rect(1,0);
my $z = gsl_complex_arccot($x);
ok_similar( [ gsl_parts($z) ],
[ $M_PI/4 , 0.0 ],
'gsl_complex_arccot'
);
}
sub GSL_COMPLEX_COTH : Tests {
my $x = gsl_complex_rect(0,1);
my $z = gsl_complex_coth($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, -cos(1)/sin(1) ],
'gsl_complex_coth'
);
}
sub GSL_COMPLEX_ARCCOTH : Tests {
my $x = gsl_complex_rect(0,0);
my $z = gsl_complex_arccoth($x);
ok_similar( [ gsl_parts($z) ],
[ 0.0, 0.0 ],
'gsl_complex_arccoth'
);
}
sub GSL_COMPLEX_SUBTRACT_OVERLOAD : Tests {
my $a = Math::GSL::Complex->new(1,1);
my $b = Math::GSL::Complex->new(5,3);
my $c = $a - $b;
ok_similar( [ gsl_real($c->raw), gsl_imag($c->raw) ],
[ -4.0, -2.0 ],
'complex addition OO using gsl_real/gsl_imag'
);
ok_similar( [ $c->parts() ],
[ -4.0, -2.0 ],
'complex addition OO using parts()'
);
}
sub GSL_COMPLEX_MULTIPLICATION_OVERLOAD : Tests {
my $a = Math::GSL::Complex->new(7,1);
my $b = Math::GSL::Complex->new(10,-3);
my $c = $a * $b;
ok_similar( [ $c->parts ],
[ 73.0, -11 ],
'complex multiplication OO using gsl_real/gsl_imag'
);
my $r = 5;
my $d = $a * 5;
ok_similar( [ $d->parts ],
[ 35.0, 5 ],
'complex multiplication OO with real number'
);
my $f = -1 * $c;
ok_similar( [ $f->parts ],
[ -73.0, 11 ],
'complex multiplication OO'
);
}
sub GSL_COMPLEX_DIVISION_OVERLOAD : Tests {
my $a = Math::GSL::Complex->new(7,1);
my $b = Math::GSL::Complex->new(-1,0);
my $c = $a / $b;
ok_similar( [ gsl_parts($c->raw) ],
[ -7, -1 ],
'complex division OO'
);
my $r = 5;
my $d = $a / 5;
ok_similar( [ $d->parts ],
[ 7/5, 1/5 ],
'complex division OO with real number'
);
my $f = -1 / $b;
ok_similar( [ $f->parts ],
[ 1, 0 ],
'complex division OO'
);
}
sub GSL_COMPLEX_EQUAL_OVERLOAD : Tests {
my $a = Math::GSL::Complex->new(100,2);
my $b = Math::GSL::Complex->new(5,3);
my $c = $a->copy;
cmp_ok( $a, '!=', $b, '$a != $b');
cmp_ok( $a, '!=', 5, '$a != $r');
cmp_ok( $a, '==', $c, '$a == $c');
}
sub GSL_COMPLEX_ADD_OVERLOAD : Tests {
my $a = Math::GSL::Complex->new(1,1);
my $b = Math::GSL::Complex->new(5,3);
my $c = $a + $b;
ok_similar( [ gsl_real($c->raw), gsl_imag($c->raw) ],
[ 6.0, 4.0 ],
'complex addition OO using gsl_real/gsl_imag'
);
ok_similar( [ $c->parts() ],
[ 6.0, 4.0 ],
'complex addition OO using parts()'
);
}
sub GSL_COMPLEX_REAL_IMAG : Tests {
my $z = Math::GSL::Complex->new(5,3);
ok_similar( [ $z->real, $z->imag ],
[ 5.0, 3.0 ],
'->real and ->imag work correctly'
);
}
Test::Class->runtests;
Jump to Line
Something went wrong with that request. Please try again.