Commit | Line | Data |
89d0527d |
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 | |