AT_DATA([evaluate.sps],
[set mxwarn 1000.
set mxerr 1000.
+set epoch 1940.
m4_foreach([check], [m4_shift($@)],
[DEBUG EVALUATE NOOPT m4_argn(4, check)/[]m4_car(check).
DEBUG EVALUATE m4_argn(4, check)/[]m4_car(check).
])])
AT_CAPTURE_FILE([evaluate.sps])
- m4_pushdef([i], [2])
+ m4_pushdef([i], [3])
AT_CHECK([pspp --testing-mode --error-file=- --no-output evaluate.sps],
[m4_if(m4_bregexp([m4_foreach([check], [m4_shift($@)], [m4_argn(3, check)])], [error:]), [-1], [0], [1])],
[stdout])
[[rnd(5.6)], [6.00]],
[[rnd(-5.4)], [-5.00]],
[[rnd(-5.6)], [-6.00]],
+ [[rnd(5.56, .1)], [5.60]],
+ [[rnd(-5.56, .1)], [-5.60]],
+ [[rnd(.5)], [1.00]],
+ [[rnd(.5 - 2**-53)], [1.00]],
+ [[rnd(.5 - 2**-52)], [1.00]],
+ [[rnd(.5 - 2**-51)], [1.00]],
+ [[rnd(.5 - 2**-45)], [0.00]],
+ [[rnd(.5 - 2**-45, 1, 10)], [1.00]],
[[rnd('x')], [error],
- [error: DEBUG EVALUATE: Type mismatch invoking RND(number) as rnd(string).]],
+ [error: DEBUG EVALUATE: Function invocation rnd(string) does not match any known function. Candidates are:
+RND(number)
+RND(number, number)
+RND(number, number, number).]],
[[trunc(1.2)], [1.00]],
[[trunc(1.9)], [1.00]],
[[trunc(-1.2)], [-1.00]],
[[trunc(-1.9)], [-1.00]],
+ [[trunc(5.06, .1)], [5.00]],
+ [[trunc(-5.06, .1)], [-5.00]],
+ [[trunc(1)], [1.00]],
+ [[trunc(1 - 2**-53)], [1.00]],
+ [[trunc(1 - 2**-52)], [1.00]],
+ [[trunc(1 - 2**-51)], [1.00]],
+ [[trunc(1 - 2**-45)], [0.00]],
+ [[trunc(1 - 2**-45, 1, 10)], [1.00]],
[[trunc('x')], [error],
- [error: DEBUG EVALUATE: Type mismatch invoking TRUNC(number) as trunc(string).]])
+ [error: DEBUG EVALUATE: Function invocation trunc(string) does not match any known function. Candidates are:
+TRUNC(number)
+TRUNC(number, number)
+TRUNC(number, number, number).]])
CHECK_EXPR_EVAL([acos arsin artan cos sin tan],
[[acos(.5) / 3.14159 * 180], [60.00]],
[[any('a', 'a ', 'b', 'c')], [true]],
[[any('b ', 'a', 'b', 'c')], [true]],
[[any('c ', 'a', 'b', 'c ')], [true]],
- [[any(a, 'b', 'c', 'd')], [error],
+ [[any(a10, 'b', 'c', 'd')], [error],
[error: DEBUG EVALUATE: Function invocation any(format, string, string, string) does not match any known function. Candidates are:
ANY(number, number[, number]...)
ANY(string, string[, string]...).]],
[[min("1", "2")], ["1"]],
[[min("1")], ["1"]])
-CHECK_EXPR_EVAL([cfvar mean sd sum variance],
+CHECK_EXPR_EVAL([cfvar mean median sd sum variance],
[[cfvar(1, 2, 3, 4, 5)], [0.53]],
[[cfvar(1, $sysmis, 2, 3, $sysmis, 4, 5)], [0.53]],
[[cfvar(1, 2)], [0.47]],
[[mean.4(1, 2, 3)], [error],
[error: DEBUG EVALUATE: With MEAN(number[, number]...), using minimum valid argument count of 4 does not make sense when passing only 3 arguments in list.]],
+ [[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]],
[[sd(1, 2, 3, 4, 5)], [1.58]],
[[sd(1, $sysmis, 2, 3, $sysmis, 4, 5)], [1.58]],
[[rindex('abcbcde', 'abc', 1)], [5.00]],
[[rindex('abcbcde', 'bccb', 2)], [4.00]],
[[rindex('abcbcde', 'bcbc', 2)], [4.00]],
+ [[rindex('abcbcde', 'bcbc', 0)], [sysmis]],
[[rindex('abcbcde', 'bcbc', $sysmis)], [sysmis]],
[[rindex('abcbcde', 'bcbcg', 2)], [sysmis]],
[[rindex('abcbcde', 'bcbcg', $sysmis)], [sysmis]],
[[lower(1)], [error],
[error: DEBUG EVALUATE: Type mismatch invoking LOWER(string) as lower(number).]])
-CHECK_EXPR_EVAL([lpad number ltrim lpad rtrim rpad string substr upcase],
+CHECK_EXPR_EVAL([replace],
+ [[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"]],
+ [[replace('banana', 'an', 'xyzzy', 1.5)], ["bxyzzyana"]],
+ [[replace('banana', 'bananana', 'xyzzy')], ["banana"]],
+ [[replace('banana', '', 'xyzzy')], ["banana"]],
+ [[replace('banana', 'ba', '', 0)], ["banana"]],
+ [[replace('banana', 'ba', '', -1)], ["banana"]],
+ [[replace('banana', 'ba', '', $sysmis)], ["banana"]])
+
+CHECK_EXPR_EVAL([lpad number ltrim lpad rtrim rpad string strunc substr upcase],
[[lpad('abc', -1)], [""]],
[[lpad('abc', 0)], ["abc"]],
[[lpad('abc', 2)], ["abc"]],
[error: DEBUG EVALUATE: Type mismatch invoking STRING(number, num_output_format) as string(number, format).]],
[[string(123, e6.0)], ["1E+002"]],
+ [[strunc('a c ', 9)], ["a c"]],
+ [[strunc('a c ', 7)], ["a c"]],
+ [[strunc('a c ', 6)], ["a c"]],
+ [[strunc('a c ', 5)], ["a c"]],
+ [[strunc('a c ', 4)], ["a c"]],
+ [[strunc('a c ', 3)], ["a c"]],
+ [[strunc('a c ', 2)], ["a"]],
+ [[strunc('a c ', 1)], ["a"]],
+ [[strunc('a c ', 0)], [""]],
+ [[strunc('a c ', -1)], [""]],
+ [[strunc('a c ', $sysmis)], [""]],
+ [[strunc(' abc ', 9)], [" abc"]],
+ [[strunc(' abc ', 8)], [" abc"]],
+ [[strunc(' abc ', 7)], [" abc"]],
+ [[strunc(' abc ', 6)], [" abc"]],
+ [[strunc(' abc ', 5)], [" abc"]],
+ [[strunc(' abc ', 4)], [" ab"]],
+ [[strunc(' abc ', 3)], [" a"]],
+ [[strunc(' abc ', 2)], [""]],
+ [[strunc(' abc ', 1)], [""]],
+ [[strunc(' abc ', -1)], [""]],
+ [[strunc(' abc ', $sysmis)], [""]],
+
[[substr('abcdefgh', -5)], [""]],
[[substr('abcdefgh', 0)], [""]],
[[substr('abcdefgh', 1)], ["abcdefgh"]],
[[datediff(date.mdy(7,18,2094), date.mdy(11,10,2038), 'quarters')], [222.00]],
[[datediff(date.mdy(2,29,1904), date.mdy(2,29,1900), 'quarters')], [15.00]],
[[datediff(date.mdy(2,29,1908), date.mdy(2,29,1904), 'quarters')], [16.00]],
- [[datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'quarters')], [11.00]])
+ [[datediff(date.mdy(2,28,1903), date.mdy(2,29,1900), 'quarters')], [11.00]],
+
+dnl time of day is significant for DATEDIFF
+ [[datediff(date.mdy(10,15,1910) + 234, date.mdy(10,10,1910) + 123, 'days')],
+ [5.00]],
+ [[datediff(date.mdy(10,15,1910) + 123, date.mdy(10,10,1910) + 234, 'days')],
+ [4.00]],
+ [[datediff(date.mdy(10,24,1910) + 234, date.mdy(10,10,1910) + 123, 'weeks')],
+ [2.00]],
+ [[datediff(date.mdy(10,24,1910) + 123, date.mdy(10,10,1910) + 234, 'weeks')],
+ [1.00]],
+ [[datediff(date.mdy(10,10,1910) + 234, date.mdy(5,10,1910) + 123, 'months')],
+ [5.00]],
+ [[datediff(date.mdy(10,10,1910) + 123, date.mdy(5,10,1910) + 234, 'months')],
+ [4.00]],
+ [[datediff(date.mdy(5,10,1919) + 234, date.mdy(5,10,1910) + 123, 'years')],
+ [9.00]],
+ [[datediff(date.mdy(5,10,1919) + 123, date.mdy(5,10,1910) + 234, 'years')],
+ [8.00]],
+
+ [[datediff(date.mdy(10,10,1910) + 123, date.mdy(10,15,1910) + 234, 'days')],
+ [-5.00]],
+ [[datediff(date.mdy(10,10,1910) + 234, date.mdy(10,15,1910) + 123, 'days')],
+ [-4.00]],
+ [[datediff(date.mdy(10,10,1910) + 123, date.mdy(10,24,1910) + 234, 'weeks')],
+ [-2.00]],
+ [[datediff(date.mdy(10,10,1910) + 234, date.mdy(10,24,1910) + 123, 'weeks')],
+ [-1.00]],
+ [[datediff(date.mdy(5,10,1910) + 123, date.mdy(10,10,1910) + 234, 'months')],
+ [-5.00]],
+ [[datediff(date.mdy(5,10,1910) + 234, date.mdy(10,10,1910) + 123, 'months')],
+ [-4.00]],
+ [[datediff(date.mdy(5,10,1910) + 123, date.mdy(5,10,1919) + 234, 'years')],
+ [-9.00]],
+ [[datediff(date.mdy(5,10,1910) + 234, date.mdy(5,10,1919) + 123, 'years')],
+ [-8.00]])
CHECK_EXPR_EVAL([datesum],
dnl DATESUM with non-leap year
[[ctime.days(datesum(date.mdy(6,10,1648), 1, 'hours') - date.mdy(6,10,1648))], [0.04]],
[[ctime.days(datesum(date.mdy(6,30,1680), 2.5, 'hours') - date.mdy(6,30,1680))], [0.10]],
[[ctime.days(datesum(date.mdy(6,19,1768), -4, 'hours') - date.mdy(6,19,1768))], [-0.17]],
- [[ctime.days(datesum(date.mdy(8,2,1819), 5, 'hours') - date.mdy(8,2,1819))], [0.21]])
+ [[ctime.days(datesum(date.mdy(8,2,1819), 5, 'hours') - date.mdy(8,2,1819))], [0.21]],
+
+dnl DATESUM preserves time-of-day for units of days and longer.
+ [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'days') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [5.00]],
+ [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'weeks') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [35.00]],
+ [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'months') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [153.00]],
+ [[ctime.days(datesum(date.mdy(8,2,1819) + time.hms(1,2,3), 5, 'years') - (date.mdy(8,2,1819) + time.hms(1,2,3)))], [1827.00]])
CHECK_EXPR_EVAL([miscellaneous],
dnl These test values are from Applied Statistics, Algorithm AS 310.