Checkin of new directory structure.
[pspp-builds.git] / tests / xforms / expressions.sh
1 #! /bin/sh
2
3 # Tests the expression optimizer and evaluator.
4
5 TEMPDIR=/tmp/pspp-tst-$$
6
7 # ensure that top_builddir  are absolute
8 if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
9 if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
10 top_builddir=`cd $top_builddir; pwd`
11
12 # ensure that top_srcdir is absolute
13 top_srcdir=`cd $top_srcdir; pwd`
14
15 STAT_CONFIG_PATH=$top_srcdir/config
16 export STAT_CONFIG_PATH
17
18
19 cleanup()
20 {
21      cd /
22      rm -rf $TEMPDIR
23 }
24
25
26 fail()
27 {
28     echo $activity
29     echo FAILED
30     cleanup;
31     exit 1;
32 }
33
34
35 no_result()
36 {
37     echo $activity
38     echo NO RESULT;
39     cleanup;
40     exit 2;
41 }
42
43 pass()
44 {
45     cleanup;
46     exit 0;
47 }
48
49 mkdir -p $TEMPDIR
50
51 cd $TEMPDIR
52 activity="create expressions list"
53 cat > 00-num-syn.expr <<'EOF'
54 # Test numeric syntax.
55 1e2 => 100.00
56 1e+2 => 100.00
57 1e-2 => 0.01
58 1e-99 => 0.00
59 EOF
60
61 cat > 01-conv-to-num.expr <<'EOF'
62 # Test using numeric/string values as Booleans and vice-versa
63 0 AND 1 => false
64 $true AND 1 => true
65 1 OR $false => true
66 1 OR $sysmis => true
67 2 OR $sysmis => sysmis
68 2 AND $sysmis => false
69 'string' AND $sysmis => error
70 0 AND $sysmis => false
71 (1>2) + 1 => 1.00
72 $true + $false => 1.00
73 EOF
74
75 cat > 02-add-sub.expr <<'EOF'
76 # Addition and subtraction.
77 1 + 2 => 3.00
78 1 + $true => 2.00
79 $sysmis + 1 => sysmis
80 7676 + $sysmis => sysmis
81 ('foo') + 5 => error
82 ('foo') + ('bar') => error      # Arithmetic concatenation requires CONCAT.
83 'foo' + 'bar' => "foobar"       # Lexical concatentation succeeds.
84 1 +3 - 2 +4 -5 => 1.00
85 1 - $true => 0.00
86 $true - 4/3 => -0.33
87 'string' - 1e10 => error
88 9.5 - '' => error
89 1 - 2 => -1.00
90 52 -23 => 29.00 
91 EOF
92
93 cat > 03-mul-div.expr <<'EOF'
94 # Multiplication and division
95 5 * 10 => 50.00
96 10 * $true => 10.00
97 $true * 5 => 5.00
98 1.5 * $true => 1.50
99 5 * $sysmis => sysmis
100 $sysmis * 15 => sysmis
101 2 * 5 / 10 => 1.00
102 1 / 2 => 0.50
103 2 / 5 => 0.40
104 12 / 3 / 2 => 2.00
105 EOF
106
107 cat > 04-exp.expr <<'EOF'
108 # Exponentiation.
109 2**8 => 256.00
110 (2**3)**4 => 4096.00    # Irritating, but compatible.
111 2**3**4 => 4096.00
112 EOF
113
114 cat > 05-negation.expr <<'EOF'
115 # Unary minus.
116 2+-3 => -1.00
117 2*-3 => -6.00
118 -3**2 => -9.00
119 (-3)**2 => 9.00
120 2**-1 => 0.50
121 0**0 => sysmis
122 0**-1 => sysmis
123 (-3)**1.5 => sysmis
124 EOF
125
126 cat > 06-logical-and.expr <<'EOF'
127 # AND truth table.
128 $false AND $false => false
129 $false AND $true => false
130 $false AND $sysmis => false
131 $true AND $false => false
132 $true AND $true => true
133 $true AND $sysmis => sysmis
134 $sysmis AND $false => false
135 $sysmis AND $true => sysmis
136 $sysmis AND $sysmis => sysmis
137 $false & $false => false
138 $false & $true => false
139 $false & $sysmis => false
140 $true & $false => false
141 $true & $true => true
142 $true & $sysmis => sysmis
143 $sysmis & $false => false
144 $sysmis & $true => sysmis
145 $sysmis & $sysmis => sysmis
146 EOF
147
148 cat > 07-logical-or.expr <<'EOF'
149 # OR truth table.
150 $false OR $false => false
151 $false OR $true => true
152 $false OR $sysmis => sysmis
153 $true OR $false => true
154 $true OR $true => true
155 $true OR $sysmis => true
156 $sysmis OR $false => sysmis
157 $sysmis OR $true => true
158 $sysmis OR $sysmis => sysmis
159 $false | $false => false
160 $false | $true => true
161 $false | $sysmis => sysmis
162 $true | $false => true
163 $true | $true => true
164 $true | $sysmis => true
165 $sysmis | $false => sysmis
166 $sysmis | $true => true
167 $sysmis | $sysmis => sysmis
168 EOF
169
170 cat > 08-logical-not.expr <<'EOF'
171 # NOT truth table.
172 not $false => true
173 not 0 => true
174 not 2.5 => true
175 not $true => false
176 not 1 => false
177 not $sysmis => sysmis
178 ~ $false => true
179 ~ 0 => true
180 ~ 2.5 => true
181 ~ $true => false
182 ~ 1 => false
183 ~ $sysmis => sysmis
184 EOF
185
186 cat > 09-eq.expr <<'EOF'
187 # Relational operators.
188 1 eq 1 => true
189 1 = 1 => true
190 1 eq 2 => false
191 2 = 3 => false
192 1 eq 'foobar' => error
193 5 eq 'foobar' => error
194 'baz' = 10 => error
195 'quux' = 5.55 => error
196 'foobar' = 'foobar' => true
197 'quux' = 'bar' => false
198 'bar   ' = 'bar' => true
199 'asdf         ' = 'asdf  ' => true
200 'asdfj   ' = 'asdf' => false
201 1 + 2 = 3 => true               # Check precedence.
202 1 >= 2 = 2 ge 3 => false        # Check precedence.
203 3 ne 2 ~= 1 => false            # Mathematically true.
204 3 > 2 > 1 => false              # Mathematically true.
205 EOF
206
207 cat > 10-le.expr <<'EOF'
208 1 <= 2 => true
209 2.5 <= 1.5 => false
210 1 le 2 => true
211 2 <= 2 => true
212 2 le 2 => true
213 2 < = 2 => error        # Make sure <= token can't be split.
214 1 <= 'foobar' => error
215 5 <= 'foobar' => error
216 'baz' <= 10 => error
217 'quux' <= 5.55 => error
218 '0123' <= '0123' => true
219 '0123' <= '0124' => true
220 '0124' le '0123' => false
221 '0123  ' <= '0123' => true
222 '0123' le '0123  ' => true
223 EOF
224
225 cat > 11-lt.expr <<'EOF'
226 1 < 2 => true
227 2.5 < 1.5 => false
228 3.5 lt 4 => true
229 4 lt 3.5 => false
230 1 lt 'foobar' => error
231 5 lt 'foobar' => error
232 'baz' < 10 => error
233 'quux' < 5.55 => error
234 '0123' lt '0123' => false
235 '0123' < '0124' => true
236 '0124' lt '0123' => false
237 '0123  ' < '0123' => false
238 '0123' lt '0123  ' => false
239 EOF
240
241 cat > 12-ge.expr <<'EOF'
242 1 >= 2 => false
243 2.5 >= 1.5 => true
244 1 ge 2 => false
245 2 >= 2 => true
246 2 ge 2 => true
247 2 > = 2 => error        # Make sure >= token can't be split.
248 1 >= 'foobar' => error
249 5 ge 'foobar' => error
250 'baz' ge 10 => error
251 'quux' >= 5.55 => error
252 '0123' ge '0123' => true
253 '0123' >= '0124' => false
254 '0124' >= '0123' => true
255 '0123  ' ge '0123' => true
256 '0123' >= '0123  ' => true
257 EOF
258
259 cat > 13-gt.expr <<'EOF'
260 1 > 2 => false
261 2.5 > 1.5 => true
262 3.5 gt 4 => false
263 4 gt 3.5 => true
264 1 gt 'foobar' => error
265 5 gt 'foobar' => error
266 'baz' > 10 => error
267 'quux' > 5.55 => error
268 '0123' gt '0123' => false
269 '0123' > '0124' => false
270 '0124' gt '0123' => true
271 '0123  ' > '0123' => false
272 '0123' gt '0123  ' => false
273 EOF
274
275 cat > 14-ne.expr <<'EOF'
276 1 ne 1 => false
277 1 ~= 1 => false
278 1 <> 2 => true
279 2 ne 3 => true
280 1 ~= 'foobar' => error
281 5 <> 'foobar' => error
282 'baz' ne 10 => error
283 'quux' ~= 5.55 => error
284 'foobar' <> 'foobar' => false
285 'quux' ne 'bar' => true
286 'bar   ' <> 'bar' => false
287 'asdf         ' ~= 'asdf  ' => false
288 'asdfj   ' ne 'asdf' => true
289 1 < > 1 => error        # <> token can't be split
290 1 ~ = 1 => error        # ~= token can't be split
291 EOF
292
293 cat > 15-exp-log.expr <<'EOF'
294 exp(10) => 22026.47
295 exp('x') => error
296
297 lg10(500) => 2.70
298 lg10('x') => error
299
300 ln(10) => 2.30
301 ln('x') => error
302 EOF
303
304 cat > 16-sqrt-abs-mod.expr <<'EOF'
305 sqrt(500) => 22.36
306 sqrt('x') => error
307
308 abs(-10.5) => 10.50
309 abs(-55.79) => 55.79
310 abs(22) => 22.00
311 abs(0) => 0.00
312
313 mod(55.5, 2) => 1.50
314 mod(-55.5, 2) => -1.50
315 mod(55.5, -2) => 1.50
316 mod(-55.5, -2) => -1.50
317 mod('a', 2) => error
318 mod(2, 'a') => error
319 mod('a', 'b') => error
320
321 mod10(55.5) => 5.50
322 mod10(-55.5) => -5.50
323 mod10('x') => error
324 EOF
325
326 cat > 17-rnd-trunc.expr <<'EOF'
327 rnd(5.4) => 5.00
328 rnd(5.6) => 6.00
329 rnd(-5.4) => -5.00
330 rnd(-5.6) => -6.00
331 rnd('x') => error
332
333 trunc(1.2) => 1.00
334 trunc(1.9) => 1.00
335 trunc(-1.2) => -1.00
336 trunc(-1.9) => -1.00
337 trunc('x') => error
338 EOF
339
340 cat > 18-arc.expr <<'EOF'
341 acos(.5) / 3.14159 * 180 => 60.00
342 arcos(.75) / 3.14159 * 180 => 41.41
343 arcos(-.5) / 3.14159 * 180 => 120.00
344 acos(-.75) / 3.14159 * 180 => 138.59
345 acos(-1) / 3.14159 * 180 => 180.00
346 arcos(1) / 3.14159 * 180 => 0.00
347 acos(-1.01) => sysmis
348 arcos(1.01) => sysmis
349 acos('x') => error
350
351 arsin(.5) / 3.14159 * 180 => 30.00
352 asin(.25) / 3.14159 * 180 => 14.48
353 arsin(-.5) / 3.14159 * 180 => -30.00
354 asin(-.25) / 3.14159 * 180 => -14.48
355 arsin(-1.01) => sysmis
356 asin(1.01) => sysmis
357 arsin('x') => error
358
359 artan(1) / 3.14159 * 180 => 45.00
360 atan(10) / 3.14159 * 180 => 84.29
361 artan(-1) / 3.14159 * 180 => -45.00
362 atan(-10) / 3.14159 * 180 => -84.29
363 artan('x') => error
364 EOF
365
366 cat > 19-cos-sin-tan.expr <<'EOF'
367 cos(60 / 180 * 3.14159) => 0.50
368 cos(45 / 180 * 3.14159) => 0.71
369 cos(30 / 180 * 3.14159) => 0.87
370 cos(15 / 180 * 3.14159) => 0.97
371 cos(-60 / 180 * 3.14159) => 0.50
372 cos(-45 / 180 * 3.14159) => 0.71
373 cos(-30 / 180 * 3.14159) => 0.87
374 cos(-15 / 180 * 3.14159) => 0.97
375 cos(123 / 180 * 3.14159) => -0.54
376 cos(321 / 180 * 3.14159) => 0.78
377 cos('x') => error
378
379 sin(60 / 180 * 3.14159) => 0.87
380 sin(45 / 180 * 3.14159) => 0.71
381 sin(30 / 180 * 3.14159) => 0.50
382 sin(15 / 180 * 3.14159) => 0.26
383 sin(-60 / 180 * 3.14159) => -0.87
384 sin(-45 / 180 * 3.14159) => -0.71
385 sin(-30 / 180 * 3.14159) => -0.50
386 sin(-15 / 180 * 3.14159) => -0.26
387 sin(123 / 180 * 3.14159) => 0.84
388 sin(321 / 180 * 3.14159) => -0.63
389 sin('x') => error
390
391 tan(60 / 180 * 3.14159) => 1.73
392 tan(45 / 180 * 3.14159) => 1.00
393 tan(30 / 180 * 3.14159) => 0.58
394 tan(15 / 180 * 3.14159) => 0.27
395 tan(-60 / 180 * 3.14159) => -1.73
396 tan(-45 / 180 * 3.14159) => -1.00
397 tan(-30 / 180 * 3.14159) => -0.58
398 tan(-15 / 180 * 3.14159) => -0.27
399 tan(123 / 180 * 3.14159) => -1.54
400 tan(321 / 180 * 3.14159) => -0.81
401 tan('x') => error
402 EOF
403
404 cat > 20-missing.expr <<'EOF'
405 # FIXME: a variable name as the argument to SYSMIS is a special case
406 # that we don't yet test.  We also can't test VALUE this way.
407 missing(10) => false
408 missing($sysmis) => true
409 missing(asin(1.01)) => true
410 missing(asin(.5)) => false
411 missing('    ') => error
412 nmiss($sysmis) => 1.00
413 nmiss(0) => 0.00
414 nmiss($sysmis, $sysmis, $sysmis) => 3.00
415 nmiss(1, 2, 3, 4) => 0.00
416 nmiss(1, $sysmis, $sysmis, 2, 2, $sysmis, $sysmis, 3, 4) => 4.00
417 nvalid($sysmis) => 0.00
418 nvalid(0) => 1.00
419 nvalid($sysmis, $sysmis, $sysmis) => 0.00
420 nvalid(1, 2, 3, 4) => 4.00
421 nvalid(1, $sysmis, $sysmis, 2, 2, $sysmis, $sysmis, 3, 4) => 5.00
422 sysmis(10) => false
423 sysmis($sysmis) => true
424 sysmis(asin(1.01)) => true
425 sysmis(asin(.5)) => false
426 sysmis('    ') => error
427 EOF
428
429 cat > 21-any.expr <<'EOF'
430 any($sysmis, 1, $sysmis, 3) => sysmis
431 any(1, 1, 2, 3) => true
432 any(2, 1, 2, 3) => true
433 any(3, 1, 2, 3) => true
434 any(5, 1, 2, 3) => false
435 any(1, 1, 1, 1) => true
436 any($sysmis, 1, 1, 1) => sysmis
437 any(1, $sysmis, $sysmis, $sysmis) => sysmis
438 any($sysmis, $sysmis, $sysmis, $sysmis) => sysmis
439 any(1) => error
440 any('1', 2, 3, 4) => error
441 any(1, '2', 3, 4) => error
442 any(1, 2, '3', 4) => error
443 any(1, 2, 3, '4') => error
444
445 any('', 'a', '', 'c') => true
446 any('a', 'a', 'b', 'c') => true
447 any('b', 'a', 'b', 'c') => true
448 any('c', 'a', 'b', 'c') => true
449 any('e', 'a', 'b', 'c') => false
450 any('a', 'a', 'a', 'a') => true
451 any('', 'a', 'a', 'a') => false
452 any('a', '', '', '') => false
453 any('a') => error
454 any('a', 'a  ', 'b', 'c') => true
455 any('b   ', 'a', 'b', 'c') => true
456 any('c   ', 'a', 'b', 'c     ') => true
457 any(a, 'b', 'c', 'd') => error
458 any('a', b, 'c', 'd') => error
459 any('a', 'b', c, 'd') => error
460 any('a', 'b', 'c', d) => error
461 EOF
462
463 cat > 22-range.expr <<'EOF'
464 range(5, 1, 10) => true
465 range(1, 1, 10) => true
466 range(10, 1, 10) => true
467 range(-1, 1, 10) => false
468 range(12, 1, 10) => false
469 range($sysmis, 1, 10) => sysmis
470 range(5, 1, $sysmis) => sysmis
471 range(5, $sysmis, 10) => sysmis
472 range($sysmis, $sysmis, 10) => sysmis 
473 range($sysmis, 1, $sysmis) => sysmis
474 range($sysmis, $sysmis, $sysmis) => sysmis
475 range(0, 1, 8, 10, 18) => false
476 range(1, 1, 8, 10, 18) => true
477 range(6, 1, 8, 10, 18) => true
478 range(8, 1, 8, 10, 18) => true
479 range(9, 1, 8, 10, 18) => false
480 range(10, 1, 8, 10, 18) => true
481 range(13, 1, 8, 10, 18) => true
482 range(16, 1, 8, 10, 18) => true
483 range(18, 1, 8, 10, 18) => true
484 range(20, 1, 8, 10, 18) => false
485 range(1) => error
486 range(1, 2) => error
487 range(1, 2, 3, 4) => error
488 range(1, 2, 3, 4, 5, 6) => error
489 range('1', 2, 3) => error
490 range(1, '2', 3) => error
491 range(1, 2, '3') => error
492
493 range('123', '111', '888') => true
494 range('111', '111', '888') => true
495 range('888', '111', '888') => true
496 range('110', '111', '888') => false
497 range('889', '111', '888') => false
498 range('000', '111', '888') => false
499 range('999', '111', '888') => false
500 range('123   ', '111', '888') => true
501 range('123', '111   ', '888') => true
502 range('123', '111', '888   ') => true
503 range('123', '111    ', '888   ') => true
504 range('00', '01', '08', '10', '18') => false
505 range('01', '01', '08', '10', '18') => true
506 range('06', '01', '08', '10', '18') => true
507 range('08', '01', '08', '10', '18') => true
508 range('09', '01', '08', '10', '18') => false
509 range('10', '01', '08', '10', '18') => true
510 range('15', '01', '08', '10', '18') => true
511 range('18', '01', '08', '10', '18') => true
512 range('19', '01', '08', '10', '18') => false
513 range('1') => error
514 range('1', '2') => error
515 range('1', '2', '3', '4') => error
516 range('1', '2', '3', '4', '5', '6') => error
517 range(1, '2', '3') => error
518 range('1', 2, '3') => error
519 range('1', '2', 3) => error
520 EOF
521
522 cat > 23-max-min.expr <<'EOF'
523 max(1, 2, 3, 4, 5) => 5.00
524 max(1, $sysmis, 2, 3, $sysmis, 4, 5) => 5.00
525 max(1, 2) => 2.00
526 max() => error
527 max(1) => 1.00
528 max(1, $sysmis) => 1.00
529 max(1, 2, 3, $sysmis) => 3.00
530 max.4(1, 2, 3, $sysmis) => sysmis
531 max.4(1, 2, 3) => error
532
533 max("2", "3", "5", "1", "4") => "5"
534 max("1", "2") => "2"
535 max("1") => "1"
536
537 min(1, 2, 3, 4, 5) => 1.00
538 min(1, $sysmis, 2, 3, $sysmis, 4, 5) => 1.00
539 min(1, 2) => 1.00
540 min() => error
541 min(1) => 1.00
542 min(1, $sysmis) => 1.00
543 min(1, 2, 3, $sysmis) => 1.00
544 min.4(1, 2, 3, $sysmis) => sysmis
545 min.4(1, 2, 3) => error
546
547 min("2", "3", "5", "1", "4") => "1"
548 min("1", "2") => "1"
549 min("1") => "1"
550 EOF
551
552 cat > 24-moments.expr <<'EOF'
553 cfvar(1, 2, 3, 4, 5) => 0.53
554 cfvar(1, $sysmis, 2, 3, $sysmis, 4, 5) => 0.53
555 cfvar(1, 2) => 0.47
556 cfvar(1) => error
557 cfvar(1, $sysmis) => sysmis
558 cfvar(1, 2, 3, $sysmis) => 0.50
559 cfvar.4(1, 2, 3, $sysmis) => sysmis
560 cfvar.4(1, 2, 3) => error
561 cfvar('x') => error
562 cfvar('x', 1, 2, 3) => error
563
564 mean(1, 2, 3, 4, 5) => 3.00
565 mean(1, $sysmis, 2, 3, $sysmis, 4, 5) => 3.00
566 mean(1, 2) => 1.50
567 mean() => error
568 mean(1) => 1.00
569 mean(1, $sysmis) => 1.00
570 mean(1, 2, 3, $sysmis) => 2.00
571 mean.4(1, 2, 3, $sysmis) => sysmis
572 mean.4(1, 2, 3) => error
573
574 sd(1, 2, 3, 4, 5) => 1.58
575 sd(1, $sysmis, 2, 3, $sysmis, 4, 5) => 1.58
576 sd(1, 2) => 0.71
577 sd(1) => error
578 sd(1, $sysmis) => sysmis
579 sd(1, 2, 3, $sysmis) => 1.00
580 sd.4(1, 2, 3, $sysmis) => sysmis
581 sd.4(1, 2, 3) => error
582 sd('x') => error
583 sd('x', 1, 2, 3) => error
584
585 sum(1, 2, 3, 4, 5) => 15.00
586 sum(1, $sysmis, 2, 3, $sysmis, 4, 5) => 15.00
587 sum(1, 2) => 3.00
588 sum() => error
589 sum(1) => 1.00
590 sum(1, $sysmis) => 1.00
591 sum(1, 2, 3, $sysmis) => 6.00
592 sum.4(1, 2, 3, $sysmis) => sysmis
593 sum.4(1, 2, 3) => error
594
595 variance(1, 2, 3, 4, 5) => 2.50
596 variance(1, $sysmis, 2, 3, $sysmis, 4, 5) => 2.50
597 variance(1, 2) => 0.50
598 variance(1) => error
599 variance(1, $sysmis) => sysmis
600 variance(1, 2, 3, $sysmis) => 1.00
601 variance.4(1, 2, 3, $sysmis) => sysmis
602 variance.4(1, 2, 3) => error
603 variance('x') => error
604 variance('x', 1, 2, 3) => error
605 EOF
606
607 cat > 25-concat.expr <<'EOF'
608 concat('') => ""
609 concat('a', 'b') => "ab"
610 concat('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') => "abcdefgh"
611 concat('abcdefgh', 'ijklmnopq') => "abcdefghijklmnopq"
612 concat('a', 1) => error
613 concat(1, 2) => error
614 EOF
615
616 cat > 26-index.expr <<'EOF'
617 index('abcbcde', 'bc') => 2.00
618 index('abcbcde', 'bcd') => 4.00
619 index('abcbcde', 'bcbc') => 2.00
620 index('abcdefgh', 'abc') => 1.00
621 index('abcdefgh', 'bcd') => 2.00
622 index('abcdefgh', 'cde') => 3.00
623 index('abcdefgh', 'def') => 4.00
624 index('abcdefgh', 'efg') => 5.00
625 index('abcdefgh', 'fgh') => 6.00
626 index('abcdefgh', 'fghi') => 0.00
627 index('abcdefgh', 'x') => 0.00
628 index('abcdefgh', 'abch') => 0.00
629 index('banana', 'na') => 3.00
630 index('banana', 'ana') => 2.00
631 index('', 'x') => 0.00
632 index('', '') => sysmis
633 index('abcdefgh', '') => sysmis
634 index('abcdefgh', 'alkjsfdjlskalkjfa') => 0.00
635
636 index('abcbcde', 'bc', 1) => 2.00
637 index('abcbcde', 'dc', 1) => 3.00
638 index('abcbcde', 'abc', 1) => 1.00
639 index('abcbcde', 'bc', 2) => 2.00
640 index('abcbcde', 'dc', 2) => 0.00
641 index('abcbcde', 'abc', 1) => 1.00
642 index('abcbcde', 'bccb', 2) => 2.00
643 index('abcbcde', 'bcbc', 2) => 2.00
644 index('abcbcde', 'bcbc', $sysmis) => sysmis
645 EOF
646
647 cat > 27-rindex.expr <<'EOF'
648 rindex('abcbcde', 'bc') => 4.00
649 rindex('abcbcde', 'bcd') => 4.00
650 rindex('abcbcde', 'bcbc') => 2.00
651 rindex('abcdefgh', 'abc') => 1.00
652 rindex('abcdefgh', 'bcd') => 2.00
653 rindex('abcdefgh', 'cde') => 3.00
654 rindex('abcdefgh', 'def') => 4.00
655 rindex('abcdefgh', 'efg') => 5.00
656 rindex('abcdefgh', 'fgh') => 6.00
657 rindex('abcdefgh', 'fghi') => 0.00
658 rindex('abcdefgh', 'x') => 0.00
659 rindex('abcdefgh', 'abch') => 0.00
660 rindex('banana', 'na') => 5.00
661 rindex('banana', 'ana') => 4.00
662 rindex('', 'x') => 0.00
663 rindex('', '') => sysmis
664 rindex('abcdefgh', '') => sysmis
665 rindex('abcdefgh', 'alkjsfdjlskalkjfa') => 0.00
666
667 rindex('abcbcde', 'bc', 1) => 5.00
668 rindex('abcbcde', 'dc', 1) => 6.00
669 rindex('abcbcde', 'abc', 1) => 5.00
670 rindex('abcbcde', 'bc', 2) => 4.00
671 rindex('abcbcde', 'dc', 2) => 0.00
672 rindex('abcbcde', 'abc', 1) => 5.00
673 rindex('abcbcde', 'bccb', 2) => 4.00
674 rindex('abcbcde', 'bcbc', 2) => 4.00
675 rindex('abcbcde', 'bcbc', $sysmis) => sysmis
676 rindex('abcbcde', 'bcbcg', 2) => sysmis
677 rindex('abcbcde', 'bcbcg', $sysmis) => sysmis
678 rindex('abcbcde', 'bcbcg', 'x') => error
679 rindex(1, 'bcdfkjl', 2) => error
680 rindex('aksj', 2, 2) => error
681 rindex(1, 2, 3) => error
682 rindex(1, 2, '3') => error
683 EOF
684
685 cat > 28-length.expr <<'EOF'
686 length('') => 0.00
687 length('a') => 1.00
688 length('xy') => 2.00
689 length('adsf    ') => 8.00
690 length('abcdefghijkl') => 12.00
691 length(0) => error
692 length($sysmis) => error
693 EOF
694
695 cat > 29-pad.expr <<'EOF'
696 lpad('abc', -1) => ""
697 lpad('abc', 0) => "abc"
698 lpad('abc', 2) => "abc"
699 lpad('abc', 3) => "abc"
700 lpad('abc', 10) => "       abc"
701 lpad('abc', 256) => ""
702 lpad('abc', $sysmis) => ""
703 lpad('abc', -1, '*') => ""
704 lpad('abc', 0, '*') => "abc"
705 lpad('abc', 2, '*') => "abc"
706 lpad('abc', 3, '*') => "abc"
707 lpad('abc', 10, '*') => "*******abc"
708 lpad('abc', 256, '*') => ""
709 lpad('abc', $sysmis, '*') => ""
710 lpad('abc', $sysmis, '') => ""
711 lpad('abc', $sysmis, 'xy') => ""
712 lpad(0, 10) => error
713 lpad('abc', 'def') => error
714 lpad(0, 10, ' ') => error
715 lpad('abc', 'def', ' ') => error
716 lpad('x', 5, 0) => error
717 lpad('x', 5, 2) => error
718
719 rpad('abc', -1) => ""
720 rpad('abc', 0) => "abc"
721 rpad('abc', 2) => "abc"
722 rpad('abc', 3) => "abc"
723 rpad('abc', 10) => "abc       "
724 rpad('abc', 256) => ""
725 rpad('abc', $sysmis) => ""
726 rpad('abc', -1, '*') => ""
727 rpad('abc', 0, '*') => "abc"
728 rpad('abc', 2, '*') => "abc"
729 rpad('abc', 3, '*') => "abc"
730 rpad('abc', 10, '*') => "abc*******"
731 rpad('abc', 256, '*') => ""
732 rpad('abc', $sysmis, '*') => ""
733 rpad('abc', $sysmis, '') => ""
734 rpad('abc', $sysmis, 'xy') => ""
735 rpad(0, 10) => error
736 rpad('abc', 'def') => error
737 rpad(0, 10, ' ') => error
738 rpad('abc', 'def', ' ') => error
739 rpad('x', 5, 0) => error
740 rpad('x', 5, 2) => error
741 EOF
742
743 cat > 30-num-str.expr <<'EOF'
744 number("123", f3.0) => 123.00
745 number(" 123", f3.0) => 12.00
746 number("123", f3.1) => 12.30
747 number("   ", f3.1) => sysmis
748
749 string(123.56, f5.1) => "123.6"
750 string($sysmis, f5.1) => "   . "
751 string("abc", A5) => error
752 EOF
753
754 cat > 31-trim.expr <<'EOF'
755 ltrim('   abc') => "abc"
756 rtrim('   abc   ') => "   abc"
757 ltrim('abc') => "abc"
758 ltrim(' abc') => "      abc"
759 ltrim('    ') => ""
760 ltrim('') => ""
761 ltrim(8) => error
762 ltrim('***abc', '*') => "abc"
763 ltrim('abc', '*') => "abc"
764 ltrim('*abc', '*') => "abc"
765 ltrim('', '*') => ""
766 ltrim(8, '*') => error
767 ltrim(' x', 8) => error
768 ltrim(8, 9) => error
769
770 rtrim('abc   ') => "abc"
771 rtrim('   abc   ') => "   abc"
772 rtrim('abc') => "abc"
773 rtrim('abc      ') => "abc      "
774 rtrim('    ') => ""
775 rtrim('') => ""
776 rtrim(8) => error
777 rtrim('abc***', '*') => "abc"
778 rtrim('abc', '*') => "abc"
779 rtrim('abc*', '*') => "abc"
780 rtrim('', '*') => ""
781 rtrim(8, '*') => error
782 rtrim(' x', 8) => error
783 rtrim(8, 9) => error
784 EOF
785
786 cat > 32-substr.expr <<'EOF'
787 substr('abcdefgh', -5) => ""
788 substr('abcdefgh', 0) => ""
789 substr('abcdefgh', 1) => "abcdefgh"
790 substr('abcdefgh', 3) => "cdefgh"
791 substr('abcdefgh', 5) => "efgh"
792 substr('abcdefgh', 6) => "fgh"
793 substr('abcdefgh', 7) => "gh"
794 substr('abcdefgh', 8) => "h"
795 substr('abcdefgh', 9) => ""
796 substr('abcdefgh', 10) => ""
797 substr('abcdefgh', 20) => ""
798 substr('abcdefgh', $sysmis) => ""
799 substr(0, 10) => error
800 substr('abcd', 'abc') => error
801 substr(0, 'abc') => error
802
803 substr('abcdefgh', 0, 0) => ""
804 substr('abcdefgh', 3, 0) => ""
805 substr('abcdefgh', 5, 0) => ""
806 substr('abcdefgh', 9, 0) => ""
807 substr('abcdefgh', 0, 1) => ""
808 substr('abcdefgh', 0, 5) => ""
809 substr('abcdefgh', 1, 8) => "abcdefgh"
810 substr('abcdefgh', 1, 10) => "abcdefgh"
811 substr('abcdefgh', 1, 20) => "abcdefgh"
812 substr('abcdefgh', 3, 4) => "cdef"
813 substr('abcdefgh', 5, 2) => "ef"
814 substr('abcdefgh', 6, 1) => "f"
815 substr('abcdefgh', 7, 10) => "gh"
816 substr('abcdefgh', 8, 1) => "h"
817 substr('abcdefgh', 8, 2) => "h"
818 substr('abcdefgh', 9, 11) => ""
819 substr('abcdefgh', 10, 52) => ""
820 substr('abcdefgh', 20, 1) => ""
821 substr('abcdefgh', $sysmis, 2) => ""
822 substr('abcdefgh', 9, $sysmis) => ""
823 substr('abcdefgh', $sysmis, $sysmis) => ""
824 substr('abc', 1, 'x') => error
825 substr(0, 10, 1) => error
826 substr(0, 10, 'x') => error
827 substr('abcd', 'abc', 0) => error
828 substr('abcd', 'abc', 'j') => error
829 substr(0, 'abc', 4) => error
830 substr(0, 'abc', 'k') => error
831 EOF
832
833 cat > 33-case.expr <<'EOF'
834 lower('ABCDEFGHIJKLMNOPQRSTUVWXYZ!@%&*(089') => "abcdefghijklmnopqrstuvwxyz!@%&*(089"
835 lower('') => ""
836 lower(1) => error
837
838 upcase('abcdefghijklmnopqrstuvwxyz!@%&*(089') => "ABCDEFGHIJKLMNOPQRSTUVWXYZ!@%&*(089"
839 upcase('') => ""
840 upcase(1) => error
841 EOF
842
843 cat > 34-time.expr <<'EOF'
844 time.days(1) => 86400.00
845 time.days(-1) => -86400.00
846 time.days(0.5) => 43200.00
847 time.days('x') => error
848 time.days($sysmis) => sysmis
849
850 time.hms(5, 6, 7) => 18367.00
851 time.hms(5, 6, 0) => 18360.00
852 time.hms(5, 0, 7) => 18007.00
853 time.hms(0, 6, 7) => 367.00
854 time.hms(-5, 6, -7) => sysmis
855 time.hms(-5, 5, -7) => sysmis
856 time.hms($sysmis, 6, 7) => sysmis
857 time.hms(5, $sysmis, 7) => sysmis
858 time.hms(5, $sysmis, 7) => sysmis
859 time.hms($sysmis, $sysmis, 7) => sysmis
860 time.hms(5, $sysmis, $sysmis) => sysmis
861 time.hms($sysmis, $sysmis, 7) => sysmis
862 time.hms($sysmis, $sysmis, $sysmis) => sysmis
863 EOF
864
865 cat > 35-ctime.expr <<'EOF'
866 ctime.days(106272) => 1.23
867 ctime.hours(106272) => 29.52
868 ctime.minutes(106272) => 1771.20
869 ctime.seconds(106272) => 106272.00
870 ctime.days(-106272) => -1.23
871 ctime.hours(-106272) => -29.52
872 ctime.minutes(-106272) => -1771.20
873 ctime.seconds(-106272) => -106272.00
874 ctime.days($sysmis) => sysmis
875 ctime.hours($sysmis) => sysmis
876 ctime.minutes($sysmis) => sysmis
877 ctime.seconds($sysmis) => sysmis
878 ctime.days('a') => error
879 ctime.hours('b') => error
880 ctime.minutes('c') => error
881 ctime.seconds('d') => error
882
883 ctime.days(date.dmy(15,10,1582)) => 1.00
884 ctime.days(date.dmy(6,9,1719)) => 50000.00
885 ctime.days(date.dmy(24,1,1583)) => 102.00
886 ctime.days(date.dmy(14,12,1585)) => 1157.00
887 ctime.days(date.dmy(26,11,1621)) => 14288.00
888 ctime.days(date.dmy(25,12,1821)) => 87365.00
889 ctime.days(date.dmy(3,12,1882)) => 109623.00
890 ctime.days(date.dmy(6,4,2002)) => 153211.00
891 ctime.days(date.dmy(19,12,1999)) => 152372.00
892 ctime.days(date.dmy(1,10,1978)) => 144623.00
893 ctime.days(date.dmy(0,10,1978)) => 144622.00
894 ctime.days(date.dmy(32,10,1978)) => sysmis
895 ctime.days(date.dmy(31,0,1978)) => 144349.00
896 ctime.days(date.dmy(31,13,1978)) => 144745.00
897 ctime.days(date.dmy($sysmis,10,1978)) => sysmis
898 ctime.days(date.dmy(31,$sysmis,1978)) => sysmis
899 ctime.days(date.dmy(31,10,$sysmis)) => sysmis
900 ctime.days(date.dmy($sysmis,$sysmis,1978)) => sysmis
901 ctime.days(date.dmy(31,$sysmis,$sysmis)) => sysmis
902 ctime.days(date.dmy($sysmis,10,$sysmis)) => sysmis
903 ctime.days(date.dmy($sysmis,$sysmis,$sysmis)) => sysmis
904 date.dmy('a',1,2) => error
905 date.dmy(1,'a',2) => error
906 date.dmy(1,2,'a') => error
907
908 ctime.days(date.mdy(10,15,1582)) => 1.00
909 ctime.days(date.mdy(9,6,1719)) => 50000.00
910 ctime.days(date.mdy(1,24,1583)) => 102.00
911 ctime.days(date.mdy(12,14,1585)) => 1157.00
912 ctime.days(date.mdy(11,26,1621)) => 14288.00
913 ctime.days(date.mdy(12,25,1821)) => 87365.00
914 ctime.days(date.mdy(12,3,1882)) => 109623.00
915 ctime.days(date.mdy(4,6,2002)) => 153211.00
916 ctime.days(date.mdy(12,19,1999)) => 152372.00
917 ctime.days(date.mdy(10,1,1978)) => 144623.00
918 ctime.days(date.mdy(10,0,1978)) => 144622.00
919 ctime.days(date.mdy(10,32,1978)) => sysmis
920 ctime.days(date.mdy(0,31,1978)) => 144349.00
921 ctime.days(date.mdy(13,31,1978)) => 144745.00
922 ctime.days(date.mdy(10,$sysmis,1978)) => sysmis
923 ctime.days(date.mdy($sysmis,31,1978)) => sysmis
924 ctime.days(date.mdy(10,31,$sysmis)) => sysmis
925 ctime.days(date.mdy($sysmis,$sysmis,1978)) => sysmis
926 ctime.days(date.mdy($sysmis,31,$sysmis)) => sysmis
927 ctime.days(date.mdy(10,$sysmis,$sysmis)) => sysmis
928 ctime.days(date.mdy($sysmis,$sysmis,$sysmis)) => sysmis
929 date.mdy('a',1,2) => error
930 date.mdy(1,'a',2) => error
931 date.mdy(1,2,'a') => error
932
933 ctime.days(date.moyr(1,2000)) => 152385.00
934 ctime.days(date.moyr(2,2000)) => 152416.00
935 ctime.days(date.moyr(3,2000)) => 152445.00
936 ctime.days(date.moyr(4,2000)) => 152476.00
937 ctime.days(date.moyr(5,2000)) => 152506.00
938 ctime.days(date.moyr(13,2000)) => 152751.00
939 ctime.days(date.moyr(14,2000)) => sysmis
940 ctime.days(date.moyr($sysmis,2000)) => sysmis
941 ctime.days(date.moyr(1,$sysmis)) => sysmis
942 ctime.days(date.moyr($sysmis,$sysmis)) => sysmis
943 date.moyr('a',2000) => error
944 date.moyr(5,'a') => error
945 date.moyr('a','b') => error
946
947 ctime.days(date.qyr(1,2000)) => 152385.00
948 ctime.days(date.qyr(2,2000)) => 152476.00
949 ctime.days(date.qyr(5,2000)) => 152751.00
950 ctime.days(date.qyr(6,2000)) => sysmis
951 ctime.days(date.qyr($sysmis,2000)) => sysmis
952 ctime.days(date.qyr(1,$sysmis)) => sysmis
953 ctime.days(date.qyr($sysmis,$sysmis)) => sysmis
954 date.qyr('a',2000) => error
955 date.qyr(5,'a') => error
956 date.qyr('a','b') => error
957
958 ctime.days(date.wkyr(1,2000)) => 152385.00
959 ctime.days(date.wkyr(15,1999)) => 152118.00
960 ctime.days(date.wkyr(36,1999)) => 152265.00
961 ctime.days(date.wkyr(54,1999)) => sysmis
962 ctime.days(date.wkyr($sysmis,1999)) => sysmis
963 ctime.days(date.wkyr(1,$sysmis)) => sysmis
964 ctime.days(date.wkyr($sysmis,$sysmis)) => sysmis
965 date.wkyr('a',1999) => error
966 date.wkyr(5,'a') => error
967 date.wkyr('a','b') => error
968
969 ctime.days(date.yrday(2000,1)) => 152385.00
970 ctime.days(date.yrday(2000,100)) => 152484.00
971 ctime.days(date.yrday(2000,253)) => 152637.00
972 ctime.days(date.yrday(2000,500)) => sysmis
973 ctime.days(date.yrday(2000,-100)) => sysmis
974 ctime.days(date.yrday(1999,$sysmis)) => sysmis
975 ctime.days(date.yrday($sysmis,1)) => sysmis
976 ctime.days(date.yrday($sysmis,$sysmis)) => sysmis
977 date.yrday(1999,'a') => error
978 date.yrday('a',5) => error
979 date.yrday('a','b') => error
980 EOF
981
982 # FIXME: XDATE.* functions
983 # FIXME: LAG
984 # FIXME: YRMODA
985
986 printf "expressions..."
987 for d in *.expr; do
988     base=`echo $d | sed 's/\.expr$//'`
989
990     # Remove comments.
991     sed -ne 's/#.*//;/^[        ]*$/!p' < $base.expr > $base.clean
992     if [ $? -ne 0 ] ; then no_result ; fi
993
994     for optimize in opt noopt; do
995         if test optimize = opt; then
996             opt_kw=''
997         else
998             opt_kw=' NOOPTIMIZE'
999         fi
1000         
1001         # Translate to DEBUG EVALUATE commands.
1002         activity="$base, $optimize: create input"
1003         sed 's#^\(.*\) => \(.*\)$#DEBUG EVALUATE'"$opt_kw"'/\1.#' \
1004             < $base.clean > $base.$optimize.stat
1005         if [ $? -ne 0 ] ; then no_result ; fi
1006
1007         # Run.
1008         activity="$base, $optimize: run program"
1009         $SUPERVISOR $top_builddir/src/pspp --testing-mode -o raw-ascii \
1010             $base.$optimize.stat > $base.$optimize.err 2> $base.$optimize.out
1011
1012         # Compare.
1013         activity="$base, $optimize: compare output"
1014         perl -pi -e 's/^\s*$//g' $base.clean $base.$optimize.out
1015         diff -b $base.clean $base.$optimize.out
1016         if [ $? -ne 0 ] ; then fail ; fi
1017     done
1018     num=`echo $d | sed 's/-.*//'`
1019     printf " $num"
1020 done
1021 printf ' ...done\n'
1022 pass