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 . dnl AT_BANNER([INPUT PROGRAM]) dnl Tests for a bug which caused a crash when dnl reading invalid INPUT PROGRAM syntax. AT_SETUP([INPUT PROGRAM invalid syntax crash]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. DATA LIST NOTABLE /a 1-9. BEGIN DATA 123456789 END DATA. END INPUT PROGRAM. ]) AT_CHECK([pspp -O format=csv input-program.sps], [1], [dnl input-program.sps:3: error: BEGIN DATA: BEGIN DATA is not allowed inside INPUT PROGRAM. ]) AT_CLEANUP dnl Tests for bug #21108, a crash when dnl reading invalid INPUT PROGRAM syntax. AT_SETUP([INPUT PROGRAM invalid syntax crash]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. DATA LIST LIST NOTABLE /x. END FILE. END INPUT PROGRAM. DESCRIPTIVES x. ]) AT_CHECK([pspp -O format=csv input-program.sps], [1], [dnl error: DESCRIPTIVES: Syntax error at end of input: expecting BEGIN. ]) AT_CLEANUP dnl Tests for bug #38782, an infinite loop processing an empty input program. AT_SETUP([INPUT PROGRAM infinite loop]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. STRING firstname lastname (a24) / address (a80). END INPUT PROGRAM. EXECUTE. ]) AT_CHECK([pspp -O format=csv input-program.sps], [1], [dnl input-program.sps:3: error: INPUT PROGRAM: Input program must contain DATA LIST or END FILE. input-program.sps:4: error: EXECUTE: EXECUTE is allowed only after the active dataset has been defined. ]) AT_CLEANUP dnl Tests for bug #39097, a bug when an INPUT PROGRAM used VECTOR, was dnl followed immediately by a call to proc_execute() (here via DATASET dnl COPY), and then the input was actually used. AT_SETUP([INPUT PROGRAM with VECTOR and EXECUTE]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. VECTOR vec(5). LOOP #c = 1 to 10. LOOP #v = 1 to 5. COMPUTE vec(#v) = #v. END LOOP. END CASE. END LOOP. END FILE. END INPUT PROGRAM. DATASET COPY x. LIST. ]) AT_CHECK([pspp -O format=csv input-program.sps], [0], [dnl Table: Data List vec1,vec2,vec3,vec4,vec5 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 1.00,2.00,3.00,4.00,5.00 ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM taking shorter of two files]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. DATA LIST NOTABLE FILE='a.txt'/X 1-10. DATA LIST NOTABLE FILE='b.txt'/Y 1-10. END INPUT PROGRAM. LIST. ]) AT_DATA([short.txt], [dnl 1 2 3 ]) AT_DATA([long.txt], [dnl 4 5 6 7 ]) cp short.txt a.txt cp long.txt b.txt AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X,Y 1,4 2,5 3,6 ]) cp short.txt b.txt cp long.txt a.txt AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X,Y 4,1 5,2 6,3 ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM taking longer of two files]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. NUMERIC #A #B. DO IF NOT #A. DATA LIST NOTABLE END=#A FILE='a.txt'/X 1-10. END IF. DO IF NOT #B. DATA LIST NOTABLE END=#B FILE='b.txt'/Y 1-10. END IF. DO IF #A AND #B. END FILE. END IF. END CASE. END INPUT PROGRAM. LIST. ]) AT_DATA([short.txt], [dnl 1 2 3 ]) AT_DATA([long.txt], [dnl 4 5 6 7 8 ]) cp short.txt a.txt cp long.txt b.txt AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X,Y 1,4 2,5 3,6 .,7 .,8 ]) cp short.txt b.txt cp long.txt a.txt AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X,Y 4,1 5,2 6,3 7,. 8,. ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM concatenating two files - version 1]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. NUMERIC #A #B. DO IF #A. DATA LIST NOTABLE END=#B FILE='b.txt'/X 1-10. DO IF #B. END FILE. ELSE. END CASE. END IF. ELSE. DATA LIST NOTABLE END=#A FILE='a.txt'/X 1-10. DO IF NOT #A. END CASE. END IF. END IF. END INPUT PROGRAM. LIST. ]) AT_DATA([a.txt], [dnl 1 2 3 ]) AT_DATA([b.txt], [dnl 4 5 6 7 8 ]) AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X 1 2 3 4 5 6 7 8 ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM concatenating two files - version 2]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. NUMERIC #EOF. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='a.txt'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. COMPUTE #EOF = 0. LOOP IF NOT #EOF. DATA LIST NOTABLE END=#EOF FILE='b.txt'/X 1-10. DO IF NOT #EOF. END CASE. END IF. END LOOP. END FILE. END INPUT PROGRAM. LIST. ]) AT_DATA([a.txt], [dnl 1 2 3 ]) AT_DATA([b.txt], [dnl 4 5 6 7 8 ]) AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X 1 2 3 4 5 6 7 8 ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM generating data]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. LOOP #I=1 TO 10. COMPUTE X=#I. END CASE. END LOOP. END FILE. END INPUT PROGRAM. FORMAT X(F2). LIST. ]) AT_CHECK([pspp -O format=csv input-program.sps], 0, [dnl Table: Data List X 1 2 3 4 5 6 7 8 9 10 ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM unexpected end of file]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. ]) AT_CHECK([pspp input-program.sps], 1, [dnl error: INPUT PROGRAM: Unexpected end-of-file within INPUT PROGRAM. ]) AT_CLEANUP AT_SETUP([INPUT PROGRAM no variables]) AT_DATA([input-program.sps], [dnl INPUT PROGRAM. END FILE. END INPUT PROGRAM. ]) AT_CHECK([pspp input-program.sps], 1, [dnl input-program.sps:3: error: INPUT PROGRAM: Input program did not create any variables. ]) AT_CLEANUP