The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 5;
use File::Spec;
use lib File::Spec->catfile("..","lib");
use Math::ODE;
use Data::Dumper;

# analytic solution is y(x) = 5 x
my $o = new Math::ODE ( file => 'data',
			step => 0.1,
			initial => [0], 
			ODE => [ \&DE1 ], 
			t0 => 0,
			tf => 1 );
isa_ok($o, 'Math::ODE');
isa_ok($o->evolve, 'Math::ODE');

if ($o) {
	my $eps = $o->{step} ** 4;	# because Math::ODE implements a 4th order Runge-Kutta method

	my $s = sprintf("%0.12f", 0.5);
	my @vals =  $o->values_at( $s );
	my $res = abs($vals[0] - 2.5);
	ok( $res < $eps, "Constant Coefficient Equation solved correctly, res=$res"); 
} else {
	ok( 0, 'Constant Coefficient Equation died due to numerical shenanigans');
}
sub DE1 { my ($t,$y) = @_; return 5; }
##############################
SKIP : {
	skip 'not blowing up enough', 1;
# analytic solution is y(x) = -1/(x-1)
$o = new Math::ODE ( file => 'data',
			step => 0.01, 
			initial => [1], 
			ODE => [ \&DE2 ], 
			t0 => 0,
			tf => 2 );
# should blow up at t=1
my $ret = $o->evolve;
@vals =  $o->values_at( 1 );
print "ret=$ret, val=" . $vals[0] . "\n";
ok( ! defined $ret , 'evolve blows up in the right place'); 
}

sub DE2 { my ($t,$y) = @_; $y->[0] ** 2; }
##############################

$o = new Math::ODE ( file => 'data',
			step => 0.1,
			csv => 1,
			initial => [0], 
			ODE => [ \&DE1 ], 
			t0 => 0,
			tf => 1 );
if ( $o->evolve ) {
	open (my $fh, '<',  $o->{file}) or die $!;
	my $first_line = <$fh>;
	ok( $first_line =~ /(\d+\.\d+),(\d+\.\d+)$/, "CSV works"); 
	close $fh or die $!;
} else {
	ok( 0, 'CSV died due to numerical shenanigans');
}