87d480de035a23196ca8472f3adccfffb2f2e268
[pspp] / tests / language / expressions / evaluate.at
1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
3 dnl
4 dnl This program is free software: you can redistribute it and/or modify
5 dnl it under the terms of the GNU General Public License as published by
6 dnl the Free Software Foundation, either version 3 of the License, or
7 dnl (at your option) any later version.
8 dnl
9 dnl This program is distributed in the hope that it will be useful,
10 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
11 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 dnl GNU General Public License for more details.
13 dnl
14 dnl You should have received a copy of the GNU General Public License
15 dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 m4_define([CHECK_EXPR_EVAL],
17   [AT_SETUP([expressions - $1])
18    AT_KEYWORDS([expression])
19    AT_DATA([evaluate.sps],
20      [set mxwarn 1000.
21 set mxerr 1000.
22 set epoch 1940.
23 m4_foreach([check], [m4_shift($@)],
24                  [DEBUG EVALUATE NOOPT m4_argn(4, check)/[]m4_car(check).
25 DEBUG EVALUATE m4_argn(4, check)/[]m4_car(check).
26 ])])
27    AT_CAPTURE_FILE([evaluate.sps])
28    m4_pushdef([i], [3])
29    AT_CHECK([pspp --testing-mode -O format=csv evaluate.sps],
30      [m4_if(m4_bregexp([m4_foreach([check], [m4_shift($@)], [m4_argn(3, check)])], [error:]), [-1], [0], [1])],
31      [stdout])
32    AT_DATA([expout], [m4_foreach([check], [m4_shift($@)],
33         [m4_define([i], m4_incr(i))dnl
34 m4_if(m4_argn(3, check), [], [], [evaluate.sps:[]i[]: m4_argn(3, check)
35 ])dnl
36 m4_argn(2, check)
37 m4_define([i], m4_incr(i))dnl
38 m4_if(m4_argn(3, check), [], [], [evaluate.sps:[]i[]: m4_argn(3, check)
39 ])dnl
40 m4_argn(2, check)
41 ])])
42    AT_CHECK([[sed '
43 # Transform "file:line.column:" into plain "file:line:",
44 # because column numbers change between opt and noopt versions.
45 s/\(evaluate.sps:[0-9]\{1,\}\)\.[0-9]\{1,\}:/\1:/
46
47 # Remove leading or trailing quotes and un-double CSV quotes.
48 s/^"//
49 s/"$//
50 s/""/"/g
51 # "
52
53 # Delete blank lines
54 /^$/d' stdout]],
55      [0], [expout], [])
56    m4_popdef([i])
57    AT_CLEANUP])
58
59 AT_BANNER([expressions])
60
61 AT_SETUP([expressions - numeric syntax])
62 AT_KEYWORDS([expression expressions evaluate])
63 AT_DATA([evaluate-base.sps], [
64 DEBUG EVALUATE SET opt.
65 DEBUG EVALUATE /1e2.
66 DEBUG EVALUATE /1e+2.
67 DEBUG EVALUATE /1e-2.
68 DEBUG EVALUATE /1e-99.
69 ])
70
71 for opt in OPT NOOPT; do
72     AS_BOX([$opt])
73     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
74     AT_CHECK([pspp --testing-mode evaluate.sps], [0], [dnl
75 1e2 => 100.00
76
77 1e+2 => 100.00
78
79 1e-2 => 0.01
80
81 1e-99 => 0.00
82 ])
83 done
84 AT_CLEANUP
85
86 AT_SETUP([expressions - coercion to and from Boolean])
87 AT_KEYWORDS([expression expressions evaluate])
88 AT_DATA([evaluate-base.sps], [
89 DEBUG EVALUATE SET opt.
90 DEBUG EVALUATE/0 AND 1.
91 DEBUG EVALUATE/$true AND 1.
92 DEBUG EVALUATE/1 OR $false.
93 DEBUG EVALUATE/1 OR $sysmis.
94 DEBUG EVALUATE/2 OR $sysmis.
95 DEBUG EVALUATE/1 AND 3.
96 ])
97
98 for opt in OPT NOOPT; do
99     AS_BOX([$opt])
100     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
101     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
102 0 AND 1 => false
103
104 $true AND 1 => true
105
106 1 OR $false => true
107
108 1 OR $sysmis => true
109
110 evaluate.sps:7.16-7.27: error: DEBUG EVALUATE: The operands of OR must have
111 value 0 or 1.
112     7 | DEBUG EVALUATE/2 OR $sysmis.
113       |                ^~~~~~~~~~~~
114
115 evaluate.sps:7.16: note: DEBUG EVALUATE: This operand with unexpected value 2
116 will be treated as 0.
117     7 | DEBUG EVALUATE/2 OR $sysmis.
118       |                ^
119
120 2 OR $sysmis => sysmis
121
122 evaluate.sps:8.16-8.22: error: DEBUG EVALUATE: The operands of AND must have
123 value 0 or 1.
124     8 | DEBUG EVALUATE/1 AND 3.
125       |                ^~~~~~~
126
127 evaluate.sps:8.22: note: DEBUG EVALUATE: This operand with unexpected value 3
128 will be treated as 0.
129     8 | DEBUG EVALUATE/1 AND 3.
130       |                      ^
131
132 1 AND 3 => false
133 ])
134 done
135 AT_CLEANUP
136
137 AT_SETUP([expressions - addition and subtraction])
138 AT_KEYWORDS([expression expressions evaluate])
139 AT_DATA([evaluate-base.sps], [
140 DEBUG EVALUATE SET opt.
141 DEBUG EVALUATE /1 + $true.
142 DEBUG EVALUATE /$sysmis + 1.
143 DEBUG EVALUATE /7676 + $sysmis.
144 DEBUG EVALUATE /1 +3 - 2 +4 - 5.
145 DEBUG EVALUATE /$true - 4/3.
146 DEBUG EVALUATE /1 - 2.
147 DEBUG EVALUATE /52 -23.
148
149 DEBUG EVALUATE /('foo') + 5.
150 DEBUG EVALUATE /('foo') + ('bar').   /* Concatenation requires CONCAT.
151 DEBUG EVALUATE /'foo' + 'bar'.       /* Lexical concatenation succeeds.
152
153 DEBUG EVALUATE /'string' - 1e10.
154 DEBUG EVALUATE /9.5 - ''.
155
156 DEBUG EVALUATE /F2.0 + 3.
157 ])
158
159 for opt in OPT NOOPT; do
160     AS_BOX([$opt])
161     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
162     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
163 1 + $true => 2.00
164
165 $sysmis + 1 => sysmis
166
167 7676 + $sysmis => sysmis
168
169 1 +3 - 2 +4 - 5 => 1.00
170
171 $true - 4/3 => -0.33
172
173 1 - 2 => -1.00
174
175 52 -23 => 29.00
176
177 evaluate.sps:11.18-11.27: error: DEBUG EVALUATE: Both operands of + must be
178 numeric.
179    11 | DEBUG EVALUATE /('foo') + 5.
180       |                  ^~~~~~~~~~
181
182 evaluate.sps:11.18-11.22: note: DEBUG EVALUATE: This operand has type 'string'.
183    11 | DEBUG EVALUATE /('foo') + 5.
184       |                  ^~~~~
185
186 evaluate.sps:11.27: note: DEBUG EVALUATE: This operand has type 'number'.
187    11 | DEBUG EVALUATE /('foo') + 5.
188       |                           ^
189
190 ('foo') + 5 => error
191
192 evaluate.sps:12.18-12.32: error: DEBUG EVALUATE: Both operands of + must be
193 numeric.
194    12 | DEBUG EVALUATE /('foo') + ('bar').   /* Concatenation requires CONCAT.
195       |                  ^~~~~~~~~~~~~~~
196
197 evaluate.sps:12.18-12.22: note: DEBUG EVALUATE: This operand has type 'string'.
198    12 | DEBUG EVALUATE /('foo') + ('bar').   /* Concatenation requires CONCAT.
199       |                  ^~~~~
200
201 evaluate.sps:12.28-12.32: note: DEBUG EVALUATE: This operand has type 'string'.
202    12 | DEBUG EVALUATE /('foo') + ('bar').   /* Concatenation requires CONCAT.
203       |                            ^~~~~
204
205 ('foo') + ('bar') => error
206
207 'foo' + 'bar' => "foobar"
208
209 evaluate.sps:15.17-15.31: error: DEBUG EVALUATE: Both operands of - must be
210 numeric.
211    15 | DEBUG EVALUATE /'string' - 1e10.
212       |                 ^~~~~~~~~~~~~~~
213
214 evaluate.sps:15.17-15.24: note: DEBUG EVALUATE: This operand has type 'string'.
215    15 | DEBUG EVALUATE /'string' - 1e10.
216       |                 ^~~~~~~~
217
218 evaluate.sps:15.26-15.31: note: DEBUG EVALUATE: This operand has type 'number'.
219    15 | DEBUG EVALUATE /'string' - 1e10.
220       |                          ^~~~~~
221
222 'string' - 1e10 => error
223
224 evaluate.sps:16.17-16.24: error: DEBUG EVALUATE: Both operands of - must be
225 numeric.
226    16 | DEBUG EVALUATE /9.5 - ''.
227       |                 ^~~~~~~~
228
229 evaluate.sps:16.17-16.19: note: DEBUG EVALUATE: This operand has type 'number'.
230    16 | DEBUG EVALUATE /9.5 - ''.
231       |                 ^~~
232
233 evaluate.sps:16.23-16.24: note: DEBUG EVALUATE: This operand has type 'string'.
234    16 | DEBUG EVALUATE /9.5 - ''.
235       |                       ^~
236
237 9.5 - '' => error
238
239 evaluate.sps:18.17-18.24: error: DEBUG EVALUATE: Both operands of + must be
240 numeric.
241    18 | DEBUG EVALUATE /F2.0 + 3.
242       |                 ^~~~~~~~
243
244 evaluate.sps:18.17-18.20: note: DEBUG EVALUATE: This operand has type 'format'.
245    18 | DEBUG EVALUATE /F2.0 + 3.
246       |                 ^~~~
247
248 evaluate.sps:18.24: note: DEBUG EVALUATE: This operand has type 'number'.
249    18 | DEBUG EVALUATE /F2.0 + 3.
250       |                        ^
251
252 F2.0 + 3 => error
253 ])
254 done
255 AT_CLEANUP
256
257 AT_SETUP([expressions - multiplication and division])
258 AT_KEYWORDS([expression expressions evaluate])
259 AT_DATA([evaluate-base.sps], [
260 DEBUG EVALUATE SET opt.
261 DEBUG EVALUATE /5 * 10.
262 DEBUG EVALUATE /10 * $true.
263 DEBUG EVALUATE /$true * 5.
264 DEBUG EVALUATE /1.5 * $true.
265 DEBUG EVALUATE /$sysmis * 15.
266 DEBUG EVALUATE /8.5 / $sysmis.
267 DEBUG EVALUATE /2 * 5 / 10.
268 DEBUG EVALUATE /1 / 2.
269 DEBUG EVALUATE /2 / 5.
270 DEBUG EVALUATE /12 / 3 / 2.
271
272 DEBUG EVALUATE /'x' * 1.
273 DEBUG EVALUATE /2 / 'x'.
274 ])
275
276 for opt in OPT NOOPT; do
277     AS_BOX([$opt])
278     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
279     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
280 5 * 10 => 50.00
281
282 10 * $true => 10.00
283
284 $true * 5 => 5.00
285
286 1.5 * $true => 1.50
287
288 $sysmis * 15 => sysmis
289
290 8.5 / $sysmis => sysmis
291
292 2 * 5 / 10 => 1.00
293
294 1 / 2 => 0.50
295
296 2 / 5 => 0.40
297
298 12 / 3 / 2 => 2.00
299
300 evaluate.sps:14.17-14.23: error: DEBUG EVALUATE: Both operands of * must be
301 numeric.
302    14 | DEBUG EVALUATE /'x' * 1.
303       |                 ^~~~~~~
304
305 evaluate.sps:14.17-14.19: note: DEBUG EVALUATE: This operand has type 'string'.
306    14 | DEBUG EVALUATE /'x' * 1.
307       |                 ^~~
308
309 evaluate.sps:14.23: note: DEBUG EVALUATE: This operand has type 'number'.
310    14 | DEBUG EVALUATE /'x' * 1.
311       |                       ^
312
313 'x' * 1 => error
314
315 evaluate.sps:15.17-15.23: error: DEBUG EVALUATE: Both operands of / must be
316 numeric.
317    15 | DEBUG EVALUATE /2 / 'x'.
318       |                 ^~~~~~~
319
320 evaluate.sps:15.17: note: DEBUG EVALUATE: This operand has type 'number'.
321    15 | DEBUG EVALUATE /2 / 'x'.
322       |                 ^
323
324 evaluate.sps:15.21-15.23: note: DEBUG EVALUATE: This operand has type 'string'.
325    15 | DEBUG EVALUATE /2 / 'x'.
326       |                     ^~~
327
328 2 / 'x' => error
329 ])
330 done
331 AT_CLEANUP
332
333 AT_SETUP([expressions - exponentiation])
334 AT_KEYWORDS([expression expressions evaluate])
335 AT_DATA([evaluate-base.sps], [
336 DEBUG EVALUATE SET opt.
337 DEBUG EVALUATE /2**8.
338 DEBUG EVALUATE /(2**3)**4.
339 DEBUG EVALUATE /2**3**4.
340 DEBUG EVALUATE /-2**2.
341 DEBUG EVALUATE /-2**-3**-4.
342 DEBUG EVALUATE /-((2**-3)**-4).
343 ])
344
345 for opt in OPT NOOPT; do
346     AS_BOX([$opt])
347     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
348     AT_CHECK([pspp --testing-mode evaluate.sps], [0], [dnl
349 2**8 => 256.00
350
351 (2**3)**4 => 4096.00
352
353 evaluate.sps:5.17-5.23: warning: DEBUG EVALUATE: The exponentiation operator
354 (`**') is left-associative: `a**b**c' equals `(a**b)**c', not `a**(b**c)'.  To
355 disable this warning, insert parentheses.
356     5 | DEBUG EVALUATE /2**3**4.
357       |                 ^~~~~~~
358
359 2**3**4 => 4096.00
360
361 -2**2 => -4.00
362
363 evaluate.sps:7.17-7.26: warning: DEBUG EVALUATE: The exponentiation operator
364 (`**') is left-associative: `a**b**c' equals `(a**b)**c', not `a**(b**c)'.  To
365 disable this warning, insert parentheses.
366     7 | DEBUG EVALUATE /-2**-3**-4.
367       |                 ^~~~~~~~~~
368
369 -2**-3**-4 => -4096.00
370
371 -((2**-3)**-4) => -4096.00
372 ])
373 done
374 AT_CLEANUP
375
376 AT_SETUP([expressions - unary minus])
377 AT_KEYWORDS([expression expressions evaluate])
378 AT_DATA([evaluate-base.sps], [
379 DEBUG EVALUATE SET opt.
380 DEBUG EVALUATE /2+-3.
381 DEBUG EVALUATE /2*-3.
382 DEBUG EVALUATE /-3**2.
383 DEBUG EVALUATE /(-3)**2.
384 DEBUG EVALUATE /-(3**2).
385 DEBUG EVALUATE /2**-1.
386 DEBUG EVALUATE /0**0.
387 DEBUG EVALUATE /0**-1.
388 DEBUG EVALUATE /(-3)**1.5.
389 ])
390
391 for opt in OPT NOOPT; do
392     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
393     AT_CHECK([pspp --testing-mode evaluate.sps], [0], [dnl
394 2+-3 => -1.00
395
396 2*-3 => -6.00
397
398 -3**2 => -9.00
399
400 (-3)**2 => 9.00
401
402 -(3**2) => -9.00
403
404 2**-1 => 0.50
405
406 0**0 => sysmis
407
408 0**-1 => sysmis
409
410 (-3)**1.5 => sysmis
411 ])
412 done
413 AT_CLEANUP
414
415 AT_SETUP([expressions - AND truth table])
416 AT_KEYWORDS([expression expressions evaluate])
417 AT_DATA([evaluate-base.sps], [
418 DEBUG EVALUATE SET opt.
419 DEBUG EVALUATE /$false AND $false.
420 DEBUG EVALUATE /$false AND $true.
421 DEBUG EVALUATE /$false AND $sysmis.
422 DEBUG EVALUATE /$true AND $false.
423 DEBUG EVALUATE /$true AND $true.
424 DEBUG EVALUATE /$true AND $sysmis.
425 DEBUG EVALUATE /$sysmis AND $false.
426 DEBUG EVALUATE /$sysmis AND $true.
427 DEBUG EVALUATE /$sysmis AND $sysmis.
428 DEBUG EVALUATE /$false & $false.
429 DEBUG EVALUATE /$false & $true.
430 DEBUG EVALUATE /$false & $sysmis.
431 DEBUG EVALUATE /$true & $false.
432 DEBUG EVALUATE /$true & $true.
433 DEBUG EVALUATE /$true & $sysmis.
434 DEBUG EVALUATE /$sysmis & $false.
435 DEBUG EVALUATE /$sysmis & $true.
436 DEBUG EVALUATE /$sysmis & $sysmis.
437 ])
438
439 for opt in OPT NOOPT; do
440     AS_BOX([$opt])
441     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
442     AT_CHECK([pspp --testing-mode evaluate.sps], [0], [dnl
443 $false AND $false => false
444
445 $false AND $true => false
446
447 $false AND $sysmis => false
448
449 $true AND $false => false
450
451 $true AND $true => true
452
453 $true AND $sysmis => sysmis
454
455 $sysmis AND $false => false
456
457 $sysmis AND $true => sysmis
458
459 $sysmis AND $sysmis => sysmis
460
461 $false & $false => false
462
463 $false & $true => false
464
465 $false & $sysmis => false
466
467 $true & $false => false
468
469 $true & $true => true
470
471 $true & $sysmis => sysmis
472
473 $sysmis & $false => false
474
475 $sysmis & $true => sysmis
476
477 $sysmis & $sysmis => sysmis
478 ])
479 done
480 AT_CLEANUP
481
482 AT_SETUP([expressions - OR truth table])
483 AT_KEYWORDS([expression expressions evaluate])
484 AT_DATA([evaluate-base.sps], [
485 DEBUG EVALUATE SET opt.
486 DEBUG EVALUATE /$false OR $false.
487 DEBUG EVALUATE /$false OR $true.
488 DEBUG EVALUATE /$false OR $sysmis.
489 DEBUG EVALUATE /$true OR $false.
490 DEBUG EVALUATE /$true OR $true.
491 DEBUG EVALUATE /$true OR $sysmis.
492 DEBUG EVALUATE /$sysmis OR $false.
493 DEBUG EVALUATE /$sysmis OR $true.
494 DEBUG EVALUATE /$sysmis OR $sysmis.
495 DEBUG EVALUATE /$false | $false.
496 DEBUG EVALUATE /$false | $true.
497 DEBUG EVALUATE /$false | $sysmis.
498 DEBUG EVALUATE /$true | $false.
499 DEBUG EVALUATE /$true | $true.
500 DEBUG EVALUATE /$true | $sysmis.
501 DEBUG EVALUATE /$sysmis | $false.
502 DEBUG EVALUATE /$sysmis | $true.
503 DEBUG EVALUATE /$sysmis | $sysmis.
504 ])
505
506 for opt in OPT NOOPT; do
507     AS_BOX([$opt])
508     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
509     AT_CHECK([pspp --testing-mode evaluate.sps], [0], [dnl
510 $false OR $false => false
511
512 $false OR $true => true
513
514 $false OR $sysmis => sysmis
515
516 $true OR $false => true
517
518 $true OR $true => true
519
520 $true OR $sysmis => true
521
522 $sysmis OR $false => sysmis
523
524 $sysmis OR $true => true
525
526 $sysmis OR $sysmis => sysmis
527
528 $false | $false => false
529
530 $false | $true => true
531
532 $false | $sysmis => sysmis
533
534 $true | $false => true
535
536 $true | $true => true
537
538 $true | $sysmis => true
539
540 $sysmis | $false => sysmis
541
542 $sysmis | $true => true
543
544 $sysmis | $sysmis => sysmis
545 ])
546 done
547 AT_CLEANUP
548
549 AT_SETUP([expressions - NOT truth table])
550 AT_KEYWORDS([expression expressions evaluate])
551 AT_DATA([evaluate-base.sps], [
552 DEBUG EVALUATE SET opt.
553 DEBUG EVALUATE /not $false.
554 DEBUG EVALUATE /not 0.
555 DEBUG EVALUATE /not 2.5.
556 DEBUG EVALUATE /not $true.
557 DEBUG EVALUATE /not 1.
558 DEBUG EVALUATE /not $sysmis.
559 DEBUG EVALUATE /~ $false.
560 DEBUG EVALUATE /~ 0.
561 DEBUG EVALUATE /~ 2.5.
562 DEBUG EVALUATE /~ $true.
563 DEBUG EVALUATE /~ 1.
564 DEBUG EVALUATE /~ $sysmis.
565 ])
566
567 for opt in OPT NOOPT; do
568     AS_BOX([$opt])
569     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
570     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
571 not $false => true
572
573 not 0 => true
574
575 evaluate.sps:5.17-5.23: error: DEBUG EVALUATE: The operand of NOT must have
576 value 0 or 1.
577     5 | DEBUG EVALUATE /not 2.5.
578       |                 ^~~~~~~
579
580 evaluate.sps:5.21-5.23: note: DEBUG EVALUATE: This operand with unexpected
581 value 2.5 will be treated as 0.
582     5 | DEBUG EVALUATE /not 2.5.
583       |                     ^~~
584
585 not 2.5 => true
586
587 not $true => false
588
589 not 1 => false
590
591 not $sysmis => sysmis
592
593 ~ $false => true
594
595 ~ 0 => true
596
597 evaluate.sps:11.17-11.21: error: DEBUG EVALUATE: The operand of NOT must have
598 value 0 or 1.
599    11 | DEBUG EVALUATE /~ 2.5.
600       |                 ^~~~~
601
602 evaluate.sps:11.19-11.21: note: DEBUG EVALUATE: This operand with unexpected
603 value 2.5 will be treated as 0.
604    11 | DEBUG EVALUATE /~ 2.5.
605       |                   ^~~
606
607 ~ 2.5 => true
608
609 ~ $true => false
610
611 ~ 1 => false
612
613 ~ $sysmis => sysmis
614 ])
615 done
616 AT_CLEANUP
617
618 AT_SETUP([expressions - = <= <])
619 AT_KEYWORDS([expression expressions evaluate eq le lt])
620 AT_DATA([evaluate-base.sps], [
621 DEBUG EVALUATE SET opt.
622 DEBUG EVALUATE /1 eq 1.
623 DEBUG EVALUATE /1 = 1.
624 DEBUG EVALUATE /1 eq 2.
625 DEBUG EVALUATE /2 = 3.
626 DEBUG EVALUATE /1 eq 'foobar'.
627 DEBUG EVALUATE /'baz' = 10.
628 DEBUG EVALUATE /'baz' = f8.2.
629 DEBUG EVALUATE /'baz' = 'baz'.
630 DEBUG EVALUATE /'quux' = 'bar'.
631 DEBUG EVALUATE /'bar  ' = 'bar'.
632 DEBUG EVALUATE /'asdf     ' = 'asdf  '.
633 DEBUG EVALUATE /'asdfj     ' = 'asdf'.
634 DEBUG EVALUATE /1 + 2 = 3.
635 DEBUG EVALUATE /1 >= 2 = 2 ge 3.
636 DEBUG EVALUATE /3 ne 2 != 1.
637 DEBUG EVALUATE /3 > 2 > 1.
638
639 DEBUG EVALUATE /1 <= 2.
640 DEBUG EVALUATE /2.5 <= 1.5.
641 DEBUG EVALUATE /1 le 2.
642 DEBUG EVALUATE /2 <= 2.
643 DEBUG EVALUATE /2 le 2.
644 DEBUG EVALUATE /2 < = 2.
645 DEBUG EVALUATE /1 <= 'foobar'.
646 DEBUG EVALUATE /'baz' <= 10.
647 DEBUG EVALUATE /'quux' <= 5.55.
648 DEBUG EVALUATE /'0123' <= '0123'.
649 DEBUG EVALUATE /'0123' <= '0124'.
650 DEBUG EVALUATE /'0124' le '0123'.
651 DEBUG EVALUATE /'0123  ' <= '0123'.
652 DEBUG EVALUATE /'0123' le '0123  '.
653
654 DEBUG EVALUATE /1 < 2.
655 DEBUG EVALUATE /2.5 < 1.5.
656 DEBUG EVALUATE /3.5 lt 4.
657 DEBUG EVALUATE /4 lt 3.5
658 DEBUG EVALUATE /1 lt 'foobar'.
659 DEBUG EVALUATE /5 lt 'foobar'.
660 DEBUG EVALUATE /'baz' < 10.
661 DEBUG EVALUATE /'quux' < 5.55.
662 DEBUG EVALUATE /'0123' lt '0123'.
663 DEBUG EVALUATE /'0123' < '0124'.
664 DEBUG EVALUATE /'0124' lt '0123'.
665 DEBUG EVALUATE /'0123  ' < '0123'.
666 DEBUG EVALUATE /'0123' lt '0123  '.
667 ])
668
669 for opt in OPT NOOPT; do
670     AS_BOX([$opt])
671     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
672     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
673 1 eq 1 => true
674
675 1 = 1 => true
676
677 1 eq 2 => false
678
679 2 = 3 => false
680
681 evaluate.sps:7.17-7.29: error: DEBUG EVALUATE: Both operands of EQ must have
682 the same type.
683     7 | DEBUG EVALUATE /1 eq 'foobar'.
684       |                 ^~~~~~~~~~~~~
685
686 evaluate.sps:7.17: note: DEBUG EVALUATE: This operand has type 'number'.
687     7 | DEBUG EVALUATE /1 eq 'foobar'.
688       |                 ^
689
690 evaluate.sps:7.22-7.29: note: DEBUG EVALUATE: This operand has type 'string'.
691     7 | DEBUG EVALUATE /1 eq 'foobar'.
692       |                      ^~~~~~~~
693
694 1 eq 'foobar' => error
695
696 evaluate.sps:8.17-8.26: error: DEBUG EVALUATE: Both operands of = must have the
697 same type.
698     8 | DEBUG EVALUATE /'baz' = 10.
699       |                 ^~~~~~~~~~
700
701 evaluate.sps:8.17-8.21: note: DEBUG EVALUATE: This operand has type 'string'.
702     8 | DEBUG EVALUATE /'baz' = 10.
703       |                 ^~~~~
704
705 evaluate.sps:8.25-8.26: note: DEBUG EVALUATE: This operand has type 'number'.
706     8 | DEBUG EVALUATE /'baz' = 10.
707       |                         ^~
708
709 'baz' = 10 => error
710
711 evaluate.sps:9.17-9.28: error: DEBUG EVALUATE: Both operands of = must have the
712 same type.
713     9 | DEBUG EVALUATE /'baz' = f8.2.
714       |                 ^~~~~~~~~~~~
715
716 evaluate.sps:9.17-9.21: note: DEBUG EVALUATE: This operand has type 'string'.
717     9 | DEBUG EVALUATE /'baz' = f8.2.
718       |                 ^~~~~
719
720 evaluate.sps:9.25-9.28: note: DEBUG EVALUATE: This operand has type 'format'.
721     9 | DEBUG EVALUATE /'baz' = f8.2.
722       |                         ^~~~
723
724 'baz' = f8.2 => error
725
726 'baz' = 'baz' => true
727
728 'quux' = 'bar' => false
729
730 'bar  ' = 'bar' => true
731
732 'asdf     ' = 'asdf  ' => true
733
734 'asdfj     ' = 'asdf' => false
735
736 1 + 2 = 3 => true
737
738 evaluate.sps:16.17-16.31: warning: DEBUG EVALUATE: Chaining relational
739 operators (e.g. `a < b < c') will not produce the mathematically expected
740 result.  Use the AND logical operator to fix the problem (e.g. `a < b AND b <
741 c').  To disable this warning, insert parentheses.
742    16 | DEBUG EVALUATE /1 >= 2 = 2 ge 3.
743       |                 ^~~~~~~~~~~~~~~
744
745 1 >= 2 = 2 ge 3 => false
746
747 evaluate.sps:17.24: error: DEBUG EVALUATE: Syntax error at `!': expecting end
748 of command.
749
750 3 ne 2 != 1 => error
751
752 evaluate.sps:18.17-18.25: warning: DEBUG EVALUATE: Chaining relational
753 operators (e.g. `a < b < c') will not produce the mathematically expected
754 result.  Use the AND logical operator to fix the problem (e.g. `a < b AND b <
755 c').  To disable this warning, insert parentheses.
756    18 | DEBUG EVALUATE /3 > 2 > 1.
757       |                 ^~~~~~~~~
758
759 3 > 2 > 1 => false
760
761 1 <= 2 => true
762
763 2.5 <= 1.5 => false
764
765 1 le 2 => true
766
767 2 <= 2 => true
768
769 2 le 2 => true
770
771 evaluate.sps:25.21: error: DEBUG EVALUATE: Syntax error at `='.
772
773 2 < = 2 => error
774
775 evaluate.sps:26.17-26.29: error: DEBUG EVALUATE: Both operands of <= must have
776 the same type.
777    26 | DEBUG EVALUATE /1 <= 'foobar'.
778       |                 ^~~~~~~~~~~~~
779
780 evaluate.sps:26.17: note: DEBUG EVALUATE: This operand has type 'number'.
781    26 | DEBUG EVALUATE /1 <= 'foobar'.
782       |                 ^
783
784 evaluate.sps:26.22-26.29: note: DEBUG EVALUATE: This operand has type 'string'.
785    26 | DEBUG EVALUATE /1 <= 'foobar'.
786       |                      ^~~~~~~~
787
788 1 <= 'foobar' => error
789
790 evaluate.sps:27.17-27.27: error: DEBUG EVALUATE: Both operands of <= must have
791 the same type.
792    27 | DEBUG EVALUATE /'baz' <= 10.
793       |                 ^~~~~~~~~~~
794
795 evaluate.sps:27.17-27.21: note: DEBUG EVALUATE: This operand has type 'string'.
796    27 | DEBUG EVALUATE /'baz' <= 10.
797       |                 ^~~~~
798
799 evaluate.sps:27.26-27.27: note: DEBUG EVALUATE: This operand has type 'number'.
800    27 | DEBUG EVALUATE /'baz' <= 10.
801       |                          ^~
802
803 'baz' <= 10 => error
804
805 evaluate.sps:28.17-28.30: error: DEBUG EVALUATE: Both operands of <= must have
806 the same type.
807    28 | DEBUG EVALUATE /'quux' <= 5.55.
808       |                 ^~~~~~~~~~~~~~
809
810 evaluate.sps:28.17-28.22: note: DEBUG EVALUATE: This operand has type 'string'.
811    28 | DEBUG EVALUATE /'quux' <= 5.55.
812       |                 ^~~~~~
813
814 evaluate.sps:28.27-28.30: note: DEBUG EVALUATE: This operand has type 'number'.
815    28 | DEBUG EVALUATE /'quux' <= 5.55.
816       |                           ^~~~
817
818 'quux' <= 5.55 => error
819
820 '0123' <= '0123' => true
821
822 '0123' <= '0124' => true
823
824 '0124' le '0123' => false
825
826 '0123  ' <= '0123' => true
827
828 '0123' le '0123  ' => true
829
830 1 < 2 => true
831
832 2.5 < 1.5 => false
833
834 3.5 lt 4 => true
835
836 4 lt 3.5 => false
837
838 evaluate.sps:39.17-39.29: error: DEBUG EVALUATE: Both operands of < must have
839 the same type.
840    39 | DEBUG EVALUATE /1 lt 'foobar'.
841       |                 ^~~~~~~~~~~~~
842
843 evaluate.sps:39.17: note: DEBUG EVALUATE: This operand has type 'number'.
844    39 | DEBUG EVALUATE /1 lt 'foobar'.
845       |                 ^
846
847 evaluate.sps:39.22-39.29: note: DEBUG EVALUATE: This operand has type 'string'.
848    39 | DEBUG EVALUATE /1 lt 'foobar'.
849       |                      ^~~~~~~~
850
851 1 lt 'foobar' => error
852
853 evaluate.sps:40.17-40.29: error: DEBUG EVALUATE: Both operands of < must have
854 the same type.
855    40 | DEBUG EVALUATE /5 lt 'foobar'.
856       |                 ^~~~~~~~~~~~~
857
858 evaluate.sps:40.17: note: DEBUG EVALUATE: This operand has type 'number'.
859    40 | DEBUG EVALUATE /5 lt 'foobar'.
860       |                 ^
861
862 evaluate.sps:40.22-40.29: note: DEBUG EVALUATE: This operand has type 'string'.
863    40 | DEBUG EVALUATE /5 lt 'foobar'.
864       |                      ^~~~~~~~
865
866 5 lt 'foobar' => error
867
868 evaluate.sps:41.17-41.26: error: DEBUG EVALUATE: Both operands of < must have
869 the same type.
870    41 | DEBUG EVALUATE /'baz' < 10.
871       |                 ^~~~~~~~~~
872
873 evaluate.sps:41.17-41.21: note: DEBUG EVALUATE: This operand has type 'string'.
874    41 | DEBUG EVALUATE /'baz' < 10.
875       |                 ^~~~~
876
877 evaluate.sps:41.25-41.26: note: DEBUG EVALUATE: This operand has type 'number'.
878    41 | DEBUG EVALUATE /'baz' < 10.
879       |                         ^~
880
881 'baz' < 10 => error
882
883 evaluate.sps:42.17-42.29: error: DEBUG EVALUATE: Both operands of < must have
884 the same type.
885    42 | DEBUG EVALUATE /'quux' < 5.55.
886       |                 ^~~~~~~~~~~~~
887
888 evaluate.sps:42.17-42.22: note: DEBUG EVALUATE: This operand has type 'string'.
889    42 | DEBUG EVALUATE /'quux' < 5.55.
890       |                 ^~~~~~
891
892 evaluate.sps:42.26-42.29: note: DEBUG EVALUATE: This operand has type 'number'.
893    42 | DEBUG EVALUATE /'quux' < 5.55.
894       |                          ^~~~
895
896 'quux' < 5.55 => error
897
898 '0123' lt '0123' => false
899
900 '0123' < '0124' => true
901
902 '0124' lt '0123' => false
903
904 '0123  ' < '0123' => false
905
906 '0123' lt '0123  ' => false
907 ])
908 done
909 AT_CLEANUP
910
911 AT_SETUP([expressions - >= > <>])
912 AT_KEYWORDS([expression expressions evaluate ge gt ne])
913 AT_DATA([evaluate-base.sps], [
914 DEBUG EVALUATE SET opt.
915 DEBUG EVALUATE /1 >= 2.
916 DEBUG EVALUATE /2.5 >= 1.5
917 DEBUG EVALUATE /1 ge 2.
918 DEBUG EVALUATE /2 >= 2.
919 DEBUG EVALUATE /2 ge 2.
920 DEBUG EVALUATE /2 > = 2.
921 DEBUG EVALUATE /1 >= 'foobar'.
922 DEBUG EVALUATE /5 ge 'foobar'.
923 DEBUG EVALUATE /'baz' ge 10.
924 DEBUG EVALUATE /'0123' ge '0123'.
925 DEBUG EVALUATE /'0123' >= '0124'.
926 DEBUG EVALUATE /'0124' >= '0123'.
927 DEBUG EVALUATE /'0123  ' ge '0123'.
928 DEBUG EVALUATE /'0123' >= '0123 '.
929
930 DEBUG EVALUATE /1 > 2.
931 DEBUG EVALUATE /2.5 > 1.5
932 DEBUG EVALUATE /3.5 gt 4.
933 DEBUG EVALUATE /4 gt 3.5
934 DEBUG EVALUATE /1 gt 'foobar'.
935 DEBUG EVALUATE /'baz' > 10.
936 DEBUG EVALUATE /'0123' > '0123'.
937 DEBUG EVALUATE /'0123' > '0124'.
938 DEBUG EVALUATE /'0124' > '0123'.
939 DEBUG EVALUATE /'0123   ' > '0123'.
940 DEBUG EVALUATE /'0123    ' > '0123 '.
941
942 DEBUG EVALUATE /1 ne 1.
943 DEBUG EVALUATE /1 ~= 1.
944 DEBUG EVALUATE /1 <> 2.
945 DEBUG EVALUATE /2 ne 3.
946 DEBUG EVALUATE /1 ~= 'foobar'.
947 DEBUG EVALUATE /'baz' ne 10.
948 DEBUG EVALUATE /'quux' ~= 5.55.
949 DEBUG EVALUATE /'foobar' <> 'foobar'.
950 DEBUG EVALUATE /'quux' ne 'bar'.
951 DEBUG EVALUATE /'bar   ' <> 'bar'.
952 DEBUG EVALUATE /'asdf       ' ~= "asdf   ".
953 DEBUG EVALUATE /1 < > 1.
954 DEBUG EVALUATE /1 ~ = 1.
955 ])
956
957 for opt in OPT NOOPT; do
958     AS_BOX([$opt])
959     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
960     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
961 1 >= 2 => false
962
963 2.5 >= 1.5 => true
964
965 1 ge 2 => false
966
967 2 >= 2 => true
968
969 2 ge 2 => true
970
971 evaluate.sps:8.21: error: DEBUG EVALUATE: Syntax error at `='.
972
973 2 > = 2 => error
974
975 evaluate.sps:9.17-9.29: error: DEBUG EVALUATE: Both operands of >= must have
976 the same type.
977     9 | DEBUG EVALUATE /1 >= 'foobar'.
978       |                 ^~~~~~~~~~~~~
979
980 evaluate.sps:9.17: note: DEBUG EVALUATE: This operand has type 'number'.
981     9 | DEBUG EVALUATE /1 >= 'foobar'.
982       |                 ^
983
984 evaluate.sps:9.22-9.29: note: DEBUG EVALUATE: This operand has type 'string'.
985     9 | DEBUG EVALUATE /1 >= 'foobar'.
986       |                      ^~~~~~~~
987
988 1 >= 'foobar' => error
989
990 evaluate.sps:10.17-10.29: error: DEBUG EVALUATE: Both operands of >= must have
991 the same type.
992    10 | DEBUG EVALUATE /5 ge 'foobar'.
993       |                 ^~~~~~~~~~~~~
994
995 evaluate.sps:10.17: note: DEBUG EVALUATE: This operand has type 'number'.
996    10 | DEBUG EVALUATE /5 ge 'foobar'.
997       |                 ^
998
999 evaluate.sps:10.22-10.29: note: DEBUG EVALUATE: This operand has type 'string'.
1000    10 | DEBUG EVALUATE /5 ge 'foobar'.
1001       |                      ^~~~~~~~
1002
1003 5 ge 'foobar' => error
1004
1005 evaluate.sps:11.17-11.27: error: DEBUG EVALUATE: Both operands of >= must have
1006 the same type.
1007    11 | DEBUG EVALUATE /'baz' ge 10.
1008       |                 ^~~~~~~~~~~
1009
1010 evaluate.sps:11.17-11.21: note: DEBUG EVALUATE: This operand has type 'string'.
1011    11 | DEBUG EVALUATE /'baz' ge 10.
1012       |                 ^~~~~
1013
1014 evaluate.sps:11.26-11.27: note: DEBUG EVALUATE: This operand has type 'number'.
1015    11 | DEBUG EVALUATE /'baz' ge 10.
1016       |                          ^~
1017
1018 'baz' ge 10 => error
1019
1020 '0123' ge '0123' => true
1021
1022 '0123' >= '0124' => false
1023
1024 '0124' >= '0123' => true
1025
1026 '0123  ' ge '0123' => true
1027
1028 '0123' >= '0123 ' => true
1029
1030 1 > 2 => false
1031
1032 2.5 > 1.5 => true
1033
1034 3.5 gt 4 => false
1035
1036 4 gt 3.5 => true
1037
1038 evaluate.sps:22.17-22.29: error: DEBUG EVALUATE: Both operands of > must have
1039 the same type.
1040    22 | DEBUG EVALUATE /1 gt 'foobar'.
1041       |                 ^~~~~~~~~~~~~
1042
1043 evaluate.sps:22.17: note: DEBUG EVALUATE: This operand has type 'number'.
1044    22 | DEBUG EVALUATE /1 gt 'foobar'.
1045       |                 ^
1046
1047 evaluate.sps:22.22-22.29: note: DEBUG EVALUATE: This operand has type 'string'.
1048    22 | DEBUG EVALUATE /1 gt 'foobar'.
1049       |                      ^~~~~~~~
1050
1051 1 gt 'foobar' => error
1052
1053 evaluate.sps:23.17-23.26: error: DEBUG EVALUATE: Both operands of > must have
1054 the same type.
1055    23 | DEBUG EVALUATE /'baz' > 10.
1056       |                 ^~~~~~~~~~
1057
1058 evaluate.sps:23.17-23.21: note: DEBUG EVALUATE: This operand has type 'string'.
1059    23 | DEBUG EVALUATE /'baz' > 10.
1060       |                 ^~~~~
1061
1062 evaluate.sps:23.25-23.26: note: DEBUG EVALUATE: This operand has type 'number'.
1063    23 | DEBUG EVALUATE /'baz' > 10.
1064       |                         ^~
1065
1066 'baz' > 10 => error
1067
1068 '0123' > '0123' => false
1069
1070 '0123' > '0124' => false
1071
1072 '0124' > '0123' => true
1073
1074 '0123   ' > '0123' => false
1075
1076 '0123    ' > '0123 ' => false
1077
1078 1 ne 1 => false
1079
1080 1 ~= 1 => false
1081
1082 1 <> 2 => true
1083
1084 2 ne 3 => true
1085
1086 evaluate.sps:34.17-34.29: error: DEBUG EVALUATE: Both operands of ~= must have
1087 the same type.
1088    34 | DEBUG EVALUATE /1 ~= 'foobar'.
1089       |                 ^~~~~~~~~~~~~
1090
1091 evaluate.sps:34.17: note: DEBUG EVALUATE: This operand has type 'number'.
1092    34 | DEBUG EVALUATE /1 ~= 'foobar'.
1093       |                 ^
1094
1095 evaluate.sps:34.22-34.29: note: DEBUG EVALUATE: This operand has type 'string'.
1096    34 | DEBUG EVALUATE /1 ~= 'foobar'.
1097       |                      ^~~~~~~~
1098
1099 1 ~= 'foobar' => error
1100
1101 evaluate.sps:35.17-35.27: error: DEBUG EVALUATE: Both operands of ~= must have
1102 the same type.
1103    35 | DEBUG EVALUATE /'baz' ne 10.
1104       |                 ^~~~~~~~~~~
1105
1106 evaluate.sps:35.17-35.21: note: DEBUG EVALUATE: This operand has type 'string'.
1107    35 | DEBUG EVALUATE /'baz' ne 10.
1108       |                 ^~~~~
1109
1110 evaluate.sps:35.26-35.27: note: DEBUG EVALUATE: This operand has type 'number'.
1111    35 | DEBUG EVALUATE /'baz' ne 10.
1112       |                          ^~
1113
1114 'baz' ne 10 => error
1115
1116 evaluate.sps:36.17-36.30: error: DEBUG EVALUATE: Both operands of ~= must have
1117 the same type.
1118    36 | DEBUG EVALUATE /'quux' ~= 5.55.
1119       |                 ^~~~~~~~~~~~~~
1120
1121 evaluate.sps:36.17-36.22: note: DEBUG EVALUATE: This operand has type 'string'.
1122    36 | DEBUG EVALUATE /'quux' ~= 5.55.
1123       |                 ^~~~~~
1124
1125 evaluate.sps:36.27-36.30: note: DEBUG EVALUATE: This operand has type 'number'.
1126    36 | DEBUG EVALUATE /'quux' ~= 5.55.
1127       |                           ^~~~
1128
1129 'quux' ~= 5.55 => error
1130
1131 'foobar' <> 'foobar' => false
1132
1133 'quux' ne 'bar' => true
1134
1135 'bar   ' <> 'bar' => false
1136
1137 'asdf       ' ~= "asdf   " => false
1138
1139 evaluate.sps:41.21: error: DEBUG EVALUATE: Syntax error at `>'.
1140
1141 1 < > 1 => error
1142
1143 evaluate.sps:42.19: error: DEBUG EVALUATE: Syntax error at `~': expecting end
1144 of command.
1145
1146 1 ~ = 1 => error
1147 ])
1148 done
1149 AT_CLEANUP
1150
1151 AT_SETUP([expressions - EXP LG10 LN SQRT ABS MOD MOD10 RND TRUNC])
1152 AT_KEYWORDS([expression expressions evaluate])
1153 AT_DATA([evaluate-base.sps], [
1154 DEBUG EVALUATE SET opt.
1155 DEBUG EVALUATE /EXP(10).
1156 DEBUG EVALUATE /EXP('x').
1157
1158 DEBUG EVALUATE /LG10(500).
1159 DEBUG EVALUATE /LG10('x').
1160
1161 DEBUG EVALUATE /SQRT(500).
1162 DEBUG EVALUATE /SQRT(-1).
1163
1164 DEBUG EVALUATE /ABS(-10.5).
1165 DEBUG EVALUATE /ABS(55.79).
1166 DEBUG EVALUATE /ABS(0).
1167 DEBUG EVALUATE /ABS(-0).
1168
1169 DEBUG EVALUATE /MOD(55.5, 2).
1170 DEBUG EVALUATE /MOD(-55.5, 2).
1171 DEBUG EVALUATE /MOD(55.5, -2).
1172 DEBUG EVALUATE /MOD(-55.5, -2).
1173 DEBUG EVALUATE /MOD('a', 2).
1174 DEBUG EVALUATE /MOD(2, 'a').
1175 DEBUG EVALUATE /MOD('a', 'b').
1176
1177 DEBUG EVALUATE /MOD10(55.5).
1178 DEBUG EVALUATE /MOD10(-55.5).
1179
1180 DEBUG EVALUATE /RND(5.4).
1181 DEBUG EVALUATE /RND(5.6).
1182 DEBUG EVALUATE /RND(-5.4).
1183 DEBUG EVALUATE /RND(-5.6).
1184 DEBUG EVALUATE /RND(5.56, .1).
1185 DEBUG EVALUATE /RND(-5.56, .1)
1186 DEBUG EVALUATE /RND(.5).
1187 DEBUG EVALUATE /RND(.5 - 2**-53).
1188 DEBUG EVALUATE /RND(.5 - 2**-52).
1189 DEBUG EVALUATE /RND(.5 - 2**-51).
1190 DEBUG EVALUATE /RND(.5 - 2**-45).
1191 DEBUG EVALUATE /RND(.5 - 2**-45, 1, 10).
1192 DEBUG EVALUATE /RND('x').
1193
1194 DEBUG EVALUATE /TRUNC(1.2).
1195 DEBUG EVALUATE /TRUNC(1.9).
1196 DEBUG EVALUATE /TRUNC(-1.2).
1197 DEBUG EVALUATE /TRUNC(-1.9).
1198 DEBUG EVALUATE /TRUNC(5.06, .1).
1199 DEBUG EVALUATE /TRUNC(-5.06, .1).
1200 DEBUG EVALUATE /TRUNC(1).
1201 DEBUG EVALUATE /TRUNC(1 - 2**-53).
1202 DEBUG EVALUATE /TRUNC(1 - 2**-52).
1203 DEBUG EVALUATE /TRUNC(1 - 2**-51).
1204 DEBUG EVALUATE /TRUNC(1 - 2**-45).
1205 DEBUG EVALUATE /TRUNC(1 - 2**-45, 1, 10).
1206 DEBUG EVALUATE /TRUNC('x').
1207 ])
1208
1209 for opt in OPT NOOPT; do
1210     AS_BOX([$opt])
1211     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
1212     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
1213 EXP(10) => 22026.47
1214
1215 evaluate.sps:4.17-4.24: error: DEBUG EVALUATE: Type mismatch invoking
1216 EXP(number) as EXP(string).
1217     4 | DEBUG EVALUATE /EXP('x').
1218       |                 ^~~~~~~~
1219
1220 EXP('x') => error
1221
1222 LG10(500) => 2.70
1223
1224 evaluate.sps:7.17-7.25: error: DEBUG EVALUATE: Type mismatch invoking
1225 LG10(number) as LG10(string).
1226     7 | DEBUG EVALUATE /LG10('x').
1227       |                 ^~~~~~~~~
1228
1229 LG10('x') => error
1230
1231 SQRT(500) => 22.36
1232
1233 SQRT(-1) => sysmis
1234
1235 ABS(-10.5) => 10.50
1236
1237 ABS(55.79) => 55.79
1238
1239 ABS(0) => 0.00
1240
1241 ABS(-0) => 0.00
1242
1243 MOD(55.5, 2) => 1.50
1244
1245 MOD(-55.5, 2) => -1.50
1246
1247 MOD(55.5, -2) => 1.50
1248
1249 MOD(-55.5, -2) => -1.50
1250
1251 evaluate.sps:21.17-21.27: error: DEBUG EVALUATE: Type mismatch invoking
1252 MOD(number, number) as MOD(string, number).
1253    21 | DEBUG EVALUATE /MOD('a', 2).
1254       |                 ^~~~~~~~~~~
1255
1256 MOD('a', 2) => error
1257
1258 evaluate.sps:22.17-22.27: error: DEBUG EVALUATE: Type mismatch invoking
1259 MOD(number, number) as MOD(number, string).
1260    22 | DEBUG EVALUATE /MOD(2, 'a').
1261       |                 ^~~~~~~~~~~
1262
1263 MOD(2, 'a') => error
1264
1265 evaluate.sps:23.17-23.29: error: DEBUG EVALUATE: Type mismatch invoking
1266 MOD(number, number) as MOD(string, string).
1267    23 | DEBUG EVALUATE /MOD('a', 'b').
1268       |                 ^~~~~~~~~~~~~
1269
1270 MOD('a', 'b') => error
1271
1272 MOD10(55.5) => 5.50
1273
1274 MOD10(-55.5) => -5.50
1275
1276 RND(5.4) => 5.00
1277
1278 RND(5.6) => 6.00
1279
1280 RND(-5.4) => -5.00
1281
1282 RND(-5.6) => -6.00
1283
1284 RND(5.56, .1) => 5.60
1285
1286 RND(-5.56, .1) => -5.60
1287
1288 RND(.5) => 1.00
1289
1290 RND(.5 - 2**-53) => 1.00
1291
1292 RND(.5 - 2**-52) => 1.00
1293
1294 RND(.5 - 2**-51) => 1.00
1295
1296 RND(.5 - 2**-45) => 0.00
1297
1298 RND(.5 - 2**-45, 1, 10) => 1.00
1299
1300 evaluate.sps:40.17-40.24: error: DEBUG EVALUATE: Function invocation
1301 RND(string) does not match any known function.  Candidates are:
1302 RND(number)
1303 RND(number, number)
1304 RND(number, number, number).
1305    40 | DEBUG EVALUATE /RND('x').
1306       |                 ^~~~~~~~
1307
1308 RND('x') => error
1309
1310 TRUNC(1.2) => 1.00
1311
1312 TRUNC(1.9) => 1.00
1313
1314 TRUNC(-1.2) => -1.00
1315
1316 TRUNC(-1.9) => -1.00
1317
1318 TRUNC(5.06, .1) => 5.00
1319
1320 TRUNC(-5.06, .1) => -5.00
1321
1322 TRUNC(1) => 1.00
1323
1324 TRUNC(1 - 2**-53) => 1.00
1325
1326 TRUNC(1 - 2**-52) => 1.00
1327
1328 TRUNC(1 - 2**-51) => 1.00
1329
1330 TRUNC(1 - 2**-45) => 0.00
1331
1332 TRUNC(1 - 2**-45, 1, 10) => 1.00
1333
1334 evaluate.sps:54.17-54.26: error: DEBUG EVALUATE: Function invocation
1335 TRUNC(string) does not match any known function.  Candidates are:
1336 TRUNC(number)
1337 TRUNC(number, number)
1338 TRUNC(number, number, number).
1339    54 | DEBUG EVALUATE /TRUNC('x').
1340       |                 ^~~~~~~~~~
1341
1342 TRUNC('x') => error
1343 ])
1344 done
1345 AT_CLEANUP
1346
1347 AT_SETUP([expressions - ACOS ARSIN ARTAN COS SIN TAN])
1348 AT_KEYWORDS([expression expressions evaluate])
1349 AT_DATA([evaluate-base.sps], [
1350 DEBUG EVALUATE SET opt.
1351 DEBUG EVALUATE /ACOS(.5) / 3.14159 * 180.
1352 DEBUG EVALUATE /ARCOS(.75) / 3.14159 * 180.
1353 DEBUG EVALUATE /ARCOS(-.5) / 3.14159 * 180.
1354 DEBUG EVALUATE /ACOS(-.75) / 3.14159 * 180.
1355 DEBUG EVALUATE /ACOS(-1) / 3.14159 * 180.
1356 DEBUG EVALUATE /ARCOS(1) / 3.14159 * 180.
1357 DEBUG EVALUATE /ACOS(-1.01) / 3.14159 * 180.
1358 DEBUG EVALUATE /ARCOS(1.01) / 3.14159 * 180.
1359 DEBUG EVALUATE /ACOS('x') / 3.14159 * 180.
1360
1361 DEBUG EVALUATE /ASIN(.5) / 3.14159 * 180.
1362 DEBUG EVALUATE /ARSIN(.25) / 3.14159 * 180.
1363 DEBUG EVALUATE /ARSIN(-.5) / 3.14159 * 180.
1364 DEBUG EVALUATE /ASIN(-.25) / 3.14159 * 180.
1365 DEBUG EVALUATE /ASIN(-1.01) / 3.14159 * 180.
1366 DEBUG EVALUATE /ARSIN(1.01) / 3.14159 * 180.
1367 DEBUG EVALUATE /ASIN('x') / 3.14159 * 180.
1368
1369 DEBUG EVALUATE /ATAN(1) / 3.14159 * 180.
1370 DEBUG EVALUATE /ARTAN(10) / 3.14159 * 180.
1371 DEBUG EVALUATE /ARTAN(-1) / 3.14159 * 180.
1372 DEBUG EVALUATE /ATAN(-10) / 3.14159 * 180.
1373 DEBUG EVALUATE /ATAN('x') / 3.14159 * 180.
1374
1375 DEBUG EVALUATE /COS(60 / 180 * 3.14159).
1376 DEBUG EVALUATE /COS(45 / 180 * 3.14159).
1377 DEBUG EVALUATE /COS(30 / 180 * 3.14159).
1378 DEBUG EVALUATE /COS(15 / 180 * 3.14159).
1379 DEBUG EVALUATE /COS(-60 / 180 * 3.14159).
1380 DEBUG EVALUATE /COS(-45 / 180 * 3.14159).
1381 DEBUG EVALUATE /COS(-30 / 180 * 3.14159).
1382 DEBUG EVALUATE /COS(-15 / 180 * 3.14159).
1383 DEBUG EVALUATE /COS(123 / 180 * 3.14159).
1384 DEBUG EVALUATE /COS(321 / 180 * 3.14159).
1385 DEBUG EVALUATE /COS('x').
1386
1387 DEBUG EVALUATE /SIN(60 / 180 * 3.14159).
1388 DEBUG EVALUATE /SIN(45 / 180 * 3.14159).
1389 DEBUG EVALUATE /SIN(30 / 180 * 3.14159).
1390 DEBUG EVALUATE /SIN(15 / 180 * 3.14159).
1391 DEBUG EVALUATE /SIN(-60 / 180 * 3.14159).
1392 DEBUG EVALUATE /SIN(-45 / 180 * 3.14159).
1393 DEBUG EVALUATE /SIN(-30 / 180 * 3.14159).
1394 DEBUG EVALUATE /SIN(-15 / 180 * 3.14159).
1395 DEBUG EVALUATE /SIN(123 / 180 * 3.14159).
1396 DEBUG EVALUATE /SIN(321 / 180 * 3.14159).
1397 DEBUG EVALUATE /SIN('x').
1398
1399 DEBUG EVALUATE /TAN(60 / 180 * 3.14159).
1400 DEBUG EVALUATE /TAN(45 / 180 * 3.14159).
1401 DEBUG EVALUATE /TAN(30 / 180 * 3.14159).
1402 DEBUG EVALUATE /TAN(15 / 180 * 3.14159).
1403 DEBUG EVALUATE /TAN(-60 / 180 * 3.14159).
1404 DEBUG EVALUATE /TAN(-45 / 180 * 3.14159).
1405 DEBUG EVALUATE /TAN(-30 / 180 * 3.14159).
1406 DEBUG EVALUATE /TAN(-15 / 180 * 3.14159).
1407 DEBUG EVALUATE /TAN(123 / 180 * 3.14159).
1408 DEBUG EVALUATE /TAN(321 / 180 * 3.14159).
1409 DEBUG EVALUATE /TAN('x').
1410 ])
1411
1412 for opt in OPT NOOPT; do
1413     AS_BOX([$opt])
1414     sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
1415     AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
1416 ACOS(.5) / 3.14159 * 180 => 60.00
1417
1418 ARCOS(.75) / 3.14159 * 180 => 41.41
1419
1420 ARCOS(-.5) / 3.14159 * 180 => 120.00
1421
1422 ACOS(-.75) / 3.14159 * 180 => 138.59
1423
1424 ACOS(-1) / 3.14159 * 180 => 180.00
1425
1426 ARCOS(1) / 3.14159 * 180 => 0.00
1427
1428 ACOS(-1.01) / 3.14159 * 180 => sysmis
1429
1430 ARCOS(1.01) / 3.14159 * 180 => sysmis
1431
1432 evaluate.sps:11.17-11.25: error: DEBUG EVALUATE: Type mismatch invoking
1433 ACOS(number) as ACOS(string).
1434    11 | DEBUG EVALUATE /ACOS('x') / 3.14159 * 180.
1435       |                 ^~~~~~~~~
1436
1437 ACOS('x') / 3.14159 * 180 => error
1438
1439 ASIN(.5) / 3.14159 * 180 => 30.00
1440
1441 ARSIN(.25) / 3.14159 * 180 => 14.48
1442
1443 ARSIN(-.5) / 3.14159 * 180 => -30.00
1444
1445 ASIN(-.25) / 3.14159 * 180 => -14.48
1446
1447 ASIN(-1.01) / 3.14159 * 180 => sysmis
1448
1449 ARSIN(1.01) / 3.14159 * 180 => sysmis
1450
1451 evaluate.sps:19.17-19.25: error: DEBUG EVALUATE: Type mismatch invoking
1452 ASIN(number) as ASIN(string).
1453    19 | DEBUG EVALUATE /ASIN('x') / 3.14159 * 180.
1454       |                 ^~~~~~~~~
1455
1456 ASIN('x') / 3.14159 * 180 => error
1457
1458 ATAN(1) / 3.14159 * 180 => 45.00
1459
1460 ARTAN(10) / 3.14159 * 180 => 84.29
1461
1462 ARTAN(-1) / 3.14159 * 180 => -45.00
1463
1464 ATAN(-10) / 3.14159 * 180 => -84.29
1465
1466 evaluate.sps:25.17-25.25: error: DEBUG EVALUATE: Type mismatch invoking
1467 ATAN(number) as ATAN(string).
1468    25 | DEBUG EVALUATE /ATAN('x') / 3.14159 * 180.
1469       |                 ^~~~~~~~~
1470
1471 ATAN('x') / 3.14159 * 180 => error
1472
1473 COS(60 / 180 * 3.14159) => 0.50
1474
1475 COS(45 / 180 * 3.14159) => 0.71
1476
1477 COS(30 / 180 * 3.14159) => 0.87
1478
1479 COS(15 / 180 * 3.14159) => 0.97
1480
1481 COS(-60 / 180 * 3.14159) => 0.50
1482
1483 COS(-45 / 180 * 3.14159) => 0.71
1484
1485 COS(-30 / 180 * 3.14159) => 0.87
1486
1487 COS(-15 / 180 * 3.14159) => 0.97
1488
1489 COS(123 / 180 * 3.14159) => -0.54
1490
1491 COS(321 / 180 * 3.14159) => 0.78
1492
1493 evaluate.sps:37.17-37.24: error: DEBUG EVALUATE: Type mismatch invoking
1494 COS(number) as COS(string).
1495    37 | DEBUG EVALUATE /COS('x').
1496       |                 ^~~~~~~~
1497
1498 COS('x') => error
1499
1500 SIN(60 / 180 * 3.14159) => 0.87
1501
1502 SIN(45 / 180 * 3.14159) => 0.71
1503
1504 SIN(30 / 180 * 3.14159) => 0.50
1505
1506 SIN(15 / 180 * 3.14159) => 0.26
1507
1508 SIN(-60 / 180 * 3.14159) => -0.87
1509
1510 SIN(-45 / 180 * 3.14159) => -0.71
1511
1512 SIN(-30 / 180 * 3.14159) => -0.50
1513
1514 SIN(-15 / 180 * 3.14159) => -0.26
1515
1516 SIN(123 / 180 * 3.14159) => 0.84
1517
1518 SIN(321 / 180 * 3.14159) => -0.63
1519
1520 evaluate.sps:49.17-49.24: error: DEBUG EVALUATE: Type mismatch invoking
1521 SIN(number) as SIN(string).
1522    49 | DEBUG EVALUATE /SIN('x').
1523       |                 ^~~~~~~~
1524
1525 SIN('x') => error
1526
1527 TAN(60 / 180 * 3.14159) => 1.73
1528
1529 TAN(45 / 180 * 3.14159) => 1.00
1530
1531 TAN(30 / 180 * 3.14159) => 0.58
1532
1533 TAN(15 / 180 * 3.14159) => 0.27
1534
1535 TAN(-60 / 180 * 3.14159) => -1.73
1536
1537 TAN(-45 / 180 * 3.14159) => -1.00
1538
1539 TAN(-30 / 180 * 3.14159) => -0.58
1540
1541 TAN(-15 / 180 * 3.14159) => -0.27
1542
1543 TAN(123 / 180 * 3.14159) => -1.54
1544
1545 TAN(321 / 180 * 3.14159) => -0.81
1546
1547 evaluate.sps:61.17-61.24: error: DEBUG EVALUATE: Type mismatch invoking
1548 TAN(number) as TAN(string).
1549    61 | DEBUG EVALUATE /TAN('x').
1550       |                 ^~~~~~~~
1551
1552 TAN('x') => error
1553 ])
1554 done
1555 AT_CLEANUP
1556
1557 # FIXME: a variable name as the argument to SYSMIS is a special case
1558 # that we don't yet test.  We also can't test VALUE this way.
1559 CHECK_EXPR_EVAL([missing nmiss nvalid sysmis any range max min],
1560   [[missing(10)], [false]],
1561   [[missing($sysmis)], [true]],
1562   [[missing(asin(1.01))], [true]],
1563   [[missing(asin(.5))], [false]],
1564   [[missing('    ')], [error],
1565    [error: DEBUG EVALUATE: Type mismatch invoking MISSING(number) as missing(string).]],
1566
1567   [[nmiss($sysmis)], [1.00]],
1568   [[nmiss(0)], [0.00]],
1569   [[nmiss($sysmis, $sysmis, $sysmis)], [3.00]],
1570   [[nmiss(1, 2, 3, 4)], [0.00]],
1571   [[nmiss(1, $sysmis, $sysmis, 2, 2, $sysmis, $sysmis, 3, 4)], [4.00]],
1572
1573   [[nvalid($sysmis)], [0.00]],
1574   [[nvalid(0)], [1.00]],
1575   [[nvalid($sysmis, $sysmis, $sysmis)], [0.00]],
1576   [[nvalid(1, 2, 3, 4)], [4.00]],
1577   [[nvalid(1, $sysmis, $sysmis, 2, 2, $sysmis, $sysmis, 3, 4)], [5.00]],
1578
1579   [[sysmis(10)], [false]],
1580   [[sysmis($sysmis)], [true]],
1581   [[sysmis(asin(1.01))], [true]],
1582   [[sysmis(asin(.5))], [false]],
1583   [[sysmis('    ')], [error],
1584    [error: DEBUG EVALUATE: Function invocation sysmis(string) does not match any known function.  Candidates are:
1585 SYSMIS(num_variable)
1586 SYSMIS(number).]],
1587
1588   [[any($sysmis, 1, $sysmis, 3)], [sysmis]],
1589   [[any(1, 1, 2, 3)], [true]],
1590   [[any(1, $true, 2, 3)], [true]],
1591   [[any(1, $false, 2, 3)], [false]],
1592   [[any(2, 1, 2, 3)], [true]],
1593   [[any(3, 1, 2, 3)], [true]],
1594   [[any(5, 1, 2, 3)], [false]],
1595   [[any(1, 1, 1, 1)], [true]],
1596   [[any($sysmis, 1, 1, 1)], [sysmis]],
1597   [[any(1, $sysmis, $sysmis, $sysmis)], [sysmis]],
1598   [[any($sysmis, $sysmis, $sysmis, $sysmis)], [sysmis]],
1599   [[any(1)], [error],
1600    [error: DEBUG EVALUATE: Function invocation any(number) does not match any known function.  Candidates are:
1601 ANY(number, number[, number]...)
1602 ANY(string, string[, string]...).]],
1603   [[any('1', 2, 3, 4)], [error],
1604    [error: DEBUG EVALUATE: Function invocation any(string, number, number, number) does not match any known function.  Candidates are:
1605 ANY(number, number[, number]...)
1606 ANY(string, string[, string]...).]],
1607   [[any(1, '2', 3, 4)], [error],
1608    [error: DEBUG EVALUATE: Function invocation any(number, string, number, number) does not match any known function.  Candidates are:
1609 ANY(number, number[, number]...)
1610 ANY(string, string[, string]...).]],
1611   [[any(1, 2, '3', 4)], [error],
1612    [error: DEBUG EVALUATE: Function invocation any(number, number, string, number) does not match any known function.  Candidates are:
1613 ANY(number, number[, number]...)
1614 ANY(string, string[, string]...).]],
1615   [[any(1, 2, 3, '4')], [error],
1616    [error: DEBUG EVALUATE: Function invocation any(number, number, number, string) does not match any known function.  Candidates are:
1617 ANY(number, number[, number]...)
1618 ANY(string, string[, string]...).]],
1619
1620   [[any('', 'a', '', 'c')], [true]],
1621   [[any('a', 'a', 'b', 'c')], [true]],
1622   [[any('b', 'a', 'b', 'c')], [true]],
1623   [[any('c', 'a', 'b', 'c')], [true]],
1624   [[any('e', 'a', 'b', 'c')], [false]],
1625   [[any('a', 'a', 'a', 'a')], [true]],
1626   [[any('', 'a', 'a', 'a')], [false]],
1627   [[any('a', '', '', '')], [false]],
1628   [[any('a')], [error],
1629    [error: DEBUG EVALUATE: Function invocation any(string) does not match any known function.  Candidates are:
1630 ANY(number, number[, number]...)
1631 ANY(string, string[, string]...).]],
1632   [[any('a', 'a  ', 'b', 'c')], [true]],
1633   [[any('b   ', 'a', 'b', 'c')], [true]],
1634   [[any('c   ', 'a', 'b', 'c     ')], [true]],
1635   [[any(a10, 'b', 'c', 'd')], [error],
1636    [error: DEBUG EVALUATE: Function invocation any(format, string, string, string) does not match any known function.  Candidates are:
1637 ANY(number, number[, number]...)
1638 ANY(string, string[, string]...).]],
1639   [[any('a', b, 'c', 'd')], [error],
1640    [error: DEBUG EVALUATE: Unknown identifier b.]],
1641   [[any('a', 'b', c, 'd')], [error],
1642    [error: DEBUG EVALUATE: Unknown identifier c.]],
1643   [[any('a', 'b', 'c', d)], [error],
1644    [error: DEBUG EVALUATE: Unknown identifier d.]],
1645
1646   [[range(5, 1, 10)], [true]],
1647   [[range(1, 1, 10)], [true]],
1648   [[range(10, 1, 10)], [true]],
1649   [[range(-1, 1, 10)], [false]],
1650   [[range(12, 1, 10)], [false]],
1651   [[range($sysmis, 1, 10)], [sysmis]],
1652   [[range(5, 1, $sysmis)], [sysmis]],
1653   [[range(5, $sysmis, 10)], [sysmis]],
1654   [[range($sysmis, $sysmis, 10)], [sysmis ]],
1655   [[range($sysmis, 1, $sysmis)], [sysmis]],
1656   [[range($sysmis, $sysmis, $sysmis)], [sysmis]],
1657   [[range(0, 1, 8, 10, 18)], [false]],
1658   [[range(1, 1, 8, 10, 18)], [true]],
1659   [[range(6, 1, 8, 10, 18)], [true]],
1660   [[range(8, 1, 8, 10, 18)], [true]],
1661   [[range(9, 1, 8, 10, 18)], [false]],
1662   [[range(10, 1, 8, 10, 18)], [true]],
1663   [[range(13, 1, 8, 10, 18)], [true]],
1664   [[range(16, 1, 8, 10, 18)], [true]],
1665   [[range(18, 1, 8, 10, 18)], [true]],
1666   [[range(20, 1, 8, 10, 18)], [false]],
1667   [[range(1)], [error],
1668    [error: DEBUG EVALUATE: Function invocation range(number) does not match any known function.  Candidates are:
1669 RANGE(number, number, number[, number, number]...)
1670 RANGE(string, string, string[, string, string]...).]],
1671   [[range(1, 2)], [error],
1672    [error: DEBUG EVALUATE: RANGE(number, number, number[, number, number]...) must have an odd number of arguments.]],
1673   [[range(1, 2, 3, 4)], [error],
1674    [error: DEBUG EVALUATE: RANGE(number, number, number[, number, number]...) must have an odd number of arguments.]],
1675   [[range(1, 2, 3, 4, 5, 6)], [error],
1676    [error: DEBUG EVALUATE: RANGE(number, number, number[, number, number]...) must have an odd number of arguments.]],
1677   [[range('1', 2, 3)], [error],
1678    [error: DEBUG EVALUATE: Function invocation range(string, number, number) does not match any known function.  Candidates are:
1679 RANGE(number, number, number[, number, number]...)
1680 RANGE(string, string, string[, string, string]...).]],
1681   [[range(1, '2', 3)], [error],
1682    [error: DEBUG EVALUATE: Function invocation range(number, string, number) does not match any known function.  Candidates are:
1683 RANGE(number, number, number[, number, number]...)
1684 RANGE(string, string, string[, string, string]...).]],
1685   [[range(1, 2, '3')], [error],
1686    [error: DEBUG EVALUATE: Function invocation range(number, number, string) does not match any known function.  Candidates are:
1687 RANGE(number, number, number[, number, number]...)
1688 RANGE(string, string, string[, string, string]...).]],
1689
1690   [[range('123', '111', '888')], [true]],
1691   [[range('111', '111', '888')], [true]],
1692   [[range('888', '111', '888')], [true]],
1693   [[range('110', '111', '888')], [false]],
1694   [[range('889', '111', '888')], [false]],
1695   [[range('000', '111', '888')], [false]],
1696   [[range('999', '111', '888')], [false]],
1697   [[range('123   ', '111', '888')], [true]],
1698   [[range('123', '111   ', '888')], [true]],
1699   [[range('123', '111', '888   ')], [true]],
1700   [[range('123', '111    ', '888   ')], [true]],
1701   [[range('00', '01', '08', '10', '18')], [false]],
1702   [[range('01', '01', '08', '10', '18')], [true]],
1703   [[range('06', '01', '08', '10', '18')], [true]],
1704   [[range('08', '01', '08', '10', '18')], [true]],
1705   [[range('09', '01', '08', '10', '18')], [false]],
1706   [[range('10', '01', '08', '10', '18')], [true]],
1707   [[range('15', '01', '08', '10', '18')], [true]],
1708   [[range('18', '01', '08', '10', '18')], [true]],
1709   [[range('19', '01', '08', '10', '18')], [false]],
1710   [[range('1')], [error],
1711    [error: DEBUG EVALUATE: Function invocation range(string) does not match any known function.  Candidates are:
1712 RANGE(number, number, number[, number, number]...)
1713 RANGE(string, string, string[, string, string]...).]],
1714   [[range('1', '2')], [error],
1715    [error: DEBUG EVALUATE: RANGE(string, string, string[, string, string]...) must have an odd number of arguments.]],
1716   [[range('1', '2', '3', '4')], [error],
1717    [error: DEBUG EVALUATE: RANGE(string, string, string[, string, string]...) must have an odd number of arguments.]],
1718   [[range('1', '2', '3', '4', '5', '6')], [error],
1719    [error: DEBUG EVALUATE: RANGE(string, string, string[, string, string]...) must have an odd number of arguments.]],
1720   [[range(1, '2', '3')], [error],
1721    [error: DEBUG EVALUATE: Function invocation range(number, string, string) does not match any known function.  Candidates are:
1722 RANGE(number, number, number[, number, number]...)
1723 RANGE(string, string, string[, string, string]...).]],
1724   [[range('1', 2, '3')], [error],
1725    [error: DEBUG EVALUATE: Function invocation range(string, number, string) does not match any known function.  Candidates are:
1726 RANGE(number, number, number[, number, number]...)
1727 RANGE(string, string, string[, string, string]...).]],
1728   [[range('1', '2', 3)], [error],
1729    [error: DEBUG EVALUATE: Function invocation range(string, string, number) does not match any known function.  Candidates are:
1730 RANGE(number, number, number[, number, number]...)
1731 RANGE(string, string, string[, string, string]...).]],
1732
1733   [[max(1, 2, 3, 4, 5)], [5.00]],
1734   [[max(1, $sysmis, 2, 3, $sysmis, 4, 5)], [5.00]],
1735   [[max(1, 2)], [2.00]],
1736   [[max()], [error],
1737    [error: DEBUG EVALUATE: Function invocation max() does not match any known function.  Candidates are:
1738 MAX(number[, number]...)
1739 MAX(string[, string]...).]],
1740   [[max(1)], [1.00]],
1741   [[max(1, $sysmis)], [1.00]],
1742   [[max(1, 2, 3, $sysmis)], [3.00]],
1743   [[max.4(1, 2, 3, $sysmis)], [sysmis]],
1744   [[max.4(1, 2, 3)], [error],
1745    [error: DEBUG EVALUATE: For MAX(number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1746
1747   [[max("2", "3", "5", "1", "4")], ["5"]],
1748   [[max("1", "2")], ["2"]],
1749   [[max("1")], ["1"]],
1750
1751   [[min(1, 2, 3, 4, 5)], [1.00]],
1752   [[min(1, $sysmis, 2, 3, $sysmis, 4, 5)], [1.00]],
1753   [[min(1, 2)], [1.00]],
1754   [[min()], [error],
1755    [error: DEBUG EVALUATE: Function invocation min() does not match any known function.  Candidates are:
1756 MIN(number[, number]...)
1757 MIN(string[, string]...).]],
1758   [[min(1)], [1.00]],
1759   [[min(1, $sysmis)], [1.00]],
1760   [[min(1, 2, 3, $sysmis)], [1.00]],
1761   [[min.4(1, 2, 3, $sysmis)], [sysmis]],
1762   [[min.4(1, 2, 3)], [error],
1763    [error: DEBUG EVALUATE: For MIN(number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1764
1765   [[min("2", "3", "5", "1", "4")], ["1"]],
1766   [[min("1", "2")], ["1"]],
1767   [[min("1")], ["1"]])
1768
1769 CHECK_EXPR_EVAL([cfvar mean median sd sum variance],
1770   [[cfvar(1, 2, 3, 4, 5)], [0.53]],
1771   [[cfvar(1, $sysmis, 2, 3, $sysmis, 4, 5)], [0.53]],
1772   [[cfvar(1, 2)], [0.47]],
1773   [[cfvar(1)], [error],
1774    [error: DEBUG EVALUATE: Type mismatch invoking CFVAR(number, number[, number]...) as cfvar(number).]],
1775   [[cfvar(1, $sysmis)], [sysmis]],
1776   [[cfvar(1, 2, 3, $sysmis)], [0.50]],
1777   [[cfvar.4(1, 2, 3, $sysmis)], [sysmis]],
1778   [[cfvar.4(1, 2, 3)], [error],
1779    [error: DEBUG EVALUATE: For CFVAR(number, number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1780   [[cfvar('x')], [error],
1781    [error: DEBUG EVALUATE: Type mismatch invoking CFVAR(number, number[, number]...) as cfvar(string).]],
1782   [[cfvar('x', 1, 2, 3)], [error],
1783    [error: DEBUG EVALUATE: Type mismatch invoking CFVAR(number, number[, number]...) as cfvar(string, number, number, number).]],
1784
1785   [[mean(1, 2, 3, 4, 5)], [3.00]],
1786   [[mean(1, $sysmis, 2, 3, $sysmis, 4, 5)], [3.00]],
1787   [[mean(1, 2)], [1.50]],
1788   [[mean()], [error],
1789    [error: DEBUG EVALUATE: Type mismatch invoking MEAN(number[, number]...) as mean().]],
1790   [[mean(1)], [1.00]],
1791   [[mean(1, $sysmis)], [1.00]],
1792   [[mean(1, 2, 3, $sysmis)], [2.00]],
1793   [[mean.4(1, 2, 3, $sysmis)], [sysmis]],
1794   [[mean.4(1, 2, 3)], [error],
1795    [error: DEBUG EVALUATE: For MEAN(number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1796
1797   [[median(1, 2, 3, 4, 5)], [3.00]],
1798   [[median(2, 3, 4, 5, 1)], [3.00]],
1799   [[median(2, 3, 4, 1, 5)], [3.00]],
1800   [[median(2, 1, 4, 5, 3)], [3.00]],
1801   [[median(1, 2, 3, 4)], [2.50]],
1802   [[median(2, 3, 1, 4)], [2.50]],
1803   [[median(2, 3, 4, 1)], [2.50]],
1804   [[median(2, 1, 4, 3)], [2.50]],
1805   [[median(1, $sysmis, 3, 4, 5)], [3.50]],
1806   [[median(2, 3, 4, 5, $sysmis, 1)], [3.00]],
1807   [[median($sysmis, $sysmis, $sysmis, 2, 3, 4, 1, 5)], [3.00]],
1808   [[median(1, 2, 3)], [2.00]],
1809   [[median(1)], [1.00]],
1810   [[median(1, 2)], [1.50]],
1811   [[median(1, 2, $sysmis)], [1.50]],
1812   [[median(1, $sysmis, $sysmis)], [1.00]],
1813   [[median($sysmis, $sysmis, $sysmis)], [sysmis]],
1814   [[median.3(1, 2, $sysmis)], [sysmis]],
1815   [[median.2(1, $sysmis)], [sysmis]],
1816
1817   [[sd(1, 2, 3, 4, 5)], [1.58]],
1818   [[sd(1, $sysmis, 2, 3, $sysmis, 4, 5)], [1.58]],
1819   [[sd(1, 2)], [0.71]],
1820   [[sd(1)], [error],
1821    [error: DEBUG EVALUATE: Type mismatch invoking SD(number, number[, number]...) as sd(number).]],
1822   [[sd(1, $sysmis)], [sysmis]],
1823   [[sd(1, 2, 3, $sysmis)], [1.00]],
1824   [[sd.4(1, 2, 3, $sysmis)], [sysmis]],
1825   [[sd.4(1, 2, 3)], [error],
1826    [error: DEBUG EVALUATE: For SD(number, number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1827   [[sd('x')], [error],
1828    [error: DEBUG EVALUATE: Type mismatch invoking SD(number, number[, number]...) as sd(string).]],
1829   [[sd('x', 1, 2, 3)], [error],
1830    [error: DEBUG EVALUATE: Type mismatch invoking SD(number, number[, number]...) as sd(string, number, number, number).]],
1831
1832   [[sum(1, 2, 3, 4, 5)], [15.00]],
1833   [[sum(1, $sysmis, 2, 3, $sysmis, 4, 5)], [15.00]],
1834   [[sum(1, 2)], [3.00]],
1835   [[sum()], [error],
1836    [error: DEBUG EVALUATE: Type mismatch invoking SUM(number[, number]...) as sum().]],
1837   [[sum(1)], [1.00]],
1838   [[sum(1, $sysmis)], [1.00]],
1839   [[sum(1, 2, 3, $sysmis)], [6.00]],
1840   [[sum.4(1, 2, 3, $sysmis)], [sysmis]],
1841   [[sum.4(1, 2, 3)], [error],
1842    [error: DEBUG EVALUATE: For SUM(number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1843
1844   [[variance(1, 2, 3, 4, 5)], [2.50]],
1845   [[variance(1, $sysmis, 2, 3, $sysmis, 4, 5)], [2.50]],
1846   [[variance(1, 2)], [0.50]],
1847   [[variance(1)], [error],
1848    [error: DEBUG EVALUATE: Type mismatch invoking VARIANCE(number, number[, number]...) as variance(number).]],
1849   [[variance(1, $sysmis)], [sysmis]],
1850   [[variance(1, 2, 3, $sysmis)], [1.00]],
1851   [[variance.4(1, 2, 3, $sysmis)], [sysmis]],
1852   [[variance.4(1, 2, 3)], [error],
1853    [error: DEBUG EVALUATE: For VARIANCE(number, number[, number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.]],
1854   [[variance('x')], [error],
1855    [error: DEBUG EVALUATE: Type mismatch invoking VARIANCE(number, number[, number]...) as variance(string).]],
1856   [[variance('x', 1, 2, 3)], [error],
1857    [error: DEBUG EVALUATE: Type mismatch invoking VARIANCE(number, number[, number]...) as variance(string, number, number, number).]])
1858
1859 CHECK_EXPR_EVAL([concat index rindex length lower],
1860   [[concat('')], [""]],
1861   [[concat('a', 'b')], ["ab"]],
1862   [[concat('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h')], ["abcdefgh"]],
1863   [[concat('abcdefgh', 'ijklmnopq')], ["abcdefghijklmnopq"]],
1864   [[concat('a', 1)], [error],
1865    [error: DEBUG EVALUATE: Type mismatch invoking CONCAT(string[, string]...) as concat(string, number).]],
1866   [[concat(1, 2)], [error],
1867    [error: DEBUG EVALUATE: Type mismatch invoking CONCAT(string[, string]...) as concat(number, number).]],
1868
1869   [[index('abcbcde', 'bc')], [2.00]],
1870   [[index('abcbcde', 'bcd')], [4.00]],
1871   [[index('abcbcde', 'bcbc')], [2.00]],
1872   [[index('abcdefgh', 'abc')], [1.00]],
1873   [[index('abcdefgh', 'bcd')], [2.00]],
1874   [[index('abcdefgh', 'cde')], [3.00]],
1875   [[index('abcdefgh', 'def')], [4.00]],
1876   [[index('abcdefgh', 'efg')], [5.00]],
1877   [[index('abcdefgh', 'fgh')], [6.00]],
1878   [[index('abcdefgh', 'fghi')], [0.00]],
1879   [[index('abcdefgh', 'x')], [0.00]],
1880   [[index('abcdefgh', 'abch')], [0.00]],
1881   [[index('banana', 'na')], [3.00]],
1882   [[index('banana', 'ana')], [2.00]],
1883   [[index('', 'x')], [0.00]],
1884   [[index('', '')], [sysmis]],
1885   [[index('abcdefgh', '')], [sysmis]],
1886   [[index('abcdefgh', 'alkjsfdjlskalkjfa')], [0.00]],
1887
1888   [[index('abcbcde', 'bc', 1)], [2.00]],
1889   [[index('abcbcde', 'dc', 1)], [3.00]],
1890   [[index('abcbcde', 'abc', 1)], [1.00]],
1891   [[index('abcbcde', 'bc', 2)], [2.00]],
1892   [[index('abcbcde', 'dc', 2)], [0.00]],
1893   [[index('abcbcde', 'abc', 1)], [1.00]],
1894   [[index('abcbcde', 'bccb', 2)], [2.00]],
1895   [[index('abcbcde', 'bcbc', 2)], [2.00]],
1896   [[index('abcbcde', 'bcbc', $sysmis)], [sysmis]],
1897
1898   [[rindex('abcbcde', 'bc')], [4.00]],
1899   [[rindex('abcbcde', 'bcd')], [4.00]],
1900   [[rindex('abcbcde', 'bcbc')], [2.00]],
1901   [[rindex('abcdefgh', 'abc')], [1.00]],
1902   [[rindex('abcdefgh', 'bcd')], [2.00]],
1903   [[rindex('abcdefgh', 'cde')], [3.00]],
1904   [[rindex('abcdefgh', 'def')], [4.00]],
1905   [[rindex('abcdefgh', 'efg')], [5.00]],
1906   [[rindex('abcdefgh', 'fgh')], [6.00]],
1907   [[rindex('abcdefgh', 'fghi')], [0.00]],
1908   [[rindex('abcdefgh', 'x')], [0.00]],
1909   [[rindex('abcdefgh', 'abch')], [0.00]],
1910   [[rindex('banana', 'na')], [5.00]],
1911   [[rindex('banana', 'ana')], [4.00]],
1912   [[rindex('', 'x')], [0.00]],
1913   [[rindex('', '')], [sysmis]],
1914   [[rindex('abcdefgh', '')], [sysmis]],
1915   [[rindex('abcdefgh', 'alkjsfdjlskalkjfa')], [0.00]],
1916
1917   [[rindex('abcbcde', 'bc', 1)], [5.00]],
1918   [[rindex('abcbcde', 'dc', 1)], [6.00]],
1919   [[rindex('abcbcde', 'abc', 1)], [5.00]],
1920   [[rindex('abcbcde', 'bc', 2)], [4.00]],
1921   [[rindex('abcbcde', 'dc', 2)], [0.00]],
1922   [[rindex('abcbcde', 'abc', 1)], [5.00]],
1923   [[rindex('abcbcde', 'bccb', 2)], [4.00]],
1924   [[rindex('abcbcde', 'bcbc', 2)], [4.00]],
1925   [[rindex('abcbcde', 'bcbc', 0)], [sysmis]],
1926   [[rindex('abcbcde', 'bcbc', $sysmis)], [sysmis]],
1927   [[rindex('abcbcde', 'bcbcg', 2)], [sysmis]],
1928   [[rindex('abcbcde', 'bcbcg', $sysmis)], [sysmis]],
1929   [[rindex('abcbcde', 'bcbcg', 'x')], [error],
1930    [error: DEBUG EVALUATE: Function invocation rindex(string, string, string) does not match any known function.  Candidates are:
1931 RINDEX(string, string)
1932 RINDEX(string, string, number).]],
1933   [[rindex(1, 'bcdfkjl', 2)], [error],
1934    [error: DEBUG EVALUATE: Function invocation rindex(number, string, number) does not match any known function.  Candidates are:
1935 RINDEX(string, string)
1936 RINDEX(string, string, number).]],
1937   [[rindex('aksj', 2, 2)], [error],
1938    [error: DEBUG EVALUATE: Function invocation rindex(string, number, number) does not match any known function.  Candidates are:
1939 RINDEX(string, string)
1940 RINDEX(string, string, number).]],
1941   [[rindex(1, 2, 3)], [error],
1942    [error: DEBUG EVALUATE: Function invocation rindex(number, number, number) does not match any known function.  Candidates are:
1943 RINDEX(string, string)
1944 RINDEX(string, string, number).]],
1945   [[rindex(1, 2, '3')], [error],
1946    [error: DEBUG EVALUATE: Function invocation rindex(number, number, string) does not match any known function.  Candidates are:
1947 RINDEX(string, string)
1948 RINDEX(string, string, number).]],
1949
1950   [[length('')], [0.00]],
1951   [[length('a')], [1.00]],
1952   [[length('xy')], [2.00]],
1953   [[length('adsf    ')], [8.00]],
1954   [[length('abcdefghijkl')], [12.00]],
1955   [[length(0)], [error],
1956    [error: DEBUG EVALUATE: Type mismatch invoking LENGTH(string) as length(number).]],
1957   [[length($sysmis)], [error],
1958    [error: DEBUG EVALUATE: Type mismatch invoking LENGTH(string) as length(number).]],
1959
1960   [[lower('ABCDEFGHIJKLMNOPQRSTUVWXYZ!@%&*089')], ["abcdefghijklmnopqrstuvwxyz!@%&*089"]],
1961   [[lower('')], [""]],
1962   [[lower(1)], [error],
1963    [error: DEBUG EVALUATE: Type mismatch invoking LOWER(string) as lower(number).]])
1964
1965 CHECK_EXPR_EVAL([replace],
1966   [[replace('banana', 'an', 'AN')], ["bANANa"]],
1967   [[replace('banana', 'an', 'a')], ["baaa"]],
1968   [[replace('banana', 'an', '')], ["ba"]],
1969   [[replace('banana', 'na', '')], ["ba"]],
1970   [[replace('banana', 'ba', 'BA')], ["BAnana"]],
1971   [[replace('banana', 'na', 'xyzzy')], ["baxyzzyxyzzy"]],
1972   [[replace('banana', 'an', 'xyzzy', 1)], ["bxyzzyana"]],
1973   [[replace('banana', 'an', 'xyzzy', 1.5)], ["bxyzzyana"]],
1974   [[replace('banana', 'bananana', 'xyzzy')], ["banana"]],
1975   [[replace('banana', '', 'xyzzy')], ["banana"]],
1976   [[replace('banana', 'ba', '', 0)], ["banana"]],
1977   [[replace('banana', 'ba', '', -1)], ["banana"]],
1978   [[replace('banana', 'ba', '', $sysmis)], ["banana"]])
1979
1980 CHECK_EXPR_EVAL([lpad number ltrim lpad rtrim rpad string strunc substr upcase],
1981   [[lpad('abc', -1)], [""]],
1982   [[lpad('abc', 0)], ["abc"]],
1983   [[lpad('abc', 2)], ["abc"]],
1984   [[lpad('abc', 3)], ["abc"]],
1985   [[lpad('abc', 10)], ["       abc"]],
1986   [[lpad('abc', 32768)], [""]],
1987   [[lpad('abc', $sysmis)], [""]],
1988   [[lpad('abc', -1, '*')], [""]],
1989   [[lpad('abc', 0, '*')], ["abc"]],
1990   [[lpad('abc', 2, '*')], ["abc"]],
1991   [[lpad('abc', 3, '*')], ["abc"]],
1992   [[lpad('abc', 10, '*')], ["*******abc"]],
1993   [[lpad('abc', 32768, '*')], [""]],
1994   [[lpad('abc', $sysmis, '*')], [""]],
1995   [[lpad('abc', $sysmis, '')], [""]],
1996   [[lpad('abc', $sysmis, 'xy')], [""]],
1997   [[lpad(0, 10)], [error],
1998    [error: DEBUG EVALUATE: Function invocation lpad(number, number) does not match any known function.  Candidates are:
1999 LPAD(string, number)
2000 LPAD(string, number, string).]],
2001   [[lpad('abc', 'def')], [error],
2002    [error: DEBUG EVALUATE: Function invocation lpad(string, string) does not match any known function.  Candidates are:
2003 LPAD(string, number)
2004 LPAD(string, number, string).]],
2005   [[lpad(0, 10, ' ')], [error],
2006    [error: DEBUG EVALUATE: Function invocation lpad(number, number, string) does not match any known function.  Candidates are:
2007 LPAD(string, number)
2008 LPAD(string, number, string).]],
2009   [[lpad('abc', 'def', ' ')], [error],
2010    [error: DEBUG EVALUATE: Function invocation lpad(string, string, string) does not match any known function.  Candidates are:
2011 LPAD(string, number)
2012 LPAD(string, number, string).]],
2013   [[lpad('x', 5, 0)], [error],
2014    [error: DEBUG EVALUATE: Function invocation lpad(string, number, number) does not match any known function.  Candidates are:
2015 LPAD(string, number)
2016 LPAD(string, number, string).]],
2017   [[lpad('x', 5, 2)], [error],
2018    [error: DEBUG EVALUATE: Function invocation lpad(string, number, number) does not match any known function.  Candidates are:
2019 LPAD(string, number)
2020 LPAD(string, number, string).]],
2021
2022   [[number("123", f3.0)], [123.00]],
2023   [[number(" 123", f3.0)], [12.00]],
2024   [[number("123", f3.1)], [12.30]],
2025   [[number("   ", f3.1)], [sysmis]],
2026   [[number("123", a8)], [error],
2027    [error: DEBUG EVALUATE: Type mismatch invoking NUMBER(string, num_input_format) as number(string, format).]],
2028 dnl CCA is not an input format:
2029   [[number("123", cca1.2)], [error],
2030    [error: DEBUG EVALUATE: Type mismatch invoking NUMBER(string, num_input_format) as number(string, format).]],
2031
2032   [[ltrim('   abc')], ["abc"]],
2033   [[rtrim('   abc   ')], ["   abc"]],
2034   [[ltrim('abc')], ["abc"]],
2035   [[ltrim('     abc')], ["      abc"]],
2036   [[ltrim('    ')], [""]],
2037   [[ltrim('')], [""]],
2038   [[ltrim(8)], [error],
2039    [error: DEBUG EVALUATE: Function invocation ltrim(number) does not match any known function.  Candidates are:
2040 LTRIM(string)
2041 LTRIM(string, string).]],
2042   [[ltrim('***abc', '*')], ["abc"]],
2043   [[ltrim('abc', '*')], ["abc"]],
2044   [[ltrim('*abc', '*')], ["abc"]],
2045   [[ltrim('', '*')], [""]],
2046   [[ltrim(8, '*')], [error],
2047    [error: DEBUG EVALUATE: Function invocation ltrim(number, string) does not match any known function.  Candidates are:
2048 LTRIM(string)
2049 LTRIM(string, string).]],
2050   [[ltrim(' x', 8)], [error],
2051    [error: DEBUG EVALUATE: Function invocation ltrim(string, number) does not match any known function.  Candidates are:
2052 LTRIM(string)
2053 LTRIM(string, string).]],
2054   [[ltrim(8, 9)], [error],
2055    [error: DEBUG EVALUATE: Function invocation ltrim(number, number) does not match any known function.  Candidates are:
2056 LTRIM(string)
2057 LTRIM(string, string).]],
2058
2059   [[rpad('abc', -1)], [""]],
2060   [[rpad('abc', 0)], ["abc"]],
2061   [[rpad('abc', 2)], ["abc"]],
2062   [[rpad('abc', 3)], ["abc"]],
2063   [[rpad('abc', 10)], ["abc       "]],
2064   [[rpad('abc', 32768)], [""]],
2065   [[rpad('abc', $sysmis)], [""]],
2066   [[rpad('abc', -1, '*')], [""]],
2067   [[rpad('abc', 0, '*')], ["abc"]],
2068   [[rpad('abc', 2, '*')], ["abc"]],
2069   [[rpad('abc', 3, '*')], ["abc"]],
2070   [[rpad('abc', 10, '*')], ["abc*******"]],
2071   [[rpad('abc', 32768, '*')], [""]],
2072   [[rpad('abc', $sysmis, '*')], [""]],
2073   [[rpad('abc', $sysmis, '')], [""]],
2074   [[rpad('abc', $sysmis, 'xy')], [""]],
2075   [[rpad(0, 10)], [error],
2076    [error: DEBUG EVALUATE: Function invocation rpad(number, number) does not match any known function.  Candidates are:
2077 RPAD(string, number)
2078 RPAD(string, number, string).]],
2079   [[rpad('abc', 'def')], [error],
2080    [error: DEBUG EVALUATE: Function invocation rpad(string, string) does not match any known function.  Candidates are:
2081 RPAD(string, number)
2082 RPAD(string, number, string).]],
2083   [[rpad(0, 10, ' ')], [error],
2084    [error: DEBUG EVALUATE: Function invocation rpad(number, number, string) does not match any known function.  Candidates are:
2085 RPAD(string, number)
2086 RPAD(string, number, string).]],
2087   [[rpad('abc', 'def', ' ')], [error],
2088    [error: DEBUG EVALUATE: Function invocation rpad(string, string, string) does not match any known function.  Candidates are:
2089 RPAD(string, number)
2090 RPAD(string, number, string).]],
2091   [[rpad('x', 5, 0)], [error],
2092    [error: DEBUG EVALUATE: Function invocation rpad(string, number, number) does not match any known function.  Candidates are:
2093 RPAD(string, number)
2094 RPAD(string, number, string).]],
2095   [[rpad('x', 5, 2)], [error],
2096    [error: DEBUG EVALUATE: Function invocation rpad(string, number, number) does not match any known function.  Candidates are:
2097 RPAD(string, number)
2098 RPAD(string, number, string).]],
2099
2100   [[rtrim('abc   ')], ["abc"]],
2101   [[rtrim('   abc   ')], ["   abc"]],
2102   [[rtrim('abc')], ["abc"]],
2103   [[rtrim('abc  ')], ["abc      "]],
2104   [[rtrim('    ')], [""]],
2105   [[rtrim('')], [""]],
2106   [[rtrim(8)], [error],
2107    [error: DEBUG EVALUATE: Function invocation rtrim(number) does not match any known function.  Candidates are:
2108 RTRIM(string)
2109 RTRIM(string, string).]],
2110   [[rtrim('abc***', '*')], ["abc"]],
2111   [[rtrim('abc', '*')], ["abc"]],
2112   [[rtrim('abc*', '*')], ["abc"]],
2113   [[rtrim('', '*')], [""]],
2114   [[rtrim(8, '*')], [error],
2115    [error: DEBUG EVALUATE: Function invocation rtrim(number, string) does not match any known function.  Candidates are:
2116 RTRIM(string)
2117 RTRIM(string, string).]],
2118   [[rtrim(' x', 8)], [error],
2119    [error: DEBUG EVALUATE: Function invocation rtrim(string, number) does not match any known function.  Candidates are:
2120 RTRIM(string)
2121 RTRIM(string, string).]],
2122   [[rtrim(8, 9)], [error],
2123    [error: DEBUG EVALUATE: Function invocation rtrim(number, number) does not match any known function.  Candidates are:
2124 RTRIM(string)
2125 RTRIM(string, string).]],
2126
2127   [[string(123.56, f5.1)], ["123.6"]],
2128   [[string($sysmis, f5.1)], ["   . "]],
2129   [[string("abc", A5)], [error],
2130    [error: DEBUG EVALUATE: Type mismatch invoking STRING(number, num_output_format) as string(string, format).]],
2131 dnl E has a minimum width of 6 on output:
2132   [[string(123, e1)], [error],
2133    [error: DEBUG EVALUATE: Type mismatch invoking STRING(number, num_output_format) as string(number, format).]],
2134   [[string(123, e6.0)], ["1E+002"]],
2135
2136   [[strunc('a c   ', 9)], ["a c"]],
2137   [[strunc('a c   ', 7)], ["a c"]],
2138   [[strunc('a c   ', 6)], ["a c"]],
2139   [[strunc('a c   ', 5)], ["a c"]],
2140   [[strunc('a c   ', 4)], ["a c"]],
2141   [[strunc('a c   ', 3)], ["a c"]],
2142   [[strunc('a c   ', 2)], ["a"]],
2143   [[strunc('a c   ', 1)], ["a"]],
2144   [[strunc('a c   ', 0)], [""]],
2145   [[strunc('a c   ', -1)], [""]],
2146   [[strunc('a c   ', $sysmis)], [""]],
2147   [[strunc('  abc  ', 9)], ["  abc"]],
2148   [[strunc('  abc  ', 8)], ["  abc"]],
2149   [[strunc('  abc  ', 7)], ["  abc"]],
2150   [[strunc('  abc  ', 6)], ["  abc"]],
2151   [[strunc('  abc  ', 5)], ["  abc"]],
2152   [[strunc('  abc  ', 4)], ["  ab"]],
2153   [[strunc('  abc  ', 3)], ["  a"]],
2154   [[strunc('  abc  ', 2)], [""]],
2155   [[strunc('  abc  ', 1)], [""]],
2156   [[strunc('  abc  ', -1)], [""]],
2157   [[strunc('  abc  ', $sysmis)], [""]],
2158
2159   [[substr('abcdefgh', -5)], [""]],
2160   [[substr('abcdefgh', 0)], [""]],
2161   [[substr('abcdefgh', 1)], ["abcdefgh"]],
2162   [[substr('abcdefgh', 3)], ["cdefgh"]],
2163   [[substr('abcdefgh', 5)], ["efgh"]],
2164   [[substr('abcdefgh', 6)], ["fgh"]],
2165   [[substr('abcdefgh', 7)], ["gh"]],
2166   [[substr('abcdefgh', 8)], ["h"]],
2167   [[substr('abcdefgh', 9)], [""]],
2168   [[substr('abcdefgh', 10)], [""]],
2169   [[substr('abcdefgh', 20)], [""]],
2170   [[substr('abcdefgh', $sysmis)], [""]],
2171   [[substr(0, 10)], [error],
2172    [error: DEBUG EVALUATE: Function invocation substr(number, number) does not match any known function.  Candidates are:
2173 SUBSTR(string, number)
2174 SUBSTR(string, number, number).]],
2175   [[substr('abcd', 'abc')], [error],
2176    [error: DEBUG EVALUATE: Function invocation substr(string, string) does not match any known function.  Candidates are:
2177 SUBSTR(string, number)
2178 SUBSTR(string, number, number).]],
2179   [[substr(0, 'abc')], [error],
2180    [error: DEBUG EVALUATE: Function invocation substr(number, string) does not match any known function.  Candidates are:
2181 SUBSTR(string, number)
2182 SUBSTR(string, number, number).]],
2183
2184   [[substr('abcdefgh', 0, 0)], [""]],
2185   [[substr('abcdefgh', 3, 0)], [""]],
2186   [[substr('abcdefgh', 5, 0)], [""]],
2187   [[substr('abcdefgh', 9, 0)], [""]],
2188   [[substr('abcdefgh', 0, 1)], [""]],
2189   [[substr('abcdefgh', 0, 5)], [""]],
2190   [[substr('abcdefgh', 1, 8)], ["abcdefgh"]],
2191   [[substr('abcdefgh', 1, 10)], ["abcdefgh"]],
2192   [[substr('abcdefgh', 1, 20)], ["abcdefgh"]],
2193   [[substr('abcdefgh', 3, 4)], ["cdef"]],
2194   [[substr('abcdefgh', 5, 2)], ["ef"]],
2195   [[substr('abcdefgh', 6, 1)], ["f"]],
2196   [[substr('abcdefgh', 7, 10)], ["gh"]],
2197   [[substr('abcdefgh', 8, 1)], ["h"]],
2198   [[substr('abcdefgh', 8, 2)], ["h"]],
2199   [[substr('abcdefgh', 9, 11)], [""]],
2200   [[substr('abcdefgh', 10, 52)], [""]],
2201   [[substr('abcdefgh', 20, 1)], [""]],
2202   [[substr('abcdefgh', $sysmis, 2)], [""]],
2203   [[substr('abcdefgh', 9, $sysmis)], [""]],
2204   [[substr('abcdefgh', $sysmis, $sysmis)], [""]],
2205   [[substr('abc', 1, 'x')], [error],
2206    [error: DEBUG EVALUATE: Function invocation substr(string, number, string) does not match any known function.  Candidates are:
2207 SUBSTR(string, number)
2208 SUBSTR(string, number, number).]],
2209   [[substr(0, 10, 1)], [error],
2210    [error: DEBUG EVALUATE: Function invocation substr(number, number, number) does not match any known function.  Candidates are:
2211 SUBSTR(string, number)
2212 SUBSTR(string, number, number).]],
2213   [[substr(0, 10, 'x')], [error],
2214    [error: DEBUG EVALUATE: Function invocation substr(number, number, string) does not match any known function.  Candidates are:
2215 SUBSTR(string, number)
2216 SUBSTR(string, number, number).]],
2217   [[substr('abcd', 'abc', 0)], [error],
2218    [error: DEBUG EVALUATE: Function invocation substr(string, string, number) does not match any known function.  Candidates are:
2219 SUBSTR(string, number)
2220 SUBSTR(string, number, number).]],
2221   [[substr('abcd', 'abc', 'j')], [error],
2222    [error: DEBUG EVALUATE: Function invocation substr(string, string, string) does not match any known function.  Candidates are:
2223 SUBSTR(string, number)
2224 SUBSTR(string, number, number).]],
2225   [[substr(0, 'abc', 4)], [error],
2226    [error: DEBUG EVALUATE: Function invocation substr(number, string, number) does not match any known function.  Candidates are:
2227 SUBSTR(string, number)
2228 SUBSTR(string, number, number).]],
2229   [[substr(0, 'abc', 'k')], [error],
2230    [error: DEBUG EVALUATE: Function invocation substr(number, string, string) does not match any known function.  Candidates are:
2231 SUBSTR(string, number)
2232 SUBSTR(string, number, number).]],
2233
2234   [[upcase('abcdefghijklmnopqrstuvwxyz!@%&*089')], ["ABCDEFGHIJKLMNOPQRSTUVWXYZ!@%&*089"]],
2235   [[upcase('')], [""]],
2236   [[upcase(1)], [error],
2237    [error: DEBUG EVALUATE: Type mismatch invoking UPCASE(string) as upcase(number).]])
2238
2239 CHECK_EXPR_EVAL([time ctime date yrmoda],
2240   [[time.days(1)], [86400.00]],
2241   [[time.days(-1)], [-86400.00]],
2242   [[time.days(0.5)], [43200.00]],
2243   [[time.days('x')], [error],
2244    [error: DEBUG EVALUATE: Type mismatch invoking TIME.DAYS(number) as time.days(string).]],
2245   [[time.days($sysmis)], [sysmis]],
2246
2247   [[time.hms(4,50,38)], [17438.00]],
2248   [[time.hms(12,31,35)], [45095.00]],
2249   [[time.hms(12,47,53)], [46073.00]],
2250   [[time.hms(1,26,0)], [5160.00]],
2251   [[time.hms(20,58,11)], [75491.00]],
2252   [[time.hms(7,36,5)], [27365.00]],
2253   [[time.hms(15,43,49)], [56629.00]],
2254   [[time.hms(4,25,9)], [15909.00]],
2255   [[time.hms(6,49,27)], [24567.00]],
2256   [[time.hms(2,57,52)], [10672.00]],
2257   [[time.hms(16,45,44)], [60344.00]],
2258   [[time.hms(21,30,57)], [77457.00]],
2259   [[time.hms(22,30,4)], [81004.00]],
2260   [[time.hms(1,56,51)], [7011.00]],
2261   [[time.hms(5, 6, 7)], [18367.00]],
2262   [[time.hms(5, 6, 0)], [18360.00]],
2263   [[time.hms(5, 0, 7)], [18007.00]],
2264   [[time.hms(0, 6, 7)], [367.00]],
2265   [[time.hms(-5, 6, -7)], [sysmis],
2266    [warning: DEBUG EVALUATE: TIME.HMS cannot mix positive and negative arguments.]],
2267   [[time.hms(-5, 5, -7)], [sysmis],
2268    [warning: DEBUG EVALUATE: TIME.HMS cannot mix positive and negative arguments.]],
2269   [[time.hms($sysmis, 6, 7)], [sysmis]],
2270   [[time.hms(5, $sysmis, 7)], [sysmis]],
2271   [[time.hms(5, $sysmis, 7)], [sysmis]],
2272   [[time.hms($sysmis, $sysmis, 7)], [sysmis]],
2273   [[time.hms(5, $sysmis, $sysmis)], [sysmis]],
2274   [[time.hms($sysmis, $sysmis, 7)], [sysmis]],
2275   [[time.hms($sysmis, $sysmis, $sysmis)], [sysmis]],
2276
2277   [[ctime.days(106272)], [1.23]],
2278   [[ctime.hours(106272)], [29.52]],
2279   [[ctime.minutes(106272)], [1771.20]],
2280   [[ctime.seconds(106272)], [106272.00]],
2281   [[ctime.days(-106272)], [-1.23]],
2282   [[ctime.hours(-106272)], [-29.52]],
2283   [[ctime.minutes(-106272)], [-1771.20]],
2284   [[ctime.seconds(-106272)], [-106272.00]],
2285   [[ctime.days($sysmis)], [sysmis]],
2286   [[ctime.hours($sysmis)], [sysmis]],
2287   [[ctime.minutes($sysmis)], [sysmis]],
2288   [[ctime.seconds($sysmis)], [sysmis]],
2289   [[ctime.days('a')], [error],
2290    [error: DEBUG EVALUATE: Type mismatch invoking CTIME.DAYS(number) as ctime.days(string).]],
2291   [[ctime.hours('b')], [error],
2292    [error: DEBUG EVALUATE: Type mismatch invoking CTIME.HOURS(number) as ctime.hours(string).]],
2293   [[ctime.minutes('c')], [error],
2294    [error: DEBUG EVALUATE: Type mismatch invoking CTIME.MINUTES(number) as ctime.minutes(string).]],
2295   [[ctime.seconds('d')], [error],
2296    [error: DEBUG EVALUATE: Type mismatch invoking CTIME.SECONDS(number) as ctime.seconds(string).]],
2297
2298   [[ctime.days(date.dmy(15,10,1582))], [1.00]],
2299   [[ctime.days(date.dmy(6,9,1719))], [50000.00]],
2300   [[ctime.days(date.dmy(24,1,1583))], [102.00]],
2301   [[ctime.days(date.dmy(14,12,1585))], [1157.00]],
2302   [[ctime.days(date.dmy(26,11,1621))], [14288.00]],
2303   [[ctime.days(date.dmy(25,12,1821))], [87365.00]],
2304   [[ctime.days(date.dmy(3,12,1882))], [109623.00]],
2305   [[ctime.days(date.dmy(6,4,2002))], [153211.00]],
2306   [[ctime.days(date.dmy(19,12,1999))], [152372.00]],
2307   [[ctime.days(date.dmy(1,10,1978))], [144623.00]],
2308   [[ctime.days(date.dmy(0,10,1978))], [144622.00]],
2309   [[ctime.days(date.dmy(32,10,1978))], [sysmis],
2310    [error: DEBUG EVALUATE: Day 32 is not in acceptable range of 0 to 31.]],
2311   [[ctime.days(date.dmy(31,0,1978))], [144349.00]],
2312   [[ctime.days(date.dmy(31,13,1978))], [144745.00]],
2313   [[ctime.days(date.dmy($sysmis,10,1978))], [sysmis]],
2314   [[ctime.days(date.dmy(31,$sysmis,1978))], [sysmis]],
2315   [[ctime.days(date.dmy(31,10,$sysmis))], [sysmis]],
2316   [[ctime.days(date.dmy($sysmis,$sysmis,1978))], [sysmis]],
2317   [[ctime.days(date.dmy(31,$sysmis,$sysmis))], [sysmis]],
2318   [[ctime.days(date.dmy($sysmis,10,$sysmis))], [sysmis]],
2319   [[ctime.days(date.dmy($sysmis,$sysmis,$sysmis))], [sysmis]],
2320   [[date.dmy('a',1,2)], [error],
2321    [error: DEBUG EVALUATE: Type mismatch invoking DATE.DMY(number, number, number) as date.dmy(string, number, number).]],
2322   [[date.dmy(1,'a',2)], [error],
2323    [error: DEBUG EVALUATE: Type mismatch invoking DATE.DMY(number, number, number) as date.dmy(number, string, number).]],
2324   [[date.dmy(1,2,'a')], [error],
2325    [error: DEBUG EVALUATE: Type mismatch invoking DATE.DMY(number, number, number) as date.dmy(number, number, string).]],
2326 dnl FIXME: check out-of-range and nearly out-of-range values
2327 dnl
2328   [[yrmoda(1582,10,15)], [1.00]],
2329   [[yrmoda(1719,9,6)], [50000.00]],
2330   [[yrmoda(1583,1,24)], [102.00]],
2331   [[yrmoda(1585,12,14)], [1157.00]],
2332   [[yrmoda(1621,11,26)], [14288.00]],
2333   [[yrmoda(1821,12,25)], [87365.00]],
2334   [[yrmoda(1882,12,3)], [109623.00]],
2335   [[yrmoda(2002,4,6)], [153211.00]],
2336   [[yrmoda(1999,12,19)], [152372.00]],
2337   [[yrmoda(1978,10,1)], [144623.00]],
2338   [[yrmoda(1978,10,0)], [144622.00]],
2339   [[yrmoda(1978,10,32)], [sysmis],
2340    [error: DEBUG EVALUATE: Day 32 is not in acceptable range of 0 to 31.]],
2341   [[yrmoda(1978,0,31)], [144349.00]],
2342   [[yrmoda(1978,13,31)], [144745.00]],
2343   [[yrmoda(1978,10,$sysmis)], [sysmis]],
2344   [[yrmoda(1978,$sysmis,31)], [sysmis]],
2345   [[yrmoda($sysmis,10,31)], [sysmis]],
2346   [[yrmoda(1978,$sysmis,$sysmis)], [sysmis]],
2347   [[yrmoda($sysmis,$sysmis,31)], [sysmis]],
2348   [[yrmoda($sysmis,10,$sysmis)], [sysmis]],
2349   [[yrmoda($sysmis,$sysmis,$sysmis)], [sysmis]],
2350   [[yrmoda('a',1,2)], [error],
2351    [error: DEBUG EVALUATE: Type mismatch invoking YRMODA(number, number, number) as yrmoda(string, number, number).]],
2352   [[yrmoda(1,'a',2)], [error],
2353    [error: DEBUG EVALUATE: Type mismatch invoking YRMODA(number, number, number) as yrmoda(number, string, number).]],
2354   [[yrmoda(1,2,'a')], [error],
2355    [error: DEBUG EVALUATE: Type mismatch invoking YRMODA(number, number, number) as yrmoda(number, number, string).]],
2356 dnl FIXME: check out-of-range and nearly out-of-range values
2357 dnl
2358   [[ctime.days(date.mdy(6,10,1648)) + 577735], [601716.00]],
2359   [[ctime.days(date.mdy(6,30,1680)) + 577735], [613424.00]],
2360   [[ctime.days(date.mdy(7,24,1716)) + 577735], [626596.00]],
2361   [[ctime.days(date.mdy(6,19,1768)) + 577735], [645554.00]],
2362   [[ctime.days(date.mdy(8,2,1819)) + 577735], [664224.00]],
2363   [[ctime.days(date.mdy(3,27,1839)) + 577735], [671401.00]],
2364   [[ctime.days(date.mdy(4,19,1903)) + 577735], [694799.00]],
2365   [[ctime.days(date.mdy(8,25,1929)) + 577735], [704424.00]],
2366   [[ctime.days(date.mdy(9,29,1941)) + 577735], [708842.00]],
2367   [[ctime.days(date.mdy(4,19,1943)) + 577735], [709409.00]],
2368   [[ctime.days(date.mdy(10,7,1943)) + 577735], [709580.00]],
2369   [[ctime.days(date.mdy(3,17,1992)) + 577735], [727274.00]],
2370   [[ctime.days(date.mdy(2,25,1996)) + 577735], [728714.00]],
2371   [[ctime.days(date.mdy(11,10,2038)) + 577735], [744313.00]],
2372   [[ctime.days(date.mdy(7,18,2094)) + 577735], [764652.00]],
2373 dnl FIXME: check out-of-range and nearly out-of-range values
2374 dnl
2375   [[ctime.days(date.mdy(10,15,1582))], [1.00]],
2376   [[ctime.days(date.mdy(9,6,1719))], [50000.00]],
2377   [[ctime.days(date.mdy(1,24,1583))], [102.00]],
2378   [[ctime.days(date.mdy(12,14,1585))], [1157.00]],
2379   [[ctime.days(date.mdy(11,26,1621))], [14288.00]],
2380   [[ctime.days(date.mdy(12,25,1821))], [87365.00]],
2381   [[ctime.days(date.mdy(12,3,1882))], [109623.00]],
2382   [[ctime.days(date.mdy(4,6,2002))], [153211.00]],
2383   [[ctime.days(date.mdy(12,19,1999))], [152372.00]],
2384   [[ctime.days(date.mdy(10,1,1978))], [144623.00]],
2385   [[ctime.days(date.mdy(10,0,1978))], [144622.00]],
2386   [[ctime.days(date.mdy(10,32,1978))], [sysmis],
2387    [error: DEBUG EVALUATE: Day 32 is not in acceptable range of 0 to 31.]],
2388   [[ctime.days(date.mdy(0,31,1978))], [144349.00]],
2389   [[ctime.days(date.mdy(13,31,1978))], [144745.00]],
2390   [[ctime.days(date.mdy(10,$sysmis,1978))], [sysmis]],
2391   [[ctime.days(date.mdy($sysmis,31,1978))], [sysmis]],
2392   [[ctime.days(date.mdy(10,31,$sysmis))], [sysmis]],
2393   [[ctime.days(date.mdy($sysmis,$sysmis,1978))], [sysmis]],
2394   [[ctime.days(date.mdy($sysmis,31,$sysmis))], [sysmis]],
2395   [[ctime.days(date.mdy(10,$sysmis,$sysmis))], [sysmis]],
2396   [[ctime.days(date.mdy($sysmis,$sysmis,$sysmis))], [sysmis]],
2397   [[date.mdy('a',1,2)], [error],
2398    [error: DEBUG EVALUATE: Type mismatch invoking DATE.MDY(number, number, number) as date.mdy(string, number, number).]],
2399   [[date.mdy(1,'a',2)], [error],
2400    [error: DEBUG EVALUATE: Type mismatch invoking DATE.MDY(number, number, number) as date.mdy(number, string, number).]],
2401   [[date.mdy(1,2,'a')], [error],
2402    [error: DEBUG EVALUATE: Type mismatch invoking DATE.MDY(number, number, number) as date.mdy(number, number, string).]],
2403   [[ctime.days(date.mdy(0,0,0))], [152353.00]],
2404   [[ctime.days(date.mdy(0,0,999))], [sysmis],
2405    [error: DEBUG EVALUATE: Date 0998-12-0 is before the earliest acceptable date of 1582-10-15.]],
2406   [[date.mdy(1,1,1582)], [sysmis],
2407    [error: DEBUG EVALUATE: Date 1582-1-1 is before the earliest acceptable date of 1582-10-15.]],
2408   [[date.mdy(10,14,1582)], [sysmis],
2409    [error: DEBUG EVALUATE: Date 1582-10-14 is before the earliest acceptable date of 1582-10-15.]],
2410   [[date.mdy(10,15,1582)], [86400.00]],
2411
2412   [[ctime.days(date.moyr(1,2000))], [152385.00]],
2413   [[ctime.days(date.moyr(2,2000))], [152416.00]],
2414   [[ctime.days(date.moyr(3,2000))], [152445.00]],
2415   [[ctime.days(date.moyr(4,2000))], [152476.00]],
2416   [[ctime.days(date.moyr(5,2000))], [152506.00]],
2417   [[ctime.days(date.moyr(13,2000))], [152751.00]],
2418   [[ctime.days(date.moyr(14,2000))], [sysmis],
2419    [error: DEBUG EVALUATE: Month 14 is not in acceptable range of 0 to 13.]],
2420   [[ctime.days(date.moyr($sysmis,2000))], [sysmis]],
2421   [[ctime.days(date.moyr(1,$sysmis))], [sysmis]],
2422   [[ctime.days(date.moyr($sysmis,$sysmis))], [sysmis]],
2423   [[date.moyr('a',2000)], [error],
2424    [error: DEBUG EVALUATE: Type mismatch invoking DATE.MOYR(number, number) as date.moyr(string, number).]],
2425   [[date.moyr(5,'a')], [error],
2426    [error: DEBUG EVALUATE: Type mismatch invoking DATE.MOYR(number, number) as date.moyr(number, string).]],
2427   [[date.moyr('a','b')], [error],
2428    [error: DEBUG EVALUATE: Type mismatch invoking DATE.MOYR(number, number) as date.moyr(string, string).]],
2429
2430   [[ctime.days(date.qyr(1,2000))], [152385.00]],
2431   [[ctime.days(date.qyr(2,2000))], [152476.00]],
2432   [[ctime.days(date.qyr(5,2000))], [sysmis],
2433    [warning: DEBUG EVALUATE: The first argument to DATE.QYR must be 1, 2, 3, or 4.]],
2434   [[ctime.days(date.qyr(6,2000))], [sysmis],
2435    [warning: DEBUG EVALUATE: The first argument to DATE.QYR must be 1, 2, 3, or 4.]],
2436   [[ctime.days(date.qyr($sysmis,2000))], [sysmis]],
2437   [[ctime.days(date.qyr(1,$sysmis))], [sysmis]],
2438   [[ctime.days(date.qyr($sysmis,$sysmis))], [sysmis]],
2439   [[date.qyr('a',2000)], [error],
2440    [error: DEBUG EVALUATE: Type mismatch invoking DATE.QYR(number, number) as date.qyr(string, number).]],
2441   [[date.qyr(5,'a')], [error],
2442    [error: DEBUG EVALUATE: Type mismatch invoking DATE.QYR(number, number) as date.qyr(number, string).]],
2443   [[date.qyr('a','b')], [error],
2444    [error: DEBUG EVALUATE: Type mismatch invoking DATE.QYR(number, number) as date.qyr(string, string).]],
2445
2446   [[ctime.days(date.wkyr(1,2000))], [152385.00]],
2447   [[ctime.days(date.wkyr(15,1999))], [152118.00]],
2448   [[ctime.days(date.wkyr(36,1999))], [152265.00]],
2449   [[ctime.days(date.wkyr(54,1999))], [sysmis],
2450    [error: DEBUG EVALUATE: The week argument to DATE.WKYR is outside the acceptable range of 1 to 53.  The result will be system-missing.]],
2451   [[ctime.days(date.wkyr($sysmis,1999))], [sysmis]],
2452   [[ctime.days(date.wkyr(1,$sysmis))], [sysmis]],
2453   [[ctime.days(date.wkyr($sysmis,$sysmis))], [sysmis]],
2454   [[date.wkyr('a',1999)], [error],
2455    [error: DEBUG EVALUATE: Type mismatch invoking DATE.WKYR(number, number) as date.wkyr(string, number).]],
2456   [[date.wkyr(5,'a')], [error],
2457    [error: DEBUG EVALUATE: Type mismatch invoking DATE.WKYR(number, number) as date.wkyr(number, string).]],
2458   [[date.wkyr('a','b')], [error],
2459    [error: DEBUG EVALUATE: Type mismatch invoking DATE.WKYR(number, number) as date.wkyr(string, string).]],
2460
2461   [[ctime.days(date.yrday(2000,1))], [152385.00]],
2462   [[ctime.days(date.yrday(2000,100))], [152484.00]],
2463   [[ctime.days(date.yrday(2000,253))], [152637.00]],
2464   [[ctime.days(date.yrday(2000,500))], [sysmis],
2465    [error: DEBUG EVALUATE: The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366.  The result will be system-missing.]],
2466   [[ctime.days(date.yrday(2000,-100))], [sysmis],
2467    [error: DEBUG EVALUATE: The day argument to DATE.YRDAY is outside the acceptable range of 1 to 366.  The result will be system-missing.]],
2468   [[ctime.days(date.yrday(1999,$sysmis))], [sysmis]],
2469   [[ctime.days(date.yrday($sysmis,1))], [sysmis]],
2470   [[ctime.days(date.yrday($sysmis,$sysmis))], [sysmis]],
2471   [[date.yrday(1999,'a')], [error],
2472    [error: DEBUG EVALUATE: Type mismatch invoking DATE.YRDAY(number, number) as date.yrday(number, string).]],
2473   [[date.yrday('a',5)], [error],
2474    [error: DEBUG EVALUATE: Type mismatch invoking DATE.YRDAY(number, number) as date.yrday(string, number).]],
2475   [[date.yrday('a','b')], [error],
2476    [error: DEBUG EVALUATE: Type mismatch invoking DATE.YRDAY(number, number) as date.yrday(string, string).]])
2477
2478 CHECK_EXPR_EVAL([xdate],
2479   [[xdate.date(date.mdy(6,10,1648) + time.hms(0,0,0)) / 86400], [23981.00]],
2480   [[xdate.date(date.mdy(6,30,1680) + time.hms(4,50,38)) / 86400], [35689.00]],
2481   [[xdate.date(date.mdy(7,24,1716) + time.hms(12,31,35)) / 86400], [48861.00]],
2482   [[xdate.date(date.mdy(6,19,1768) + time.hms(12,47,53)) / 86400], [67819.00]],
2483   [[xdate.date(date.mdy(8,2,1819) + time.hms(1,26,0)) / 86400], [86489.00]],
2484   [[xdate.date(date.mdy(3,27,1839) + time.hms(20,58,11)) / 86400], [93666.00]],
2485   [[xdate.date(date.mdy(4,19,1903) + time.hms(7,36,5)) / 86400], [117064.00]],
2486   [[xdate.date(date.mdy(8,25,1929) + time.hms(15,43,49)) / 86400], [126689.00]],
2487   [[xdate.date(date.mdy(9,29,1941) + time.hms(4,25,9)) / 86400], [131107.00]],
2488   [[xdate.date(date.mdy(4,19,1943) + time.hms(6,49,27)) / 86400], [131674.00]],
2489   [[xdate.date(date.mdy(10,7,1943) + time.hms(2,57,52)) / 86400], [131845.00]],
2490   [[xdate.date(date.mdy(3,17,1992) + time.hms(16,45,44)) / 86400], [149539.00]],
2491   [[xdate.date(date.mdy(2,25,1996) + time.hms(21,30,57)) / 86400], [150979.00]],
2492   [[xdate.date(date.mdy(9,29,1941) + time.hms(4,25,9)) / 86400], [131107.00]],
2493   [[xdate.date(date.mdy(4,19,43) + time.hms(6,49,27)) / 86400], [131674.00]],
2494   [[xdate.date(date.mdy(10,7,43) + time.hms(2,57,52)) / 86400], [131845.00]],
2495   [[xdate.date(date.mdy(3,17,92) + time.hms(16,45,44)) / 86400], [149539.00]],
2496   [[xdate.date(date.mdy(2,25,96) + time.hms(21,30,57)) / 86400], [150979.00]],
2497   [[xdate.date(date.mdy(11,10,2038) + time.hms(22,30,4)) / 86400], [166578.00]],
2498   [[xdate.date(date.mdy(7,18,2094) + time.hms(1,56,51)) / 86400], [186917.00]],
2499   [[xdate.date(123.4)], [0.00]],
2500   [[xdate.date('')], [error],
2501    [error: DEBUG EVALUATE: Type mismatch invoking XDATE.DATE(number) as xdate.date(string).]],
2502
2503   [[xdate.hour(date.mdy(6,10,1648) + time.hms(0,0,0))], [0.00]],
2504   [[xdate.hour(date.mdy(6,30,1680) + time.hms(4,50,38))], [4.00]],
2505   [[xdate.hour(date.mdy(7,24,1716) + time.hms(12,31,35))], [12.00]],
2506   [[xdate.hour(date.mdy(6,19,1768) + time.hms(12,47,53))], [12.00]],
2507   [[xdate.hour(date.mdy(8,2,1819) + time.hms(1,26,0))], [1.00]],
2508   [[xdate.hour(date.mdy(3,27,1839) + time.hms(20,58,11))], [20.00]],
2509   [[xdate.hour(date.mdy(4,19,1903) + time.hms(7,36,5))], [7.00]],
2510   [[xdate.hour(date.mdy(8,25,1929) + time.hms(15,43,49))], [15.00]],
2511   [[xdate.hour(date.mdy(9,29,1941) + time.hms(4,25,9))], [4.00]],
2512   [[xdate.hour(date.mdy(4,19,1943) + time.hms(6,49,27))], [6.00]],
2513   [[xdate.hour(date.mdy(10,7,1943) + time.hms(2,57,52))], [2.00]],
2514   [[xdate.hour(date.mdy(3,17,1992) + time.hms(16,45,44))], [16.00]],
2515   [[xdate.hour(date.mdy(2,25,1996) + time.hms(21,30,57))], [21.00]],
2516   [[xdate.hour(date.mdy(9,29,1941) + time.hms(4,25,9))], [4.00]],
2517   [[xdate.hour(date.mdy(4,19,43) + time.hms(6,49,27))], [6.00]],
2518   [[xdate.hour(date.mdy(10,7,43) + time.hms(2,57,52))], [2.00]],
2519   [[xdate.hour(date.mdy(3,17,92) + time.hms(16,45,44))], [16.00]],
2520   [[xdate.hour(date.mdy(2,25,96) + time.hms(21,30,57))], [21.00]],
2521   [[xdate.hour(date.mdy(11,10,2038) + time.hms(22,30,4))], [22.00]],
2522   [[xdate.hour(date.mdy(7,18,2094) + time.hms(1,56,51))], [1.00]],
2523   [[xdate.hour(-1)], [-1.00]],
2524   [[xdate.hour(1)], [0.00]],
2525   [[xdate.hour($sysmis)], [sysmis]],
2526   [[xdate.hour('')], [error],
2527    [error: DEBUG EVALUATE: Type mismatch invoking XDATE.HOUR(number) as xdate.hour(string).]],
2528
2529   [[xdate.jday(date.mdy(6,10,1648) + time.hms(0,0,0))], [162.00]],
2530   [[xdate.jday(date.mdy(6,30,1680) + time.hms(4,50,38))], [182.00]],
2531   [[xdate.jday(date.mdy(7,24,1716) + time.hms(12,31,35))], [206.00]],
2532   [[xdate.jday(date.mdy(6,19,1768) + time.hms(12,47,53))], [171.00]],
2533   [[xdate.jday(date.mdy(8,2,1819) + time.hms(1,26,0))], [214.00]],
2534   [[xdate.jday(date.mdy(3,27,1839) + time.hms(20,58,11))], [86.00]],
2535   [[xdate.jday(date.mdy(4,19,1903) + time.hms(7,36,5))], [109.00]],
2536   [[xdate.jday(date.mdy(8,25,1929) + time.hms(15,43,49))], [237.00]],
2537   [[xdate.jday(date.mdy(9,29,1941) + time.hms(4,25,9))], [272.00]],
2538   [[xdate.jday(date.mdy(4,19,1943) + time.hms(6,49,27))], [109.00]],
2539   [[xdate.jday(date.mdy(10,7,1943) + time.hms(2,57,52))], [280.00]],
2540   [[xdate.jday(date.mdy(3,17,1992) + time.hms(16,45,44))], [77.00]],
2541   [[xdate.jday(date.mdy(2,25,1996) + time.hms(21,30,57))], [56.00]],
2542   [[xdate.jday(date.mdy(9,29,1941) + time.hms(4,25,9))], [272.00]],
2543   [[xdate.jday(date.mdy(4,19,43) + time.hms(6,49,27))], [109.00]],
2544   [[xdate.jday(date.mdy(10,7,43) + time.hms(2,57,52))], [280.00]],
2545   [[xdate.jday(date.mdy(3,17,92) + time.hms(16,45,44))], [77.00]],
2546   [[xdate.jday(date.mdy(2,25,96) + time.hms(21,30,57))], [56.00]],
2547   [[xdate.jday(date.mdy(11,10,2038) + time.hms(22,30,4))], [314.00]],
2548   [[xdate.jday(date.mdy(7,18,2094) + time.hms(1,56,51))], [199.00]],
2549   [[xdate.jday(0)], [sysmis]],
2550   [[xdate.jday(1)], [sysmis]],
2551   [[xdate.jday(86400)], [288.00]],
2552
2553   [[xdate.mday(date.mdy(6,10,1648) + time.hms(0,0,0))], [10.00]],
2554   [[xdate.mday(date.mdy(6,30,1680) + time.hms(4,50,38))], [30.00]],
2555   [[xdate.mday(date.mdy(7,24,1716) + time.hms(12,31,35))], [24.00]],
2556   [[xdate.mday(date.mdy(6,19,1768) + time.hms(12,47,53))], [19.00]],
2557   [[xdate.mday(date.mdy(8,2,1819) + time.hms(1,26,0))], [2.00]],
2558   [[xdate.mday(date.mdy(3,27,1839) + time.hms(20,58,11))], [27.00]],
2559   [[xdate.mday(date.mdy(4,19,1903) + time.hms(7,36,5))], [19.00]],
2560   [[xdate.mday(date.mdy(8,25,1929) + time.hms(15,43,49))], [25.00]],
2561   [[xdate.mday(date.mdy(9,29,1941) + time.hms(4,25,9))], [29.00]],
2562   [[xdate.mday(date.mdy(4,19,1943) + time.hms(6,49,27))], [19.00]],
2563   [[xdate.mday(date.mdy(10,7,1943) + time.hms(2,57,52))], [7.00]],
2564   [[xdate.mday(date.mdy(3,17,1992) + time.hms(16,45,44))], [17.00]],
2565   [[xdate.mday(date.mdy(2,25,1996) + time.hms(21,30,57))], [25.00]],
2566   [[xdate.mday(date.mdy(9,29,1941) + time.hms(4,25,9))], [29.00]],
2567   [[xdate.mday(date.mdy(4,19,43) + time.hms(6,49,27))], [19.00]],
2568   [[xdate.mday(date.mdy(10,7,43) + time.hms(2,57,52))], [7.00]],
2569   [[xdate.mday(date.mdy(3,17,92) + time.hms(16,45,44))], [17.00]],
2570   [[xdate.mday(date.mdy(2,25,96) + time.hms(21,30,57))], [25.00]],
2571   [[xdate.mday(date.mdy(11,10,2038) + time.hms(22,30,4))], [10.00]],
2572   [[xdate.mday(date.mdy(7,18,2094) + time.hms(1,56,51))], [18.00]],
2573
2574   [[xdate.minute(date.mdy(6,10,1648) + time.hms(0,0,0))], [0.00]],
2575   [[xdate.minute(date.mdy(6,30,1680) + time.hms(4,50,38))], [50.00]],
2576   [[xdate.minute(date.mdy(7,24,1716) + time.hms(12,31,35))], [31.00]],
2577   [[xdate.minute(date.mdy(6,19,1768) + time.hms(12,47,53))], [47.00]],
2578   [[xdate.minute(date.mdy(8,2,1819) + time.hms(1,26,0))], [26.00]],
2579   [[xdate.minute(date.mdy(3,27,1839) + time.hms(20,58,11))], [58.00]],
2580   [[xdate.minute(date.mdy(4,19,1903) + time.hms(7,36,5))], [36.00]],
2581   [[xdate.minute(date.mdy(8,25,1929) + time.hms(15,43,49))], [43.00]],
2582   [[xdate.minute(date.mdy(9,29,1941) + time.hms(4,25,9))], [25.00]],
2583   [[xdate.minute(date.mdy(4,19,1943) + time.hms(6,49,27))], [49.00]],
2584   [[xdate.minute(date.mdy(10,7,1943) + time.hms(2,57,52))], [57.00]],
2585   [[xdate.minute(date.mdy(3,17,1992) + time.hms(16,45,44))], [45.00]],
2586   [[xdate.minute(date.mdy(2,25,1996) + time.hms(21,30,57))], [30.00]],
2587   [[xdate.minute(date.mdy(9,29,1941) + time.hms(4,25,9))], [25.00]],
2588   [[xdate.minute(date.mdy(4,19,43) + time.hms(6,49,27))], [49.00]],
2589   [[xdate.minute(date.mdy(10,7,43) + time.hms(2,57,52))], [57.00]],
2590   [[xdate.minute(date.mdy(3,17,92) + time.hms(16,45,44))], [45.00]],
2591   [[xdate.minute(date.mdy(2,25,96) + time.hms(21,30,57))], [30.00]],
2592   [[xdate.minute(date.mdy(11,10,2038) + time.hms(22,30,4))], [30.00]],
2593   [[xdate.minute(date.mdy(7,18,2094) + time.hms(1,56,51))], [56.00]],
2594
2595   [[xdate.month(date.mdy(6,10,1648) + time.hms(0,0,0))], [6.00]],
2596   [[xdate.month(date.mdy(6,30,1680) + time.hms(4,50,38))], [6.00]],
2597   [[xdate.month(date.mdy(7,24,1716) + time.hms(12,31,35))], [7.00]],
2598   [[xdate.month(date.mdy(6,19,1768) + time.hms(12,47,53))], [6.00]],
2599   [[xdate.month(date.mdy(8,2,1819) + time.hms(1,26,0))], [8.00]],
2600   [[xdate.month(date.mdy(3,27,1839) + time.hms(20,58,11))], [3.00]],
2601   [[xdate.month(date.mdy(4,19,1903) + time.hms(7,36,5))], [4.00]],
2602   [[xdate.month(date.mdy(8,25,1929) + time.hms(15,43,49))], [8.00]],
2603   [[xdate.month(date.mdy(9,29,1941) + time.hms(4,25,9))], [9.00]],
2604   [[xdate.month(date.mdy(4,19,1943) + time.hms(6,49,27))], [4.00]],
2605   [[xdate.month(date.mdy(10,7,1943) + time.hms(2,57,52))], [10.00]],
2606   [[xdate.month(date.mdy(3,17,1992) + time.hms(16,45,44))], [3.00]],
2607   [[xdate.month(date.mdy(2,25,1996) + time.hms(21,30,57))], [2.00]],
2608   [[xdate.month(date.mdy(9,29,1941) + time.hms(4,25,9))], [9.00]],
2609   [[xdate.month(date.mdy(4,19,43) + time.hms(6,49,27))], [4.00]],
2610   [[xdate.month(date.mdy(10,7,43) + time.hms(2,57,52))], [10.00]],
2611   [[xdate.month(date.mdy(3,17,92) + time.hms(16,45,44))], [3.00]],
2612   [[xdate.month(date.mdy(2,25,96) + time.hms(21,30,57))], [2.00]],
2613   [[xdate.month(date.mdy(11,10,2038) + time.hms(22,30,4))], [11.00]],
2614   [[xdate.month(date.mdy(7,18,2094) + time.hms(1,56,51))], [7.00]],
2615
2616   [[xdate.quarter(date.mdy(6,10,1648) + time.hms(0,0,0))], [2.00]],
2617   [[xdate.quarter(date.mdy(6,30,1680) + time.hms(4,50,38))], [2.00]],
2618   [[xdate.quarter(date.mdy(7,24,1716) + time.hms(12,31,35))], [3.00]],
2619   [[xdate.quarter(date.mdy(6,19,1768) + time.hms(12,47,53))], [2.00]],
2620   [[xdate.quarter(date.mdy(8,2,1819) + time.hms(1,26,0))], [3.00]],
2621   [[xdate.quarter(date.mdy(3,27,1839) + time.hms(20,58,11))], [1.00]],
2622   [[xdate.quarter(date.mdy(4,19,1903) + time.hms(7,36,5))], [2.00]],
2623   [[xdate.quarter(date.mdy(8,25,1929) + time.hms(15,43,49))], [3.00]],
2624   [[xdate.quarter(date.mdy(9,29,1941) + time.hms(4,25,9))], [3.00]],
2625   [[xdate.quarter(date.mdy(4,19,1943) + time.hms(6,49,27))], [2.00]],
2626   [[xdate.quarter(date.mdy(10,7,1943) + time.hms(2,57,52))], [4.00]],
2627   [[xdate.quarter(date.mdy(3,17,1992) + time.hms(16,45,44))], [1.00]],
2628   [[xdate.quarter(date.mdy(2,25,1996) + time.hms(21,30,57))], [1.00]],
2629   [[xdate.quarter(date.mdy(9,29,1941) + time.hms(4,25,9))], [3.00]],
2630   [[xdate.quarter(date.mdy(4,19,43) + time.hms(6,49,27))], [2.00]],
2631   [[xdate.quarter(date.mdy(10,7,43) + time.hms(2,57,52))], [4.00]],
2632   [[xdate.quarter(date.mdy(3,17,92) + time.hms(16,45,44))], [1.00]],
2633   [[xdate.quarter(date.mdy(2,25,96) + time.hms(21,30,57))], [1.00]],
2634   [[xdate.quarter(date.mdy(11,10,2038) + time.hms(22,30,4))], [4.00]],
2635   [[xdate.quarter(date.mdy(7,18,2094) + time.hms(1,56,51))], [3.00]],
2636
2637   [[xdate.second(date.mdy(6,10,1648) + time.hms(0,0,0))], [0.00]],
2638   [[xdate.second(date.mdy(6,30,1680) + time.hms(4,50,38))], [38.00]],
2639   [[xdate.second(date.mdy(7,24,1716) + time.hms(12,31,35))], [35.00]],
2640   [[xdate.second(date.mdy(6,19,1768) + time.hms(12,47,53))], [53.00]],
2641   [[xdate.second(date.mdy(8,2,1819) + time.hms(1,26,0))], [0.00]],
2642   [[xdate.second(date.mdy(3,27,1839) + time.hms(20,58,11))], [11.00]],
2643   [[xdate.second(date.mdy(4,19,1903) + time.hms(7,36,5))], [5.00]],
2644   [[xdate.second(date.mdy(8,25,1929) + time.hms(15,43,49))], [49.00]],
2645   [[xdate.second(date.mdy(9,29,1941) + time.hms(4,25,9))], [9.00]],
2646   [[xdate.second(date.mdy(4,19,1943) + time.hms(6,49,27))], [27.00]],
2647   [[xdate.second(date.mdy(10,7,1943) + time.hms(2,57,52))], [52.00]],
2648   [[xdate.second(date.mdy(3,17,1992) + time.hms(16,45,44))], [44.00]],
2649   [[xdate.second(date.mdy(2,25,1996) + time.hms(21,30,57))], [57.00]],
2650   [[xdate.second(date.mdy(9,29,1941) + time.hms(4,25,9))], [9.00]],
2651   [[xdate.second(date.mdy(4,19,43) + time.hms(6,49,27))], [27.00]],
2652   [[xdate.second(date.mdy(10,7,43) + time.hms(2,57,52))], [52.00]],
2653   [[xdate.second(date.mdy(3,17,92) + time.hms(16,45,44))], [44.00]],
2654   [[xdate.second(date.mdy(2,25,96) + time.hms(21,30,57))], [57.00]],
2655   [[xdate.second(date.mdy(11,10,2038) + time.hms(22,30,4))], [4.00]],
2656   [[xdate.second(date.mdy(7,18,2094) + time.hms(1,56,51))], [51.00]],
2657
2658   [[xdate.tday(date.mdy(6,10,1648) + time.hms(0,0,0))], [23981.00]],
2659   [[xdate.tday(date.mdy(6,30,1680) + time.hms(4,50,38))], [35689.00]],
2660   [[xdate.tday(date.mdy(7,24,1716) + time.hms(12,31,35))], [48861.00]],
2661   [[xdate.tday(date.mdy(6,19,1768) + time.hms(12,47,53))], [67819.00]],
2662   [[xdate.tday(date.mdy(8,2,1819) + time.hms(1,26,0))], [86489.00]],
2663   [[xdate.tday(date.mdy(3,27,1839) + time.hms(20,58,11))], [93666.00]],
2664   [[xdate.tday(date.mdy(4,19,1903) + time.hms(7,36,5))], [117064.00]],
2665   [[xdate.tday(date.mdy(8,25,1929) + time.hms(15,43,49))], [126689.00]],
2666   [[xdate.tday(date.mdy(9,29,1941) + time.hms(4,25,9))], [131107.00]],
2667   [[xdate.tday(date.mdy(4,19,1943) + time.hms(6,49,27))], [131674.00]],
2668   [[xdate.tday(date.mdy(10,7,1943) + time.hms(2,57,52))], [131845.00]],
2669   [[xdate.tday(date.mdy(3,17,1992) + time.hms(16,45,44))], [149539.00]],
2670   [[xdate.tday(date.mdy(2,25,1996) + time.hms(21,30,57))], [150979.00]],
2671   [[xdate.tday(date.mdy(9,29,1941) + time.hms(4,25,9))], [131107.00]],
2672   [[xdate.tday(date.mdy(4,19,43) + time.hms(6,49,27))], [131674.00]],
2673   [[xdate.tday(date.mdy(10,7,43) + time.hms(2,57,52))], [131845.00]],
2674   [[xdate.tday(date.mdy(3,17,92) + time.hms(16,45,44))], [149539.00]],
2675   [[xdate.tday(date.mdy(2,25,96) + time.hms(21,30,57))], [150979.00]],
2676   [[xdate.tday(date.mdy(11,10,2038) + time.hms(22,30,4))], [166578.00]],
2677   [[xdate.tday(date.mdy(7,18,2094) + time.hms(1,56,51))], [186917.00]],
2678
2679   [[xdate.time(date.mdy(6,10,1648) + time.hms(0,0,0))], [0.00]],
2680   [[xdate.time(date.mdy(6,30,1680) + time.hms(4,50,38))], [17438.00]],
2681   [[xdate.time(date.mdy(7,24,1716) + time.hms(12,31,35))], [45095.00]],
2682   [[xdate.time(date.mdy(6,19,1768) + time.hms(12,47,53))], [46073.00]],
2683   [[xdate.time(date.mdy(8,2,1819) + time.hms(1,26,0))], [5160.00]],
2684   [[xdate.time(date.mdy(3,27,1839) + time.hms(20,58,11))], [75491.00]],
2685   [[xdate.time(date.mdy(4,19,1903) + time.hms(7,36,5))], [27365.00]],
2686   [[xdate.time(date.mdy(8,25,1929) + time.hms(15,43,49))], [56629.00]],
2687   [[xdate.time(date.mdy(9,29,1941) + time.hms(4,25,9))], [15909.00]],
2688   [[xdate.time(date.mdy(4,19,1943) + time.hms(6,49,27))], [24567.00]],
2689   [[xdate.time(date.mdy(10,7,1943) + time.hms(2,57,52))], [10672.00]],
2690   [[xdate.time(date.mdy(3,17,1992) + time.hms(16,45,44))], [60344.00]],
2691   [[xdate.time(date.mdy(2,25,1996) + time.hms(21,30,57))], [77457.00]],
2692   [[xdate.time(date.mdy(9,29,1941) + time.hms(4,25,9))], [15909.00]],
2693   [[xdate.time(date.mdy(4,19,43) + time.hms(6,49,27))], [24567.00]],
2694   [[xdate.time(date.mdy(10,7,43) + time.hms(2,57,52))], [10672.00]],
2695   [[xdate.time(date.mdy(3,17,92) + time.hms(16,45,44))], [60344.00]],
2696   [[xdate.time(date.mdy(2,25,96) + time.hms(21,30,57))], [77457.00]],
2697   [[xdate.time(date.mdy(11,10,2038) + time.hms(22,30,4))], [81004.00]],
2698   [[xdate.time(date.mdy(7,18,2094) + time.hms(1,56,51))], [7011.00]],
2699
2700   [[xdate.week(date.mdy(6,10,1648) + time.hms(0,0,0))], [24.00]],
2701   [[xdate.week(date.mdy(6,30,1680) + time.hms(4,50,38))], [26.00]],
2702   [[xdate.week(date.mdy(7,24,1716) + time.hms(12,31,35))], [30.00]],
2703   [[xdate.week(date.mdy(6,19,1768) + time.hms(12,47,53))], [25.00]],
2704   [[xdate.week(date.mdy(8,2,1819) + time.hms(1,26,0))], [31.00]],
2705   [[xdate.week(date.mdy(3,27,1839) + time.hms(20,58,11))], [13.00]],
2706   [[xdate.week(date.mdy(4,19,1903) + time.hms(7,36,5))], [16.00]],
2707   [[xdate.week(date.mdy(8,25,1929) + time.hms(15,43,49))], [34.00]],
2708   [[xdate.week(date.mdy(9,29,1941) + time.hms(4,25,9))], [39.00]],
2709   [[xdate.week(date.mdy(4,19,1943) + time.hms(6,49,27))], [16.00]],
2710   [[xdate.week(date.mdy(10,7,1943) + time.hms(2,57,52))], [40.00]],
2711   [[xdate.week(date.mdy(3,17,1992) + time.hms(16,45,44))], [11.00]],
2712   [[xdate.week(date.mdy(2,25,1996) + time.hms(21,30,57))], [8.00]],
2713   [[xdate.week(date.mdy(9,29,1941) + time.hms(4,25,9))], [39.00]],
2714   [[xdate.week(date.mdy(4,19,43) + time.hms(6,49,27))], [16.00]],
2715   [[xdate.week(date.mdy(10,7,43) + time.hms(2,57,52))], [40.00]],
2716   [[xdate.week(date.mdy(3,17,92) + time.hms(16,45,44))], [11.00]],
2717   [[xdate.week(date.mdy(2,25,96) + time.hms(21,30,57))], [8.00]],
2718   [[xdate.week(date.mdy(11,10,2038) + time.hms(22,30,4))], [45.00]],
2719   [[xdate.week(date.mdy(7,18,2094) + time.hms(1,56,51))], [29.00]],
2720
2721   [[xdate.wkday(date.mdy(6,10,1648))], [4.00]],
2722   [[xdate.wkday(date.mdy(6,30,1680))], [1.00]],
2723   [[xdate.wkday(date.mdy(7,24,1716))], [6.00]],
2724   [[xdate.wkday(date.mdy(6,19,1768))], [1.00]],
2725   [[xdate.wkday(date.mdy(8,2,1819))], [2.00]],
2726   [[xdate.wkday(date.mdy(3,27,1839))], [4.00]],
2727   [[xdate.wkday(date.mdy(4,19,1903))], [1.00]],
2728   [[xdate.wkday(date.mdy(8,25,1929))], [1.00]],
2729   [[xdate.wkday(date.mdy(9,29,1941))], [2.00]],
2730   [[xdate.wkday(date.mdy(4,19,1943))], [2.00]],
2731   [[xdate.wkday(date.mdy(10,7,1943))], [5.00]],
2732   [[xdate.wkday(date.mdy(3,17,1992))], [3.00]],
2733   [[xdate.wkday(date.mdy(2,25,1996))], [1.00]],
2734   [[xdate.wkday(date.mdy(9,29,1941))], [2.00]],
2735   [[xdate.wkday(date.mdy(4,19,43))], [2.00]],
2736   [[xdate.wkday(date.mdy(10,7,43))], [5.00]],
2737   [[xdate.wkday(date.mdy(3,17,92))], [3.00]],
2738   [[xdate.wkday(date.mdy(2,25,96))], [1.00]],
2739   [[xdate.wkday(date.mdy(11,10,2038))], [4.00]],
2740   [[xdate.wkday(date.mdy(7,18,2094))], [1.00]],
2741
2742   [[xdate.year(date.mdy(6,10,1648) + time.hms(0,0,0))], [1648.00]],
2743   [[xdate.year(date.mdy(6,30,1680) + time.hms(4,50,38))], [1680.00]],
2744   [[xdate.year(date.mdy(7,24,1716) + time.hms(12,31,35))], [1716.00]],
2745   [[xdate.year(date.mdy(6,19,1768) + time.hms(12,47,53))], [1768.00]],
2746   [[xdate.year(date.mdy(8,2,1819) + time.hms(1,26,0))], [1819.00]],
2747   [[xdate.year(date.mdy(3,27,1839) + time.hms(20,58,11))], [1839.00]],
2748   [[xdate.year(date.mdy(4,19,1903) + time.hms(7,36,5))], [1903.00]],
2749   [[xdate.year(date.mdy(8,25,1929) + time.hms(15,43,49))], [1929.00]],
2750   [[xdate.year(date.mdy(9,29,1941) + time.hms(4,25,9))], [1941.00]],
2751   [[xdate.year(date.mdy(4,19,1943) + time.hms(6,49,27))], [1943.00]],
2752   [[xdate.year(date.mdy(10,7,1943) + time.hms(2,57,52))], [1943.00]],
2753   [[xdate.year(date.mdy(3,17,1992) + time.hms(16,45,44))], [1992.00]],
2754   [[xdate.year(date.mdy(2,25,1996) + time.hms(21,30,57))], [1996.00]],
2755   [[xdate.year(date.mdy(9,29,1941) + time.hms(4,25,9))], [1941.00]],
2756   [[xdate.year(date.mdy(4,19,43) + time.hms(6,49,27))], [1943.00]],
2757   [[xdate.year(date.mdy(10,7,43) + time.hms(2,57,52))], [1943.00]],
2758   [[xdate.year(date.mdy(3,17,92) + time.hms(16,45,44))], [1992.00]],
2759   [[xdate.year(date.mdy(2,25,96) + time.hms(21,30,57))], [1996.00]],
2760   [[xdate.year(date.mdy(11,10,2038) + time.hms(22,30,4))], [2038.00]],
2761   [[xdate.year(date.mdy(7,18,2094) + time.hms(1,56,51))], [2094.00]])
2762
2763 CHECK_EXPR_EVAL([datediff],
2764   [[datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'years')], [-32.00]],
2765   [[datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'years')], [-36.00]],
2766   [[datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'years')], [-51.00]],
2767   [[datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'years')], [-51.00]],
2768   [[datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'years')], [-19.00]],
2769   [[datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'years')], [-64.00]],
2770   [[datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'years')], [-26.00]],
2771   [[datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'years')], [-12.00]],
2772   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'years')], [-1.00]],
2773   [[datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'years')], [0.00]],
2774   [[datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'years')], [-48.00]],
2775   [[datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'years')], [-3.00]],
2776   [[datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'years')], [-54.00]],
2777   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'years')], [-1.00]],
2778   [[datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'years')], [0.00]],
2779   [[datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'years')], [-48.00]],
2780   [[datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'years')], [-3.00]],
2781   [[datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'years')], [-42.00]],
2782   [[datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'years')], [-55.00]],
2783   [[datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'years')], [-3.00]],
2784   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'years')], [-4.00]],
2785   [[datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'years')], [-2.00]],
2786
2787   [[datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'quarters')], [-128.00]],
2788   [[datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'quarters')], [-144.00]],
2789   [[datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'quarters')], [-207.00]],
2790   [[datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'quarters')], [-204.00]],
2791   [[datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'quarters')], [-78.00]],
2792   [[datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'quarters')], [-256.00]],
2793   [[datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'quarters')], [-105.00]],
2794   [[datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'quarters')], [-48.00]],
2795   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'quarters')], [-6.00]],
2796   [[datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'quarters')], [-1.00]],
2797   [[datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'quarters')], [-193.00]],
2798   [[datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'quarters')], [-15.00]],
2799   [[datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'quarters')], [-217.00]],
2800   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'quarters')], [-6.00]],
2801   [[datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'quarters')], [-1.00]],
2802   [[datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'quarters')], [-193.00]],
2803   [[datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'quarters')], [-15.00]],
2804   [[datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'quarters')], [-170.00]],
2805   [[datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'quarters')], [-222.00]],
2806   [[datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'quarters')], [-15.00]],
2807   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'quarters')], [-16.00]],
2808   [[datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'quarters')], [-11.00]],
2809
2810   [[datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'months')], [-384.00]],
2811   [[datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'months')], [-432.00]],
2812   [[datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'months')], [-622.00]],
2813   [[datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'months')], [-613.00]],
2814   [[datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'months')], [-235.00]],
2815   [[datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'months')], [-768.00]],
2816   [[datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'months')], [-316.00]],
2817   [[datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'months')], [-145.00]],
2818   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'months')], [-18.00]],
2819   [[datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'months')], [-5.00]],
2820   [[datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'months')], [-581.00]],
2821   [[datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'months')], [-47.00]],
2822   [[datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'months')], [-652.00]],
2823   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'months')], [-18.00]],
2824   [[datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'months')], [-5.00]],
2825   [[datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'months')], [-581.00]],
2826   [[datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'months')], [-47.00]],
2827   [[datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'months')], [-512.00]],
2828   [[datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'months')], [-668.00]],
2829   [[datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'months')], [-47.00]],
2830   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'months')], [-48.00]],
2831   [[datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'months')], [-35.00]],
2832
2833   [[datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'weeks')], [-1672.00]],
2834   [[datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'weeks')], [-1881.00]],
2835   [[datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'weeks')], [-2708.00]],
2836   [[datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'weeks')], [-2667.00]],
2837   [[datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'weeks')], [-1025.00]],
2838   [[datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'weeks')], [-3342.00]],
2839   [[datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'weeks')], [-1375.00]],
2840   [[datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'weeks')], [-631.00]],
2841   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'weeks')], [-81.00]],
2842   [[datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'weeks')], [-24.00]],
2843   [[datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'weeks')], [-2527.00]],
2844   [[datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'weeks')], [-205.00]],
2845   [[datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'weeks')], [-2838.00]],
2846   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'weeks')], [-81.00]],
2847   [[datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'weeks')], [-24.00]],
2848   [[datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'weeks')], [-2527.00]],
2849   [[datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'weeks')], [-205.00]],
2850   [[datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'weeks')], [-2228.00]],
2851   [[datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'weeks')], [-2905.00]],
2852   [[datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'weeks')], [-208.00]],
2853   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'weeks')], [-208.00]],
2854   [[datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'weeks')], [-156.00]],
2855
2856   [[datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'days')], [-11708.00]],
2857   [[datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'days')], [-13172.00]],
2858   [[datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'days')], [-18958.00]],
2859   [[datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'days')], [-18670.00]],
2860   [[datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'days')], [-7177.00]],
2861   [[datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'days')], [-23398.00]],
2862   [[datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'days')], [-9625.00]],
2863   [[datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'days')], [-4418.00]],
2864   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'days')], [-567.00]],
2865   [[datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'days')], [-171.00]],
2866   [[datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'days')], [-17694.00]],
2867   [[datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'days')], [-1440.00]],
2868   [[datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'days')], [-19872.00]],
2869   [[datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'days')], [-567.00]],
2870   [[datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'days')], [-171.00]],
2871   [[datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'days')], [-17694.00]],
2872   [[datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'days')], [-1440.00]],
2873   [[datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'days')], [-15599.00]],
2874   [[datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'days')], [-20339.00]],
2875   [[datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'days')], [-1460.00]],
2876   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'days')], [-1461.00]],
2877   [[datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'days')], [-1094.00]],
2878
2879   [[datediff(date.mdy(6,30,1680), date.mdy(6,10,1648), 'years')], [32.00]],
2880   [[datediff(date.mdy(7,24,1716), date.mdy(6,30,1680), 'years')], [36.00]],
2881   [[datediff(date.mdy(6,19,1768), date.mdy(7,24,1716), 'years')], [51.00]],
2882   [[datediff(date.mdy(8,2,1819), date.mdy(6,19,1768), 'years')], [51.00]],
2883   [[datediff(date.mdy(3,27,1839), date.mdy(8,2,1819), 'years')], [19.00]],
2884   [[datediff(date.mdy(4,19,1903), date.mdy(3,27,1839), 'years')], [64.00]],
2885   [[datediff(date.mdy(8,25,1929), date.mdy(4,19,1903), 'years')], [26.00]],
2886   [[datediff(date.mdy(9,29,1941), date.mdy(8,25,1929), 'years')], [12.00]],
2887   [[datediff(date.mdy(4,19,1943), date.mdy(9,29,1941), 'years')], [1.00]],
2888   [[datediff(date.mdy(10,7,1943), date.mdy(4,19,1943), 'years')], [0.00]],
2889   [[datediff(date.mdy(3,17,1992), date.mdy(10,7,1943), 'years')], [48.00]],
2890   [[datediff(date.mdy(2,25,1996), date.mdy(3,17,1992), 'years')], [3.00]],
2891   [[datediff(date.mdy(2,25,1996), date.mdy(9,29,1941), 'years')], [54.00]],
2892   [[datediff(date.mdy(4,19,43), date.mdy(9,29,1941), 'years')], [1.00]],
2893   [[datediff(date.mdy(10,7,43), date.mdy(4,19,43), 'years')], [0.00]],
2894   [[datediff(date.mdy(3,17,92), date.mdy(10,7,43), 'years')], [48.00]],
2895   [[datediff(date.mdy(2,25,96), date.mdy(3,17,92), 'years')], [3.00]],
2896   [[datediff(date.mdy(11,10,2038), date.mdy(2,25,96), 'years')], [42.00]],
2897   [[datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'years')], [55.00]],
2898   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'years')], [3.00]],
2899   [[datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'years')], [4.00]],
2900   [[datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'years')], [2.00]],
2901
2902   [[datediff(date.mdy(6,30,1680), date.mdy(6,10,1648), 'months')], [384.00]],
2903   [[datediff(date.mdy(7,24,1716), date.mdy(6,30,1680), 'months')], [432.00]],
2904   [[datediff(date.mdy(6,19,1768), date.mdy(7,24,1716), 'months')], [622.00]],
2905   [[datediff(date.mdy(8,2,1819), date.mdy(6,19,1768), 'months')], [613.00]],
2906   [[datediff(date.mdy(3,27,1839), date.mdy(8,2,1819), 'months')], [235.00]],
2907   [[datediff(date.mdy(4,19,1903), date.mdy(3,27,1839), 'months')], [768.00]],
2908   [[datediff(date.mdy(8,25,1929), date.mdy(4,19,1903), 'months')], [316.00]],
2909   [[datediff(date.mdy(9,29,1941), date.mdy(8,25,1929), 'months')], [145.00]],
2910   [[datediff(date.mdy(4,19,1943), date.mdy(9,29,1941), 'months')], [18.00]],
2911   [[datediff(date.mdy(10,7,1943), date.mdy(4,19,1943), 'months')], [5.00]],
2912   [[datediff(date.mdy(3,17,1992), date.mdy(10,7,1943), 'months')], [581.00]],
2913   [[datediff(date.mdy(2,25,1996), date.mdy(3,17,1992), 'months')], [47.00]],
2914   [[datediff(date.mdy(2,25,1996), date.mdy(9,29,1941), 'months')], [652.00]],
2915   [[datediff(date.mdy(4,19,43), date.mdy(9,29,1941), 'months')], [18.00]],
2916   [[datediff(date.mdy(10,7,43), date.mdy(4,19,43), 'months')], [5.00]],
2917   [[datediff(date.mdy(3,17,92), date.mdy(10,7,43), 'months')], [581.00]],
2918   [[datediff(date.mdy(2,25,96), date.mdy(3,17,92), 'months')], [47.00]],
2919   [[datediff(date.mdy(11,10,2038), date.mdy(2,25,96), 'months')], [512.00]],
2920   [[datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'months')], [668.00]],
2921   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'months')], [47.00]],
2922   [[datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'months')], [48.00]],
2923   [[datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'months')], [35.00]],
2924
2925   [[datediff(date.mdy(6,30,1680), date.mdy(6,10,1648), 'quarters')], [128.00]],
2926   [[datediff(date.mdy(7,24,1716), date.mdy(6,30,1680), 'quarters')], [144.00]],
2927   [[datediff(date.mdy(6,19,1768), date.mdy(7,24,1716), 'quarters')], [207.00]],
2928   [[datediff(date.mdy(8,2,1819), date.mdy(6,19,1768), 'quarters')], [204.00]],
2929   [[datediff(date.mdy(3,27,1839), date.mdy(8,2,1819), 'quarters')], [78.00]],
2930   [[datediff(date.mdy(4,19,1903), date.mdy(3,27,1839), 'quarters')], [256.00]],
2931   [[datediff(date.mdy(8,25,1929), date.mdy(4,19,1903), 'quarters')], [105.00]],
2932   [[datediff(date.mdy(9,29,1941), date.mdy(8,25,1929), 'quarters')], [48.00]],
2933   [[datediff(date.mdy(4,19,1943), date.mdy(9,29,1941), 'quarters')], [6.00]],
2934   [[datediff(date.mdy(10,7,1943), date.mdy(4,19,1943), 'quarters')], [1.00]],
2935   [[datediff(date.mdy(3,17,1992), date.mdy(10,7,1943), 'quarters')], [193.00]],
2936   [[datediff(date.mdy(2,25,1996), date.mdy(3,17,1992), 'quarters')], [15.00]],
2937   [[datediff(date.mdy(2,25,1996), date.mdy(9,29,1941), 'quarters')], [217.00]],
2938   [[datediff(date.mdy(4,19,43), date.mdy(9,29,1941), 'quarters')], [6.00]],
2939   [[datediff(date.mdy(10,7,43), date.mdy(4,19,43), 'quarters')], [1.00]],
2940   [[datediff(date.mdy(3,17,92), date.mdy(10,7,43), 'quarters')], [193.00]],
2941   [[datediff(date.mdy(2,25,96), date.mdy(3,17,92), 'quarters')], [15.00]],
2942   [[datediff(date.mdy(11,10,2038), date.mdy(2,25,96), 'quarters')], [170.00]],
2943   [[datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'quarters')], [222.00]],
2944   [[datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'quarters')], [15.00]],
2945   [[datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'quarters')], [16.00]],
2946   [[datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'quarters')], [11.00]],
2947
2948 dnl time of day is significant for DATEDIFF
2949   [[datediff(date.mdy(10,15,1910) + 234, date.mdy(10,10,1910) + 123, 'days')],
2950     [5.00]],
2951   [[datediff(date.mdy(10,15,1910) + 123, date.mdy(10,10,1910) + 234, 'days')],
2952     [4.00]],
2953   [[datediff(date.mdy(10,24,1910) + 234, date.mdy(10,10,1910) + 123, 'weeks')],
2954     [2.00]],
2955   [[datediff(date.mdy(10,24,1910) + 123, date.mdy(10,10,1910) + 234, 'weeks')],
2956     [1.00]],
2957   [[datediff(date.mdy(10,10,1910) + 234, date.mdy(5,10,1910) + 123, 'months')],
2958     [5.00]],
2959   [[datediff(date.mdy(10,10,1910) + 123, date.mdy(5,10,1910) + 234, 'months')],
2960     [4.00]],
2961   [[datediff(date.mdy(5,10,1919) + 234, date.mdy(5,10,1910) + 123, 'years')],
2962     [9.00]],
2963   [[datediff(date.mdy(5,10,1919) + 123, date.mdy(5,10,1910) + 234, 'years')],
2964     [8.00]],
2965
2966   [[datediff(date.mdy(10,10,1910) + 123, date.mdy(10,15,1910) + 234, 'days')],
2967     [-5.00]],
2968   [[datediff(date.mdy(10,10,1910) + 234, date.mdy(10,15,1910) + 123, 'days')],
2969     [-4.00]],
2970   [[datediff(date.mdy(10,10,1910) + 123, date.mdy(10,24,1910) + 234, 'weeks')],
2971     [-2.00]],
2972   [[datediff(date.mdy(10,10,1910) + 234, date.mdy(10,24,1910) + 123, 'weeks')],
2973     [-1.00]],
2974   [[datediff(date.mdy(5,10,1910) + 123, date.mdy(10,10,1910) + 234, 'months')],
2975     [-5.00]],
2976   [[datediff(date.mdy(5,10,1910) + 234, date.mdy(10,10,1910) + 123, 'months')],
2977     [-4.00]],
2978   [[datediff(date.mdy(5,10,1910) + 123, date.mdy(5,10,1919) + 234, 'years')],
2979     [-9.00]],
2980   [[datediff(date.mdy(5,10,1910) + 234, date.mdy(5,10,1919) + 123, 'years')],
2981     [-8.00]])
2982
2983 CHECK_EXPR_EVAL([datesum],
2984 dnl DATESUM with non-leap year
2985   [[ctime.days(datesum(date.mdy(1,31,1900), 1, 'months') - date.mdy(1,1,1900))], [58.00]],
2986   [[ctime.days(datesum(date.mdy(1,31,1900), 2, 'months') - date.mdy(1,1,1900))], [89.00]],
2987   [[ctime.days(datesum(date.mdy(1,31,1900), 3, 'months') - date.mdy(1,1,1900))], [119.00]],
2988   [[ctime.days(datesum(date.mdy(1,31,1900), 4, 'months') - date.mdy(1,1,1900))], [150.00]],
2989   [[ctime.days(datesum(date.mdy(1,31,1900), 5.4, 'months') - date.mdy(1,1,1900))], [180.00]],
2990   [[ctime.days(datesum(date.mdy(1,31,1900), 6, 'months') - date.mdy(1,1,1900))], [211.00]],
2991   [[ctime.days(datesum(date.mdy(1,31,1900), 7, 'months') - date.mdy(1,1,1900))], [242.00]],
2992   [[ctime.days(datesum(date.mdy(1,31,1900), 8, 'months') - date.mdy(1,1,1900))], [272.00]],
2993   [[ctime.days(datesum(date.mdy(1,31,1900), 9, 'months') - date.mdy(1,1,1900))], [303.00]],
2994   [[ctime.days(datesum(date.mdy(1,31,1900), 10, 'months') - date.mdy(1,1,1900))], [333.00]],
2995   [[ctime.days(datesum(date.mdy(1,31,1900), 11, 'months') - date.mdy(1,1,1900))], [364.00]],
2996   [[ctime.days(datesum(date.mdy(1,31,1900), 12, 'months') - date.mdy(1,1,1900))], [395.00]],
2997   [[ctime.days(datesum(date.mdy(1,31,1900), 13.9, 'months') - date.mdy(1,1,1900))], [423.00]],
2998   [[ctime.days(datesum(date.mdy(1,31,1900), 1, 'months', 'rollover') - date.mdy(1,1,1900))], [61.00]],
2999   [[ctime.days(datesum(date.mdy(1,31,1900), 2, 'months', 'rollover') - date.mdy(1,1,1900))], [89.00]],
3000   [[ctime.days(datesum(date.mdy(1,31,1900), 3.2, 'months', 'rollover') - date.mdy(1,1,1900))], [120.00]],
3001   [[ctime.days(datesum(date.mdy(1,31,1900), 4, 'months', 'rollover') - date.mdy(1,1,1900))], [150.00]],
3002   [[ctime.days(datesum(date.mdy(1,31,1900), 5, 'months', 'rollover') - date.mdy(1,1,1900))], [181.00]],
3003   [[ctime.days(datesum(date.mdy(1,31,1900), 6, 'months', 'rollover') - date.mdy(1,1,1900))], [211.00]],
3004   [[ctime.days(datesum(date.mdy(1,31,1900), 7, 'months', 'rollover') - date.mdy(1,1,1900))], [242.00]],
3005   [[ctime.days(datesum(date.mdy(1,31,1900), 8, 'months', 'rollover') - date.mdy(1,1,1900))], [273.00]],
3006   [[ctime.days(datesum(date.mdy(1,31,1900), 9, 'months', 'rollover') - date.mdy(1,1,1900))], [303.00]],
3007   [[ctime.days(datesum(date.mdy(1,31,1900), 10, 'months', 'rollover') - date.mdy(1,1,1900))], [334.00]],
3008   [[ctime.days(datesum(date.mdy(1,31,1900), 11, 'months', 'rollover') - date.mdy(1,1,1900))], [364.00]],
3009   [[ctime.days(datesum(date.mdy(1,31,1900), 12, 'months', 'rollover') - date.mdy(1,1,1900))], [395.00]],
3010   [[ctime.days(datesum(date.mdy(1,31,1900), 13, 'months', 'rollover') - date.mdy(1,1,1900))], [426.00]],
3011
3012 dnl DATESUM with leap year
3013   [[ctime.days(datesum(date.mdy(1,31,1904), 1, 'months') - date.mdy(1,1,1904))], [59.00]],
3014   [[ctime.days(datesum(date.mdy(1,31,1904), 2.5, 'months') - date.mdy(1,1,1904))], [90.00]],
3015   [[ctime.days(datesum(date.mdy(1,31,1904), 3, 'months') - date.mdy(1,1,1904))], [120.00]],
3016   [[ctime.days(datesum(date.mdy(1,31,1904), 4.9, 'months') - date.mdy(1,1,1904))], [151.00]],
3017   [[ctime.days(datesum(date.mdy(1,31,1904), 5.1, 'months') - date.mdy(1,1,1904))], [181.00]],
3018   [[ctime.days(datesum(date.mdy(1,31,1904), 6, 'months') - date.mdy(1,1,1904))], [212.00]],
3019   [[ctime.days(datesum(date.mdy(1,31,1904), 7, 'months') - date.mdy(1,1,1904))], [243.00]],
3020   [[ctime.days(datesum(date.mdy(1,31,1904), 8, 'months') - date.mdy(1,1,1904))], [273.00]],
3021   [[ctime.days(datesum(date.mdy(1,31,1904), 9, 'months') - date.mdy(1,1,1904))], [304.00]],
3022   [[ctime.days(datesum(date.mdy(1,31,1904), 10, 'months') - date.mdy(1,1,1904))], [334.00]],
3023   [[ctime.days(datesum(date.mdy(1,31,1904), 11, 'months') - date.mdy(1,1,1904))], [365.00]],
3024   [[ctime.days(datesum(date.mdy(1,31,1904), 12, 'months') - date.mdy(1,1,1904))], [396.00]],
3025   [[ctime.days(datesum(date.mdy(1,31,1904), 13, 'months') - date.mdy(1,1,1904))], [424.00]],
3026   [[ctime.days(datesum(date.mdy(1,31,1904), 1, 'months', 'rollover') - date.mdy(1,1,1904))], [61.00]],
3027   [[ctime.days(datesum(date.mdy(1,31,1904), 2, 'months', 'rollover') - date.mdy(1,1,1904))], [90.00]],
3028   [[ctime.days(datesum(date.mdy(1,31,1904), 3, 'months', 'rollover') - date.mdy(1,1,1904))], [121.00]],
3029   [[ctime.days(datesum(date.mdy(1,31,1904), 4, 'months', 'rollover') - date.mdy(1,1,1904))], [151.00]],
3030   [[ctime.days(datesum(date.mdy(1,31,1904), 5, 'months', 'rollover') - date.mdy(1,1,1904))], [182.00]],
3031   [[ctime.days(datesum(date.mdy(1,31,1904), 6, 'months', 'rollover') - date.mdy(1,1,1904))], [212.00]],
3032   [[ctime.days(datesum(date.mdy(1,31,1904), 7, 'months', 'rollover') - date.mdy(1,1,1904))], [243.00]],
3033   [[ctime.days(datesum(date.mdy(1,31,1904), 8, 'months', 'rollover') - date.mdy(1,1,1904))], [274.00]],
3034   [[ctime.days(datesum(date.mdy(1,31,1904), 9, 'months', 'rollover') - date.mdy(1,1,1904))], [304.00]],
3035   [[ctime.days(datesum(date.mdy(1,31,1904), 10, 'months', 'rollover') - date.mdy(1,1,1904))], [335.00]],
3036   [[ctime.days(datesum(date.mdy(1,31,1904), 11, 'months', 'rollover') - date.mdy(1,1,1904))], [365.00]],
3037   [[ctime.days(datesum(date.mdy(1,31,1904), 12, 'months', 'rollover') - date.mdy(1,1,1904))], [396.00]],
3038   [[ctime.days(datesum(date.mdy(1,31,1904), 13, 'months', 'rollover') - date.mdy(1,1,1904))], [427.00]],
3039
3040   [[ctime.days(datesum(date.mdy(6,10,1648), 1, 'weeks') - date.mdy(6,10,1648))], [7.00]],
3041   [[ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'weeks') - date.mdy(6,30,1680))], [17.50]],
3042   [[ctime.days(datesum(date.mdy(7,24,1716), -3, 'weeks') - date.mdy(7,24,1716))], [-21.00]],
3043   [[ctime.days(datesum(date.mdy(6,19,1768), 4, 'weeks') - date.mdy(6,19,1768))], [28.00]],
3044   [[ctime.days(datesum(date.mdy(8,2,1819), 5, 'weeks') - date.mdy(8,2,1819))], [35.00]],
3045
3046   [[ctime.days(datesum(date.mdy(6,10,1648), 1, 'days') - date.mdy(6,10,1648))], [1.00]],
3047   [[ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'days') - date.mdy(6,30,1680))], [2.50]],
3048   [[ctime.days(datesum(date.mdy(7,24,1716), -3, 'days') - date.mdy(7,24,1716))], [-3.00]],
3049   [[ctime.days(datesum(date.mdy(6,19,1768), 4, 'days') - date.mdy(6,19,1768))], [4.00]],
3050   [[ctime.days(datesum(date.mdy(8,2,1819), 5, 'days') - date.mdy(8,2,1819))], [5.00]],
3051   [[ctime.days(datesum(date.mdy(6,10,1648), 1, 'hours') - date.mdy(6,10,1648))], [0.04]],
3052   [[ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'hours') - date.mdy(6,30,1680))], [0.10]],
3053   [[ctime.days(datesum(date.mdy(6,19,1768), -4, 'hours') - date.mdy(6,19,1768))], [-0.17]],
3054   [[ctime.days(datesum(date.mdy(8,2,1819), 5, 'hours') - date.mdy(8,2,1819))], [0.21]],
3055
3056 dnl DATESUM preserves time-of-day for units of days and longer.
3057   [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'days') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [5.00]],
3058   [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'weeks') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [35.00]],
3059   [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'months') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [153.00]],
3060   [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'years') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [1827.00]])
3061
3062 CHECK_EXPR_EVAL([miscellaneous],
3063 dnl These test values are from Applied Statistics, Algorithm AS 310.
3064   [[1000 * ncdf.beta(.868,10,20,150)], [937.66]],
3065   [[1000 * ncdf.beta(.9,10,10,120)], [730.68]],
3066   [[1000 * ncdf.beta(.88,15,5,80)], [160.43]],
3067   [[1000 * ncdf.beta(.85,20,10,110)], [186.75]],
3068   [[1000 * ncdf.beta(.66,20,30,65)], [655.94]],
3069   [[1000 * ncdf.beta(.72,20,50,130)], [979.69]],
3070   [[1000 * ncdf.beta(.72,30,20,80)], [116.24]],
3071   [[1000 * ncdf.beta(.8,30,40,130)], [993.04]],
3072
3073 dnl FIXME: LAG
3074 dnl
3075   [[X], [1.00], [], [(X = 1.00)]],
3076   [[SYSMIS(1)], [false]],
3077   [[SYSMIS($SYSMIS)], [true]],
3078   [[SYSMIS(1 + $SYSMIS)], [true]],
3079
3080 dnl FIXME: out-of-range and nearly out-of-range values on dates
3081 dnl
3082 dnl Tests correctness of generic optimizations in optimize_tree().
3083   [[x + 0], [10.00], [], [(X = 10.00)]],
3084   [[x - 0], [-3.00], [], [(X = -3.00)]],
3085   [[0 + x], [5.00], [], [(X = 5.00)]],
3086   [[x * 1], [10.00], [], [(X = 10.00)]],
3087   [[1 * x], [-3.00], [], [(X = -3.00)]],
3088   [[x / 1], [5.00], [], [(X = 5.00)]],
3089   [[0 * x], [0.00], [], [(X = 10.00)]],
3090   [[x * 0], [0.00], [], [(X = -3.00)]],
3091   [[0 / x], [0.00], [], [(X = 5.00)]],
3092   [[mod(0, x)], [0.00], [], [(X = 5.00)]],
3093   [[x ** 1], [5.00], [], [(X = 5.00)]],
3094   [[x ** 2], [25.00], [], [(X = 5.00)]])
3095
3096 CHECK_EXPR_EVAL([negative checks],
3097   [[$nonexistent], [error], [error: DEBUG EVALUATE: Unknown system variable $nonexistent.]],
3098   [[RANGE(1, 2)], [error], [error: DEBUG EVALUATE: RANGE(number, number, number[, number, number]...) must have an odd number of arguments.]],
3099   [[CONCAT.1('a', 'b')], [error], [error: DEBUG EVALUATE: CONCAT(string[, string]...) function cannot accept suffix .1 to specify the minimum number of valid arguments.]],
3100   [[foobar(x)], [error], [error: DEBUG EVALUATE: No function or vector named foobar.]],
3101   [[CONCAT.1('a' b)], [error], [error: DEBUG EVALUATE: Syntax error at `b': expecting `,' or `)'.]],
3102   [[NCDF.CHISQ(1, 2, 3)], [error], [error: DEBUG EVALUATE: NCDF.CHISQ(number, number, number) is not available in this version of PSPP.]])
3103
3104 AT_SETUP([LAG function])
3105 AT_DATA([lag.sps], [dnl
3106 data list /W 1.
3107 begin data.
3108 1
3109 2
3110 3
3111 4
3112 5
3113 end data.
3114
3115 compute X=lag(w,1).
3116 compute Y=lag(x).
3117 compute Z=lag(w,2).
3118 list.
3119 ])
3120 AT_CHECK([pspp -o pspp.csv lag.sps])
3121 AT_CHECK([cat pspp.csv], [0], [dnl
3122 Table: Reading 1 record from INLINE.
3123 Variable,Record,Columns,Format
3124 W,1,1-1,F1.0
3125
3126 Table: Data List
3127 W,X,Y,Z
3128 1,.  ,.  ,.  @&t@
3129 2,1.00,.  ,.  @&t@
3130 3,2.00,1.00,1.00
3131 4,3.00,2.00,2.00
3132 5,4.00,3.00,3.00
3133 ])
3134 AT_CLEANUP
3135
3136 AT_SETUP([LAG crash bug])
3137 AT_DATA([lag.sps], [dnl
3138 DATA LIST LIST /x.
3139 BEGIN DATA
3140 1
3141 2
3142 END DATA.
3143
3144 DO IF (x <> LAG(x) ).
3145         ECHO 'hello'.
3146 END IF.
3147
3148 EXECUTE.
3149 ])
3150 AT_CHECK([pspp -o pspp.csv lag.sps])
3151 AT_CHECK([cat pspp.csv], [0], [dnl
3152 Table: Reading free-form data from INLINE.
3153 Variable,Format
3154 x,F8.0
3155
3156 hello
3157 ])
3158 AT_CLEANUP
3159
3160 dnl Tests for a bug which caused UNIFORM(x) to always return zero.
3161 AT_SETUP([UNIFORM function])
3162 AT_DATA([uniform.sps], [dnl
3163 set seed=10.
3164 input program.
3165 + loop #i = 1 to 20.
3166 +    do repeat response=R1.
3167 +       compute response = uniform(10).
3168 +    end repeat.
3169 +    end case.
3170 + end loop.
3171 + end file.
3172 end input program.
3173
3174 list.
3175 ])
3176 AT_CHECK([pspp -o pspp.csv uniform.sps])
3177 AT_CHECK([cat pspp.csv], [0], [dnl
3178 Table: Data List
3179 R1
3180 7.71
3181 2.99
3182 .21
3183 4.95
3184 6.34
3185 4.43
3186 7.49
3187 8.32
3188 4.99
3189 5.83
3190 2.25
3191 .25
3192 1.98
3193 7.09
3194 7.61
3195 2.66
3196 1.69
3197 2.64
3198 .88
3199 1.50
3200 ])
3201 AT_CLEANUP
3202
3203 AT_SETUP([VALUELABEL function])
3204 AT_DATA([valuelabel.sps], [dnl
3205 DATA LIST notable /n 1 s 2(a).
3206 VALUE LABELS /n 0 'Very dissatisfied'
3207                 1 'Dissatisfied'
3208                 1.5 'Slightly Peeved'
3209                 2 'Neutral'
3210                 3 'Satisfied'
3211                 4 'Very satisfied'.
3212 VALUE LABELS /s 'a' 'Wouldn''t buy again'
3213                 'b' 'Unhappy'
3214                 'c' 'Bored'
3215                 'd' 'Satiated'
3216                 'e' 'Elated'.
3217 STRING nlabel slabel(a10).
3218 COMPUTE nlabel = VALUELABEL(n).
3219 COMPUTE slabel = VALUELABEL(s).
3220 LIST.
3221 BEGIN DATA.
3222
3223 0a
3224 1b
3225 2c
3226 3d
3227 4e
3228 5f
3229 6g
3230 END DATA.
3231 ])
3232 AT_CHECK([pspp -o pspp.csv valuelabel.sps])
3233 AT_CHECK([cat pspp.csv], [0], [dnl
3234 Table: Data List
3235 n,s,nlabel,slabel
3236 .,,,
3237 0,a,Very dissa,Wouldn't b
3238 1,b,Dissatisfi,Unhappy
3239 2,c,Neutral,Bored
3240 3,d,Satisfied,Satiated
3241 4,e,Very satis,Elated
3242 5,f,,
3243 6,g,,
3244 ])
3245 AT_CLEANUP
3246
3247 AT_SETUP([variables in expressions])
3248 AT_DATA([variables.sps], [dnl
3249 DATA LIST NOTABLE/N1 TO N5 1-5.
3250 MISSING VALUES N1 TO N5 (3 THRU 5, 1).
3251 BEGIN DATA.
3252 12345
3253 6789
3254 END DATA.
3255
3256 COMPUTE P1=N1.
3257 COMPUTE P2=N2.
3258 COMPUTE P3=N3.
3259 COMPUTE P4=N4.
3260 COMPUTE P5=N5.
3261
3262 COMPUTE MC=NMISS(N1 TO N5).
3263 COMPUTE VC=NVALID(N1 TO N5).
3264
3265 COMPUTE S1=SYSMIS(N1).
3266 COMPUTE S2=SYSMIS(N2).
3267 COMPUTE S3=SYSMIS(N3).
3268 COMPUTE S4=SYSMIS(N4).
3269 COMPUTE S5=SYSMIS(N5).
3270
3271 COMPUTE M1=MISSING(N1).
3272 COMPUTE M2=MISSING(N2).
3273 COMPUTE M3=MISSING(N3).
3274 COMPUTE M4=MISSING(N4).
3275 COMPUTE M5=MISSING(N5).
3276
3277 COMPUTE V1=VALUE(N1).
3278 COMPUTE V2=VALUE(N2).
3279 COMPUTE V3=VALUE(N3).
3280 COMPUTE V4=VALUE(N4).
3281 COMPUTE V5=VALUE(N5).
3282
3283 FORMATS ALL (F1).
3284
3285 LIST.
3286 ])
3287 AT_CHECK([pspp -o pspp.csv variables.sps])
3288 AT_CHECK([cat pspp.csv], [0], [dnl
3289 Table: Data List
3290 N1,N2,N3,N4,N5,P1,P2,P3,P4,P5,MC,VC,S1,S2,S3,S4,S5,M1,M2,M3,M4,M5,V1,V2,V3,V4,V5
3291 1,2,3,4,5,.,2,.,.,.,4,1,0,0,0,0,0,1,0,1,1,1,1,2,3,4,5
3292 6,7,8,9,.,6,7,8,9,.,1,4,0,0,0,0,1,0,0,0,0,1,6,7,8,9,.
3293 ])
3294 AT_CLEANUP
3295
3296 AT_SETUP([vectors in expressions])
3297 AT_DATA([vectors.sps], [dnl
3298 DATA LIST NOTABLE /N1 TO N5 1-5.
3299 MISSING VALUES N1 TO N5 (3 THRU 5, 1).
3300 BEGIN DATA.
3301 12345
3302 6789
3303 END DATA.
3304
3305 VECTOR N=N1 TO N5.
3306 VECTOR X(5).
3307 LOOP I=1 TO 5.
3308 COMPUTE X(I)=N(I) + 1.
3309 END LOOP.
3310
3311 FORMATS ALL (F2).
3312
3313 LIST.
3314 ])
3315 AT_CHECK([pspp -o pspp.csv vectors.sps])
3316 AT_CHECK([cat pspp.csv], [0], [dnl
3317 Table: Data List
3318 N1,N2,N3,N4,N5,X1,X2,X3,X4,X5,I
3319 1,2,3,4,5,.,3,.,.,.,5
3320 6,7,8,9,.,7,8,9,10,.,5
3321 ])
3322 AT_CLEANUP