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

# Also tests that long variable names are preserved by SAVE and GET.
AT_SETUP([write and read numeric data])
AT_KEYWORDS([SAVE GET system file])
for variant in 'UNCOMPRESSED $FL2' 'ZCOMPRESSED $FL3'; do
    set $variant
    compression=$1 magic=$2
    cat >sysfile.sps <<EOF
DATA LIST LIST NOTABLE / variable001 * variable002 * variable003 * variable004 * .
BEGIN DATA.
    1.00     1.00    1.0     2.00
    1.00     1.00    2.0    30.00
    1.00     2.00    1.0     8.00
    1.00     2.00    2.0    20.00
    2.00     1.00    1.0     2.00
    2.00     1.00    2.0    22.00
    2.00     2.00    1.0     1.00
    2.00     2.00    2.0     3.00
END DATA.

SAVE/$compression /OUTFILE='foo.sav'.

GET /FILE='foo.sav'.

LIST.
EOF
    AT_CHECK([pspp -o pspp.csv sysfile.sps])
    AT_CHECK([cat pspp.csv], [0], [dnl
Table: Data List
variable001,variable002,variable003,variable004
1.00,1.00,1.00,2.00
1.00,1.00,2.00,30.00
1.00,2.00,1.00,8.00
1.00,2.00,2.00,20.00
2.00,1.00,1.00,2.00
2.00,1.00,2.00,22.00
2.00,2.00,1.00,1.00
2.00,2.00,2.00,3.00
])
    AT_CHECK_UNQUOTED([dd if=foo.sav bs=1 count=4; echo], [0], [$magic
], [ignore])
done
AT_CLEANUP

AT_SETUP([write and read long string value labels and missing values])
AT_KEYWORDS([SAVE GET system file])
for variant in 'UNCOMPRESSED $FL2' 'ZCOMPRESSED $FL3'; do
    set $variant
    compression=$1 magic=$2
    cat >sysfile.sps <<EOF
DATA LIST LIST NOTABLE/s1 s2 s3 (a9).
BEGIN DATA
a b c
END DATA.

VALUE LABELS
    /s1 'abc' 'First value label'
	'abcdefgh' 'Second value label'
	'abcdefghi' 'Third value label'
    /s2 '0' 'Fourth value label'
	'01234567' 'Fifth value label'
	'012345678' 'Sixth value label'.

MISSING VALUES
     s1 ('0')
    /s2 ('12' '123')
    /s3 ('1234' '12345' '12345678').

SAVE/$compression /OUTFILE='foo.sav'.
GET /FILE='foo.sav'.
DISPLAY DICTIONARY.
EOF
    AT_CHECK([pspp -o pspp.csv sysfile.sps])
    AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Measurement Level,Role,Width,Alignment,Print Format,Write Format,Missing Values
s1,1,Nominal,Input,9,Left,A9,A9,"""0       """
s2,2,Nominal,Input,9,Left,A9,A9,"""12      ""; ""123     """
s3,3,Nominal,Input,9,Left,A9,A9,"""1234    ""; ""12345   ""; ""12345678"""

Table: Value Labels
Variable Value,,Label
s1,abc,First value label
,abcdefgh,Second value label
,abcdefghi,Third value label
s2,0,Fourth value label
,01234567,Fifth value label
,012345678,Sixth value label
])
    AT_CHECK_UNQUOTED([dd if=foo.sav bs=1 count=4; echo], [0], [$magic
], [ignore])
done
AT_CLEANUP

AT_SETUP([write and read compressed files])
AT_KEYWORDS([SAVE GET system file])
AT_DATA([sysfile.sps], [dnl
DATA LIST LIST NOTABLE /x * y (a200).
BEGIN DATA.
1.2 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
.   yyyyyyyyyyyyyyy
0   ddddddddddddddddddddddddddddddd
101 z
END DATA.

SAVE OUTFILE='com.sav' /COMPRESS .

GET FILE='com.sav'.

LIST.
])
AT_CHECK([pspp -o pspp.csv sysfile.sps])
dnl Make sure file really was compressd, allowing big- or little-endian format.
AT_CHECK([dd if=com.sav bs=1 skip=72 count=4 2> /dev/null > com.sav.subset])
od com.sav.subset
AT_CHECK(
  [(printf '\000\000\000\001' | cmp -l com.sav.subset -) ||
   (printf '\001\000\000\000' | cmp -l com.sav.subset -)], [0],
  [ignore])
AT_CLEANUP

AT_SETUP([overwriting system file])
AT_DATA([output.sav], [abcdef
])
cp output.sav output.sav.backup
AT_DATA([sysfile.sps], [dnl
DATA LIST NOTABLE/x 1.
BEGIN DATA.
5
END DATA.
SAVE OUTFILE='output.sav'.
])
AT_CHECK([pspp -O format=csv sysfile.sps])
AT_CHECK([cmp output.sav output.sav.backup], [1], [ignore])
AT_CLEANUP

AT_SETUP([overwriting system file atomically])
AT_DATA([output.sav], [abcdef
])
cp output.sav output.sav.backup
AT_DATA([sysfile.sps],
[[DATA LIST NOTABLE/x 1.
BEGIN DATA.
5
END DATA.
XSAVE OUTFILE='output.sav'.
HOST COMMAND=['kill -TERM $PPID'].
]])
AT_CHECK([pspp -O format=csv sysfile.sps], [143], [], [ignore])
AT_CHECK([cmp output.sav output.sav.backup])
AT_CHECK(
  [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
AT_CLEANUP


AT_SETUP([write to same system file being read])
AT_DATA([save.sps], [dnl
DATA LIST NOTABLE/x 1.
BEGIN DATA.
3
END DATA.
SAVE OUTFILE='data.sav'.
])
AT_CHECK([pspp -O format=csv save.sps])
AT_CHECK([test -s data.sav])
AT_CHECK(
  [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
AT_DATA([save2.sps], [dnl
GET FILE='data.sav'.
COMPUTE y = x * 3.
SAVE OUTFILE='data.sav'.
])
AT_CHECK([pspp -O format=csv save2.sps])
AT_CHECK(
  [for file in *.tmp*; do if test -e $file; then echo $file; exit 1; fi; done])
AT_DATA([save3.sps], [dnl
GET FILE='data.sav'.
LIST.
])
AT_CHECK([pspp -O format=csv save3.sps], [0], [dnl
Table: Data List
x,y
3,9.00
])
AT_CLEANUP

AT_SETUP([nonempty case_map doesn't crash])
AT_KEYWORDS([SAVE system file])
AT_DATA([save.sps], [dnl
INPUT PROGRAM.
    COMPUTE #I = 1.
    COMPUTE X = #I + 1.
    END CASE.
    END FILE.
END INPUT PROGRAM.

SAVE OUTFILE='tiny.sav'.
])
AT_CHECK([pspp -O format=csv save.sps])
AT_DATA([get.sps], [dnl
GET FILE='tiny.sav'.
LIST.
])
AT_CHECK([pspp -O format=csv get.sps], [0], [dnl
Table: Data List
X
2.00
])
AT_CLEANUP

# Test that system files can be read properly, even when the case_size
# header value is -1 (Some 3rd party products do this).
AT_SETUP([system files with -1 case_size])
AT_KEYWORDS([SAVE GET])
AT_DATA([save.sps], [dnl
DATA LIST LIST NOTABLE /cont (A32) size pop count.
VAR LABEL
    cont 'continents of the world'
    size 'sq km'
    pop 'population'
    count 'number of countries'.
SAVE OUTFILE='cont.sav'.
BEGIN DATA.
Asia, 44579000, 3.7E+009, 44.00
Africa, 30065000, 7.8E+008, 53.00
"North America", 24256000, 4.8E+008, 23.00
"South America", 17819000, 3.4E+008, 12.00
Antarctica, 13209000, .00, .00
Europe, 9938000, 7.3E+008, 46.00
Australia/Oceania, 7687000, 31000000, 14.00
END DATA.
])
AT_CHECK([pspp -O format=csv save.sps])
AT_CHECK([test -f cont.sav])

dnl case_size is a 4-byte field at offset 68.
dnl Make a new copy with its value changed to -1.
AT_CHECK(
  [(dd if=cont.sav bs=1 count=68;
    printf '\377\377\377\377';
    dd if=cont.sav bs=1 skip=72) > cont2.sav], [0], [], [ignore])
AT_CHECK([cmp cont.sav cont2.sav], [1],
  [cont.sav cont2.sav differ: char 69, line 1
])

AT_DATA([get.sps], [dnl
GET FILE='cont2.sav'.
DISPLAY LABELS.
LIST.
])
AT_CHECK([pspp -o pspp.csv get.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Label
cont,1,continents of the world
size,2,sq km
pop,3,population
count,4,number of countries

Table: Data List
cont,size,pop,count
Asia,44579000,3.7E+009,44.00
Africa,30065000,7.8E+008,53.00
North America,24256000,4.8E+008,23.00
South America,17819000,3.4E+008,12.00
Antarctica,13209000,.00,.00
Europe,9938000,7.3E+008,46.00
Australia/Oceania,7687000,31000000,14.00
])
AT_CLEANUP

AT_SETUP([write v2 system file])
AT_KEYWORDS([SAVE])
AT_DATA([sysfile.sps], [dnl
DATA LIST LIST NOTABLE / X * variable001 * variable002 * variable003 * .
BEGIN DATA.
    1.00     1.00    1.0     2.00
    1.00     1.00    2.0    30.00
    1.00     2.00    1.0     8.00
    1.00     2.00    2.0    20.00
    2.00     1.00    1.0     2.00
    2.00     1.00    2.0    22.00
    2.00     2.00    1.0     1.00
    2.00     2.00    2.0     3.00
END DATA.

SAVE /OUTFILE='foo.sav'
     /VERSION=2
     .

GET /FILE='foo.sav'.

LIST.
])
AT_CHECK([pspp -O format=csv sysfile.sps], [0], [dnl
Table: Data List
x,variable,variab_a,variab_b
1.00,1.00,1.00,2.00
1.00,1.00,2.00,30.00
1.00,2.00,1.00,8.00
1.00,2.00,2.00,20.00
2.00,1.00,1.00,2.00
2.00,1.00,2.00,22.00
2.00,2.00,1.00,1.00
2.00,2.00,2.00,3.00
])
dnl Ensure that the written file has no long name table
AT_CHECK([grep 'X=X' foo.sav], [1], [ignore-nolog])
AT_CLEANUP

AT_BANNER([system files -- very long strings])

AT_SETUP([read very long strings written by SPSS 13])
AT_CHECK([cp $top_srcdir/tests/data/v13.sav .])
AT_DATA([sys-file.sps], [dnl
GET FILE='v13.sav' ENCODING='utf-8'.
DISPLAY VARIABLES.
LIST.
])
AT_CHECK([pspp -o pspp.csv sys-file.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Print Format,Write Format
N,1,F8.2,F8.2
A255,2,A255,A255
A258,3,A258,A258
A2000,4,A2000,A2000

Table: Data List
N,A255,A258,A2000
1.00,a1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA,b1BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB,c1CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
2.00,a2XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX,b2YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY,c2ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
])
AT_CLEANUP

AT_SETUP([read very long strings written by SPSS 14])
AT_CHECK([cp $top_srcdir/tests/data/v14.sav .])
AT_DATA([sys-file.sps], [dnl
GET FILE='v14.sav' ENCODING='utf-8'.
DISPLAY VARIABLES.
LIST.
])
AT_CHECK([pspp -o pspp.csv sys-file.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Print Format,Write Format
vl255,1,A255,A255
vl256,2,A256,A256
vl1335,3,A1335,A1335
vl2000,4,A2000,A2000

Table: Data List
vl255,vl256,vl1335,vl2000
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM,MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
])
AT_CLEANUP

m4_divert_push([PREPARE_TESTS])
vls_gen_data () {
cat > data.txt <<EOF
[encoded data, 66470 characters]
EOF
}
m4_divert_pop([PREPARE_TESTS])

m4_define([VLS_WRITE],
  [AT_SETUP([save very long string -- m4_tolower([$1])])
   vls_gen_data
   AT_DATA([save.sps], [dnl
DATA LIST FIXED NOTABLE FILE='data.txt'
    /a 2-11 (a)
     b (a256)
     c (a200)
     d (a32767).

SAVE OUTFILE='foo.sav' /$1.
])
   AT_CHECK([pspp -O format=csv save.sps])
   AT_DATA([get.sps], [dnl
GET FILE='foo.sav'.

DISPLAY VARIABLES.

PRINT OUTFILE='out.txt'
	/a (a10) b (a256) c (a200)
	d (a32767)
	.

EXECUTE.
])
   AT_CHECK([pspp -o pspp.csv get.sps])
   AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Print Format,Write Format
a,1,A10,A10
b,2,A256,A256
c,3,A200,A200
d,4,A32767,A32767
])
   AT_CLEANUP])

VLS_WRITE([UNCOMPRESSED])
VLS_WRITE([COMPRESSED])

dnl This test writes non-ASCII characters to most of the string fields in
dnl a .sav file and demonstrates that they are properly read back in.
dnl XXX mrsets tests are missing.
AT_SETUP([system file character encoding])
AT_CHECK([i18n-test supports_encodings windows-1252])
AT_DATA([save.sps], [dnl
SET LOCALE='windows-1252'.
DATA LIST LIST NOTABLE /àéîöçxyzabc * roué (A9) croûton (A1000).
FILE LABEL 'clientèle confrère cortège crèche'.
DOCUMENT coördinate smörgåsbord
épée séance soufflé soirée
jalapeño vicuña.
VALUE LABEL
      /àéîöçxyzabc 1 'éclair élan'
      /roué 'abcdefghi' 'sauté précis'.
VARIABLE LABEL
      roué 'Provençal soupçon'.
DATAFILE ATTRIBUTE
      ATTRIBUTE=Furtwängler('kindergärtner').
VARIABLE ATTRIBUTE
      VARIABLES=àéîöçxyzabc
      ATTRIBUTE=Atatürk('Düsseldorf Gewürztraminer').
BEGIN DATA.
1 a x
2 b y
3 c z
END DATA.
SAVE OUTFILE='foo.sav'.
])
AT_CHECK([pspp -O format=csv save.sps])
AT_DATA([get.sps], [dnl
GET FILE='foo.sav'.
DISPLAY FILE LABEL.
DISPLAY DOCUMENTS.
DISPLAY DICTIONARY.
DISPLAY ATTRIBUTES.
])
AT_CHECK([pspp -o pspp.csv get.sps])
AT_CHECK([[sed 's/(Entered [^)]*)/(Entered <date>)/' pspp.csv]], [0], [dnl
Table: File Label
Label,clientèle confrère cortège crèche

Table: Documents
"DOCUMENT coördinate smörgåsbord
épée séance soufflé soirée
jalapeño vicuña.
   (Entered <date>)"

Table: Variables
Name,Position,Label,Measurement Level,Role,Width,Alignment,Print Format,Write Format
àéîöçxyzabc,1,,Nominal,Input,8,Right,F8.2,F8.2
roué,2,Provençal soupçon,Nominal,Input,9,Left,A9,A9
croûton,3,,Nominal,Input,32,Left,A1000,A1000

Table: Value Labels
Variable Value,,Label
àéîöçxyzabc,1.00,éclair élan
Provençal soupçon,abcdefghi,sauté précis

Table: Variable and Dataset Attributes
Variable and Name,,Value
(dataset),Furtwängler,kindergärtner
àéîöçxyzabc,Atatürk,Düsseldorf Gewürztraminer
])
AT_CLEANUP
