The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
use Test::More tests => 16;
use File::Spec;
use lib File::Spec->catfile("..","lib");
use Math::MatrixReal;
my ($e,$res) = (0,0);
my $eps = 1e-8;

$matrix = Math::MatrixReal->new_random( 10,10, { integer => 1 } );
ok ( ref $matrix eq 'Math::MatrixReal' , 'new_random returns the correct object' );
my ($rows,$cols) = $matrix->dim;
ok( $rows == 10 && $cols == 10, 'new_random returns the correct size' );
for my $r ( 1 .. $rows ){
   for my $c ( 1 .. $cols ) {
	$e = $matrix->element($r,$c);
	$res += abs( $e-int($e) );
   }
}
ok( $res < $eps, 'new_random option type integer works' );

$matrix = Math::MatrixReal->new_random( 5 );
($rows,$cols) = $matrix->dim;
ok( $rows == 5 && $cols == 5, 'new_random is square if called with one argument' );

($rows,$cols) = (1+int(rand(10)), 1+int(rand(10)) );
$matrix = Math::MatrixReal->new_random( $rows,$cols, { bounded_by => [-$rows, $rows] } );
my $min = $matrix->element(1,1); 
my $max = $min;
for my $r ( 1 .. $rows ){
   for my $c ( 2 .. $cols ) {
	$e = $matrix->element($r,$c);
	$e < $min ? $min = $e :  $e > $max ? $max = $e : 0  ;
   }
}
ok( $min >= -$rows && $max <= $rows, 'new_random option bounded_by works' );


eval { $matrix = Math::MatrixReal->new_random };
if ($@){
	ok(1, 'new_random fails with no args');
} else {
	ok(0, 'new_random fails with no args');
}

eval { $matrix = Math::MatrixReal->new_random(0,17.5) };
if ($@){
	ok(1, 'new_random fails with invalid args');
} else {
	ok(0, 'new_random fails with invalid args');
}

eval { $matrix = Math::MatrixReal->new_random(10,20, { bounded_by => [] } ) };
if ($@){
	ok(1, 'new_random fails with invalid bounded_by');
} else {
	ok(0, 'new_random fails with invalid bounded_by');
}

eval { $matrix = Math::MatrixReal->new_random(10,20, { bounded_by => [1,-1] } ) };
if ($@){
	ok(1, 'new_random fails with invalid bounded_by range');
} else {
	ok(0, 'new_random fails with invalid bounded_by range');
}

eval { $matrix = Math::MatrixReal->new_random(10,20, { symmetric => 1 } ) };
if ($@){
	ok(1, 'new_random fails with rectangular + symmetric');
} else {
	ok(0, 'new_random fails with rectangular + symmetric');
}
eval { $matrix = Math::MatrixReal->new_random(10, { symmetric => 1 } ) };
if ($matrix->is_symmetric ){
	ok(1, 'new_random can do symmetric');
} else {
	ok(0, 'new_random fails with symmetric');
}
eval { $a = Math::MatrixReal->new_random(5, { tridiag => 1, integer => 1 } ) };
if ($a->is_tridiagonal ){
	ok(1, 'new_random with tridiag works');
} else {
	ok(0, 'new_random with tridiag  fails');
}
eval { $a = Math::MatrixReal->new_random(5, { tridiag => 1, symmetric => 1 } ) };
if ($a->is_tridiagonal && $a->is_symmetric ){
	ok(1, 'new_random with tridiag+symmetric works');
} else {
	ok(0, 'new_random with tridiag+symmetric  fails');
}
eval { $matrix = Math::MatrixReal->new_random(10,20, { tridiag => 1 } ) };
if ($@){
	ok(1, 'new_random fails with nonsquare tridiag');
} else {
	ok(0, 'new_random fails with nonsquare tridiag');
}
eval { $matrix = Math::MatrixReal->new_random(10,20, { diag => 1 } ) };
if ($@){
	ok(1, 'new_random fails with nonsquare diag');
} else {
	ok(0, 'new_random fails with nonsquare diag');
}
eval { $a = Math::MatrixReal->new_random(5, { diag => 1, integer => 1 } ) };
if ($a->is_diagonal ){
	ok(1, 'new_random with diag works');
} else {
	ok(0, 'new_random with diag  fails');
}