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([variable display attributes])

AT_SETUP([variable display attribute commands])
AT_KEYWORDS([VARIABLE ALIGNMENT])
AT_KEYWORDS([VARIABLE WIDTH])
AT_KEYWORDS([VARIABLE LEVEL])
AT_KEYWORDS([VARIABLE ROLE])
AT_DATA([var-display.sps], [dnl
DATA LIST FREE /x y z.
VARIABLE ALIGNMENT x (LEFT)/y (RIGHT)/z (CENTER).
VARIABLE WIDTH x (10)/y (12)/z (14).
VARIABLE LEVEL x (SCALE)/y (ORDINAL)/z (NOMINAL).
VARIABLE ROLE /TARGET x /BOTH y /NONE z.
DISPLAY DICTIONARY.
])
AT_CHECK([pspp -o pspp.csv var-display.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Measurement Level,Role,Width,Alignment,Print Format,Write Format
x,1,Scale,Output,10,Left,F8.2,F8.2
y,2,Ordinal,Both,12,Right,F8.2,F8.2
z,3,Nominal,None,14,Center,F8.2,F8.2
])
AT_CLEANUP

AT_SETUP([variable display attribute syntax errors])
AT_KEYWORDS([VARIABLE ALIGNMENT])
AT_KEYWORDS([VARIABLE WIDTH])
AT_KEYWORDS([VARIABLE LEVEL])
AT_KEYWORDS([VARIABLE ROLE])
AT_DATA([var-display.sps], [dnl
DATA LIST LIST NOTABLE /x y z.
VARIABLE ALIGNMENT **.
VARIABLE ALIGNMENT x **.
VARIABLE ALIGNMENT x (**).
VARIABLE ALIGNMENT x (LEFT **).
VARIABLE WIDTH **.
VARIABLE WIDTH x **.
VARIABLE WIDTH x (**).
VARIABLE WIDTH x (10 **).
VARIABLE LEVEL **.
VARIABLE LEVEL x **.
VARIABLE LEVEL x (**).
VARIABLE LEVEL x (SCALE **).
VARIABLE ROLE **.
VARIABLE ROLE / **.
VARIABLE ROLE /INPUT **.
VARIABLE ROLE /INPUT x **.
])
AT_CHECK([pspp -O format=csv var-display.sps], [1], [dnl
"var-display.sps:2.20-2.21: error: VARIABLE ALIGNMENT: Syntax error expecting variable name.
    2 | VARIABLE ALIGNMENT **.
      |                    ^~"

"var-display.sps:3.22-3.23: error: VARIABLE ALIGNMENT: Syntax error expecting `('.
    3 | VARIABLE ALIGNMENT x **.
      |                      ^~"

"var-display.sps:4.23-4.24: error: VARIABLE ALIGNMENT: Syntax error expecting LEFT, RIGHT, or CENTER.
    4 | VARIABLE ALIGNMENT x (**).
      |                       ^~"

"var-display.sps:5.28-5.29: error: VARIABLE ALIGNMENT: Syntax error expecting `)'.
    5 | VARIABLE ALIGNMENT x (LEFT **).
      |                            ^~"

"var-display.sps:6.16-6.17: error: VARIABLE WIDTH: Syntax error expecting variable name.
    6 | VARIABLE WIDTH **.
      |                ^~"

"var-display.sps:7.18-7.19: error: VARIABLE WIDTH: Syntax error expecting `('.
    7 | VARIABLE WIDTH x **.
      |                  ^~"

"var-display.sps:8.19-8.20: error: VARIABLE WIDTH: Syntax error expecting positive integer.
    8 | VARIABLE WIDTH x (**).
      |                   ^~"

"var-display.sps:9.22-9.23: error: VARIABLE WIDTH: Syntax error expecting `)'.
    9 | VARIABLE WIDTH x (10 **).
      |                      ^~"

"var-display.sps:10.16-10.17: error: VARIABLE LEVEL: Syntax error expecting variable name.
   10 | VARIABLE LEVEL **.
      |                ^~"

"var-display.sps:11.18-11.19: error: VARIABLE LEVEL: Syntax error expecting `('.
   11 | VARIABLE LEVEL x **.
      |                  ^~"

"var-display.sps:12.19-12.20: error: VARIABLE LEVEL: Syntax error expecting SCALE, ORDINAL, or NOMINAL.
   12 | VARIABLE LEVEL x (**).
      |                   ^~"

"var-display.sps:13.25-13.26: error: VARIABLE LEVEL: Syntax error expecting `)'.
   13 | VARIABLE LEVEL x (SCALE **).
      |                         ^~"

"var-display.sps:14.15-14.16: error: VARIABLE ROLE: Syntax error expecting `/'.
   14 | VARIABLE ROLE **.
      |               ^~"

"var-display.sps:15.17-15.18: error: VARIABLE ROLE: Syntax error expecting INPUT, TARGET, BOTH, NONE, PARTITION, or SPLIT.
   15 | VARIABLE ROLE / **.
      |                 ^~"

"var-display.sps:16.22-16.23: error: VARIABLE ROLE: Syntax error expecting variable name.
   16 | VARIABLE ROLE /INPUT **.
      |                      ^~"

"var-display.sps:17.24-17.25: error: VARIABLE ROLE: Syntax error expecting `/'.
   17 | VARIABLE ROLE /INPUT x **.
      |                        ^~"
])
AT_CLEANUP

AT_SETUP([variable level inference and SCALEMIN])
AT_DATA([var-level.sps], [dnl
DATA LIST LIST NOTABLE /n1 to n3 s1 to s5.

* Nominal formats (copied from data that will default to scale).
COMPUTE n4=s1.
COMPUTE n5=s1.
FORMATS n4(WKDAY5) n5(MONTH5).

* Scale formats (copied from data that will default to nominal).
COMPUTE s6=n1.
COMPUTE s7=n1.
COMPUTE s8=n1.
FORMATS s6(DOLLAR6.2) s7(CCA8.2) s8(DATETIME17).

STRING string(A8).
DISPLAY DICTIONARY.
EXECUTE.

* n1 has 10 unique small values -> nominal.
* n2 has 23 unique small values -> nominal.
* n3 is all missing -> nominal.
* s1 has 24 unique small values -> scale.
* s2 has one negative value -> scale.
* s3 has one non-integer value -> scale.
* s4 has no valid values less than 10 -> scale.
* s5 has no valid values less than 10,000 -> scale.
BEGIN DATA.
1  1  . 1  1  1    10 10001
2  2  . 2  2  2    11 10002
3  3  . 3  3  3    12 10003
4  4  . 4  4  4    13 10004
5  5  . 5  5  5    14 10005
6  6  . 6  6  6    15 10006
7  7  . 7  7  7    16 10007
8  8  . 8  8  8    17 10008
9  9  . 9  9  9    18 10009
10 10 . 10 10 10.5 19 110000
1  11 . 11 -1 1    11 10001
2  12 . 12 2  2    12 10002
3  13 . 13 3  3    13 10003
4  14 . 14 4  4    14 10004
5  15 . 15 5  5    15 10005
6  16 . 16 6  6    16 10006
7  17 . 17 7  7    17 10007
8  18 . 18 8  8    18 10008
9  19 . 19 9  9    19 10009
1  20 . 20 1  1    20 10001
2  21 . 21 2  2    21 10002
3  22 . 22 3  3    22 10003
4  23 . 23 4  4    23 10004
5  23 . 24 5  5    24 10005
6  23 . 24 6  6    25 10006
END DATA.
DISPLAY DICTIONARY.
])
AT_CHECK([pspp -o pspp.csv var-level.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Variables
Name,Position,Measurement Level,Role,Width,Alignment,Print Format,Write Format
n1,1,Unknown,Input,8,Right,F8.2,F8.2
n2,2,Unknown,Input,8,Right,F8.2,F8.2
n3,3,Unknown,Input,8,Right,F8.2,F8.2
s1,4,Unknown,Input,8,Right,F8.2,F8.2
s2,5,Unknown,Input,8,Right,F8.2,F8.2
s3,6,Unknown,Input,8,Right,F8.2,F8.2
s4,7,Unknown,Input,8,Right,F8.2,F8.2
s5,8,Unknown,Input,8,Right,F8.2,F8.2
n4,9,Unknown,Input,8,Right,WKDAY5,WKDAY5
n5,10,Unknown,Input,8,Right,MONTH5,MONTH5
s6,11,Unknown,Input,8,Right,DOLLAR6.2,DOLLAR6.2
s7,12,Unknown,Input,8,Right,CCA8.2,CCA8.2
s8,13,Unknown,Input,8,Right,DATETIME17.0,DATETIME17.0
string,14,Nominal,Input,8,Left,A8,A8

Table: Variables
Name,Position,Measurement Level,Role,Width,Alignment,Print Format,Write Format
n1,1,Nominal,Input,8,Right,F8.2,F8.2
n2,2,Nominal,Input,8,Right,F8.2,F8.2
n3,3,Nominal,Input,8,Right,F8.2,F8.2
s1,4,Scale,Input,8,Right,F8.2,F8.2
s2,5,Scale,Input,8,Right,F8.2,F8.2
s3,6,Scale,Input,8,Right,F8.2,F8.2
s4,7,Scale,Input,8,Right,F8.2,F8.2
s5,8,Scale,Input,8,Right,F8.2,F8.2
n4,9,Nominal,Input,8,Right,WKDAY5,WKDAY5
n5,10,Nominal,Input,8,Right,MONTH5,MONTH5
s6,11,Scale,Input,8,Right,DOLLAR6.2,DOLLAR6.2
s7,12,Scale,Input,8,Right,CCA8.2,CCA8.2
s8,13,Scale,Input,8,Right,DATETIME17.0,DATETIME17.0
string,14,Nominal,Input,8,Left,A8,A8
])
AT_CLEANUP

AT_BANNER([VARIABLE LABELS])

AT_SETUP([variable labels])

dnl The following test is to make sure the TVARS command works and that
dnl variables are displayed accordingly.
AT_DATA([var-labels.sps], [dnl
DATA LIST LIST NOTABLE /x * y *.
BEGIN DATA.
1 100
2 200
3 300
4 400
END DATA.

* While no labels have been set, the TVARS is irrelevant.
SET TVARS=NAMES.
DESCRIPTIVES ALL.

SET TVARS=LABELS.
DESCRIPTIVES ALL.

SET TVARS=BOTH.
DESCRIPTIVES ALL.

VARIABLE LABEL x 'foo' y 'bar'.

* Now, the TVARS setting should have effect

SET TVARS=NAMES.
DESCRIPTIVES ALL.

SET TVARS=LABELS.
DESCRIPTIVES ALL.

SET TVARS=BOTH.
DESCRIPTIVES ALL.
])

AT_CHECK([pspp -o pspp.csv -o pspp.txt var-labels.sps])
AT_CHECK([cat pspp.csv], [0],[dnl
Table: Descriptive Statistics
,N,Mean,Std Dev,Minimum,Maximum
x,4,2.50,1.29,1.00,4.00
y,4,250.00,129.10,100.00,400.00
Valid N (listwise),4,,,,
Missing N (listwise),0,,,,

Table: Descriptive Statistics
,N,Mean,Std Dev,Minimum,Maximum
x,4,2.50,1.29,1.00,4.00
y,4,250.00,129.10,100.00,400.00
Valid N (listwise),4,,,,
Missing N (listwise),0,,,,

Table: Descriptive Statistics
,N,Mean,Std Dev,Minimum,Maximum
x,4,2.50,1.29,1.00,4.00
y,4,250.00,129.10,100.00,400.00
Valid N (listwise),4,,,,
Missing N (listwise),0,,,,

Table: Descriptive Statistics
,N,Mean,Std Dev,Minimum,Maximum
x,4,2.50,1.29,1.00,4.00
y,4,250.00,129.10,100.00,400.00
Valid N (listwise),4,,,,
Missing N (listwise),0,,,,

Table: Descriptive Statistics
,N,Mean,Std Dev,Minimum,Maximum
foo,4,2.50,1.29,1.00,4.00
bar,4,250.00,129.10,100.00,400.00
Valid N (listwise),4,,,,
Missing N (listwise),0,,,,

Table: Descriptive Statistics
,N,Mean,Std Dev,Minimum,Maximum
x foo,4,2.50,1.29,1.00,4.00
y bar,4,250.00,129.10,100.00,400.00
Valid N (listwise),4,,,,
Missing N (listwise),0,,,,
])

AT_CLEANUP
