PRINT: Improve error messages.
[pspp] / tests / language / data-io / print.at
1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
3 dnl
4 dnl This program is free software: you can redistribute it and/or modify
5 dnl it under the terms of the GNU General Public License as published by
6 dnl the Free Software Foundation, either version 3 of the License, or
7 dnl (at your option) any later version.
8 dnl
9 dnl This program is distributed in the hope that it will be useful,
10 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
11 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 dnl GNU General Public License for more details.
13 dnl
14 dnl You should have received a copy of the GNU General Public License
15 dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 dnl
17 AT_BANNER([PRINT and WRITE])
18
19 dnl These tests check unusual aspects of the PRINT and WRITE
20 dnl transformations:
21 dnl
22 dnl   - PRINT puts spaces between variables, unless a format
23 dnl     is specified explicitly.
24 dnl
25 dnl   - WRITE doesn't put space between variables.
26 dnl
27 dnl   - PRINT to an external file prefixes each line with a space.
28 dnl
29 dnl   - PRINT EJECT to an external file indicates a formfeed by a "1"
30 dnl     in the first column.
31 dnl
32 dnl   - WRITE writes out spaces for system-missing values, not a period.
33 dnl
34 dnl   - When no output is specified, an empty record is output.
35
36 AT_SETUP([PRINT numeric variables])
37 AT_DATA([print.sps], [dnl
38 data list notable /x y 1-2.
39 begin data.
40 12
41 34
42  6
43 7
44 90
45 end data.
46
47 print /x y.
48 print eject /x y 1-2.
49 print /x '-' y.
50 print.
51
52 execute.
53 ])
54 AT_CHECK([pspp -O format=csv print.sps], [0], [dnl
55 1 2 @&t@
56
57
58
59 12
60 1 -2 @&t@
61
62 3 4 @&t@
63
64
65
66 34
67 3 -4 @&t@
68
69 . 6 @&t@
70
71
72
73 .6
74 . -6 @&t@
75
76 7 . @&t@
77
78
79
80 7.
81 7 -. @&t@
82
83 9 0 @&t@
84
85
86
87 90
88 9 -0 @&t@
89
90 ])
91 AT_CLEANUP
92
93 AT_SETUP([PRINT string variables])
94 AT_DATA([print.sps], [dnl
95 DATA LIST FREE /s8 (a8) s10 (a10) vl255 (a255) vl258 (a258).
96 BEGIN DATA.
97 12345678
98 AaaaaaaaaZ
99 AbbbbMaryHadALittleLambbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbZ
100 AccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZ
101 87654321
102 AnnnnnnnnZ
103 AmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmZ
104 AoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooWhyIsItSoZ
105 END DATA.
106
107 print
108         outfile='print.txt'
109         /s10 * vl255 * vl258 *.
110
111 EXECUTE.
112 ])
113 AT_CHECK([pspp -O format=csv print.sps])
114 AT_CHECK([cat print.txt], [0], [dnl
115  AaaaaaaaaZ AbbbbMaryHadALittleLambbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbZ AccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccZ @&t@
116  AnnnnnnnnZ AmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmZ AoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooWhyIsItSoZ @&t@
117 ])
118 AT_CLEANUP
119
120 AT_SETUP([PRINT to file])
121 AT_DATA([print.sps], [dnl
122 data list notable /x y 1-2.
123 begin data.
124 12
125 34
126  6
127 7
128 90
129 end data.
130
131 print outfile='print.out' /x y.
132 print eject outfile='print.out' /x y (f1,f1).
133 print outfile='print.out' /x '-' y.
134 print outfile='print.out'.
135
136 execute.
137 ])
138 AT_CHECK([pspp -O format=csv print.sps])
139 AT_CHECK([cat print.out], [0], [dnl
140  1 2 @&t@
141 112
142  1 -2 @&t@
143  @&t@
144  3 4 @&t@
145 134
146  3 -4 @&t@
147  @&t@
148  . 6 @&t@
149 1.6
150  . -6 @&t@
151  @&t@
152  7 . @&t@
153 17.
154  7 -. @&t@
155  @&t@
156  9 0 @&t@
157 190
158  9 -0 @&t@
159  @&t@
160 ])
161 AT_CLEANUP
162
163 dnl Tests for a bug which crashed when deallocating after a bad PRINT
164 dnl command.
165 AT_SETUP([PRINT crash bug])
166 AT_DATA([print.sps], [dnl
167 DATA LIST LIST NOTABLE /a * b *.
168 BEGIN DATA.
169 1 2
170 3 4
171 END DATA.
172
173 PRINT F8.2
174 LIST.
175 ])
176 AT_CHECK([pspp -O format=csv print.sps], [1], [dnl
177 "print.sps:7.7-7.10: error: PRINT: Syntax error expecting OUTFILE, ENCODING, RECORDS, TABLE, or NOTABLE.
178     7 | PRINT F8.2
179       |       ^~~~"
180
181 Table: Data List
182 a,b
183 1.00,2.00
184 3.00,4.00
185 ])
186 AT_CLEANUP
187
188 AT_SETUP([WRITE to file])
189 AT_DATA([write.sps], [dnl
190 data list notable /x y 1-2.
191 begin data.
192 12
193 34
194  6
195 7
196 90
197 end data.
198
199 write outfile='write.out' /x y.
200 write outfile='write.out' /x y (2(f1)).
201 write outfile='write.out' /x '-' y.
202 write outfile='write.out'.
203
204 execute.
205 ])
206 AT_CHECK([pspp -O format=csv write.sps])
207 AT_CHECK([cat write.out], [0], [dnl
208 12
209 12
210 1-2
211
212 34
213 34
214 3-4
215
216  6
217  6
218  -6
219
220 7 @&t@
221 7 @&t@
222 7- @&t@
223
224 90
225 90
226 9-0
227
228 ])
229 AT_CLEANUP
230
231 AT_SETUP([PRINT overwrites file])
232 AT_DATA([output.txt], [abcdef
233 ])
234 AT_DATA([print.sps], [dnl
235 DATA LIST NOTABLE/x 1.
236 BEGIN DATA.
237 5
238 END DATA.
239 PRINT OUTFILE='output.txt'/x.
240 EXECUTE.
241 ])
242 AT_CHECK([pspp -O format=csv print.sps])
243 AT_CHECK([cat output.txt], [0], [ 5 @&t@
244 ])
245 AT_CLEANUP
246
247 AT_SETUP([PRINT overwrites file atomically])
248 AT_DATA([output.txt], [abcdef
249 ])
250 AT_DATA([print.sps],
251 [[DATA LIST NOTABLE/x 1.
252 BEGIN DATA.
253 5
254 END DATA.
255 PRINT OUTFILE='output.txt'/x.
256 HOST COMMAND=['kill -TERM $PPID'].
257 ]])
258 AT_CHECK([pspp -O format=csv print.sps], [143], [], [ignore])
259 AT_CHECK([cat output.txt], [0], [abcdef
260 ])
261 AT_CHECK(
262   [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
263 AT_CLEANUP
264
265 AT_SETUP([PRINT to same file being read])
266 AT_DATA([data.txt], [5
267 ])
268 AT_DATA([print.sps], [dnl
269 DATA LIST FILE='data.txt' NOTABLE/x 1.
270 COMPUTE y = x + 1.
271 PRINT OUTFILE='data.txt'/y.
272 EXECUTE.
273 ])
274 AT_CHECK([pspp -O format=csv print.sps])
275 AT_CHECK([cat data.txt], [0], [     6.00 @&t@
276 ])
277 AT_CHECK(
278   [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
279 AT_CLEANUP
280
281 AT_SETUP([PRINT to special file])
282 AT_SKIP_IF([test ! -c /dev/null])
283 AT_CHECK([ln -s /dev/null foo.out || exit 77])
284 AT_SKIP_IF([test ! -c foo.out])
285 AT_DATA([print.sps], [dnl
286 DATA LIST NOTABLE /x 1.
287 BEGIN DATA.
288 1
289 2
290 3
291 4
292 5
293 END DATA.
294 PRINT OUTFILE='foo.out'/x.
295 PRINT OUTFILE='foo2.out'/x.
296 EXECUTE.
297 ])
298 AT_CHECK([pspp -O format=csv print.sps])
299 AT_CHECK([cat foo2.out], [0], [dnl
300  1 @&t@
301  2 @&t@
302  3 @&t@
303  4 @&t@
304  5 @&t@
305 ])
306 ls -l foo.out foo2.out
307 AT_CHECK([test -c foo.out])
308 AT_CLEANUP
309
310 AT_SETUP([PRINT with special line ends])
311 AT_DATA([print.sps], [dnl
312 FILE HANDLE lf   /NAME='lf.txt'   /ENDS=LF.
313 FILE HANDLE crlf /NAME='crlf.txt' /ENDS=CRLF.
314 DATA LIST NOTABLE /x 1.
315 BEGIN DATA.
316 1
317 2
318 3
319 4
320 5
321 END DATA.
322 PRINT OUTFILE=lf/x.
323 PRINT OUTFILE=crlf/x.
324 EXECUTE.
325 ])
326 AT_CHECK([pspp -O format=csv print.sps])
327 AT_CHECK([cat lf.txt], [0], [dnl
328  1 @&t@
329  2 @&t@
330  3 @&t@
331  4 @&t@
332  5 @&t@
333 ])
334 AT_CHECK([tr '\r' R < crlf.txt], [0], [dnl
335  1 R
336  2 R
337  3 R
338  4 R
339  5 R
340 ])
341 AT_CLEANUP
342
343 AT_SETUP([PRINT syntax errors])
344 AT_DATA([print.sps], [dnl
345 DATA LIST LIST NOTABLE /x.
346 PRINT OUTFILE=**.
347 PRINT ENCODING=**.
348 PRINT RECORDS=-1.
349 PRINT **.
350 PRINT/ **.
351 PRINT/'string' 0.
352 PRINT/'string' 5-3.
353 PRINT/y.
354 PRINT/x 0.
355 PRINT/x (A8).
356 ])
357 AT_CHECK([pspp -O format=csv print.sps], [1], [dnl
358 "print.sps:2.15-2.16: error: PRINT: Syntax error expecting a file name or handle name.
359     2 | PRINT OUTFILE=**.
360       |               ^~"
361
362 "print.sps:3.16-3.17: error: PRINT: Syntax error expecting string.
363     3 | PRINT ENCODING=**.
364       |                ^~"
365
366 "print.sps:4.15-4.16: error: PRINT: Syntax error expecting non-negative integer for RECORDS.
367     4 | PRINT RECORDS=-1.
368       |               ^~"
369
370 "print.sps:5.7-5.8: error: PRINT: Syntax error expecting OUTFILE, ENCODING, RECORDS, TABLE, or NOTABLE.
371     5 | PRINT **.
372       |       ^~"
373
374 "print.sps:6.8-6.9: error: PRINT: Syntax error expecting variable name.
375     6 | PRINT/ **.
376       |        ^~"
377
378 "print.sps:7.16: error: PRINT: Column positions for fields must be positive.
379     7 | PRINT/'string' 0.
380       |                ^"
381
382 "print.sps:8.16-8.18: error: PRINT: The ending column for a field must be greater than the starting column.
383     8 | PRINT/'string' 5-3.
384       |                ^~~"
385
386 "print.sps:9.7: error: PRINT: y is not a variable name.
387     9 | PRINT/y.
388       |       ^"
389
390 "print.sps:10.9: error: PRINT: Column positions for fields must be positive.
391    10 | PRINT/x 0.
392       |         ^"
393
394 "print.sps:11.9-11.12: error: PRINT: Numeric variable x is not compatible with string format A8.
395    11 | PRINT/x (A8).
396       |         ^~~~"
397 ])
398 AT_CLEANUP