dnl PSPP - a program for statistical analysis.
dnl Copyright (C) 2017 Free Software Foundation, Inc.
dnl
dnl This program is free software: you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation, either version 3 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
dnl
AT_BANNER([PRINT and WRITE])

dnl These tests check unusual aspects of the PRINT and WRITE
dnl transformations:
dnl
dnl   - PRINT puts spaces between variables, unless a format
dnl     is specified explicitly.
dnl
dnl   - WRITE doesn't put space between variables.
dnl
dnl   - PRINT to an external file prefixes each line with a space.
dnl
dnl   - PRINT EJECT to an external file indicates a formfeed by a "1"
dnl     in the first column.
dnl
dnl   - WRITE writes out spaces for system-missing values, not a period.
dnl
dnl   - When no output is specified, an empty record is output.

AT_SETUP([PRINT numeric variables])
AT_DATA([print.sps], [dnl
data list notable /x y 1-2.
begin data.
12
34
 6
7
90
end data.

print /x y.
print eject /x y 1-2.
print /x '-' y.
print.

execute.
])
AT_CHECK([pspp -O format=csv print.sps], [0], [dnl
1 2 @&t@



12
1 -2 @&t@

3 4 @&t@



34
3 -4 @&t@

. 6 @&t@



.6
. -6 @&t@

7 . @&t@



7.
7 -. @&t@

9 0 @&t@



90
9 -0 @&t@

])
AT_CLEANUP

AT_SETUP([PRINT string variables])
AT_DATA([print.sps], [dnl
DATA LIST FREE /s8 (a8) s10 (a10) vl255 (a255) vl258 (a258).
BEGIN DATA.
12345678
AaaaaaaaaZ
AbbbbMaryHadALittleLambbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbZ
AccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZ
87654321
AnnnnnnnnZ
AmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmZ
AoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooWhyIsItSoZ
END DATA.

print
	outfile='print.txt'
	/s10 * vl255 * vl258 *.

EXECUTE.
])
AT_CHECK([pspp -O format=csv print.sps])
AT_CHECK([cat print.txt], [0], [dnl
 AaaaaaaaaZ AbbbbMaryHadALittleLambbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbZ AccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZ @&t@
 AnnnnnnnnZ AmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmZ AoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooWhyIsItSoZ @&t@
])
AT_CLEANUP

AT_SETUP([PRINT to file])
AT_DATA([print.sps], [dnl
data list notable /x y 1-2.
begin data.
12
34
 6
7
90
end data.

print outfile='print.out' /x y.
print eject outfile='print.out' /x y (f1,f1).
print outfile='print.out' /x '-' y.
print outfile='print.out'.

execute.
])
AT_CHECK([pspp -O format=csv print.sps])
AT_CHECK([cat print.out], [0], [dnl
 1 2 @&t@
112
 1 -2 @&t@
 @&t@
 3 4 @&t@
134
 3 -4 @&t@
 @&t@
 . 6 @&t@
1.6
 . -6 @&t@
 @&t@
 7 . @&t@
17.
 7 -. @&t@
 @&t@
 9 0 @&t@
190
 9 -0 @&t@
 @&t@
])
AT_CLEANUP

dnl Tests for a bug which crashed when deallocating after a bad PRINT
dnl command.
AT_SETUP([PRINT crash bug])
AT_DATA([print.sps], [dnl
DATA LIST LIST NOTABLE /a * b *.
BEGIN DATA.
1 2
3 4
END DATA.

PRINT F8.2
LIST.
])
AT_CHECK([pspp -O format=csv print.sps], [1], [dnl
"print.sps:7.7-7.10: error: PRINT: Syntax error expecting OUTFILE, ENCODING, RECORDS, TABLE, or NOTABLE.
    7 | PRINT F8.2
      |       ^~~~"

Table: Data List
a,b
1.00,2.00
3.00,4.00
])
AT_CLEANUP

AT_SETUP([WRITE to file])
AT_DATA([write.sps], [dnl
data list notable /x y 1-2.
begin data.
12
34
 6
7
90
end data.

write outfile='write.out' /x y.
write outfile='write.out' /x y (2(f1)).
write outfile='write.out' /x '-' y.
write outfile='write.out'.

execute.
])
AT_CHECK([pspp -O format=csv write.sps])
AT_CHECK([cat write.out], [0], [dnl
12
12
1-2

34
34
3-4

 6
 6
 -6

7 @&t@
7 @&t@
7- @&t@

90
90
9-0

])
AT_CLEANUP

AT_SETUP([PRINT overwrites file])
AT_DATA([output.txt], [abcdef
])
AT_DATA([print.sps], [dnl
DATA LIST NOTABLE/x 1.
BEGIN DATA.
5
END DATA.
PRINT OUTFILE='output.txt'/x.
EXECUTE.
])
AT_CHECK([pspp -O format=csv print.sps])
AT_CHECK([cat output.txt], [0], [ 5 @&t@
])
AT_CLEANUP

AT_SETUP([PRINT overwrites file atomically])
AT_DATA([output.txt], [abcdef
])
AT_DATA([print.sps],
[[DATA LIST NOTABLE/x 1.
BEGIN DATA.
5
END DATA.
PRINT OUTFILE='output.txt'/x.
HOST COMMAND=['kill -TERM $PPID'].
]])
AT_CHECK([pspp -O format=csv print.sps], [143], [], [ignore])
AT_CHECK([cat output.txt], [0], [abcdef
])
AT_CHECK(
  [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
AT_CLEANUP

AT_SETUP([PRINT to same file being read])
AT_DATA([data.txt], [5
])
AT_DATA([print.sps], [dnl
DATA LIST FILE='data.txt' NOTABLE/x 1.
COMPUTE y = x + 1.
PRINT OUTFILE='data.txt'/y.
EXECUTE.
])
AT_CHECK([pspp -O format=csv print.sps])
AT_CHECK([cat data.txt], [0], [     6.00 @&t@
])
AT_CHECK(
  [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
AT_CLEANUP

AT_SETUP([PRINT to special file])
AT_SKIP_IF([test ! -c /dev/null])
AT_CHECK([ln -s /dev/null foo.out || exit 77])
AT_SKIP_IF([test ! -c foo.out])
AT_DATA([print.sps], [dnl
DATA LIST NOTABLE /x 1.
BEGIN DATA.
1
2
3
4
5
END DATA.
PRINT OUTFILE='foo.out'/x.
PRINT OUTFILE='foo2.out'/x.
EXECUTE.
])
AT_CHECK([pspp -O format=csv print.sps])
AT_CHECK([cat foo2.out], [0], [dnl
 1 @&t@
 2 @&t@
 3 @&t@
 4 @&t@
 5 @&t@
])
ls -l foo.out foo2.out
AT_CHECK([test -c foo.out])
AT_CLEANUP

AT_SETUP([PRINT with special line ends])
AT_DATA([print.sps], [dnl
FILE HANDLE lf   /NAME='lf.txt'   /ENDS=LF.
FILE HANDLE crlf /NAME='crlf.txt' /ENDS=CRLF.
DATA LIST NOTABLE /x 1.
BEGIN DATA.
1
2
3
4
5
END DATA.
PRINT OUTFILE=lf/x.
PRINT OUTFILE=crlf/x.
EXECUTE.
])
AT_CHECK([pspp -O format=csv print.sps])
AT_CHECK([cat lf.txt], [0], [dnl
 1 @&t@
 2 @&t@
 3 @&t@
 4 @&t@
 5 @&t@
])
AT_CHECK([tr '\r' R < crlf.txt], [0], [dnl
 1 R
 2 R
 3 R
 4 R
 5 R
])
AT_CLEANUP

AT_SETUP([PRINT syntax errors])
AT_DATA([print.sps], [dnl
DATA LIST LIST NOTABLE /x.
PRINT OUTFILE=**.
PRINT ENCODING=**.
PRINT RECORDS=-1.
PRINT **.
PRINT/ **.
PRINT/'string' 0.
PRINT/'string' 5-3.
PRINT/y.
PRINT/x 0.
PRINT/x (A8).
])
AT_CHECK([pspp -O format=csv print.sps], [1], [dnl
"print.sps:2.15-2.16: error: PRINT: Syntax error expecting a file name or handle name.
    2 | PRINT OUTFILE=**.
      |               ^~"

"print.sps:3.16-3.17: error: PRINT: Syntax error expecting string.
    3 | PRINT ENCODING=**.
      |                ^~"

"print.sps:4.15-4.16: error: PRINT: Syntax error expecting non-negative integer for RECORDS.
    4 | PRINT RECORDS=-1.
      |               ^~"

"print.sps:5.7-5.8: error: PRINT: Syntax error expecting OUTFILE, ENCODING, RECORDS, TABLE, or NOTABLE.
    5 | PRINT **.
      |       ^~"

"print.sps:6.8-6.9: error: PRINT: Syntax error expecting variable name.
    6 | PRINT/ **.
      |        ^~"

"print.sps:7.16: error: PRINT: Column positions for fields must be positive.
    7 | PRINT/'string' 0.
      |                ^"

"print.sps:8.16-8.18: error: PRINT: The ending column for a field must be greater than the starting column.
    8 | PRINT/'string' 5-3.
      |                ^~~"

"print.sps:9.7: error: PRINT: y is not a variable name.
    9 | PRINT/y.
      |       ^"

"print.sps:10.9: error: PRINT: Column positions for fields must be positive.
   10 | PRINT/x 0.
      |         ^"

"print.sps:11.9-11.12: error: PRINT: Numeric variable x is not compatible with string format A8.
   11 | PRINT/x (A8).
      |         ^~~~"
])
AT_CLEANUP
