AmigaOS patches to 5.003_28
[p5sagit/p5-mst-13.2.git] / t / lib / complex.t
1 #!./perl
2
3 # $RCSfile$
4 #
5 # Regression tests for the new Math::Complex pacakge
6 # -- Raphael Manfredi, Sept 1996
7 BEGIN {
8     chdir 't' if -d 't';
9     @INC = '../lib';
10 }
11 use Math::Complex;
12
13 $test = 0;
14 $| = 1;
15 $script = '';
16 $epsilon = 1e-10;
17
18 while (<DATA>) {
19         next if /^#/ || /^\s*$/;
20         chop;
21         $set_test = 0;                  # Assume not a test over a set of values
22         if (/^&(.*)/) {
23                 $op = $1;
24                 next;
25         }
26         elsif (/^\{(.*)\}/) {
27                 set($1, \@set, \@val);
28                 next;
29         }
30         elsif (s/^\|//) {
31                 $set_test = 1;          # Requests we loop over the set...
32         }
33         my @args = split(/:/);
34         if ($set_test) {
35                 my $i;
36                 for ($i = 0; $i < @set; $i++) {
37                         $target = $set[$i];             # complex number
38                         $zvalue = $val[$i];             # textual value as found in set definition
39                         test($zvalue, $target, @args);
40                 }
41         } else {
42                 test($op, undef, @args);
43         }
44 }
45
46 print "1..$test\n";
47 eval $script;
48 die $@ if $@;
49
50 sub test {
51         my ($op, $z, @args) = @_;
52         $test++;
53         my $i;
54         for ($i = 0; $i < @args; $i++) {
55                 $val = value($args[$i]);
56                 $script .= "\$z$i = $val;\n";
57         }
58         if (defined $z) {
59                 $args = "'$op'";                # Really the value
60                 $try = "abs(\$z0 - \$z1) <= 1e-10 ? \$z1 : \$z0";
61                 $script .= "\$res = $try; ";
62                 $script .= "check($test, $args[0], \$res, \$z$#args, $args);\n";
63         } else {
64                 my ($try, $args);
65                 if (@args == 2) {
66                         $try = "$op \$z0";
67                         $args = "'$args[0]'";
68                 } else {
69                         $try = ($op =~ /^\w/) ? "$op(\$z0, \$z1)" : "\$z0 $op \$z1";
70                         $args = "'$args[0]', '$args[1]'";
71                 }
72                 $script .= "\$res = $try; ";
73                 $script .= "check($test, '$try', \$res, \$z$#args, $args);\n";
74         }
75 }
76
77 sub set {
78         my ($set, $setref, $valref) = @_;
79         @{$setref} = ();
80         @{$valref} = ();
81         my @set = split(/;\s*/, $set);
82         my @res;
83         my $i;
84         for ($i = 0; $i < @set; $i++) {
85                 push(@{$valref}, $set[$i]);
86                 my $val = value($set[$i]);
87                 $script .= "\$s$i = $val;\n";
88                 push(@{$setref}, "\$s$i");
89         }
90 }
91
92 sub value {
93         local ($_) = @_;
94         if (/^\s*\((.*),(.*)\)/) {
95                 return "cplx($1,$2)";
96         }
97         elsif (/^\s*\[(.*),(.*)\]/) {
98                 return "cplxe($1,$2)";
99         }
100         elsif (/^\s*'(.*)'/) {
101                 my $ex = $1;
102                 $ex =~ s/\bz\b/$target/g;
103                 $ex =~ s/\br\b/abs($target)/g;
104                 $ex =~ s/\bt\b/arg($target)/g;
105                 $ex =~ s/\ba\b/Re($target)/g;
106                 $ex =~ s/\bb\b/Im($target)/g;
107                 return $ex;
108         }
109         elsif (/^\s*"(.*)"/) {
110                 return "\"$1\"";
111         }
112         return $_;
113 }
114
115 sub check {
116         my ($test, $try, $got, $expected, @z) = @_;
117         if ("$got" eq "$expected" || ($expected =~ /^-?\d/ && $got == $expected)) {
118                 print "ok $test\n";
119         } else {
120                 print "not ok $test\n";
121                 my $args = (@z == 1) ? "z = $z[0]" : "z0 = $z[0], z1 = $z[1]";
122                 print "# '$try' expected: '$expected' got: '$got' for $args\n";
123         }
124 }
125 __END__
126 &+
127 (3,4):(3,4):(6,8)
128 (-3,4):(3,-4):(0,0)
129 (3,4):-3:(0,4)
130 1:(4,2):(5,2)
131 [2,0]:[2,pi]:(0,0)
132
133 &++
134 (2,1):(3,1)
135
136 &-
137 (2,3):(-2,-3)
138 [2,pi/2]:[2,-(pi)/2]
139 2:[2,0]:(0,0)
140 [3,0]:2:(1,0)
141 3:(4,5):(-1,-5)
142 (4,5):3:(1,5)
143
144 &--
145 (1,2):(0,2)
146 [2,pi]:[3,pi]
147
148 &*
149 (0,1):(0,1):(-1,0)
150 (4,5):(1,0):(4,5)
151 [2,2*pi/3]:(1,0):[2,2*pi/3]
152 2:(0,1):(0,2)
153 (0,1):3:(0,3)
154 (0,1):(4,1):(-1,4)
155 (2,1):(4,-1):(9,2)
156
157 &/
158 (3,4):(3,4):(1,0)
159 (4,-5):1:(4,-5)
160 1:(0,1):(0,-1)
161 (0,6):(0,2):(3,0)
162 (9,2):(4,-1):(2,1)
163 [4,pi]:[2,pi/2]:[2,pi/2]
164 [2,pi/2]:[4,pi]:[0.5,-(pi)/2]
165
166 &abs
167 (3,4):5
168 (-3,4):5
169
170 &~
171 (4,5):(4,-5)
172 (-3,4):(-3,-4)
173 [2,pi/2]:[2,-(pi)/2]
174
175 &<
176 (3,4):(1,2):0
177 (3,4):(3,2):0
178 (3,4):(3,8):1
179 (4,4):(5,129):1
180
181 &==
182 (3,4):(4,5):0
183 (3,4):(3,5):0
184 (3,4):(2,4):0
185 (3,4):(3,4):1
186
187 &sqrt
188 (-100,0):(0,10)
189 (16,-30):(5,-3)
190
191 &stringify_cartesian
192 (-100,0):"-100"
193 (0,1):"i"
194 (4,-3):"4-3i"
195 (4,0):"4"
196 (-4,0):"-4"
197 (-2,4):"-2+4i"
198 (-2,-1):"-2-i"
199
200 &stringify_polar
201 [-1, 0]:"[1,pi]"
202 [1, pi/3]:"[1,pi/3]"
203 [6, -2*pi/3]:"[6,-2pi/3]"
204 [0.5, -9*pi/11]:"[0.5,-9pi/11]"
205
206 { (4,3); [3,2]; (-3,4); (0,2); [2,1] }
207
208 |'z + ~z':'2*Re(z)'
209 |'z - ~z':'2*i*Im(z)'
210 |'z * ~z':'abs(z) * abs(z)'
211
212 { (4,3); [3,2]; (-3,4); (0,2); 3; 1; (-5, 0); [2,1] }
213
214 |'exp(z)':'exp(a) * exp(i * b)'
215 |'abs(z)':'r'
216 |'sqrt(z) * sqrt(z)':'z'
217 |'sqrt(z)':'sqrt(r) * exp(i * t/2)'
218 |'cbrt(z)':'cbrt(r) * exp(i * t/3)'
219 |'log(z)':'log(r) + i*t'
220 |'sin(asin(z))':'z'
221 |'cos(acos(z))':'z'
222 |'tan(atan(z))':'z'
223 |'cotan(acotan(z))':'z'
224 |'cos(z) ** 2 + sin(z) ** 2':1
225 |'cosh(z) ** 2 - sinh(z) ** 2':1
226 |'cos(z)':'cosh(i*z)'
227 |'cotan(z)':'1 / tan(z)'
228 |'cotanh(z)':'1 / tanh(z)'
229 |'i*sin(z)':'sinh(i*z)'
230 |'z**z':'exp(z * log(z))'
231 |'log(exp(z))':'z'
232 |'exp(log(z))':'z'
233 |'log10(z)':'log(z) / log(10)'
234 |'logn(z, 3)':'log(z) / log(3)'
235 |'logn(z, 2)':'log(z) / log(2)'
236 |'(root(z, 4))[1] ** 4':'z'
237 |'(root(z, 8))[7] ** 8':'z'
238
239 { (1,1); [1,0.5]; (-2, -1); 2; (-1,0.5); (0,0.5); 0.5; (2, 0) }
240
241 |'sinh(asinh(z))':'z'
242 |'cosh(acosh(z))':'z'
243 |'tanh(atanh(z))':'z'
244 |'cotanh(acotanh(z))':'z'
245
246 { (0.2,-0.4); [1,0.5]; -1.2; (-1,0.5); (0,-0.5); 0.5; (1.1, 0) }
247
248 |'asin(sin(z))':'z'
249 |'acos(cos(z)) ** 2':'z * z'
250 |'atan(tan(z))':'z'
251 |'asinh(sinh(z))':'z'
252 |'acosh(cosh(z)) ** 2':'z * z'
253 |'atanh(tanh(z))':'z'
254