--- /dev/null
+#!./perl
+
+# $RCSfile$
+#
+# Regression tests for the new Math::Complex pacakge
+# -- Raphael Manfredi, Sept 1996
+BEGIN {
+ chdir 't' if -d 't';
+ @INC = '../lib';
+}
+use Math::Complex;
+
+$test = 0;
+$| = 1;
+$script = '';
+$epsilon = 1e-10;
+
+while (<DATA>) {
+ next if /^#/ || /^\s*$/;
+ chop;
+ $set_test = 0; # Assume not a test over a set of values
+ if (/^&(.*)/) {
+ $op = $1;
+ next;
+ }
+ elsif (/^\{(.*)\}/) {
+ set($1, \@set, \@val);
+ next;
+ }
+ elsif (s/^\|//) {
+ $set_test = 1; # Requests we loop over the set...
+ }
+ my @args = split(/:/);
+ if ($set_test) {
+ my $i;
+ for ($i = 0; $i < @set; $i++) {
+ $target = $set[$i]; # complex number
+ $zvalue = $val[$i]; # textual value as found in set definition
+ test($zvalue, $target, @args);
+ }
+ } else {
+ test($op, undef, @args);
+ }
+}
+
+print "1..$test\n";
+eval $script;
+die $@ if $@;
+
+sub test {
+ my ($op, $z, @args) = @_;
+ $test++;
+ my $i;
+ for ($i = 0; $i < @args; $i++) {
+ $val = value($args[$i]);
+ $script .= "\$z$i = $val;\n";
+ }
+ if (defined $z) {
+ $args = "'$op'"; # Really the value
+ $try = "abs(\$z0 - \$z1) <= 1e-10 ? \$z1 : \$z0";
+ $script .= "\$res = $try; ";
+ $script .= "check($test, $args[0], \$res, \$z$#args, $args);\n";
+ } else {
+ my ($try, $args);
+ if (@args == 2) {
+ $try = "$op \$z0";
+ $args = "'$args[0]'";
+ } else {
+ $try = ($op =~ /^\w/) ? "$op(\$z0, \$z1)" : "\$z0 $op \$z1";
+ $args = "'$args[0]', '$args[1]'";
+ }
+ $script .= "\$res = $try; ";
+ $script .= "check($test, '$try', \$res, \$z$#args, $args);\n";
+ }
+}
+
+sub set {
+ my ($set, $setref, $valref) = @_;
+ @{$setref} = ();
+ @{$valref} = ();
+ my @set = split(/;\s*/, $set);
+ my @res;
+ my $i;
+ for ($i = 0; $i < @set; $i++) {
+ push(@{$valref}, $set[$i]);
+ my $val = value($set[$i]);
+ $script .= "\$s$i = $val;\n";
+ push(@{$setref}, "\$s$i");
+ }
+}
+
+sub value {
+ local ($_) = @_;
+ if (/^\s*\((.*),(.*)\)/) {
+ return "cplx($1,$2)";
+ }
+ elsif (/^\s*\[(.*),(.*)\]/) {
+ return "cplxe($1,$2)";
+ }
+ elsif (/^\s*'(.*)'/) {
+ my $ex = $1;
+ $ex =~ s/\bz\b/$target/g;
+ $ex =~ s/\br\b/abs($target)/g;
+ $ex =~ s/\bt\b/arg($target)/g;
+ $ex =~ s/\ba\b/Re($target)/g;
+ $ex =~ s/\bb\b/Im($target)/g;
+ return $ex;
+ }
+ elsif (/^\s*"(.*)"/) {
+ return "\"$1\"";
+ }
+ return $_;
+}
+
+sub check {
+ my ($test, $try, $got, $expected, @z) = @_;
+ if ("$got" eq "$expected" || ($expected =~ /^-?\d/ && $got == $expected)) {
+ print "ok $test\n";
+ } else {
+ print "not ok $test\n";
+ my $args = (@z == 1) ? "z = $z[0]" : "z0 = $z[0], z1 = $z[1]";
+ print "# '$try' expected: '$expected' got: '$got' for $args\n";
+ }
+}
+__END__
+&+
+(3,4):(3,4):(6,8)
+(-3,4):(3,-4):(0,0)
+(3,4):-3:(0,4)
+1:(4,2):(5,2)
+[2,0]:[2,pi]:(0,0)
+
+&++
+(2,1):(3,1)
+
+&-
+(2,3):(-2,-3)
+[2,pi/2]:[2,-(pi)/2]
+2:[2,0]:(0,0)
+[3,0]:2:(1,0)
+3:(4,5):(-1,-5)
+(4,5):3:(1,5)
+
+&--
+(1,2):(0,2)
+[2,pi]:[3,pi]
+
+&*
+(0,1):(0,1):(-1,0)
+(4,5):(1,0):(4,5)
+[2,2*pi/3]:(1,0):[2,2*pi/3]
+2:(0,1):(0,2)
+(0,1):3:(0,3)
+(0,1):(4,1):(-1,4)
+(2,1):(4,-1):(9,2)
+
+&/
+(3,4):(3,4):(1,0)
+(4,-5):1:(4,-5)
+1:(0,1):(0,-1)
+(0,6):(0,2):(3,0)
+(9,2):(4,-1):(2,1)
+[4,pi]:[2,pi/2]:[2,pi/2]
+[2,pi/2]:[4,pi]:[0.5,-(pi)/2]
+
+&abs
+(3,4):5
+(-3,4):5
+
+&~
+(4,5):(4,-5)
+(-3,4):(-3,-4)
+[2,pi/2]:[2,-(pi)/2]
+
+&<
+(3,4):(1,2):0
+(3,4):(3,2):0
+(3,4):(3,8):1
+(4,4):(5,129):1
+
+&==
+(3,4):(4,5):0
+(3,4):(3,5):0
+(3,4):(2,4):0
+(3,4):(3,4):1
+
+&sqrt
+(-100,0):(0,10)
+(16,-30):(5,-3)
+
+&stringify_cartesian
+(-100,0):"-100"
+(0,1):"i"
+(4,-3):"4-3i"
+(4,0):"4"
+(-4,0):"-4"
+(-2,4):"-2+4i"
+(-2,-1):"-2-i"
+
+&stringify_polar
+[-1, 0]:"[1,pi]"
+[1, pi/3]:"[1,pi/3]"
+[6, -2*pi/3]:"[6,-2pi/3]"
+[0.5, -9*pi/11]:"[0.5,-9pi/11]"
+
+{ (4,3); [3,2]; (-3,4); (0,2); [2,1] }
+
+|'z + ~z':'2*Re(z)'
+|'z - ~z':'2*i*Im(z)'
+|'z * ~z':'abs(z) * abs(z)'
+
+{ (4,3); [3,2]; (-3,4); (0,2); 3; 1; (-5, 0); [2,1] }
+
+|'exp(z)':'exp(a) * exp(i * b)'
+|'abs(z)':'r'
+|'sqrt(z) * sqrt(z)':'z'
+|'sqrt(z)':'sqrt(r) * exp(i * t/2)'
+|'cbrt(z)':'cbrt(r) * exp(i * t/3)'
+|'log(z)':'log(r) + i*t'
+|'sin(asin(z))':'z'
+|'cos(acos(z))':'z'
+|'tan(atan(z))':'z'
+|'cotan(acotan(z))':'z'
+|'cos(z) ** 2 + sin(z) ** 2':1
+|'cosh(z) ** 2 - sinh(z) ** 2':1
+|'cos(z)':'cosh(i*z)'
+|'cotan(z)':'1 / tan(z)'
+|'cotanh(z)':'1 / tanh(z)'
+|'i*sin(z)':'sinh(i*z)'
+|'z**z':'exp(z * log(z))'
+|'log(exp(z))':'z'
+|'exp(log(z))':'z'
+|'log10(z)':'log(z) / log(10)'
+|'logn(z, 3)':'log(z) / log(3)'
+|'logn(z, 2)':'log(z) / log(2)'
+|'(root(z, 4))[1] ** 4':'z'
+|'(root(z, 8))[7] ** 8':'z'
+
+{ (1,1); [1,0.5]; (-2, -1); 2; (-1,0.5); (0,0.5); 0.5; (2, 0) }
+
+|'sinh(asinh(z))':'z'
+|'cosh(acosh(z))':'z'
+|'tanh(atanh(z))':'z'
+|'cotanh(acotanh(z))':'z'
+
+{ (0.2,-0.4); [1,0.5]; -1.2; (-1,0.5); (0,-0.5); 0.5; (1.1, 0) }
+
+|'asin(sin(z))':'z'
+|'acos(cos(z)) ** 2':'z * z'
+|'atan(tan(z))':'z'
+|'asinh(sinh(z))':'z'
+|'acosh(cosh(z)) ** 2':'z * z'
+|'atanh(tanh(z))':'z'
+