The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl pderival.t'

use Test::Simple tests => 20;

use Math::Polynomial::Solve qw(poly_derivaluate fltcmp ascending_order);
use Math::Complex;
use strict;
use warnings;

require "t/coef.pl";

my(@coef, $y, $dy, $d2y);

#
# (1, 0, 0, 0, -1)
#
# At point 5.
#
@coef = (1, 0, 0, 0, -1);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 624) == 0 and
	fltcmp($dy, 500) == 0 and
	fltcmp($d2y, 300) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (1, 4, 6, 4, 1)
#
# At point 5.
#
@coef = (1, 4, 6, 4, 1);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 1296) == 0 and
	fltcmp($dy, 864) == 0 and
	fltcmp($d2y, 432) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (1, -10, 35, -50, 24)
#
# At point 5.
#
@coef = (1, -10, 35, -50, 24);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 24) == 0 and
	fltcmp($dy, 50) == 0 and
	fltcmp($d2y, 70) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (-31, 14, -16, -14, 1)
#
# At point 5
#
@coef = (-31, 14, -16, -14, 1);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, -18094) == 0 and
	fltcmp($dy, -14624) == 0 and
	fltcmp($d2y, -8912) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (4, -20, -7, 49, -70, 7, -53, 90)
#
# At points 5, 3, 1, -1, -3, -5
#
@coef = (4, -20, -7, 49, -70, 7, -53, 90);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 0) == 0 and
	fltcmp($dy, 59892) == 0 and
	fltcmp($d2y, 145114) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, 3);

ok( (fltcmp($y, -5460) == 0 and
	fltcmp($dy, -8192) == 0 and
	fltcmp($d2y, -7510) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, 1);

ok( (fltcmp($y, 0) == 0 and
	fltcmp($dy, -180) == 0 and
	fltcmp($d2y, -390) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, -1);

ok( (fltcmp($y, 252) == 0 and
	fltcmp($dy, -360) == 0 and
	fltcmp($d2y, 394) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, -3);

ok( (fltcmp($y, -15456) == 0 and
	fltcmp($dy, 39460) == 0 and
	fltcmp($d2y, -79078) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, -5);

ok( (fltcmp($y, -563220) == 0 and
	fltcmp($dy, 760752) == 0 and
	fltcmp($d2y, -865686) == 0),
	"   [ " . join(", ", @coef) . " ]");

ascending_order(1);

#
# (1, 0, 0, 0, -1)
#
# At point 5.
#
@coef = reverse(1, 0, 0, 0, -1);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 624) == 0 and
	fltcmp($dy, 500) == 0 and
	fltcmp($d2y, 300) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (1, 4, 6, 4, 1)
#
# At point 5.
#
@coef = reverse(1, 4, 6, 4, 1);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 1296) == 0 and
	fltcmp($dy, 864) == 0 and
	fltcmp($d2y, 432) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (1, -10, 35, -50, 24)
#
# At point 5.
#
@coef = reverse(1, -10, 35, -50, 24);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 24) == 0 and
	fltcmp($dy, 50) == 0 and
	fltcmp($d2y, 70) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (-31, 14, -16, -14, 1)
#
# At point 5
#
@coef = reverse(-31, 14, -16, -14, 1);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, -18094) == 0 and
	fltcmp($dy, -14624) == 0 and
	fltcmp($d2y, -8912) == 0),
	"   [ " . join(", ", @coef) . " ]");

#
# (4, -20, -7, 49, -70, 7, -53, 90)
#
# At points 5, 3, 1, -1, -3, -5
#
@coef = reverse(4, -20, -7, 49, -70, 7, -53, 90);

($y, $dy, $d2y) = poly_derivaluate(\@coef, 5);

ok( (fltcmp($y, 0) == 0 and
	fltcmp($dy, 59892) == 0 and
	fltcmp($d2y, 145114) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, 3);

ok( (fltcmp($y, -5460) == 0 and
	fltcmp($dy, -8192) == 0 and
	fltcmp($d2y, -7510) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, 1);

ok( (fltcmp($y, 0) == 0 and
	fltcmp($dy, -180) == 0 and
	fltcmp($d2y, -390) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, -1);

ok( (fltcmp($y, 252) == 0 and
	fltcmp($dy, -360) == 0 and
	fltcmp($d2y, 394) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, -3);

ok( (fltcmp($y, -15456) == 0 and
	fltcmp($dy, 39460) == 0 and
	fltcmp($d2y, -79078) == 0),
	"   [ " . join(", ", @coef) . " ]");

($y, $dy, $d2y) = poly_derivaluate(\@coef, -5);

ok( (fltcmp($y, -563220) == 0 and
	fltcmp($dy, 760752) == 0 and
	fltcmp($d2y, -865686) == 0),
	"   [ " . join(", ", @coef) . " ]");

1;