79c71be8b66e5c5aac9d7cb7f40ac30834d5a9b8
[pspp] / tests / language / data-io / inpt-pgm.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([INPUT PROGRAM])
18
19 dnl Tests for a bug which caused a crash when
20 dnl reading invalid INPUT PROGRAM syntax.
21 AT_SETUP([INPUT PROGRAM invalid syntax crash])
22 AT_DATA([input-program.sps], [dnl
23 INPUT PROGRAM.
24 DATA LIST NOTABLE /a 1-9.
25 BEGIN DATA
26 123456789
27 END DATA.
28 END INPUT PROGRAM.
29 ])
30 AT_CHECK([pspp -O format=csv input-program.sps], [1], [dnl
31 "input-program.sps:3.1-3.10: error: BEGIN DATA: BEGIN DATA is not allowed inside INPUT PROGRAM.
32     3 | BEGIN DATA
33       | ^~~~~~~~~~"
34 ])
35 AT_CLEANUP
36
37 dnl Tests for bug #21108, a crash when
38 dnl reading invalid INPUT PROGRAM syntax.
39 AT_SETUP([INPUT PROGRAM invalid syntax crash])
40 AT_DATA([input-program.sps], [dnl
41 INPUT PROGRAM.
42 DATA LIST LIST NOTABLE /x.
43 END FILE.
44 END INPUT PROGRAM.
45
46 DESCRIPTIVES x.
47 ])
48 AT_CHECK([pspp -O format=csv input-program.sps], [1], [dnl
49 error: DESCRIPTIVES: At end of input: Syntax error expecting BEGIN.
50 ])
51 AT_CLEANUP
52
53 dnl Tests for bug #38782, an infinite loop processing an empty input program.
54 AT_SETUP([INPUT PROGRAM infinite loop])
55 AT_DATA([input-program.sps], [dnl
56 INPUT PROGRAM.
57 STRING firstname lastname (a24) / address (a80).
58 END INPUT PROGRAM.
59 EXECUTE.
60 ])
61 AT_CHECK([pspp -O format=csv input-program.sps], [1], [dnl
62 input-program.sps:3: error: INPUT PROGRAM: Input program must contain DATA LIST or END FILE.
63
64 "input-program.sps:4.1-4.7: error: EXECUTE: EXECUTE is allowed only after the active dataset has been defined.
65     4 | EXECUTE.
66       | ^~~~~~~"
67 ])
68 AT_CLEANUP
69
70 dnl Tests for bug #39097, a bug when an INPUT PROGRAM used VECTOR, was
71 dnl followed immediately by a call to proc_execute() (here via DATASET
72 dnl COPY), and then the input was actually used.
73 AT_SETUP([INPUT PROGRAM with VECTOR and EXECUTE])
74 AT_DATA([input-program.sps], [dnl
75 INPUT PROGRAM.
76 VECTOR vec(5).
77 LOOP #c = 1 to 10.
78  LOOP #v = 1 to 5.
79   COMPUTE vec(#v) = #v.
80  END LOOP.
81  END CASE.
82 END LOOP.
83 END FILE.
84 END INPUT PROGRAM.
85 DATASET COPY x.
86 LIST.
87 ])
88 AT_CHECK([pspp -O format=csv input-program.sps], [0], [dnl
89 Table: Data List
90 vec1,vec2,vec3,vec4,vec5
91 1.00,2.00,3.00,4.00,5.00
92 1.00,2.00,3.00,4.00,5.00
93 1.00,2.00,3.00,4.00,5.00
94 1.00,2.00,3.00,4.00,5.00
95 1.00,2.00,3.00,4.00,5.00
96 1.00,2.00,3.00,4.00,5.00
97 1.00,2.00,3.00,4.00,5.00
98 1.00,2.00,3.00,4.00,5.00
99 1.00,2.00,3.00,4.00,5.00
100 1.00,2.00,3.00,4.00,5.00
101 ])
102 AT_CLEANUP
103
104 AT_SETUP([INPUT PROGRAM taking shorter of two files])
105 AT_DATA([input-program.sps], [dnl
106 INPUT PROGRAM.
107     DATA LIST NOTABLE FILE='a.txt'/X 1-10.
108     DATA LIST NOTABLE FILE='b.txt'/Y 1-10.
109 END INPUT PROGRAM.
110 LIST.
111 ])
112 AT_DATA([short.txt], [dnl
113 1
114 2
115 3
116 ])
117 AT_DATA([long.txt], [dnl
118 4
119 5
120 6
121 7
122 ])
123
124 cp short.txt a.txt
125 cp long.txt b.txt
126 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
127 Table: Data List
128 X,Y
129 1,4
130 2,5
131 3,6
132 ])
133
134 cp short.txt b.txt
135 cp long.txt a.txt
136 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
137 Table: Data List
138 X,Y
139 4,1
140 5,2
141 6,3
142 ])
143 AT_CLEANUP
144
145 AT_SETUP([INPUT PROGRAM taking longer of two files])
146 AT_DATA([input-program.sps], [dnl
147 INPUT PROGRAM.
148     NUMERIC #A #B.
149
150     DO IF NOT #A.
151         DATA LIST NOTABLE END=#A FILE='a.txt'/X 1-10.
152     END IF.
153     DO IF NOT #B.
154         DATA LIST NOTABLE END=#B FILE='b.txt'/Y 1-10.
155     END IF.
156     DO IF #A AND #B.
157         END FILE.
158     END IF.
159     END CASE.
160 END INPUT PROGRAM.
161 LIST.
162 ])
163 AT_DATA([short.txt], [dnl
164 1
165 2
166 3
167 ])
168 AT_DATA([long.txt], [dnl
169 4
170 5
171 6
172 7
173 8
174 ])
175
176 cp short.txt a.txt
177 cp long.txt b.txt
178 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
179 Table: Data List
180 X,Y
181 1,4
182 2,5
183 3,6
184 .,7
185 .,8
186 ])
187
188 cp short.txt b.txt
189 cp long.txt a.txt
190 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
191 Table: Data List
192 X,Y
193 4,1
194 5,2
195 6,3
196 7,.
197 8,.
198 ])
199 AT_CLEANUP
200
201 AT_SETUP([INPUT PROGRAM concatenating two files - version 1])
202 AT_DATA([input-program.sps], [dnl
203 INPUT PROGRAM.
204     NUMERIC #A #B.
205
206     DO IF #A.
207         DATA LIST NOTABLE END=#B FILE='b.txt'/X 1-10.
208         DO IF #B.
209             END FILE.
210         ELSE.
211             END CASE.
212         END IF.
213     ELSE.
214         DATA LIST NOTABLE END=#A FILE='a.txt'/X 1-10.
215         DO IF NOT #A.
216             END CASE.
217         END IF.
218     END IF.
219 END INPUT PROGRAM.
220 LIST.
221 ])
222 AT_DATA([a.txt], [dnl
223 1
224 2
225 3
226 ])
227 AT_DATA([b.txt], [dnl
228 4
229 5
230 6
231 7
232 8
233 ])
234
235 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
236 Table: Data List
237 X
238 1
239 2
240 3
241 4
242 5
243 6
244 7
245 8
246 ])
247 AT_CLEANUP
248
249 AT_SETUP([INPUT PROGRAM concatenating two files - version 2])
250 AT_DATA([input-program.sps], [dnl
251 INPUT PROGRAM.
252     NUMERIC #EOF.
253
254     LOOP IF NOT #EOF.
255         DATA LIST NOTABLE END=#EOF FILE='a.txt'/X 1-10.
256         DO IF NOT #EOF.
257             END CASE.
258         END IF.
259     END LOOP.
260
261     COMPUTE #EOF = 0.
262     LOOP IF NOT #EOF.
263         DATA LIST NOTABLE END=#EOF FILE='b.txt'/X 1-10.
264         DO IF NOT #EOF.
265             END CASE.
266         END IF.
267     END LOOP.
268
269     END FILE.
270 END INPUT PROGRAM.
271 LIST.
272 ])
273 AT_DATA([a.txt], [dnl
274 1
275 2
276 3
277 ])
278 AT_DATA([b.txt], [dnl
279 4
280 5
281 6
282 7
283 8
284 ])
285
286 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
287 Table: Data List
288 X
289 1
290 2
291 3
292 4
293 5
294 6
295 7
296 8
297 ])
298 AT_CLEANUP
299
300 AT_SETUP([INPUT PROGRAM generating data])
301 AT_DATA([input-program.sps], [dnl
302 INPUT PROGRAM.
303     LOOP #I=1 TO 10.
304         COMPUTE X=#I.
305         END CASE.
306     END LOOP.
307     END FILE.
308 END INPUT PROGRAM.
309 FORMAT X(F2).
310 LIST.
311 ])
312 AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl
313 Table: Data List
314 X
315 1
316 2
317 3
318 4
319 5
320 6
321 7
322 8
323 9
324 10
325 ])
326 AT_CLEANUP
327
328 AT_SETUP([INPUT PROGRAM unexpected end of file])
329 AT_DATA([input-program.sps], [dnl
330 INPUT PROGRAM.
331 ])
332 AT_CHECK([pspp input-program.sps], 1, [dnl
333 error: INPUT PROGRAM: Unexpected end-of-file within INPUT PROGRAM.
334 ])
335 AT_CLEANUP
336
337
338 AT_SETUP([INPUT PROGRAM no variables])
339 AT_DATA([input-program.sps], [dnl
340 INPUT PROGRAM.
341 END FILE.
342 END INPUT PROGRAM.
343 ])
344 AT_CHECK([pspp input-program.sps], 1, [dnl
345 input-program.sps:3: error: INPUT PROGRAM: Input program did not create any
346 variables.
347 ])
348 AT_CLEANUP