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([INSERT])

dnl Create a file "batch.sps" that is valid syntax only in batch mode.
m4_define([CREATE_BATCH_SPS],
  [AT_DATA([batch.sps], [dnl
input program
loop #i = 1 to 5
+  compute z = #i
+  end case
end loop
end file
end input program
])])

AT_SETUP([INSERT SYNTAX=INTERACTIVE])
CREATE_BATCH_SPS
AT_DATA([insert.sps], [dnl
INSERT
  FILE='batch.sps'
  SYNTAX=interactive.
LIST.
])
AT_CHECK([pspp -o pspp.csv insert.sps], [1], [dnl
batch.sps:2.1-2.4: error: INPUT PROGRAM: Syntax error expecting end of command.
    2 | loop #i = 1 to 5
      | ^~~~
batch.sps:3.4-3.10: error: COMPUTE: COMPUTE is allowed only after the active dataset has been defined or inside INPUT PROGRAM.
    3 | +  compute z = #i
      |    ^~~~~~~
batch.sps:4.4-4.11: error: END CASE: END CASE is allowed only inside INPUT PROGRAM.
    4 | +  end case
      |    ^~~~~~~~
insert.sps:4.1-4.4: error: LIST: LIST is allowed only after the active dataset has been defined.
    4 | LIST.
      | ^~~~
])
AT_CLEANUP

AT_SETUP([INSERT SYNTAX=BATCH])
CREATE_BATCH_SPS
AT_DATA([insert.sps], [dnl
INSERT
  FILE='batch.sps'
  SYNTAX=BATCH.
LIST.
])
AT_CHECK([pspp -o pspp.csv insert.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Data List
z
1.00
2.00
3.00
4.00
5.00
])
AT_CLEANUP

AT_SETUP([INSERT CD=NO])
AT_DATA([insert.sps], [INSERT FILE='Dir1/foo.sps'.
LIST.
])
mkdir Dir1
AT_DATA([Dir1/foo.sps], [INSERT FILE='bar.sps' CD=NO.
])
AT_DATA([Dir1/bar.sps],
  [DATA LIST LIST /x *.
BEGIN DATA.
1
2
3
END DATA.
])
AT_CHECK([pspp -o pspp.csv insert.sps], [1], [dnl
Dir1/foo.sps:1: error: INSERT: Can't find `bar.sps' in include file search path.
insert.sps:2.1-2.4: error: LIST: LIST is allowed only after the active dataset has been defined.
    2 | LIST.
      | ^~~~
])
AT_CLEANUP

AT_SETUP([INSERT CD=YES])
AT_DATA([insert.sps], [INSERT FILE='Dir1/foo.sps' CD=YES.
LIST.
])
mkdir Dir1
AT_DATA([Dir1/foo.sps], [INSERT FILE='bar.sps'.
])
AT_DATA([Dir1/bar.sps],
  [DATA LIST LIST /x *.
BEGIN DATA.
1
2
3
END DATA.
])
AT_CHECK([pspp -o pspp.csv insert.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
x,F8.0

Table: Data List
x
1.00
2.00
3.00
])
AT_CLEANUP

m4_define([CREATE_ERROR_SPS],
  [AT_DATA([error.sps], [dnl
DATA LIST NOTABLE LIST /x *.
BEGIN DATA.
1
2
3
END DATA.

* The following line is erroneous

DISPLAY AKSDJ.
LIST.
])])

AT_SETUP([INSERT ERROR=STOP])
CREATE_ERROR_SPS
AT_DATA([insert.sps], [INSERT FILE='error.sps' ERROR=STOP.
])
AT_CHECK([pspp -o pspp.csv insert.sps], [1], [dnl
error.sps:10.9-10.13: error: DISPLAY: AKSDJ is not a variable name.
   10 | DISPLAY AKSDJ.
      |         ^~~~~
warning: Error encountered while ERROR=STOP is effective.
])
AT_CLEANUP

AT_SETUP([INSERT ERROR=CONTINUE])
CREATE_ERROR_SPS
AT_DATA([insert.sps], [INSERT FILE='error.sps' ERROR=CONTINUE.
])
AT_CHECK([pspp -o pspp.csv insert.sps], [1], [dnl
error.sps:10.9-10.13: error: DISPLAY: AKSDJ is not a variable name.
   10 | DISPLAY AKSDJ.
      |         ^~~~~
])
AT_CHECK([cat pspp.csv], [0], [dnl
"error.sps:10.9-10.13: error: DISPLAY: AKSDJ is not a variable name.
   10 | DISPLAY AKSDJ.
      |         ^~~~~"

Table: Data List
x
1.00
2.00
3.00
])
AT_CLEANUP

dnl Test for regression against bug #24569 in which PSPP crashed
dnl upon attempt to insert a nonexistent file.
AT_SETUP([INSERT nonexistent file])
AT_DATA([insert.sps], [dnl
INSERT
  FILE='nonexistent'
  ERROR=CONTINUE.
  .

LIST.
])
AT_CHECK([pspp -O format=csv insert.sps], [1], [dnl
insert.sps:2: error: INSERT: Can't find `nonexistent' in include file search path.

"insert.sps:6.1-6.4: error: LIST: LIST is allowed only after the active dataset has been defined.
    6 | LIST.
      | ^~~~"
])
AT_CLEANUP


dnl A test to check the INCLUDE command complete with the
dnl syntax and function of the ENCODING subcommand.
AT_SETUP([INCLUDE full check])
AT_DATA([two-utf8.sps], [dnl
echo 'Äpfelfölfaß'.
])

AT_DATA([include.sps], [dnl
echo 'ONE'.

include FILE='two-latin1.sps' ENCODING='ISO_8859-1'.
])

AT_CHECK([iconv -f UTF-8 -t iso-8859-1 two-utf8.sps > two-latin1.sps], [0], [])

AT_CHECK([pspp -O format=csv include.sps], [0], [dnl
ONE

Äpfelfölfaß
])
AT_CLEANUP




dnl Test for a bug where insert crashed on an unterminated string input
AT_SETUP([INSERT unterminated string])

AT_DATA([insert.sps], [INSERT FILE=7bar.sps' CD=NO.
])

AT_CHECK([pspp -O format=csv insert.sps], [1], [ignore])

AT_CLEANUP

AT_SETUP([INSERT syntax errors])
AT_KEYWORDS([INCLUDE])
: >inner.sps
AT_DATA([insert.sps], [dnl
INSERT **.
INSERT 'nonexistent.sps'.
INSERT 'inner.sps' ENCODING=**.
INSERT 'inner.sps' SYNTAX=**.
INSERT 'inner.sps' CD=**.
INSERT 'inner.sps' ERROR=**.
INSERT 'inner.sps' **.
INCLUDE 'inner.sps' **.
])
AT_CHECK([pspp -O format=csv insert.sps], [1], [dnl
"insert.sps:1.8-1.9: error: INSERT: Syntax error expecting string.
    1 | INSERT **.
      |        ^~"

insert.sps:2: error: INSERT: Can't find `nonexistent.sps' in include file search path.

"insert.sps:3.29-3.30: error: INSERT: Syntax error expecting string.
    3 | INSERT 'inner.sps' ENCODING=**.
      |                             ^~"

"insert.sps:4.27-4.28: error: INSERT: Syntax error expecting BATCH, INTERACTIVE, or AUTO.
    4 | INSERT 'inner.sps' SYNTAX=**.
      |                           ^~"

"insert.sps:5.23-5.24: error: INSERT: Syntax error expecting YES or NO.
    5 | INSERT 'inner.sps' CD=**.
      |                       ^~"

"insert.sps:6.26-6.27: error: INSERT: Syntax error expecting CONTINUE or STOP.
    6 | INSERT 'inner.sps' ERROR=**.
      |                          ^~"

"insert.sps:7.20-7.21: error: INSERT: Syntax error expecting ENCODING, SYNTAX, CD, or ERROR.
    7 | INSERT 'inner.sps' **.
      |                    ^~"

"insert.sps:8.21-8.22: error: INCLUDE: Syntax error expecting ENCODING.
    8 | INCLUDE 'inner.sps' **.
      |                     ^~"
])
AT_CLEANUP
