+range('1', '2', '3', '4') => error
+
+evaluate.sps:77.17-77.51: error: DEBUG EVALUATE: RANGE(string, string, string[,
+string, string]...) must have an odd number of arguments.
+ 77 | DEBUG EVALUATE /range('1', '2', '3', '4', '5', '6').
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+range('1', '2', '3', '4', '5', '6') => error
+
+evaluate.sps:78.17-78.34: error: DEBUG EVALUATE: Function invocation
+range(number, string, string) does not match any known function. Candidates
+are:
+RANGE(number, number, number[, number, number]...)
+RANGE(string, string, string[, string, string]...).
+ 78 | DEBUG EVALUATE /range(1, '2', '3').
+ | ^~~~~~~~~~~~~~~~~~
+
+range(1, '2', '3') => error
+
+evaluate.sps:79.17-79.34: error: DEBUG EVALUATE: Function invocation
+range(string, number, string) does not match any known function. Candidates
+are:
+RANGE(number, number, number[, number, number]...)
+RANGE(string, string, string[, string, string]...).
+ 79 | DEBUG EVALUATE /range('1', 2, '3').
+ | ^~~~~~~~~~~~~~~~~~
+
+range('1', 2, '3') => error
+
+evaluate.sps:80.17-80.34: error: DEBUG EVALUATE: Function invocation
+range(string, string, number) does not match any known function. Candidates
+are:
+RANGE(number, number, number[, number, number]...)
+RANGE(string, string, string[, string, string]...).
+ 80 | DEBUG EVALUATE /range('1', '2', 3).
+ | ^~~~~~~~~~~~~~~~~~
+
+range('1', '2', 3) => error
+]])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - MAX MIN])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /max(1, 2, 3, 4, 5).
+DEBUG EVALUATE /max(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /max(1, 2).
+DEBUG EVALUATE /max().
+DEBUG EVALUATE /max(1).
+DEBUG EVALUATE /max(1, $sysmis).
+DEBUG EVALUATE /max(1, 2, 3, $sysmis).
+DEBUG EVALUATE /max.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /max.4(1, 2, 3).
+
+DEBUG EVALUATE /max("2", "3", "5", "1", "4").
+DEBUG EVALUATE /max("1", "2").
+DEBUG EVALUATE /max("1").
+
+DEBUG EVALUATE /min(1, 2, 3, 4, 5).
+DEBUG EVALUATE /min(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /min(1, 2).
+DEBUG EVALUATE /min().
+DEBUG EVALUATE /min(1).
+DEBUG EVALUATE /min(1, $sysmis).
+DEBUG EVALUATE /min(1, 2, 3, $sysmis).
+DEBUG EVALUATE /min.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /min.4(1, 2, 3).
+
+DEBUG EVALUATE /min("2", "3", "5", "1", "4").
+DEBUG EVALUATE /min("1", "2").
+DEBUG EVALUATE /min("1").
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1],
+[[max(1, 2, 3, 4, 5) => 5.00
+
+max(1, $sysmis, 2, 3, $sysmis, 4, 5) => 5.00
+
+max(1, 2) => 2.00
+
+evaluate.sps:6.17-6.20: error: DEBUG EVALUATE: Function invocation max() does
+not match any known function. Candidates are:
+MAX(number[, number]...)
+MAX(string[, string]...).
+ 6 | DEBUG EVALUATE /max().
+ | ^~~~
+
+max() => error
+
+max(1) => 1.00
+
+max(1, $sysmis) => 1.00
+
+max(1, 2, 3, $sysmis) => 3.00
+
+max.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:11.17-11.30: error: DEBUG EVALUATE: For MAX(number[, number]...)
+with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 11 | DEBUG EVALUATE /max.4(1, 2, 3).
+ | ^~~~~~~~~~~~~~
+
+max.4(1, 2, 3) => error
+
+max("2", "3", "5", "1", "4") => "5"
+
+max("1", "2") => "2"
+
+max("1") => "1"
+
+min(1, 2, 3, 4, 5) => 1.00
+
+min(1, $sysmis, 2, 3, $sysmis, 4, 5) => 1.00
+
+min(1, 2) => 1.00
+
+evaluate.sps:20.17-20.20: error: DEBUG EVALUATE: Function invocation min() does
+not match any known function. Candidates are:
+MIN(number[, number]...)
+MIN(string[, string]...).
+ 20 | DEBUG EVALUATE /min().
+ | ^~~~
+
+min() => error
+
+min(1) => 1.00
+
+min(1, $sysmis) => 1.00
+
+min(1, 2, 3, $sysmis) => 1.00
+
+min.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:25.17-25.30: error: DEBUG EVALUATE: For MIN(number[, number]...)
+with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 25 | DEBUG EVALUATE /min.4(1, 2, 3).
+ | ^~~~~~~~~~~~~~
+
+min.4(1, 2, 3) => error
+
+min("2", "3", "5", "1", "4") => "1"
+
+min("1", "2") => "1"
+
+min("1") => "1"
+]])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - CFVAR MEAN MEDIAN])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /cfvar(1, 2, 3, 4, 5).
+DEBUG EVALUATE /cfvar(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /cfvar(1, 2).
+DEBUG EVALUATE /cfvar(1).
+DEBUG EVALUATE /cfvar(1, $sysmis).
+DEBUG EVALUATE /cfvar(1, 2, 3, $sysmis).
+DEBUG EVALUATE /cfvar.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /cfvar.4(1, 2, 3).
+DEBUG EVALUATE /cfvar('x').
+DEBUG EVALUATE /cfvar('x', 1, 2, 3).
+
+DEBUG EVALUATE /mean(1, 2, 3, 4, 5).
+DEBUG EVALUATE /mean(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /mean(1, 2).
+DEBUG EVALUATE /mean().
+DEBUG EVALUATE /mean(1).
+DEBUG EVALUATE /mean(1, $sysmis).
+DEBUG EVALUATE /mean(1, 2, 3, $sysmis).
+DEBUG EVALUATE /mean.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /mean.4(1, 2, 3).
+
+DEBUG EVALUATE /median(1, 2, 3, 4, 5).
+DEBUG EVALUATE /median(2, 3, 4, 5, 1).
+DEBUG EVALUATE /median(2, 3, 4, 1, 5).
+DEBUG EVALUATE /median(2, 1, 4, 5, 3).
+DEBUG EVALUATE /median(1, 2, 3, 4).
+DEBUG EVALUATE /median(2, 3, 1, 4).
+DEBUG EVALUATE /median(2, 3, 4, 1).
+DEBUG EVALUATE /median(2, 1, 4, 3).
+DEBUG EVALUATE /median(1, $sysmis, 3, 4, 5).
+DEBUG EVALUATE /median(2, 3, 4, 5, $sysmis, 1).
+DEBUG EVALUATE /median($sysmis, $sysmis, $sysmis, 2, 3, 4, 1, 5).
+DEBUG EVALUATE /median(1, 2, 3).
+DEBUG EVALUATE /median(1).
+DEBUG EVALUATE /median(1, 2).
+DEBUG EVALUATE /median(1, 2, $sysmis).
+DEBUG EVALUATE /median(1, $sysmis, $sysmis).
+DEBUG EVALUATE /median($sysmis, $sysmis, $sysmis).
+DEBUG EVALUATE /median.3(1, 2, $sysmis).
+DEBUG EVALUATE /median.2(1, $sysmis).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1],
+[[cfvar(1, 2, 3, 4, 5) => 0.53
+
+cfvar(1, $sysmis, 2, 3, $sysmis, 4, 5) => 0.53
+
+cfvar(1, 2) => 0.47
+
+evaluate.sps:7.17-7.24: error: DEBUG EVALUATE: Type mismatch invoking
+CFVAR(number, number[, number]...) as cfvar(number).
+ 7 | DEBUG EVALUATE /cfvar(1).
+ | ^~~~~~~~
+
+cfvar(1) => error
+
+cfvar(1, $sysmis) => sysmis
+
+cfvar(1, 2, 3, $sysmis) => 0.50
+
+cfvar.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:11.17-11.32: error: DEBUG EVALUATE: For CFVAR(number, number[,
+number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 11 | DEBUG EVALUATE /cfvar.4(1, 2, 3).
+ | ^~~~~~~~~~~~~~~~
+
+cfvar.4(1, 2, 3) => error
+
+evaluate.sps:12.17-12.26: error: DEBUG EVALUATE: Type mismatch invoking
+CFVAR(number, number[, number]...) as cfvar(string).
+ 12 | DEBUG EVALUATE /cfvar('x').
+ | ^~~~~~~~~~
+
+cfvar('x') => error
+
+evaluate.sps:13.17-13.35: error: DEBUG EVALUATE: Type mismatch invoking
+CFVAR(number, number[, number]...) as cfvar(string, number, number, number).
+ 13 | DEBUG EVALUATE /cfvar('x', 1, 2, 3).
+ | ^~~~~~~~~~~~~~~~~~~
+
+cfvar('x', 1, 2, 3) => error
+
+mean(1, 2, 3, 4, 5) => 3.00
+
+mean(1, $sysmis, 2, 3, $sysmis, 4, 5) => 3.00
+
+mean(1, 2) => 1.50
+
+evaluate.sps:18.17-18.21: error: DEBUG EVALUATE: Type mismatch invoking
+MEAN(number[, number]...) as mean().
+ 18 | DEBUG EVALUATE /mean().
+ | ^~~~~
+
+mean() => error
+
+mean(1) => 1.00
+
+mean(1, $sysmis) => 1.00
+
+mean(1, 2, 3, $sysmis) => 2.00
+
+mean.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:23.17-23.31: error: DEBUG EVALUATE: For MEAN(number[, number]...)
+with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 23 | DEBUG EVALUATE /mean.4(1, 2, 3).
+ | ^~~~~~~~~~~~~~~
+
+mean.4(1, 2, 3) => error
+
+median(1, 2, 3, 4, 5) => 3.00
+
+median(2, 3, 4, 5, 1) => 3.00
+
+median(2, 3, 4, 1, 5) => 3.00
+
+median(2, 1, 4, 5, 3) => 3.00
+
+median(1, 2, 3, 4) => 2.50
+
+median(2, 3, 1, 4) => 2.50
+
+median(2, 3, 4, 1) => 2.50
+
+median(2, 1, 4, 3) => 2.50
+
+median(1, $sysmis, 3, 4, 5) => 3.50
+
+median(2, 3, 4, 5, $sysmis, 1) => 3.00
+
+median($sysmis, $sysmis, $sysmis, 2, 3, 4, 1, 5) => 3.00
+
+median(1, 2, 3) => 2.00
+
+median(1) => 1.00
+
+median(1, 2) => 1.50
+
+median(1, 2, $sysmis) => 1.50
+
+median(1, $sysmis, $sysmis) => 1.00
+
+median($sysmis, $sysmis, $sysmis) => sysmis
+
+median.3(1, 2, $sysmis) => sysmis
+
+median.2(1, $sysmis) => sysmis
+]])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - SD SUM VARIANCE])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /sd(1, 2, 3, 4, 5).
+DEBUG EVALUATE /sd(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /sd(1, 2).
+DEBUG EVALUATE /sd(1).
+DEBUG EVALUATE /sd(1, $sysmis).
+DEBUG EVALUATE /sd(1, 2, 3, $sysmis).
+DEBUG EVALUATE /sd.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /sd.4(1, 2, 3).
+DEBUG EVALUATE /sd('x').
+DEBUG EVALUATE /sd('x', 1, 2, 3).
+DEBUG EVALUATE (a=1)(b=2)(c=3)(d=4)(e=5)(f=6)(g=7)/sd(a TO c).
+
+DEBUG EVALUATE /sum(1, 2, 3, 4, 5).
+DEBUG EVALUATE /sum(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /sum(1, 2).
+DEBUG EVALUATE /sum().
+DEBUG EVALUATE /sum(1).
+DEBUG EVALUATE /sum(1, $sysmis).
+DEBUG EVALUATE /sum(1, 2, 3, $sysmis).
+DEBUG EVALUATE /sum.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /sum.4(1, 2, 3).
+DEBUG EVALUATE (a=1)(b=2)(c=3)(d=4)(e=5)(f=6)(g=7)/sum(b TO F).
+
+DEBUG EVALUATE /variance(1, 2, 3, 4, 5).
+DEBUG EVALUATE /variance(1, $sysmis, 2, 3, $sysmis, 4, 5).
+DEBUG EVALUATE /variance(1, 2).
+DEBUG EVALUATE /variance(1).
+DEBUG EVALUATE /variance(1, $sysmis).
+DEBUG EVALUATE /variance(1, 2, 3, $sysmis).
+DEBUG EVALUATE /variance.4(1, 2, 3, $sysmis).
+DEBUG EVALUATE /variance.4(1, 2, 3).
+DEBUG EVALUATE /variance('x').
+DEBUG EVALUATE /variance('x', 1, 2, 3).
+DEBUG EVALUATE (a=1)(b=2)(c=3)(d=4)(e=5)(f=6)(g=7)/variance(a TO e).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1],
+[[sd(1, 2, 3, 4, 5) => 1.58
+
+sd(1, $sysmis, 2, 3, $sysmis, 4, 5) => 1.58
+
+sd(1, 2) => 0.71
+
+evaluate.sps:7.17-7.21: error: DEBUG EVALUATE: Type mismatch invoking
+SD(number, number[, number]...) as sd(number).
+ 7 | DEBUG EVALUATE /sd(1).
+ | ^~~~~
+
+sd(1) => error
+
+sd(1, $sysmis) => sysmis
+
+sd(1, 2, 3, $sysmis) => 1.00
+
+sd.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:11.17-11.29: error: DEBUG EVALUATE: For SD(number, number[,
+number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 11 | DEBUG EVALUATE /sd.4(1, 2, 3).
+ | ^~~~~~~~~~~~~
+
+sd.4(1, 2, 3) => error
+
+evaluate.sps:12.17-12.23: error: DEBUG EVALUATE: Type mismatch invoking
+SD(number, number[, number]...) as sd(string).
+ 12 | DEBUG EVALUATE /sd('x').
+ | ^~~~~~~
+
+sd('x') => error
+
+evaluate.sps:13.17-13.32: error: DEBUG EVALUATE: Type mismatch invoking
+SD(number, number[, number]...) as sd(string, number, number, number).
+ 13 | DEBUG EVALUATE /sd('x', 1, 2, 3).
+ | ^~~~~~~~~~~~~~~~
+
+sd('x', 1, 2, 3) => error
+
+sd(a TO c) => 1.00
+
+sum(1, 2, 3, 4, 5) => 15.00
+
+sum(1, $sysmis, 2, 3, $sysmis, 4, 5) => 15.00
+
+sum(1, 2) => 3.00
+
+evaluate.sps:19.17-19.20: error: DEBUG EVALUATE: Type mismatch invoking
+SUM(number[, number]...) as sum().
+ 19 | DEBUG EVALUATE /sum().
+ | ^~~~
+
+sum() => error
+
+sum(1) => 1.00
+
+sum(1, $sysmis) => 1.00
+
+sum(1, 2, 3, $sysmis) => 6.00
+
+sum.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:24.17-24.30: error: DEBUG EVALUATE: For SUM(number[, number]...)
+with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 24 | DEBUG EVALUATE /sum.4(1, 2, 3).
+ | ^~~~~~~~~~~~~~
+
+sum.4(1, 2, 3) => error
+
+sum(b TO F) => 20.00
+
+variance(1, 2, 3, 4, 5) => 2.50
+
+variance(1, $sysmis, 2, 3, $sysmis, 4, 5) => 2.50
+
+variance(1, 2) => 0.50
+
+evaluate.sps:30.17-30.27: error: DEBUG EVALUATE: Type mismatch invoking
+VARIANCE(number, number[, number]...) as variance(number).
+ 30 | DEBUG EVALUATE /variance(1).
+ | ^~~~~~~~~~~
+
+variance(1) => error
+
+variance(1, $sysmis) => sysmis
+
+variance(1, 2, 3, $sysmis) => 1.00
+
+variance.4(1, 2, 3, $sysmis) => sysmis
+
+evaluate.sps:34.17-34.35: error: DEBUG EVALUATE: For VARIANCE(number, number[,
+number]...) with 3 arguments, at most 3 (not 4) may be required to be valid.
+ 34 | DEBUG EVALUATE /variance.4(1, 2, 3).
+ | ^~~~~~~~~~~~~~~~~~~
+
+variance.4(1, 2, 3) => error
+
+evaluate.sps:35.17-35.29: error: DEBUG EVALUATE: Type mismatch invoking
+VARIANCE(number, number[, number]...) as variance(string).
+ 35 | DEBUG EVALUATE /variance('x').
+ | ^~~~~~~~~~~~~
+
+variance('x') => error
+
+evaluate.sps:36.17-36.38: error: DEBUG EVALUATE: Type mismatch invoking
+VARIANCE(number, number[, number]...) as variance(string, number, number,
+number).
+ 36 | DEBUG EVALUATE /variance('x', 1, 2, 3).
+ | ^~~~~~~~~~~~~~~~~~~~~~
+
+variance('x', 1, 2, 3) => error
+
+variance(a TO e) => 2.50
+]])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - CONCAT])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /concat('').
+DEBUG EVALUATE /concat('a', 'b').
+DEBUG EVALUATE /concat('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h').
+DEBUG EVALUATE /concat('abcdefgh', 'ijklmnopq').
+DEBUG EVALUATE /concat('a', 1).
+DEBUG EVALUATE /concat(1, 2).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1],
+[[concat('') => ""
+
+concat('a', 'b') => "ab"
+
+concat('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h') => "abcdefgh"
+
+concat('abcdefgh', 'ijklmnopq') => "abcdefghijklmnopq"
+
+evaluate.sps:8.17-8.30: error: DEBUG EVALUATE: Type mismatch invoking
+CONCAT(string[, string]...) as concat(string, number).
+ 8 | DEBUG EVALUATE /concat('a', 1).
+ | ^~~~~~~~~~~~~~
+
+concat('a', 1) => error
+
+evaluate.sps:9.17-9.28: error: DEBUG EVALUATE: Type mismatch invoking
+CONCAT(string[, string]...) as concat(number, number).
+ 9 | DEBUG EVALUATE /concat(1, 2).
+ | ^~~~~~~~~~~~
+
+concat(1, 2) => error
+]])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - INDEX])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /index('abcbcde', 'bc').
+DEBUG EVALUATE /index('abcbcde', 'bcd').
+DEBUG EVALUATE /index('abcbcde', 'bcbc').
+DEBUG EVALUATE /index('abcdefgh', 'abc').
+DEBUG EVALUATE /index('abcdefgh', 'bcd').
+DEBUG EVALUATE /index('abcdefgh', 'cde').
+DEBUG EVALUATE /index('abcdefgh', 'def').
+DEBUG EVALUATE /index('abcdefgh', 'efg').
+DEBUG EVALUATE /index('abcdefgh', 'fgh').
+DEBUG EVALUATE /index('abcdefgh', 'fghi').
+DEBUG EVALUATE /index('abcdefgh', 'x').
+DEBUG EVALUATE /index('abcdefgh', 'abch').
+DEBUG EVALUATE /index('banana', 'na').
+DEBUG EVALUATE /index('banana', 'ana').
+DEBUG EVALUATE /index('', 'x').
+DEBUG EVALUATE /index('', '').
+DEBUG EVALUATE /index('abcdefgh', '').
+DEBUG EVALUATE /index('abcdefgh', 'alkjsfdjlskalkjfa').
+
+DEBUG EVALUATE /index('abcbcde', 'bc', 1).
+DEBUG EVALUATE /index('abcbcde', 'dc', 1).
+DEBUG EVALUATE /index('abcbcde', 'abc', 1).
+DEBUG EVALUATE /index('abcbcde', 'bc', 2).
+DEBUG EVALUATE /index('abcbcde', 'dc', 2).
+DEBUG EVALUATE /index('abcbcde', 'abc', 1).
+DEBUG EVALUATE /index('abcbcde', 'bccb', 2).
+DEBUG EVALUATE /index('abcbcde', 'bcbc', 2).
+DEBUG EVALUATE /index('abcbcde', 'bcbc', $sysmis).
+DEBUG EVALUATE /index('abcbcde', 'bcbc', 3).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+index('abcbcde', 'bc') => 2.00
+
+index('abcbcde', 'bcd') => 4.00
+
+index('abcbcde', 'bcbc') => 2.00
+
+index('abcdefgh', 'abc') => 1.00
+
+index('abcdefgh', 'bcd') => 2.00
+
+index('abcdefgh', 'cde') => 3.00
+
+index('abcdefgh', 'def') => 4.00
+
+index('abcdefgh', 'efg') => 5.00
+
+index('abcdefgh', 'fgh') => 6.00
+
+index('abcdefgh', 'fghi') => 0.00
+
+index('abcdefgh', 'x') => 0.00
+
+index('abcdefgh', 'abch') => 0.00
+
+index('banana', 'na') => 3.00
+
+index('banana', 'ana') => 2.00
+
+index('', 'x') => 0.00
+
+index('', '') => 1.00
+
+index('abcdefgh', '') => 1.00
+
+index('abcdefgh', 'alkjsfdjlskalkjfa') => 0.00
+
+index('abcbcde', 'bc', 1) => 2.00
+
+index('abcbcde', 'dc', 1) => 3.00
+
+index('abcbcde', 'abc', 1) => 1.00
+
+index('abcbcde', 'bc', 2) => 2.00
+
+index('abcbcde', 'dc', 2) => 0.00
+
+index('abcbcde', 'abc', 1) => 1.00
+
+index('abcbcde', 'bccb', 2) => 2.00
+
+index('abcbcde', 'bcbc', 2) => 2.00
+
+index('abcbcde', 'bcbc', $sysmis) => sysmis
+
+evaluate.sps:32.17-32.43: error: DEBUG EVALUATE: INDEX needle length argument
+must evenly divide the length of the needles argument.
+ 32 | DEBUG EVALUATE /index('abcbcde', 'bcbc', 3).
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:32.34-32.39: note: DEBUG EVALUATE: The needles argument has length
+4.
+ 32 | DEBUG EVALUATE /index('abcbcde', 'bcbc', 3).
+ | ^~~~~~
+
+evaluate.sps:32.42: note: DEBUG EVALUATE: The needle length argument has value
+3.
+ 32 | DEBUG EVALUATE /index('abcbcde', 'bcbc', 3).
+ | ^
+
+index('abcbcde', 'bcbc', 3) => sysmis
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - RINDEX])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /rindex('abcbcde', 'bc').
+DEBUG EVALUATE /rindex('abcbcde', 'bcd').
+DEBUG EVALUATE /rindex('abcbcde', 'bcbc').
+DEBUG EVALUATE /rindex('abcdefgh', 'abc').
+DEBUG EVALUATE /rindex('abcdefgh', 'bcd').
+DEBUG EVALUATE /rindex('abcdefgh', 'cde').
+DEBUG EVALUATE /rindex('abcdefgh', 'def').
+DEBUG EVALUATE /rindex('abcdefgh', 'efg').
+DEBUG EVALUATE /rindex('abcdefgh', 'fgh').
+DEBUG EVALUATE /rindex('abcdefgh', 'fghi').
+DEBUG EVALUATE /rindex('abcdefgh', 'x').
+DEBUG EVALUATE /rindex('abcdefgh', 'abch').
+DEBUG EVALUATE /rindex('banana', 'na').
+DEBUG EVALUATE /rindex('banana', 'ana').
+DEBUG EVALUATE /rindex('', 'x').
+DEBUG EVALUATE /rindex('', '').
+DEBUG EVALUATE /rindex('abcdefgh', '').
+DEBUG EVALUATE /rindex('abcdefgh', 'alkjsfdjlskalkjfa').
+
+DEBUG EVALUATE /rindex('abcbcde', 'bc', 1).
+DEBUG EVALUATE /rindex('abcbcde', 'dc', 1).
+DEBUG EVALUATE /rindex('abcbcde', 'abc', 1).
+DEBUG EVALUATE /rindex('abcbcde', 'bc', 2).
+DEBUG EVALUATE /rindex('abcbcde', 'dc', 2).
+DEBUG EVALUATE /rindex('abcbcde', 'abc', 1).
+DEBUG EVALUATE /rindex('abcbcde', 'bccb', 2).
+DEBUG EVALUATE /rindex('abcbcde', 'bcbc', 2).
+DEBUG EVALUATE /rindex('abcbcde', 'bcbc', 0).
+DEBUG EVALUATE /rindex('abcbcde', 'bcbc', $sysmis).
+DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', 2).
+DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', $sysmis).
+DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', 'x').
+DEBUG EVALUATE /rindex(1, 'bcdfkjl', 2).
+DEBUG EVALUATE /rindex('aksj', 2, 2).
+DEBUG EVALUATE /rindex(1, 2, 3).
+DEBUG EVALUATE /rindex(1, 2, '3').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+rindex('abcbcde', 'bc') => 4.00
+
+rindex('abcbcde', 'bcd') => 4.00
+
+rindex('abcbcde', 'bcbc') => 2.00
+
+rindex('abcdefgh', 'abc') => 1.00
+
+rindex('abcdefgh', 'bcd') => 2.00
+
+rindex('abcdefgh', 'cde') => 3.00
+
+rindex('abcdefgh', 'def') => 4.00
+
+rindex('abcdefgh', 'efg') => 5.00
+
+rindex('abcdefgh', 'fgh') => 6.00
+
+rindex('abcdefgh', 'fghi') => 0.00
+
+rindex('abcdefgh', 'x') => 0.00
+
+rindex('abcdefgh', 'abch') => 0.00
+
+rindex('banana', 'na') => 5.00
+
+rindex('banana', 'ana') => 4.00
+
+rindex('', 'x') => 0.00
+
+rindex('', '') => 1.00
+
+rindex('abcdefgh', '') => 9.00
+
+rindex('abcdefgh', 'alkjsfdjlskalkjfa') => 0.00
+
+rindex('abcbcde', 'bc', 1) => 5.00
+
+rindex('abcbcde', 'dc', 1) => 6.00
+
+rindex('abcbcde', 'abc', 1) => 5.00
+
+rindex('abcbcde', 'bc', 2) => 4.00
+
+rindex('abcbcde', 'dc', 2) => 0.00
+
+rindex('abcbcde', 'abc', 1) => 5.00
+
+rindex('abcbcde', 'bccb', 2) => 4.00
+
+rindex('abcbcde', 'bcbc', 2) => 4.00
+
+evaluate.sps:31.17-31.44: error: DEBUG EVALUATE: RINDEX needle length argument
+must evenly divide the length of the needles argument.
+ 31 | DEBUG EVALUATE /rindex('abcbcde', 'bcbc', 0).
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:31.35-31.40: note: DEBUG EVALUATE: The needles argument has length
+4.
+ 31 | DEBUG EVALUATE /rindex('abcbcde', 'bcbc', 0).
+ | ^~~~~~
+
+evaluate.sps:31.43: note: DEBUG EVALUATE: The needle length argument has value
+0.
+ 31 | DEBUG EVALUATE /rindex('abcbcde', 'bcbc', 0).
+ | ^
+
+rindex('abcbcde', 'bcbc', 0) => sysmis
+
+rindex('abcbcde', 'bcbc', $sysmis) => sysmis
+
+evaluate.sps:33.17-33.45: error: DEBUG EVALUATE: RINDEX needle length argument
+must evenly divide the length of the needles argument.
+ 33 | DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', 2).
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:33.35-33.41: note: DEBUG EVALUATE: The needles argument has length
+5.
+ 33 | DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', 2).
+ | ^~~~~~~
+
+evaluate.sps:33.44: note: DEBUG EVALUATE: The needle length argument has value
+2.
+ 33 | DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', 2).
+ | ^
+
+rindex('abcbcde', 'bcbcg', 2) => sysmis
+
+rindex('abcbcde', 'bcbcg', $sysmis) => sysmis
+
+evaluate.sps:35.17-35.47: error: DEBUG EVALUATE: Function invocation
+rindex(string, string, string) does not match any known function. Candidates
+are:
+RINDEX(string, string)
+RINDEX(string, string, integer).
+ 35 | DEBUG EVALUATE /rindex('abcbcde', 'bcbcg', 'x').
+ | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+rindex('abcbcde', 'bcbcg', 'x') => error
+
+evaluate.sps:36.17-36.39: error: DEBUG EVALUATE: Function invocation
+rindex(number, string, number) does not match any known function. Candidates
+are:
+RINDEX(string, string)
+RINDEX(string, string, integer).
+ 36 | DEBUG EVALUATE /rindex(1, 'bcdfkjl', 2).
+ | ^~~~~~~~~~~~~~~~~~~~~~~
+
+rindex(1, 'bcdfkjl', 2) => error
+
+evaluate.sps:37.17-37.36: error: DEBUG EVALUATE: Function invocation
+rindex(string, number, number) does not match any known function. Candidates
+are:
+RINDEX(string, string)
+RINDEX(string, string, integer).
+ 37 | DEBUG EVALUATE /rindex('aksj', 2, 2).
+ | ^~~~~~~~~~~~~~~~~~~~
+
+rindex('aksj', 2, 2) => error
+
+evaluate.sps:38.17-38.31: error: DEBUG EVALUATE: Function invocation
+rindex(number, number, number) does not match any known function. Candidates
+are:
+RINDEX(string, string)
+RINDEX(string, string, integer).
+ 38 | DEBUG EVALUATE /rindex(1, 2, 3).
+ | ^~~~~~~~~~~~~~~
+
+rindex(1, 2, 3) => error
+
+evaluate.sps:39.17-39.33: error: DEBUG EVALUATE: Function invocation
+rindex(number, number, string) does not match any known function. Candidates
+are:
+RINDEX(string, string)
+RINDEX(string, string, integer).
+ 39 | DEBUG EVALUATE /rindex(1, 2, '3').
+ | ^~~~~~~~~~~~~~~~~
+
+rindex(1, 2, '3') => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - LENGTH])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /length('').
+DEBUG EVALUATE /length('a').
+DEBUG EVALUATE /length('xy').
+DEBUG EVALUATE /length('adsf ').
+DEBUG EVALUATE /length('abcdefghijkl').
+DEBUG EVALUATE /length(0).
+DEBUG EVALUATE /length($sysmis).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+length('') => 0.00
+
+length('a') => 1.00
+
+length('xy') => 2.00
+
+length('adsf ') => 8.00
+
+length('abcdefghijkl') => 12.00
+
+evaluate.sps:9.17-9.25: error: DEBUG EVALUATE: Type mismatch invoking
+LENGTH(string) as length(number).
+ 9 | DEBUG EVALUATE /length(0).
+ | ^~~~~~~~~
+
+length(0) => error
+
+evaluate.sps:10.17-10.31: error: DEBUG EVALUATE: Type mismatch invoking
+LENGTH(string) as length(number).
+ 10 | DEBUG EVALUATE /length($sysmis).
+ | ^~~~~~~~~~~~~~~
+
+length($sysmis) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - LOWER])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /lower('ABCDEFGHIJKLMNOPQRSTUVWXYZ!@%&*089').
+DEBUG EVALUATE /lower('').
+DEBUG EVALUATE /lower(1).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+lower('ABCDEFGHIJKLMNOPQRSTUVWXYZ!@%&*089') => "abcdefghijklmnopqrstuvwxyz!@
+%&*089"
+
+lower('') => ""
+
+evaluate.sps:6.17-6.24: error: DEBUG EVALUATE: Type mismatch invoking
+LOWER(string) as lower(number).
+ 6 | DEBUG EVALUATE /lower(1).
+ | ^~~~~~~~
+
+lower(1) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - REPLACE])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /replace('banana', 'an', 'AN').
+DEBUG EVALUATE /replace('banana', 'an', 'a').
+DEBUG EVALUATE /replace('banana', 'an', '').
+DEBUG EVALUATE /replace('banana', 'na', '').
+DEBUG EVALUATE /replace('banana', 'ba', 'BA').
+DEBUG EVALUATE /replace('banana', 'na', 'xyzzy').
+DEBUG EVALUATE /replace('banana', 'an', 'xyzzy', 1).
+DEBUG EVALUATE /replace('banana', 'an', 'xyzzy', 1.5).
+DEBUG EVALUATE /replace('banana', 'bananana', 'xyzzy').
+DEBUG EVALUATE /replace('banana', '', 'xyzzy').
+DEBUG EVALUATE /replace('banana', 'ba', '', 0).
+DEBUG EVALUATE /replace('banana', 'ba', '', -1).
+DEBUG EVALUATE /replace('banana', 'ba', '', $sysmis).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+replace('banana', 'an', 'AN') => "bANANa"
+
+replace('banana', 'an', 'a') => "baaa"
+
+replace('banana', 'an', '') => "ba"
+
+replace('banana', 'na', '') => "ba"
+
+replace('banana', 'ba', 'BA') => "BAnana"
+
+replace('banana', 'na', 'xyzzy') => "baxyzzyxyzzy"
+
+replace('banana', 'an', 'xyzzy', 1) => "bxyzzyana"
+
+evaluate.sps:10.50-10.52: error: DEBUG EVALUATE: Treating unexpected non-
+integer value 1.5 as missing.
+ 10 | DEBUG EVALUATE /replace('banana', 'an', 'xyzzy', 1.5).
+ | ^~~
+
+replace('banana', 'an', 'xyzzy', 1.5) => "banana"
+
+replace('banana', 'bananana', 'xyzzy') => "banana"
+
+replace('banana', '', 'xyzzy') => "banana"
+
+replace('banana', 'ba', '', 0) => "banana"
+
+replace('banana', 'ba', '', -1) => "banana"
+
+replace('banana', 'ba', '', $sysmis) => "banana"
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - LPAD])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [dnl
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /lpad('abc', 0).
+DEBUG EVALUATE /lpad('abc', 2).
+DEBUG EVALUATE /lpad('abc', 3).
+DEBUG EVALUATE /lpad('abc', 10).
+
+DEBUG EVALUATE /lpad('abc', -1).
+DEBUG EVALUATE /lpad('abc', 32768).
+DEBUG EVALUATE /lpad('abc', $sysmis).
+
+DEBUG EVALUATE /lpad('abc', -1, '*').
+DEBUG EVALUATE /lpad('abc', 0, '*').
+DEBUG EVALUATE /lpad('abc', 2, '*').
+DEBUG EVALUATE /lpad('abc', 3, '*').
+DEBUG EVALUATE /lpad('abc', 10, '*').
+
+DEBUG EVALUATE /lpad('abc', 5, 'de').
+DEBUG EVALUATE /lpad('abc', 6, 'de').
+DEBUG EVALUATE /lpad('abc', 7, 'de').
+DEBUG EVALUATE /lpad('abc', 8, 'de').
+DEBUG EVALUATE /lpad('abc', 9, 'de').
+
+DEBUG EVALUATE /lpad('abc', 32768, '*').
+DEBUG EVALUATE /lpad('abc', $sysmis, '*').
+DEBUG EVALUATE /lpad('abc', $sysmis, '').
+DEBUG EVALUATE /lpad('abc', $sysmis, 'xy').
+DEBUG EVALUATE /lpad(0, 10).
+DEBUG EVALUATE /lpad('abc', 'def').
+DEBUG EVALUATE /lpad(0, 10, ' ').
+DEBUG EVALUATE /lpad('abc', 'def', ' ').
+DEBUG EVALUATE /lpad('x', 5, 0).
+DEBUG EVALUATE /lpad('x', 5, 2).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+lpad('abc', 0) => "abc"
+
+lpad('abc', 2) => "abc"
+
+lpad('abc', 3) => "abc"
+
+lpad('abc', 10) => " abc"
+
+evaluate.sps:8.17-8.31: error: DEBUG EVALUATE: The length argument to LPAD must
+be between 0 and 32767.
+ 8 | DEBUG EVALUATE /lpad('abc', -1).
+ | ^~~~~~~~~~~~~~~
+
+evaluate.sps:8.29-8.30: note: DEBUG EVALUATE: The length argument is -1.
+ 8 | DEBUG EVALUATE /lpad('abc', -1).
+ | ^~
+
+lpad('abc', -1) => "abc"
+
+evaluate.sps:9.17-9.34: error: DEBUG EVALUATE: The length argument to LPAD must
+be between 0 and 32767.
+ 9 | DEBUG EVALUATE /lpad('abc', 32768).
+ | ^~~~~~~~~~~~~~~~~~
+
+evaluate.sps:9.29-9.33: note: DEBUG EVALUATE: The length argument is 32768.
+ 9 | DEBUG EVALUATE /lpad('abc', 32768).
+ | ^~~~~
+
+lpad('abc', 32768) => "abc"
+
+lpad('abc', $sysmis) => "abc"
+
+evaluate.sps:12.17-12.36: error: DEBUG EVALUATE: The length argument to LPAD
+must be between 0 and 32767.
+ 12 | DEBUG EVALUATE /lpad('abc', -1, '*').
+ | ^~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:12.29-12.30: note: DEBUG EVALUATE: The length argument is -1.
+ 12 | DEBUG EVALUATE /lpad('abc', -1, '*').
+ | ^~
+
+lpad('abc', -1, '*') => "abc"
+
+lpad('abc', 0, '*') => "abc"
+
+lpad('abc', 2, '*') => "abc"
+
+lpad('abc', 3, '*') => "abc"
+
+lpad('abc', 10, '*') => "*******abc"
+
+lpad('abc', 5, 'de') => "deabc"
+
+lpad('abc', 6, 'de') => "deabc"
+
+lpad('abc', 7, 'de') => "dedeabc"
+
+lpad('abc', 8, 'de') => "dedeabc"
+
+lpad('abc', 9, 'de') => "dededeabc"
+
+evaluate.sps:24.17-24.39: error: DEBUG EVALUATE: The length argument to LPAD
+must be between 0 and 32767.
+ 24 | DEBUG EVALUATE /lpad('abc', 32768, '*').
+ | ^~~~~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:24.29-24.33: note: DEBUG EVALUATE: The length argument is 32768.
+ 24 | DEBUG EVALUATE /lpad('abc', 32768, '*').
+ | ^~~~~
+
+lpad('abc', 32768, '*') => "abc"
+
+lpad('abc', $sysmis, '*') => "abc"
+
+lpad('abc', $sysmis, '') => "abc"
+
+lpad('abc', $sysmis, 'xy') => "abc"
+
+evaluate.sps:28.17-28.27: error: DEBUG EVALUATE: Function invocation
+lpad(number, number) does not match any known function. Candidates are:
+LPAD(string, integer)
+LPAD(string, integer, string).
+ 28 | DEBUG EVALUATE /lpad(0, 10).
+ | ^~~~~~~~~~~
+
+lpad(0, 10) => error
+
+evaluate.sps:29.17-29.34: error: DEBUG EVALUATE: Function invocation
+lpad(string, string) does not match any known function. Candidates are:
+LPAD(string, integer)
+LPAD(string, integer, string).
+ 29 | DEBUG EVALUATE /lpad('abc', 'def').
+ | ^~~~~~~~~~~~~~~~~~
+
+lpad('abc', 'def') => error
+
+evaluate.sps:30.17-30.32: error: DEBUG EVALUATE: Function invocation
+lpad(number, number, string) does not match any known function. Candidates
+are:
+LPAD(string, integer)
+LPAD(string, integer, string).
+ 30 | DEBUG EVALUATE /lpad(0, 10, ' ').
+ | ^~~~~~~~~~~~~~~~
+
+lpad(0, 10, ' ') => error
+
+evaluate.sps:31.17-31.39: error: DEBUG EVALUATE: Function invocation
+lpad(string, string, string) does not match any known function. Candidates
+are:
+LPAD(string, integer)
+LPAD(string, integer, string).
+ 31 | DEBUG EVALUATE /lpad('abc', 'def', ' ').
+ | ^~~~~~~~~~~~~~~~~~~~~~~
+
+lpad('abc', 'def', ' ') => error
+
+evaluate.sps:32.17-32.31: error: DEBUG EVALUATE: Function invocation
+lpad(string, number, number) does not match any known function. Candidates
+are:
+LPAD(string, integer)
+LPAD(string, integer, string).
+ 32 | DEBUG EVALUATE /lpad('x', 5, 0).
+ | ^~~~~~~~~~~~~~~
+
+lpad('x', 5, 0) => error
+
+evaluate.sps:33.17-33.31: error: DEBUG EVALUATE: Function invocation
+lpad(string, number, number) does not match any known function. Candidates
+are:
+LPAD(string, integer)
+LPAD(string, integer, string).
+ 33 | DEBUG EVALUATE /lpad('x', 5, 2).
+ | ^~~~~~~~~~~~~~~
+
+lpad('x', 5, 2) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - NUMBER])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /number("123", f3.0).
+DEBUG EVALUATE /number(" 123", f3.0).
+DEBUG EVALUATE /number("123", f3.1).
+DEBUG EVALUATE /number(" ", f3.1).
+DEBUG EVALUATE /number("123", a8).
+dnl CCA is not an input format:
+DEBUG EVALUATE /number("123", cca1.2).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+number("123", f3.0) => 123.00
+
+number(" 123", f3.0) => 12.00
+
+number("123", f3.1) => 12.30
+
+number(" ", f3.1) => sysmis
+
+evaluate.sps:7.17-7.33: error: DEBUG EVALUATE: Type mismatch invoking
+NUMBER(string, num_input_format) as number(string, format).
+ 7 | DEBUG EVALUATE /number("123", a8).
+ | ^~~~~~~~~~~~~~~~~
+
+number("123", a8) => error
+
+evaluate.sps:8.17-8.37: error: DEBUG EVALUATE: Type mismatch invoking
+NUMBER(string, num_input_format) as number(string, format).
+ 8 | DEBUG EVALUATE /number("123", cca1.2).
+ | ^~~~~~~~~~~~~~~~~~~~~
+
+number("123", cca1.2) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - LTRIM])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ltrim(' abc').
+DEBUG EVALUATE /rtrim(' abc ').
+DEBUG EVALUATE /ltrim('abc').
+* The following string contains a tab.
+DEBUG EVALUATE /ltrim(' abc').
+DEBUG EVALUATE /ltrim(' ').
+DEBUG EVALUATE /ltrim('').
+DEBUG EVALUATE /ltrim(8).
+
+DEBUG EVALUATE /ltrim('***abc', '*').
+DEBUG EVALUATE /ltrim('abc', '*').
+DEBUG EVALUATE /ltrim('*abc', '*').
+DEBUG EVALUATE /ltrim('', '*').
+
+DEBUG EVALUATE /ltrim('abc', 'xy').
+DEBUG EVALUATE /ltrim('xyabc', 'xy').
+DEBUG EVALUATE /ltrim('xyxyabc', 'xy').
+
+DEBUG EVALUATE /ltrim(8, '*').
+DEBUG EVALUATE /ltrim(' x', 8).
+DEBUG EVALUATE /ltrim(8, 9).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+ltrim(' abc') => "abc"
+
+rtrim(' abc ') => " abc"
+
+ltrim('abc') => "abc"
+
+ltrim(' abc') => " abc"
+
+ltrim(' ') => ""
+
+ltrim('') => ""
+
+evaluate.sps:10.17-10.24: error: DEBUG EVALUATE: Function invocation
+ltrim(number) does not match any known function. Candidates are:
+LTRIM(string)
+LTRIM(string, string).
+ 10 | DEBUG EVALUATE /ltrim(8).
+ | ^~~~~~~~
+
+ltrim(8) => error
+
+ltrim('***abc', '*') => "abc"
+
+ltrim('abc', '*') => "abc"
+
+ltrim('*abc', '*') => "abc"
+
+ltrim('', '*') => ""
+
+ltrim('abc', 'xy') => "abc"
+
+ltrim('xyabc', 'xy') => "abc"
+
+ltrim('xyxyabc', 'xy') => "abc"
+
+evaluate.sps:21.17-21.29: error: DEBUG EVALUATE: Function invocation
+ltrim(number, string) does not match any known function. Candidates are:
+LTRIM(string)
+LTRIM(string, string).
+ 21 | DEBUG EVALUATE /ltrim(8, '*').
+ | ^~~~~~~~~~~~~
+
+ltrim(8, '*') => error
+
+evaluate.sps:22.17-22.30: error: DEBUG EVALUATE: Function invocation
+ltrim(string, number) does not match any known function. Candidates are:
+LTRIM(string)
+LTRIM(string, string).
+ 22 | DEBUG EVALUATE /ltrim(' x', 8).
+ | ^~~~~~~~~~~~~~
+
+ltrim(' x', 8) => error
+
+evaluate.sps:23.17-23.27: error: DEBUG EVALUATE: Function invocation
+ltrim(number, number) does not match any known function. Candidates are:
+LTRIM(string)
+LTRIM(string, string).
+ 23 | DEBUG EVALUATE /ltrim(8, 9).
+ | ^~~~~~~~~~~
+
+ltrim(8, 9) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - RPAD])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [dnl
+DEBUG EVALUATE SET opt.
+
+DEBUG EVALUATE /rpad('abc', 0).
+DEBUG EVALUATE /rpad('abc', 2).
+DEBUG EVALUATE /rpad('abc', 3).
+DEBUG EVALUATE /rpad('abc', 10).
+
+DEBUG EVALUATE /rpad('abc', -1).
+DEBUG EVALUATE /rpad('abc', 32768).
+DEBUG EVALUATE /rpad('abc', $sysmis).
+
+DEBUG EVALUATE /rpad('abc', -1, '*').
+DEBUG EVALUATE /rpad('abc', 0, '*').
+DEBUG EVALUATE /rpad('abc', 2, '*').
+DEBUG EVALUATE /rpad('abc', 3, '*').
+DEBUG EVALUATE /rpad('abc', 10, '*').
+
+DEBUG EVALUATE /rpad('abc', 5, 'de').
+DEBUG EVALUATE /rpad('abc', 6, 'de').
+DEBUG EVALUATE /rpad('abc', 7, 'de').
+DEBUG EVALUATE /rpad('abc', 8, 'de').
+DEBUG EVALUATE /rpad('abc', 9, 'de').
+
+DEBUG EVALUATE /rpad('abc', 32768, '*').
+DEBUG EVALUATE /rpad('abc', $sysmis, '*').
+DEBUG EVALUATE /rpad('abc', $sysmis, '').
+DEBUG EVALUATE /rpad('abc', $sysmis, 'xy').
+DEBUG EVALUATE /rpad(0, 10).
+DEBUG EVALUATE /rpad('abc', 'def').
+DEBUG EVALUATE /rpad(0, 10, ' ').
+DEBUG EVALUATE /rpad('abc', 'def', ' ').
+DEBUG EVALUATE /rpad('x', 5, 0).
+DEBUG EVALUATE /rpad('x', 5, 2).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+rpad('abc', 0) => "abc"
+
+rpad('abc', 2) => "abc"
+
+rpad('abc', 3) => "abc"
+
+rpad('abc', 10) => "abc "
+
+evaluate.sps:8.17-8.31: error: DEBUG EVALUATE: The length argument to RPAD must
+be between 0 and 32767.
+ 8 | DEBUG EVALUATE /rpad('abc', -1).
+ | ^~~~~~~~~~~~~~~
+
+evaluate.sps:8.29-8.30: note: DEBUG EVALUATE: The length argument is -1.
+ 8 | DEBUG EVALUATE /rpad('abc', -1).
+ | ^~
+
+rpad('abc', -1) => "abc"
+
+evaluate.sps:9.17-9.34: error: DEBUG EVALUATE: The length argument to RPAD must
+be between 0 and 32767.
+ 9 | DEBUG EVALUATE /rpad('abc', 32768).
+ | ^~~~~~~~~~~~~~~~~~
+
+evaluate.sps:9.29-9.33: note: DEBUG EVALUATE: The length argument is 32768.
+ 9 | DEBUG EVALUATE /rpad('abc', 32768).
+ | ^~~~~
+
+rpad('abc', 32768) => "abc"
+
+rpad('abc', $sysmis) => "abc"
+
+evaluate.sps:12.17-12.36: error: DEBUG EVALUATE: The length argument to RPAD
+must be between 0 and 32767.
+ 12 | DEBUG EVALUATE /rpad('abc', -1, '*').
+ | ^~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:12.29-12.30: note: DEBUG EVALUATE: The length argument is -1.
+ 12 | DEBUG EVALUATE /rpad('abc', -1, '*').
+ | ^~
+
+rpad('abc', -1, '*') => "abc"
+
+rpad('abc', 0, '*') => "abc"
+
+rpad('abc', 2, '*') => "abc"
+
+rpad('abc', 3, '*') => "abc"
+
+rpad('abc', 10, '*') => "abc*******"
+
+rpad('abc', 5, 'de') => "abcde"
+
+rpad('abc', 6, 'de') => "abcde"
+
+rpad('abc', 7, 'de') => "abcdede"
+
+rpad('abc', 8, 'de') => "abcdede"
+
+rpad('abc', 9, 'de') => "abcdedede"
+
+evaluate.sps:24.17-24.39: error: DEBUG EVALUATE: The length argument to RPAD
+must be between 0 and 32767.
+ 24 | DEBUG EVALUATE /rpad('abc', 32768, '*').
+ | ^~~~~~~~~~~~~~~~~~~~~~~
+
+evaluate.sps:24.29-24.33: note: DEBUG EVALUATE: The length argument is 32768.
+ 24 | DEBUG EVALUATE /rpad('abc', 32768, '*').
+ | ^~~~~
+
+rpad('abc', 32768, '*') => "abc"
+
+rpad('abc', $sysmis, '*') => "abc"
+
+rpad('abc', $sysmis, '') => "abc"
+
+rpad('abc', $sysmis, 'xy') => "abc"
+
+evaluate.sps:28.17-28.27: error: DEBUG EVALUATE: Function invocation
+rpad(number, number) does not match any known function. Candidates are:
+RPAD(string, integer)
+RPAD(string, integer, string).
+ 28 | DEBUG EVALUATE /rpad(0, 10).
+ | ^~~~~~~~~~~
+
+rpad(0, 10) => error
+
+evaluate.sps:29.17-29.34: error: DEBUG EVALUATE: Function invocation
+rpad(string, string) does not match any known function. Candidates are:
+RPAD(string, integer)
+RPAD(string, integer, string).
+ 29 | DEBUG EVALUATE /rpad('abc', 'def').
+ | ^~~~~~~~~~~~~~~~~~
+
+rpad('abc', 'def') => error
+
+evaluate.sps:30.17-30.32: error: DEBUG EVALUATE: Function invocation
+rpad(number, number, string) does not match any known function. Candidates
+are:
+RPAD(string, integer)
+RPAD(string, integer, string).
+ 30 | DEBUG EVALUATE /rpad(0, 10, ' ').
+ | ^~~~~~~~~~~~~~~~
+
+rpad(0, 10, ' ') => error
+
+evaluate.sps:31.17-31.39: error: DEBUG EVALUATE: Function invocation
+rpad(string, string, string) does not match any known function. Candidates
+are:
+RPAD(string, integer)
+RPAD(string, integer, string).
+ 31 | DEBUG EVALUATE /rpad('abc', 'def', ' ').
+ | ^~~~~~~~~~~~~~~~~~~~~~~
+
+rpad('abc', 'def', ' ') => error
+
+evaluate.sps:32.17-32.31: error: DEBUG EVALUATE: Function invocation
+rpad(string, number, number) does not match any known function. Candidates
+are:
+RPAD(string, integer)
+RPAD(string, integer, string).
+ 32 | DEBUG EVALUATE /rpad('x', 5, 0).
+ | ^~~~~~~~~~~~~~~
+
+rpad('x', 5, 0) => error
+
+evaluate.sps:33.17-33.31: error: DEBUG EVALUATE: Function invocation
+rpad(string, number, number) does not match any known function. Candidates
+are:
+RPAD(string, integer)
+RPAD(string, integer, string).
+ 33 | DEBUG EVALUATE /rpad('x', 5, 2).
+ | ^~~~~~~~~~~~~~~
+
+rpad('x', 5, 2) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - RTRIM])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /rtrim('abc ').
+DEBUG EVALUATE /rtrim(' abc ').
+DEBUG EVALUATE /rtrim('abc').
+* The following string contains a tab.
+DEBUG EVALUATE /rtrim('abc ').
+DEBUG EVALUATE /rtrim(' ').
+DEBUG EVALUATE /rtrim('').
+DEBUG EVALUATE /rtrim(8).
+
+DEBUG EVALUATE /rtrim('abc***', '*').
+DEBUG EVALUATE /rtrim('abc', '*').
+DEBUG EVALUATE /rtrim('abc*', '*').
+DEBUG EVALUATE /rtrim('', '*').
+
+DEBUG EVALUATE /rtrim('abc', 'xy').
+DEBUG EVALUATE /rtrim('abcxy', 'xy').
+DEBUG EVALUATE /rtrim('abcxyxy', 'xy').
+
+DEBUG EVALUATE /rtrim(8, '*').
+DEBUG EVALUATE /rtrim('x ', 8).
+DEBUG EVALUATE /rtrim(8, 9).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+rtrim('abc ') => "abc"
+
+rtrim(' abc ') => " abc"
+
+rtrim('abc') => "abc"
+
+rtrim('abc ') => "abc "
+
+rtrim(' ') => ""
+
+rtrim('') => ""
+
+evaluate.sps:10.17-10.24: error: DEBUG EVALUATE: Function invocation
+rtrim(number) does not match any known function. Candidates are:
+RTRIM(string)
+RTRIM(string, string).
+ 10 | DEBUG EVALUATE /rtrim(8).
+ | ^~~~~~~~
+
+rtrim(8) => error
+
+rtrim('abc***', '*') => "abc"
+
+rtrim('abc', '*') => "abc"
+
+rtrim('abc*', '*') => "abc"
+
+rtrim('', '*') => ""
+
+rtrim('abc', 'xy') => "abc"
+
+rtrim('abcxy', 'xy') => "abc"
+
+rtrim('abcxyxy', 'xy') => "abc"
+
+evaluate.sps:21.17-21.29: error: DEBUG EVALUATE: Function invocation
+rtrim(number, string) does not match any known function. Candidates are:
+RTRIM(string)
+RTRIM(string, string).
+ 21 | DEBUG EVALUATE /rtrim(8, '*').
+ | ^~~~~~~~~~~~~
+
+rtrim(8, '*') => error
+
+evaluate.sps:22.17-22.30: error: DEBUG EVALUATE: Function invocation
+rtrim(string, number) does not match any known function. Candidates are:
+RTRIM(string)
+RTRIM(string, string).
+ 22 | DEBUG EVALUATE /rtrim('x ', 8).
+ | ^~~~~~~~~~~~~~
+
+rtrim('x ', 8) => error
+
+evaluate.sps:23.17-23.27: error: DEBUG EVALUATE: Function invocation
+rtrim(number, number) does not match any known function. Candidates are:
+RTRIM(string)
+RTRIM(string, string).
+ 23 | DEBUG EVALUATE /rtrim(8, 9).
+ | ^~~~~~~~~~~
+
+rtrim(8, 9) => error
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - STRING])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /string(123.56, f5.1).
+DEBUG EVALUATE /string($sysmis, f5.1).
+DEBUG EVALUATE /string("abc", A5).
+dnl E has a minimum width of 6 on output:
+DEBUG EVALUATE /string(123, e1).
+DEBUG EVALUATE /string(123, e6.0).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - STRUNC])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /strunc('a c ', 9).
+DEBUG EVALUATE /strunc('a c ', 7).
+DEBUG EVALUATE /strunc('a c ', 6).
+DEBUG EVALUATE /strunc('a c ', 5).
+DEBUG EVALUATE /strunc('a c ', 4).
+DEBUG EVALUATE /strunc('a c ', 3).
+DEBUG EVALUATE /strunc('a c ', 2).
+DEBUG EVALUATE /strunc('a c ', 1).
+DEBUG EVALUATE /strunc('a c ', 0).
+DEBUG EVALUATE /strunc('a c ', -1).
+DEBUG EVALUATE /strunc('a c ', $sysmis).
+DEBUG EVALUATE /strunc(' abc ', 9).
+DEBUG EVALUATE /strunc(' abc ', 8).
+DEBUG EVALUATE /strunc(' abc ', 7).
+DEBUG EVALUATE /strunc(' abc ', 6).
+DEBUG EVALUATE /strunc(' abc ', 5).
+DEBUG EVALUATE /strunc(' abc ', 4).
+DEBUG EVALUATE /strunc(' abc ', 3).
+DEBUG EVALUATE /strunc(' abc ', 2).
+DEBUG EVALUATE /strunc(' abc ', 1).
+DEBUG EVALUATE /strunc(' abc ', -1).
+DEBUG EVALUATE /strunc(' abc ', $sysmis).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - SUBSTR])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /substr('abcdefgh', -5).
+DEBUG EVALUATE /substr('abcdefgh', 0).
+DEBUG EVALUATE /substr('abcdefgh', 1).
+DEBUG EVALUATE /substr('abcdefgh', 3).
+DEBUG EVALUATE /substr('abcdefgh', 5).
+DEBUG EVALUATE /substr('abcdefgh', 6).
+DEBUG EVALUATE /substr('abcdefgh', 7).
+DEBUG EVALUATE /substr('abcdefgh', 8).
+DEBUG EVALUATE /substr('abcdefgh', 9).
+DEBUG EVALUATE /substr('abcdefgh', 10).
+DEBUG EVALUATE /substr('abcdefgh', 20).
+DEBUG EVALUATE /substr('abcdefgh', $sysmis).
+DEBUG EVALUATE /substr(0, 10).
+DEBUG EVALUATE /substr('abcd', 'abc').
+DEBUG EVALUATE /substr(0, 'abc').
+
+DEBUG EVALUATE /substr('abcdefgh', 0, 0).
+DEBUG EVALUATE /substr('abcdefgh', 3, 0).
+DEBUG EVALUATE /substr('abcdefgh', 5, 0).
+DEBUG EVALUATE /substr('abcdefgh', 9, 0).
+DEBUG EVALUATE /substr('abcdefgh', 0, 1).
+DEBUG EVALUATE /substr('abcdefgh', 0, 5).
+DEBUG EVALUATE /substr('abcdefgh', 1, 8).
+DEBUG EVALUATE /substr('abcdefgh', 1, 10).
+DEBUG EVALUATE /substr('abcdefgh', 1, 20).
+DEBUG EVALUATE /substr('abcdefgh', 3, 4).
+DEBUG EVALUATE /substr('abcdefgh', 5, 2).
+DEBUG EVALUATE /substr('abcdefgh', 6, 1).
+DEBUG EVALUATE /substr('abcdefgh', 7, 10).
+DEBUG EVALUATE /substr('abcdefgh', 8, 1).
+DEBUG EVALUATE /substr('abcdefgh', 8, 2).
+DEBUG EVALUATE /substr('abcdefgh', 9, 11).
+DEBUG EVALUATE /substr('abcdefgh', 10, 52).
+DEBUG EVALUATE /substr('abcdefgh', 20, 1).
+DEBUG EVALUATE /substr('abcdefgh', $sysmis, 2).
+DEBUG EVALUATE /substr('abcdefgh', 9, $sysmis).
+DEBUG EVALUATE /substr('abcdefgh', $sysmis, $sysmis).
+DEBUG EVALUATE /substr('abc', 1, 'x').
+DEBUG EVALUATE /substr(0, 10, 1).
+DEBUG EVALUATE /substr(0, 10, 'x').
+DEBUG EVALUATE /substr('abcd', 'abc', 0).
+DEBUG EVALUATE /substr('abcd', 'abc', 'j').
+DEBUG EVALUATE /substr(0, 'abc', 4).
+DEBUG EVALUATE /substr(0, 'abc', 'k').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - UPCASE])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /upcase('abcdefghijklmnopqrstuvwxyz!@%&*089').
+DEBUG EVALUATE /upcase('').
+DEBUG EVALUATE /upcase(1).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - TIME.DAYS])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /time.days(1).
+DEBUG EVALUATE /time.days(-1).
+DEBUG EVALUATE /time.days(0.5).
+DEBUG EVALUATE /time.days('x').
+DEBUG EVALUATE /time.days($sysmis).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - TIME.HMS])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /time.hms(4,50,38).
+DEBUG EVALUATE /time.hms(12,31,35).
+DEBUG EVALUATE /time.hms(12,47,53).
+DEBUG EVALUATE /time.hms(1,26,0).
+DEBUG EVALUATE /time.hms(20,58,11).
+DEBUG EVALUATE /time.hms(7,36,5).
+DEBUG EVALUATE /time.hms(15,43,49).
+DEBUG EVALUATE /time.hms(4,25,9).
+DEBUG EVALUATE /time.hms(6,49,27).
+DEBUG EVALUATE /time.hms(2,57,52).
+DEBUG EVALUATE /time.hms(16,45,44).
+DEBUG EVALUATE /time.hms(21,30,57).
+DEBUG EVALUATE /time.hms(22,30,4).
+DEBUG EVALUATE /time.hms(1,56,51).
+DEBUG EVALUATE /time.hms(5, 6, 7).
+DEBUG EVALUATE /time.hms(5, 6, 0).
+DEBUG EVALUATE /time.hms(5, 0, 7).
+DEBUG EVALUATE /time.hms(0, 6, 7).
+DEBUG EVALUATE /time.hms(-5, 6, -7).
+DEBUG EVALUATE /time.hms(-5, 5, -7).
+DEBUG EVALUATE /time.hms($sysmis, 6, 7).
+DEBUG EVALUATE /time.hms(5, $sysmis, 7).
+DEBUG EVALUATE /time.hms(5, $sysmis, 7).
+DEBUG EVALUATE /time.hms($sysmis, $sysmis, 7).
+DEBUG EVALUATE /time.hms(5, $sysmis, $sysmis).
+DEBUG EVALUATE /time.hms($sysmis, $sysmis, 7).
+DEBUG EVALUATE /time.hms($sysmis, $sysmis, $sysmis).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - CTIME.*])
+AT_KEYWORDS([expression expressions evaluate ctime])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(106272).
+DEBUG EVALUATE /ctime.hours(106272).
+DEBUG EVALUATE /ctime.minutes(106272).
+DEBUG EVALUATE /ctime.seconds(106272).
+DEBUG EVALUATE /ctime.days(-106272).
+DEBUG EVALUATE /ctime.hours(-106272).
+DEBUG EVALUATE /ctime.minutes(-106272).
+DEBUG EVALUATE /ctime.seconds(-106272).
+DEBUG EVALUATE /ctime.days($sysmis).
+DEBUG EVALUATE /ctime.hours($sysmis).
+DEBUG EVALUATE /ctime.minutes($sysmis).
+DEBUG EVALUATE /ctime.seconds($sysmis).
+DEBUG EVALUATE /ctime.days('a').
+DEBUG EVALUATE /ctime.hours('b').
+DEBUG EVALUATE /ctime.minutes('c').
+DEBUG EVALUATE /ctime.seconds('d').
+
+DEBUG EVALUATE /ctime.days(date.dmy(15,10,1582)).
+DEBUG EVALUATE /ctime.days(date.dmy(6,9,1719)).
+DEBUG EVALUATE /ctime.days(date.dmy(24,1,1583)).
+DEBUG EVALUATE /ctime.days(date.dmy(14,12,1585)).
+DEBUG EVALUATE /ctime.days(date.dmy(26,11,1621)).
+DEBUG EVALUATE /ctime.days(date.dmy(25,12,1821)).
+DEBUG EVALUATE /ctime.days(date.dmy(3,12,1882)).
+DEBUG EVALUATE /ctime.days(date.dmy(6,4,2002)).
+DEBUG EVALUATE /ctime.days(date.dmy(19,12,1999)).
+DEBUG EVALUATE /ctime.days(date.dmy(1,10,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(0,10,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(32,10,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(31,0,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(31,13,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy($sysmis,10,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(31,$sysmis,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(31,10,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.dmy($sysmis,$sysmis,1978)).
+DEBUG EVALUATE /ctime.days(date.dmy(31,$sysmis,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.dmy($sysmis,10,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.dmy($sysmis,$sysmis,$sysmis)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATE.DMY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /date.dmy('a',1,2).
+DEBUG EVALUATE /date.dmy(1,'a',2).
+DEBUG EVALUATE /date.dmy(1,2,'a').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - YRMOD])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+dnl FIXME: check out-of-range and nearly out-of-range values
+DEBUG EVALUATE /yrmoda(1582,10,15).
+DEBUG EVALUATE /yrmoda(1719,9,6).
+DEBUG EVALUATE /yrmoda(1583,1,24).
+DEBUG EVALUATE /yrmoda(1585,12,14).
+DEBUG EVALUATE /yrmoda(1621,11,26).
+DEBUG EVALUATE /yrmoda(1821,12,25).
+DEBUG EVALUATE /yrmoda(1882,12,3).
+DEBUG EVALUATE /yrmoda(2002,4,6).
+DEBUG EVALUATE /yrmoda(1999,12,19).
+DEBUG EVALUATE /yrmoda(1978,10,1).
+DEBUG EVALUATE /yrmoda(1978,10,0).
+DEBUG EVALUATE /yrmoda(1978,10,32).
+DEBUG EVALUATE /yrmoda(1978,0,31).
+DEBUG EVALUATE /yrmoda(1978,13,31).
+DEBUG EVALUATE /yrmoda(1978,10,$sysmis).
+DEBUG EVALUATE /yrmoda(1978,$sysmis,31).
+DEBUG EVALUATE /yrmoda($sysmis,10,31).
+DEBUG EVALUATE /yrmoda(1978,$sysmis,$sysmis).
+DEBUG EVALUATE /yrmoda($sysmis,$sysmis,31).
+DEBUG EVALUATE /yrmoda($sysmis,10,$sysmis).
+DEBUG EVALUATE /yrmoda($sysmis,$sysmis,$sysmis).
+DEBUG EVALUATE /yrmoda('a',1,2).
+DEBUG EVALUATE /yrmoda(1,'a',2).
+DEBUG EVALUATE /yrmoda(1,2,'a').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATE.MDY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+dnl FIXME: check out-of-range and nearly out-of-range values
+DEBUG EVALUATE /ctime.days(date.mdy(6,10,1648)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(6,30,1680)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(7,24,1716)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(6,19,1768)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(8,2,1819)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(3,27,1839)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(4,19,1903)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(8,25,1929)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(9,29,1941)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(4,19,1943)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(10,7,1943)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(3,17,1992)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(2,25,1996)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(11,10,2038)) + 577735.
+DEBUG EVALUATE /ctime.days(date.mdy(7,18,2094)) + 577735.
+dnl FIXME: check out-of-range and nearly out-of-range values
+dnl
+DEBUG EVALUATE /ctime.days(date.mdy(10,15,1582)).
+DEBUG EVALUATE /ctime.days(date.mdy(9,6,1719)).
+DEBUG EVALUATE /ctime.days(date.mdy(1,24,1583)).
+DEBUG EVALUATE /ctime.days(date.mdy(12,14,1585)).
+DEBUG EVALUATE /ctime.days(date.mdy(11,26,1621)).
+DEBUG EVALUATE /ctime.days(date.mdy(12,25,1821)).
+DEBUG EVALUATE /ctime.days(date.mdy(12,3,1882)).
+DEBUG EVALUATE /ctime.days(date.mdy(4,6,2002)).
+DEBUG EVALUATE /ctime.days(date.mdy(12,19,1999)).
+DEBUG EVALUATE /ctime.days(date.mdy(10,1,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy(10,0,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy(10,32,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy(0,31,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy(13,31,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy(10,$sysmis,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy($sysmis,31,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy(10,31,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.mdy($sysmis,$sysmis,1978)).
+DEBUG EVALUATE /ctime.days(date.mdy($sysmis,31,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.mdy(10,$sysmis,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.mdy($sysmis,$sysmis,$sysmis)).
+DEBUG EVALUATE /date.mdy('a',1,2).
+DEBUG EVALUATE /date.mdy(1,'a',2).
+DEBUG EVALUATE /date.mdy(1,2,'a').
+DEBUG EVALUATE /ctime.days(date.mdy(0,0,0)).
+DEBUG EVALUATE /ctime.days(date.mdy(0,0,999)).
+DEBUG EVALUATE /date.mdy(1,1,1582).
+DEBUG EVALUATE /date.mdy(10,14,1582).
+DEBUG EVALUATE /date.mdy(10,15,1582).
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATE.MOYR])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(date.moyr(1,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(2,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(3,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(4,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(5,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(13,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(14,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr($sysmis,2000)).
+DEBUG EVALUATE /ctime.days(date.moyr(1,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.moyr($sysmis,$sysmis)).
+DEBUG EVALUATE /date.moyr('a',2000).
+DEBUG EVALUATE /date.moyr(5,'a').
+DEBUG EVALUATE /date.moyr('a','b').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATE.QYR])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(date.qyr(1,2000)).
+DEBUG EVALUATE /ctime.days(date.qyr(2,2000)).
+DEBUG EVALUATE /ctime.days(date.qyr(5,2000)).
+DEBUG EVALUATE /ctime.days(date.qyr(6,2000)).
+DEBUG EVALUATE /ctime.days(date.qyr($sysmis,2000)).
+DEBUG EVALUATE /ctime.days(date.qyr(1,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.qyr($sysmis,$sysmis)).
+DEBUG EVALUATE /date.qyr('a',2000).
+DEBUG EVALUATE /date.qyr(5,'a').
+DEBUG EVALUATE /date.qyr('a','b').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATE.WKYR])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(date.wkyr(1,2000)).
+DEBUG EVALUATE /ctime.days(date.wkyr(15,1999)).
+DEBUG EVALUATE /ctime.days(date.wkyr(36,1999)).
+DEBUG EVALUATE /ctime.days(date.wkyr(54,1999)).
+DEBUG EVALUATE /ctime.days(date.wkyr($sysmis,1999)).
+DEBUG EVALUATE /ctime.days(date.wkyr(1,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.wkyr($sysmis,$sysmis)).
+DEBUG EVALUATE /date.wkyr('a',1999).
+DEBUG EVALUATE /date.wkyr(5,'a').
+DEBUG EVALUATE /date.wkyr('a','b').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATE.YRDAY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(date.yrday(2000,1)).
+DEBUG EVALUATE /ctime.days(date.yrday(2000,100)).
+DEBUG EVALUATE /ctime.days(date.yrday(2000,253)).
+DEBUG EVALUATE /ctime.days(date.yrday(2000,500)).
+DEBUG EVALUATE /ctime.days(date.yrday(2000,-100)).
+DEBUG EVALUATE /ctime.days(date.yrday(1999,$sysmis)).
+DEBUG EVALUATE /ctime.days(date.yrday($sysmis,1)).
+DEBUG EVALUATE /ctime.days(date.yrday($sysmis,$sysmis)).
+DEBUG EVALUATE /date.yrday(1999,'a').
+DEBUG EVALUATE /date.yrday('a',5).
+DEBUG EVALUATE /date.yrday('a','b').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.DATE])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.date(date.mdy(6,10,1648) + time.hms(0,0,0)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(6,30,1680) + time.hms(4,50,38)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(7,24,1716) + time.hms(12,31,35)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(6,19,1768) + time.hms(12,47,53)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(8,2,1819) + time.hms(1,26,0)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(3,27,1839) + time.hms(20,58,11)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(4,19,1903) + time.hms(7,36,5)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(8,25,1929) + time.hms(15,43,49)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(9,29,1941) + time.hms(4,25,9)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(4,19,1943) + time.hms(6,49,27)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(10,7,1943) + time.hms(2,57,52)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(3,17,1992) + time.hms(16,45,44)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(2,25,1996) + time.hms(21,30,57)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(9,29,1941) + time.hms(4,25,9)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(4,19,43) + time.hms(6,49,27)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(10,7,43) + time.hms(2,57,52)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(3,17,92) + time.hms(16,45,44)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(2,25,96) + time.hms(21,30,57)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(11,10,2038) + time.hms(22,30,4)) / 86400.
+DEBUG EVALUATE /xdate.date(date.mdy(7,18,2094) + time.hms(1,56,51)) / 86400.
+DEBUG EVALUATE /xdate.date(123.4).
+DEBUG EVALUATE /xdate.date('').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.HOUR])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.hour(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.hour(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.hour(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.hour(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.hour(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.hour(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.hour(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.hour(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.hour(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.hour(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.hour(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.hour(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.hour(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.hour(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.hour(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.hour(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.hour(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.hour(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.hour(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.hour(date.mdy(7,18,2094) + time.hms(1,56,51)).
+DEBUG EVALUATE /xdate.hour(-1).
+DEBUG EVALUATE /xdate.hour(1).
+DEBUG EVALUATE /xdate.hour($sysmis).
+DEBUG EVALUATE /xdate.hour('').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.JDAY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.jday(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.jday(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.jday(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.jday(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.jday(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.jday(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.jday(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.jday(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.jday(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.jday(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.jday(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.jday(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.jday(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.jday(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.jday(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.jday(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.jday(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.jday(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.jday(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.jday(date.mdy(7,18,2094) + time.hms(1,56,51)).
+DEBUG EVALUATE /xdate.jday(0).
+DEBUG EVALUATE /xdate.jday(1).
+DEBUG EVALUATE /xdate.jday(86400).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.MDAY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.mday(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.mday(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.mday(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.mday(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.mday(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.mday(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.mday(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.mday(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.mday(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.mday(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.mday(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.mday(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.mday(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.mday(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.mday(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.mday(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.mday(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.mday(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.mday(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.mday(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.MINUTE])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.minute(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.minute(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.minute(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.minute(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.minute(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.minute(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.minute(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.minute(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.minute(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.minute(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.minute(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.minute(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.minute(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.minute(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.minute(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.minute(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.minute(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.minute(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.minute(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.minute(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.MONTH])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.month(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.month(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.month(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.month(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.month(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.month(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.month(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.month(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.month(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.month(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.month(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.month(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.month(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.month(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.month(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.month(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.month(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.month(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.month(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.month(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.QUARTER])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.quarter(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.quarter(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.SECOND])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.second(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.second(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.second(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.second(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.second(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.second(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.second(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.second(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.second(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.second(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.second(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.second(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.second(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.second(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.second(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.second(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.second(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.second(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.second(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.second(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.TDAY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.tday(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.tday(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.tday(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.tday(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.tday(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.tday(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.tday(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.tday(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.tday(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.tday(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.tday(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.tday(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.tday(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.tday(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.tday(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.tday(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.tday(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.tday(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.tday(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.tday(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.TIME])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.time(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.time(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.time(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.time(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.time(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.time(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.time(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.time(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.time(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.time(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.time(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.time(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.time(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.time(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.time(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.time(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.time(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.time(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.time(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.time(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.WEEK])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.week(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.week(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.week(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.week(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.week(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.week(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.week(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.week(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.week(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.week(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.week(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.week(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.week(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.week(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.week(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.week(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.week(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.week(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.week(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.week(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.WKDAY])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.wkday(date.mdy(6,10,1648)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(6,30,1680)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(7,24,1716)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(6,19,1768)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(8,2,1819)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(3,27,1839)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(4,19,1903)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(8,25,1929)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(9,29,1941)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(4,19,1943)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(10,7,1943)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(3,17,1992)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(2,25,1996)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(9,29,1941)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(4,19,43)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(10,7,43)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(3,17,92)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(2,25,96)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(11,10,2038)).
+DEBUG EVALUATE /xdate.wkday(date.mdy(7,18,2094)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - XDATE.YEAR])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /xdate.year(date.mdy(6,10,1648) + time.hms(0,0,0)).
+DEBUG EVALUATE /xdate.year(date.mdy(6,30,1680) + time.hms(4,50,38)).
+DEBUG EVALUATE /xdate.year(date.mdy(7,24,1716) + time.hms(12,31,35)).
+DEBUG EVALUATE /xdate.year(date.mdy(6,19,1768) + time.hms(12,47,53)).
+DEBUG EVALUATE /xdate.year(date.mdy(8,2,1819) + time.hms(1,26,0)).
+DEBUG EVALUATE /xdate.year(date.mdy(3,27,1839) + time.hms(20,58,11)).
+DEBUG EVALUATE /xdate.year(date.mdy(4,19,1903) + time.hms(7,36,5)).
+DEBUG EVALUATE /xdate.year(date.mdy(8,25,1929) + time.hms(15,43,49)).
+DEBUG EVALUATE /xdate.year(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.year(date.mdy(4,19,1943) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.year(date.mdy(10,7,1943) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.year(date.mdy(3,17,1992) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.year(date.mdy(2,25,1996) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.year(date.mdy(9,29,1941) + time.hms(4,25,9)).
+DEBUG EVALUATE /xdate.year(date.mdy(4,19,43) + time.hms(6,49,27)).
+DEBUG EVALUATE /xdate.year(date.mdy(10,7,43) + time.hms(2,57,52)).
+DEBUG EVALUATE /xdate.year(date.mdy(3,17,92) + time.hms(16,45,44)).
+DEBUG EVALUATE /xdate.year(date.mdy(2,25,96) + time.hms(21,30,57)).
+DEBUG EVALUATE /xdate.year(date.mdy(11,10,2038) + time.hms(22,30,4)).
+DEBUG EVALUATE /xdate.year(date.mdy(7,18,2094) + time.hms(1,56,51)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATEDIFF])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'years').
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'years').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'years').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'years').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'years').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'years').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'years').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'years').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'years').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'years').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'years').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'years').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'years').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'years').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'years').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'years').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'years').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'years').
+
+DEBUG EVALUATE /datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'quarters').
+
+DEBUG EVALUATE /datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'months').
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'months').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'months').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'months').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'months').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'months').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'months').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'months').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'months').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'months').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'months').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'months').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'months').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'months').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'months').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'months').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'months').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'months').
+
+DEBUG EVALUATE /datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'weeks').
+
+DEBUG EVALUATE /datediff(date.mdy(6,10,1648), date.mdy(6,30,1680), 'days').
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(7,24,1716), 'days').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,19,1768), 'days').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(8,2,1819), 'days').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(3,27,1839), 'days').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(4,19,1903), 'days').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(8,25,1929), 'days').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(9,29,1941), 'days').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,1943), 'days').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(10,7,1943), 'days').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(3,17,1992), 'days').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(2,25,1996), 'days').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(2,25,1996), 'days').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(4,19,43), 'days').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(10,7,43), 'days').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(3,17,92), 'days').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(2,25,96), 'days').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(11,10,2038), 'days').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(7,18,2094), 'days').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,29,1904), 'days').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1908), 'days').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1900), date.mdy(2,28,1903), 'days').
+
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(6,10,1648), 'years').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,30,1680), 'years').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(7,24,1716), 'years').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(6,19,1768), 'years').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(8,2,1819), 'years').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(3,27,1839), 'years').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(4,19,1903), 'years').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(8,25,1929), 'years').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(9,29,1941), 'years').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(4,19,1943), 'years').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(10,7,1943), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,25,1996), date.mdy(3,17,1992), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,25,1996), date.mdy(9,29,1941), 'years').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(9,29,1941), 'years').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(4,19,43), 'years').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(10,7,43), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(3,17,92), 'years').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(2,25,96), 'years').
+DEBUG EVALUATE /datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'years').
+DEBUG EVALUATE /datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'years').
+
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(6,10,1648), 'months').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,30,1680), 'months').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(7,24,1716), 'months').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(6,19,1768), 'months').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(8,2,1819), 'months').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(3,27,1839), 'months').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(4,19,1903), 'months').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(8,25,1929), 'months').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(9,29,1941), 'months').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(4,19,1943), 'months').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(10,7,1943), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,25,1996), date.mdy(3,17,1992), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,25,1996), date.mdy(9,29,1941), 'months').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(9,29,1941), 'months').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(4,19,43), 'months').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(10,7,43), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(3,17,92), 'months').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(2,25,96), 'months').
+DEBUG EVALUATE /datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'months').
+DEBUG EVALUATE /datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'months').
+
+DEBUG EVALUATE /datediff(date.mdy(6,30,1680), date.mdy(6,10,1648), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(7,24,1716), date.mdy(6,30,1680), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(6,19,1768), date.mdy(7,24,1716), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(8,2,1819), date.mdy(6,19,1768), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(3,27,1839), date.mdy(8,2,1819), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1903), date.mdy(3,27,1839), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(8,25,1929), date.mdy(4,19,1903), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(9,29,1941), date.mdy(8,25,1929), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(4,19,1943), date.mdy(9,29,1941), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(10,7,1943), date.mdy(4,19,1943), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(3,17,1992), date.mdy(10,7,1943), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,25,1996), date.mdy(3,17,1992), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,25,1996), date.mdy(9,29,1941), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(4,19,43), date.mdy(9,29,1941), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(10,7,43), date.mdy(4,19,43), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(3,17,92), date.mdy(10,7,43), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,25,96), date.mdy(3,17,92), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(11,10,2038), date.mdy(2,25,96), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'quarters').
+DEBUG EVALUATE /datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'quarters').
+
+dnl time of day is significant for DATEDIFF
+DEBUG EVALUATE /datediff(date.mdy(10,15,1910) + 234, date.mdy(10,10,1910) + 123, 'days').
+DEBUG EVALUATE /datediff(date.mdy(10,15,1910) + 123, date.mdy(10,10,1910) + 234, 'days').
+DEBUG EVALUATE /datediff(date.mdy(10,24,1910) + 234, date.mdy(10,10,1910) + 123, 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(10,24,1910) + 123, date.mdy(10,10,1910) + 234, 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(10,10,1910) + 234, date.mdy(5,10,1910) + 123, 'months').
+DEBUG EVALUATE /datediff(date.mdy(10,10,1910) + 123, date.mdy(5,10,1910) + 234, 'months').
+DEBUG EVALUATE /datediff(date.mdy(5,10,1919) + 234, date.mdy(5,10,1910) + 123, 'years').
+DEBUG EVALUATE /datediff(date.mdy(5,10,1919) + 123, date.mdy(5,10,1910) + 234, 'years').
+
+DEBUG EVALUATE /datediff(date.mdy(10,10,1910) + 123, date.mdy(10,15,1910) + 234, 'days').
+DEBUG EVALUATE /datediff(date.mdy(10,10,1910) + 234, date.mdy(10,15,1910) + 123, 'days').
+DEBUG EVALUATE /datediff(date.mdy(10,10,1910) + 123, date.mdy(10,24,1910) + 234, 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(10,10,1910) + 234, date.mdy(10,24,1910) + 123, 'weeks').
+DEBUG EVALUATE /datediff(date.mdy(5,10,1910) + 123, date.mdy(10,10,1910) + 234, 'months').
+DEBUG EVALUATE /datediff(date.mdy(5,10,1910) + 234, date.mdy(10,10,1910) + 123, 'months').
+DEBUG EVALUATE /datediff(date.mdy(5,10,1910) + 123, date.mdy(5,10,1919) + 234, 'years').
+DEBUG EVALUATE /datediff(date.mdy(5,10,1910) + 234, date.mdy(5,10,1919) + 123, 'years').
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATESUM with non-leap year])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 1, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 2, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 3, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 4, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 5.4, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 6, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 7, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 8, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 9, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 10, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 11, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 12, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 13.9, 'months') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 1, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 2, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 3.2, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 4, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 5, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 6, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 7, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 8, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 9, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 10, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 11, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 12, 'months', 'rollover') - date.mdy(1,1,1900)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1900), 13, 'months', 'rollover') - date.mdy(1,1,1900)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATESUM with leap year])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 1, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 2.5, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 3, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 4.9, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 5.1, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 6, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 7, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 8, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 9, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 10, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 11, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 12, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 13, 'months') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 1, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 2, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 3, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 4, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 5, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 6, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 7, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 8, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 9, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 10, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 11, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 12, 'months', 'rollover') - date.mdy(1,1,1904)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(1,31,1904), 13, 'months', 'rollover') - date.mdy(1,1,1904)).
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATESUM])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,10,1648), 1, 'weeks') - date.mdy(6,10,1648)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'weeks') - date.mdy(6,30,1680)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(7,24,1716), -3, 'weeks') - date.mdy(7,24,1716)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,19,1768), 4, 'weeks') - date.mdy(6,19,1768)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(8,2,1819), 5, 'weeks') - date.mdy(8,2,1819)).
+
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,10,1648), 1, 'days') - date.mdy(6,10,1648)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'days') - date.mdy(6,30,1680)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(7,24,1716), -3, 'days') - date.mdy(7,24,1716)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,19,1768), 4, 'days') - date.mdy(6,19,1768)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(8,2,1819), 5, 'days') - date.mdy(8,2,1819)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,10,1648), 1, 'hours') - date.mdy(6,10,1648)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'hours') - date.mdy(6,30,1680)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(6,19,1768), -4, 'hours') - date.mdy(6,19,1768)).
+DEBUG EVALUATE /ctime.days(datesum(date.mdy(8,2,1819), 5, 'hours') - date.mdy(8,2,1819)).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - DATESUM preserves time of day for units of days and longer])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /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))).
+DEBUG EVALUATE /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))).
+DEBUG EVALUATE /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))).
+DEBUG EVALUATE /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))).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+dnl These test values are from Applied Statistics, Algorithm AS 310.
+AT_SETUP([expressions - NCDF.BETA])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /1000 * ncdf.beta(.868,10,20,150).
+DEBUG EVALUATE /1000 * ncdf.beta(.9,10,10,120).
+DEBUG EVALUATE /1000 * ncdf.beta(.88,15,5,80).
+DEBUG EVALUATE /1000 * ncdf.beta(.85,20,10,110).
+DEBUG EVALUATE /1000 * ncdf.beta(.66,20,30,65).
+DEBUG EVALUATE /1000 * ncdf.beta(.72,20,50,130).
+DEBUG EVALUATE /1000 * ncdf.beta(.72,30,20,80).
+DEBUG EVALUATE /1000 * ncdf.beta(.8,30,40,130).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+dnl FIXME: LAG
+dnl
+ [[X], [1.00], [], [(X = 1.00)]],
+
+dnl FIXME: out-of-range and nearly out-of-range values on dates
+dnl
+dnl Tests correctness of generic optimizations in optimize_tree().
+AT_SETUP([expressions - generic tree optimizations])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE (x=10) /x + 0.
+DEBUG EVALUATE (x=-3) /x - 0.
+DEBUG EVALUATE (x=5) /0 + x.
+DEBUG EVALUATE (x=10) /x * 1.
+DEBUG EVALUATE (x=-3) /1 * x.
+DEBUG EVALUATE (x=5) /x / 1.
+DEBUG EVALUATE (x=10) /0 * x.
+DEBUG EVALUATE (x=-3) /x * 0.
+DEBUG EVALUATE (x=5) /0 / x.
+DEBUG EVALUATE (x=5) /mod(0, x).
+DEBUG EVALUATE (x=5) /x ** 1.
+DEBUG EVALUATE (x=5) /x ** 2.
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - negative checks])
+AT_KEYWORDS([expression expressions evaluate])
+AT_DATA([evaluate-base.sps], [
+DEBUG EVALUATE SET opt.
+DEBUG EVALUATE /$nonexistent.
+DEBUG EVALUATE /RANGE(1, 2).
+DEBUG EVALUATE /CONCAT.1('a', 'b').
+DEBUG EVALUATE /foobar(x).
+DEBUG EVALUATE /CONCAT.1('a' b).
+DEBUG EVALUATE /NCDF.CHISQ(1, 2, 3).
+])
+
+for opt in OPT NOOPT; do
+ AS_BOX([$opt])
+ sed "s/opt/$opt/" < evaluate-base.sps > evaluate.sps
+ AT_CHECK([pspp --testing-mode evaluate.sps], [1], [dnl
+])
+done
+AT_CLEANUP
+
+AT_SETUP([expressions - LAG])