+dnl PSPP - a program for statistical analysis.
+dnl Copyright (C) 2017, 2020 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([MATRIX DATA])
AT_SETUP([Matrix data (lower file)])
AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
Table: Data List
ROWTYPE_,VARNAME_,var01,var02,var03,var04,var05,var06,var07,var08
-mean ,,24.3000,5.4000,69.7000,20.1000,13.4000,2.7000,27.9000,3.7000
-STDDEV ,,5.7000,1.5000,23.5000,5.8000,2.8000,4.5000,5.4000,1.5000
-n ,,92.0000,92.0000,92.0000,92.0000,92.0000,92.0000,92.0000,92.0000
-corr ,var01,1.0000,.1800,-.2200,.3600,.2700,.3300,.5000,.1700
-corr ,var02,.1800,1.0000,-.1700,.3100,.1600,.1500,.2900,.2900
-corr ,var03,-.2200,-.1700,1.0000,-.1400,-.1200,-.1700,-.2000,-.0500
-corr ,var04,.3600,.3100,-.1400,1.0000,.2200,.2400,.3200,.2000
-corr ,var05,.2700,.1600,-.1200,.2200,1.0000,.2100,.1200,.2700
-corr ,var06,.3300,.1500,-.1700,.2400,.2100,1.0000,.3800,.2000
-corr ,var07,.5000,.2900,-.2000,.3200,.1200,.3800,1.0000,.0400
-corr ,var08,.1700,.2900,-.0500,.2000,.2700,.2000,.0400,1.0000
+mean,,24.3000,5.4000,69.7000,20.1000,13.4000,2.7000,27.9000,3.7000
+STDDEV,,5.7000,1.5000,23.5000,5.8000,2.8000,4.5000,5.4000,1.5000
+n,,92.0000,92.0000,92.0000,92.0000,92.0000,92.0000,92.0000,92.0000
+corr,var01,1.0000,.1800,-.2200,.3600,.2700,.3300,.5000,.1700
+corr,var02,.1800,1.0000,-.1700,.3100,.1600,.1500,.2900,.2900
+corr,var03,-.2200,-.1700,1.0000,-.1400,-.1200,-.1700,-.2000,-.0500
+corr,var04,.3600,.3100,-.1400,1.0000,.2200,.2400,.3200,.2000
+corr,var05,.2700,.1600,-.1200,.2200,1.0000,.2100,.1200,.2700
+corr,var06,.3300,.1500,-.1700,.2400,.2100,1.0000,.3800,.2000
+corr,var07,.5000,.2900,-.2000,.3200,.1200,.3800,1.0000,.0400
+corr,var08,.1700,.2900,-.0500,.2000,.2700,.2000,.0400,1.0000
])
AT_CLEANUP
AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
Table: Data List
ROWTYPE_,VARNAME_,var01,var02,var03,var04
-mean ,,34.0000,35.0000,36.0000,37.0000
-STDDEV ,,22.0000,11.0000,55.0000,66.0000
-N ,,100.0000,101.0000,102.0000,103.0000
-corr ,var01,1.0000,9.0000,8.0000,7.0000
-corr ,var02,9.0000,1.0000,6.0000,5.0000
-corr ,var03,8.0000,6.0000,1.0000,4.0000
-corr ,var04,7.0000,5.0000,4.0000,1.0000
+mean,,34.0000,35.0000,36.0000,37.0000
+STDDEV,,22.0000,11.0000,55.0000,66.0000
+N,,100.0000,101.0000,102.0000,103.0000
+corr,var01,1.0000,9.0000,8.0000,7.0000
+corr,var02,9.0000,1.0000,6.0000,5.0000
+corr,var03,8.0000,6.0000,1.0000,4.0000
+corr,var04,7.0000,5.0000,4.0000,1.0000
])
AT_CLEANUP
AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
Table: Data List
ROWTYPE_,VARNAME_,var01,var02,var03,var04
-MEAN ,,34.0000,35.0000,36.0000,37.0000
-STDDEV ,,22.0000,11.0000,55.0000,66.0000
-N ,,100.0000,101.0000,102.0000,103.0000
-CORR ,var01,1.0000,9.0000,8.0000,7.0000
-CORR ,var02,9.0000,1.0000,6.0000,5.0000
-CORR ,var03,8.0000,6.0000,1.0000,4.0000
-CORR ,var04,7.0000,5.0000,4.0000,1.0000
+MEAN,,34.0000,35.0000,36.0000,37.0000
+STDDEV,,22.0000,11.0000,55.0000,66.0000
+N,,100.0000,101.0000,102.0000,103.0000
+CORR,var01,1.0000,9.0000,8.0000,7.0000
+CORR,var02,9.0000,1.0000,6.0000,5.0000
+CORR,var03,8.0000,6.0000,1.0000,4.0000
+CORR,var04,7.0000,5.0000,4.0000,1.0000
])
AT_CLEANUP
AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
Table: Data List
ROWTYPE_,VARNAME_,var01,var02,var03,var04
-mean ,,34.0000,35.0000,36.0000,37.0000
-STDDEV ,,22.0000,11.0000,55.0000,66.0000
-n ,,100.0000,101.0000,102.0000,103.0000
-corr ,var01,1.0000,9.0000,8.0000,7.0000
-corr ,var02,9.0000,1.0000,6.0000,5.0000
-corr ,var03,8.0000,6.0000,1.0000,4.0000
-corr ,var04,7.0000,5.0000,4.0000,1.0000
+mean,,34.0000,35.0000,36.0000,37.0000
+STDDEV,,22.0000,11.0000,55.0000,66.0000
+n,,100.0000,101.0000,102.0000,103.0000
+corr,var01,1.0000,9.0000,8.0000,7.0000
+corr,var02,9.0000,1.0000,6.0000,5.0000
+corr,var03,8.0000,6.0000,1.0000,4.0000
+corr,var04,7.0000,5.0000,4.0000,1.0000
])
AT_CLEANUP
AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
Table: Data List
ROWTYPE_,VARNAME_,var01,var02,var03,var04
-mean ,,34.0000,35.0000,36.0000,37.0000
-STDDEV ,,22.0000,11.0000,55.0000,66.0000
-n ,,100.0000,101.0000,102.0000,103.0000
-corr ,var01,1.0000,9.0000,8.0000,7.0000
-corr ,var02,9.0000,1.0000,6.0000,5.0000
-corr ,var03,8.0000,6.0000,1.0000,4.0000
-corr ,var04,7.0000,5.0000,4.0000,1.0000
+mean,,34.0000,35.0000,36.0000,37.0000
+STDDEV,,22.0000,11.0000,55.0000,66.0000
+n,,100.0000,101.0000,102.0000,103.0000
+corr,var01,1.0000,9.0000,8.0000,7.0000
+corr,var02,9.0000,1.0000,6.0000,5.0000
+corr,var03,8.0000,6.0000,1.0000,4.0000
+corr,var04,7.0000,5.0000,4.0000,1.0000
])
AT_CLEANUP
AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
-Variable,Description,Position
-s1,Format: F4.0,1
-s2,Format: F4.0,2
-ROWTYPE_,Format: A8,3
-VARNAME_,Format: A8,4
-var01,Format: F10.4,5
-var02,Format: F10.4,6
-var03,Format: F10.4,7
+Table: Variables
+Name,Position,Measurement Level,Role,Width,Alignment,Print Format,Write Format
+s1,1,Scale,Input,8,Right,F4.0,F4.0
+s2,2,Scale,Input,8,Right,F4.0,F4.0
+ROWTYPE_,3,Nominal,Input,8,Left,A8,A8
+VARNAME_,4,Nominal,Input,8,Left,A8,A8
+var01,5,Scale,Input,8,Right,F10.4,F10.4
+var02,6,Scale,Input,8,Right,F10.4,F10.4
+var03,7,Scale,Input,8,Right,F10.4,F10.4
Table: Data List
s1,s2,ROWTYPE_,VARNAME_,var01,var02,var03
-8,0,mean ,,21.4000,5.0000,72.9000
-8,0,STDDEV ,,6.5000,1.6000,22.8000
-8,0,n ,,106.0000,106.0000,106.0000
-8,0,corr ,var01,1.0000,.4100,-.1600
-8,0,corr ,var02,.4100,1.0000,-.2200
-8,0,corr ,var03,-.1600,-.2200,1.0000
-8,1,mean ,,11.4000,1.0000,52.9000
-8,1,STDDEV ,,9.5000,8.6000,12.8000
-8,1,n ,,10.0000,11.0000,12.0000
-8,1,corr ,var01,1.0000,.5100,.3600
-8,1,corr ,var02,.5100,1.0000,-.4100
-8,1,corr ,var03,.3600,-.4100,1.0000
+8,0,mean,,21.4000,5.0000,72.9000
+8,0,STDDEV,,6.5000,1.6000,22.8000
+8,0,n,,106.0000,106.0000,106.0000
+8,0,corr,var01,1.0000,.4100,-.1600
+8,0,corr,var02,.4100,1.0000,-.2200
+8,0,corr,var03,-.1600,-.2200,1.0000
+8,1,mean,,11.4000,1.0000,52.9000
+8,1,STDDEV,,9.5000,8.6000,12.8000
+8,1,n,,10.0000,11.0000,12.0000
+8,1,corr,var01,1.0000,.5100,.3600
+8,1,corr,var02,.5100,1.0000,-.4100
+8,1,corr,var03,.3600,-.4100,1.0000
])
AT_CLEANUP
])
AT_CLEANUP
+
+
+
+AT_SETUP([Matrix data - long variable names])
+
+AT_DATA([matrix-data.pspp], [dnl
+matrix data
+ variables = rowtype_ var01 var_two variable_number_three variableFour
+ /format = upper diagonal.
+
+begin data
+mean 34 35 36 37
+sd 22 11 55 66
+n_vector 100 101 102 103
+corr 1 9 8 7
+corr 1 6 5
+corr 1 4
+corr 1
+end data.
+
+list.
+])
+
+AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
+Table: Data List
+ROWTYPE_,VARNAME_,var01,var_two,variable_number_three,variableFour
+mean,,34.0000,35.0000,36.0000,37.0000
+STDDEV,,22.0000,11.0000,55.0000,66.0000
+N,,100.0000,101.0000,102.0000,103.0000
+corr,var01,1.0000,9.0000,8.0000,7.0000
+corr,var_two,9.0000,1.0000,6.0000,5.0000
+corr,variable_number_three,8.0000,6.0000,1.0000,4.0000
+corr,variableFour,7.0000,5.0000,4.0000,1.0000
+])
+
+AT_CLEANUP
+
+
+
+AT_SETUP([Matrix reader - read integrity])
+
+dnl Check that matrices presented are read correctly.
+dnl The example below is an unlikely one since all
+dnl covariance/correlation matrices must be symmetrical
+dnl but it serves a purpose for this test.
+AT_DATA([matrix-reader.pspp], [dnl
+matrix data
+ variables = rowtype_ var01 to var9
+ /format = full.
+
+begin data
+n 1 2 3 4 5 6 7 8 9
+sd 100 200 300 400 500 600 700 800 900
+corr 11 12 13 14 15 16 17 18 19
+corr 21 22 23 24 25 26 27 28 29
+corr 31 32 33 34 35 36 37 38 39
+corr 41 42 43 44 45 46 47 48 49
+corr 51 52 53 54 55 56 57 58 59
+corr 61 62 63 64 65 66 67 68 69
+corr 71 72 73 74 75 76 77 78 79
+corr 81 82 83 84 85 86 87 88 89
+corr 91 92 93 94 95 96 97 98 99
+end data.
+
+factor /matrix = in (corr = *)
+ /analysis var02 var04 var06
+ /method = correlation
+ /rotation = norotate
+ /print correlation.
+])
+
+AT_CHECK([pspp -O format=csv matrix-reader.pspp], [0], [dnl
+Table: Correlation Matrix
+,,var02,var04,var06
+Correlation,var02,22.000,24.000,26.000
+,var04,42.000,44.000,46.000
+,var06,62.000,64.000,66.000
+
+Table: Component Matrix
+,Component,
+,1,2
+var02,6.73,-2.23
+var04,6.95,2.15
+var06,9.22,.01
+])
+
+AT_CLEANUP
+
+
+AT_SETUP([Matrix data - too many rows])
+
+dnl Test for a crash which occurred when the matrix had more rows declared
+dnl than variables to hold them.
+AT_DATA([matrix-data.pspp], [dnl
+matrix data
+ variables = rowtype_
+ var01 var02 var03 var04
+ / format = upper diagonal .
+begin data
+ mean 21.4 5.0 72.9 17.4
+ sd 6.5 1.6 22.8 5.7
+ n 106 106 106 106
+ corr 1.00 .32 .48 .28
+ corr 1.00 .72 .54 .44
+ corr 1.00 .50 .59 .64
+ corr 1.00 .62 .49 -.30
+ corr 1.00 .56 -.38 .52
+ corr 1.00 -.73 .91 .80
+ corr 1.00 -.65 -.60
+ corr 1.00 .70
+ corr 1.00
+end data .
+
+execute.
+])
+
+
+AT_CHECK([pspp -O format=csv matrix-data.pspp], [1], [dnl
+matrix-data.pspp:13: error: MATRIX DATA: There are 4 variable declared but the data has at least 5 matrix rows.
+
+matrix-data.pspp:20: error: EXECUTE: EXECUTE is allowed only after the active dataset has been defined.
+])
+
+
+AT_CLEANUP
+
+
+
+
+AT_SETUP([Matrix data (badly formed)])
+
+AT_DATA([data.pspp], [dnl
+data list list /ROWTYPE_ (a8) VARNAME_(a4) v1 v2 v3 v4xxxxxxxxxxxxxxxxxxxxxzzzzzzzzzzzzzxxxxxxxxx.
+begin data
+mean "" 1 2 3 4
+sd "" 5 6 7 8
+n "" 2 3 4 5
+corr v1 11 22 33 44
+corr v2 55 66 77 88
+corr v3 111 222 333 444
+corr v4 4 3 21 1
+end data.
+
+list.
+
+factor matrix=in(corr = *)
+ .
+])
+
+AT_CHECK([pspp -O format=csv data.pspp], [1], [ignore])
+
+AT_CLEANUP
+
+
+
+
+AT_SETUP([Matrix data (N subcommand)])
+
+AT_DATA([matrix-data.pspp], [dnl
+matrix data
+ variables = rowtype_ var01 var02 var03 var04
+ /n = 99
+ /format = upper nodiagonal.
+begin data
+mean 34 35 36 37
+sd 22 11 55 66
+n_vector 1 2 3 4
+corr 9 8 7
+corr 6 5
+corr 4
+end data.
+
+list.
+])
+
+AT_CHECK([pspp -O format=csv matrix-data.pspp], [0], [dnl
+"matrix-data.pspp:12: warning: MATRIX DATA: The N subcommand was specified, but a N record was also found in the data. The N record will be ignored."
+
+Table: Data List
+ROWTYPE_,VARNAME_,var01,var02,var03,var04
+N,,99.0000,99.0000,99.0000,99.0000
+mean,,34.0000,35.0000,36.0000,37.0000
+STDDEV,,22.0000,11.0000,55.0000,66.0000
+corr,var01,1.0000,9.0000,8.0000,7.0000
+corr,var02,9.0000,1.0000,6.0000,5.0000
+corr,var03,8.0000,6.0000,1.0000,4.0000
+corr,var04,7.0000,5.0000,4.0000,1.0000
+])
+
+AT_CLEANUP
+
+
+
+dnl A "no-crash" test. This was observed to cause problems.
+dnl See bug #58596
+AT_SETUP([Matrix data crash])
+
+AT_DATA([matrix-data.pspp], [dnl
+begin data
+corr 31
+
+matrix data
+ var1
+begin data
+ corr 1.00
+end data .
+
+matrix data
+ variables = roxtype_ var01
+ /format = upper nodiagonal.
+begin data
+])
+
+AT_CHECK([pspp -O format=csv matrix-data.pspp], [1], [ignore])
+
+AT_CLEANUP