# Copyright (c) 2007-2009 Martin Becker. All rights reserved. # This package is free software; you can redistribute it and/or modify it # under the same terms as Perl itself. # # $Id: 04_lagrange.t 36 2009-06-08 11:51:03Z demetri $ # Checking Lagrange interpolation. # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl t/04_lagrange.t' ######################### use strict; use warnings; use Test; BEGIN { plan tests => 15 }; use Math::Polynomial 1.000; ok(1); # module loaded ######################### sub has_coeff { my $p = shift; if (!ref($p) || !$p->isa('Math::Polynomial')) { print '# expected Math::Polynomial object, got ', ref($p)? ref($p): defined($p)? qq{"$p"}: 'undef', "\n"; return 0; } my @coeff = $p->coeff; if (@coeff != @_ || grep {$coeff[$_] != $_[$_]} 0..$#coeff) { print '# expected coefficients (', join(', ', @_), '), got (', join(', ', @coeff), ")\n"; return 0; } return 1; } my $p = Math::Polynomial->interpolate([-1..2], [0, 1, 2, -9]); ok(has_coeff($p, 1, 3, 0, -2)); my $q = $p->interpolate([0..3], [3, 0, 0, 3]); ok(has_coeff($q, 3, -4.5, 1.5)); my $c = $p->interpolate([0], [1]); ok(has_coeff($c, 1)); my $z0 = $p->interpolate([], []); ok(has_coeff($z0)); my $z1 = $p->interpolate([1, 2], [0, 0]); ok(has_coeff($z1)); my $z2 = Math::Polynomial->interpolate([], []); ok(has_coeff($z2)); my $r = eval { $p->interpolate([1], [2, 3]) }; ok(!defined $r); ok($@ =~ /usage/); $r = eval { $p->interpolate([1], 2) }; ok(!defined $r); ok($@ =~ /usage/); $r = eval { $p->interpolate(1, [2]) }; ok(!defined $r); ok($@ =~ /usage/); $r = eval { $p->interpolate([1, 1], [2, 2]) }; ok(!defined $r); ok($@ =~ /x values not disjoint/); __END__