# 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: 02_basics.t 36 2009-06-08 11:51:03Z demetri $ # Checking basic constructors and attribute accessors. # Before `make install' is performed this script should be runnable with # `make test'. After `make install' it should work as `perl t/02_basics.t' ######################### use strict; use warnings; use Test; BEGIN { plan tests => 40 }; use Math::Polynomial 1.000; ok(1); # module loaded ######################### my @samples = ( [[], [], [0], ], [[0], [], [0], ], [[5], [5], [5], ], [[5, 0, 0], [5], [5], ], [[2, 0, 0, 8], [2, 0, 0, 8], [2, 0, 0, 8],], ); my ($ok1, $ok2, $ok3, $ok4, $ok5, $ok6) = (1) x 6; foreach my $sample (@samples) { my @arg = @{$sample->[0]}; my @res1 = @{$sample->[1]}; my @res2 = @{$sample->[2]}; my $p = Math::Polynomial->new(@arg); my @c1 = $p->coeff; my @c2 = $p->coefficients; $ok1 &&= defined $p; $ok2 &&= ref $p; $ok3 &&= $p->isa('Math::Polynomial'); $ok4 &&= @arg == grep { $arg[$_] == $p->coeff($_) } 0..$#arg; $ok5 &&= @c1 == @res1 && @res1 == grep { $c1[$_] == $res1[$_] } 0..$#res1; $ok6 &&= @c2 == @res2 && @res2 == grep { $c2[$_] == $res2[$_] } 0..$#res2; } ok($ok1); # class method new / defined ok($ok2); # class method new / ref ok($ok3); # class method new / isa ok($ok4); # class method new / coeff(i) ok($ok5); # class method new / coeff ok($ok6); # class method new / coefficients my $sp = Math::Polynomial->new(-1, 2, 3); ($ok1, $ok2, $ok3, $ok4) = (1) x 4; foreach my $sample (@samples) { my @arg = @{$sample->[0]}; my @res1 = @{$sample->[1]}; my @res2 = @{$sample->[2]}; my $p = $sp->new(@arg); my @c1 = $p->coeff; my @c2 = $p->coefficients; $ok1 &&= defined $p; $ok2 &&= ref $p; $ok3 &&= $p->isa('Math::Polynomial'); $ok4 &&= @arg == grep { $arg[$_] == $p->coeff($_) } 0..$#arg; $ok5 &&= @c1 == @res1 && @res1 == grep { $c1[$_] == $res1[$_] } 0..$#res1; $ok6 &&= @c2 == @res2 && @res2 == grep { $c2[$_] == $res2[$_] } 0..$#res2; } ok($ok1); # object method new / defined ok($ok2); # object method new / ref ok($ok3); # object method new / isa ok($ok4); # object method new / coeff(i) ok($ok5); # object method new / coeff ok($ok6); # object method new / coefficients @samples = ( [[0], [1]], [[1], [0, 1]], [[4], [0, 0, 0, 0, 1]], [[0, 10], [10]], [[1, 11], [0, 11]], [[2, 13], [0, 0, 13]], [[0, 0], []], [[2, 0], []], ); ($ok1, $ok2, $ok3, $ok4) = (1) x 4; foreach my $sample (@samples) { my @arg = @{$sample->[0]}; my @res = @{$sample->[1]}; my $p = Math::Polynomial->monomial(@arg); my @coeff = $p->coeff; $ok1 &&= defined $p; $ok2 &&= ref $p; $ok3 &&= $p->isa('Math::Polynomial'); $ok4 &&= @coeff == @res && @res == grep { $coeff[$_] == $res[$_] } 0..$#res; } ok($ok1); # class method monomial / defined ok($ok2); # class method monomial / ref ok($ok3); # class method monomial / isa ok($ok4); # class method monomial / coeff ($ok1, $ok2, $ok3, $ok4) = (1) x 4; foreach my $sample (@samples) { my @arg = @{$sample->[0]}; my @res = @{$sample->[1]}; my $p = $sp->monomial(@arg); my @coeff = $p->coeff; $ok1 &&= defined $p; $ok2 &&= ref $p; $ok3 &&= $p->isa('Math::Polynomial'); $ok4 &&= @coeff == @res && @res == grep { $coeff[$_] == $res[$_] } 0..$#res; } ok($ok1); # object method monomial / defined ok($ok2); # object method monomial / ref ok($ok3); # object method monomial / isa ok($ok4); # object method monomial / coeff ok(0 == $sp->coeff(-1)); ok(0 == $sp->coeff_zero); ok(1 == $sp->coeff_one); ok(2 == $sp->degree); ok(2 == $sp->proper_degree); my $zp = $sp->new; ok(0 == $zp->coeff_zero); ok(1 == $zp->coeff_one); ok(-1 == $zp->degree); my @res = $zp->proper_degree; ok(1 == @res && !defined $res[0]); # zero polynomial / proper_degree $sp = $sp->new(-1, -2, 1); @samples = ( [-1, 2], [0, -1], [1, -2], [2, -1], [3, 2], ); ($ok1, $ok2) = (1) x 2; foreach my $sample (@samples) { $ok1 &&= $sample->[1] == $sp->evaluate($sample->[0]); $ok2 &&= 0 == $zp->evaluate($sample->[0]); } ok($ok1); # evaluate non-zero polynomial ok($ok2); # evaluate zero polynomial # diagnostics $Math::Polynomial::max_degree = 10; my $q = eval { Math::Polynomial->monomial(10, 20) }; ok($q && $q->isa('Math::Polynomial')); $q = eval { Math::Polynomial->monomial(11, 1) }; ok(!defined($q) && $@ && $@ =~ /exponent too large/); $q = eval { local $Math::Polynomial::max_degree; Math::Polynomial->monomial(11, 1) }; ok($q && $q->isa('Math::Polynomial')); $q = eval { $sp->monomial(10, 20) }; ok($q && $q->isa('Math::Polynomial')); $q = eval { $sp->monomial(11, 1) }; ok(!defined($q) && $@ && $@ =~ /exponent too large/); $q = eval { local $Math::Polynomial::max_degree; $sp->monomial(11, 1) }; ok($q && $q->isa('Math::Polynomial')); $q = Math::Polynomial->new(0, 1); my $c = eval { $q->coeff }; ok( !defined($c) && $@ && $@ =~ /array context required if called without argument/ ); $c = eval { $q->coefficients }; ok(!defined($c) && $@ && $@ =~ /array context required/); __END__