output: Introduce pivot tables.
[pspp] / tests / language / data-io / get-data-spreadsheet.at
1 dnl PSPP - a program for statistical analysis.
2 dnl Copyright (C) 2017 Free Software Foundation, Inc.
3 dnl 
4 dnl This program is free software: you can redistribute it and/or modify
5 dnl it under the terms of the GNU General Public License as published by
6 dnl the Free Software Foundation, either version 3 of the License, or
7 dnl (at your option) any later version.
8 dnl 
9 dnl This program is distributed in the hope that it will be useful,
10 dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
11 dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 dnl GNU General Public License for more details.
13 dnl 
14 dnl You should have received a copy of the GNU General Public License
15 dnl along with this program.  If not, see <http://www.gnu.org/licenses/>.
16 dnl 
17 m4_define([SPREADSHEET_TEST_PREP],[dnl
18  m4_if($1,[GNM],[dnl
19     AT_CHECK([gzip -c $top_srcdir/tests/language/data-io/Book1.gnm.unzipped > Book1.gnumeric])dnl
20     m4_define([testsheet],[Book1.gnumeric])dnl
21     ]) dnl
22  m4_if($1,[ODS],[dnl
23     AT_CHECK([cp $top_srcdir/tests/language/data-io/test.ods test.ods])dnl
24     m4_define([testsheet],[test.ods])dnl
25     ])dnl
26 ])
27
28 m4_define([CHECK_SPREADSHEET_READER],
29  [dnl
30 AT_SETUP([GET DATA /TYPE=$1 with CELLRANGE])
31 SPREADSHEET_TEST_PREP($1)
32 AT_DATA([get-data.sps], [dnl
33 GET DATA /TYPE=$1 /FILE='testsheet'  /READNAMES=off /SHEET=name 'This' /CELLRANGE=range 'g9:i13' .
34 DISPLAY VARIABLES.
35 LIST.
36 ])
37 AT_CHECK([pspp -o pspp.csv get-data.sps])
38 AT_CHECK([cat pspp.csv], [0], [dnl
39 Table: Variables
40 Name,Position,Print Format,Write Format,Missing Values
41 VAR001,1,F8.2,F8.2,
42 VAR002,2,A8,A8,
43 VAR003,3,F8.2,F8.2,
44
45 Table: Data List
46 VAR001,VAR002,VAR003
47 .00,fred,20.00
48 1.00,11,21.00
49 2.00,twelve,22.00
50 3.00,13,23.00
51 4.00,14,24.00
52 ])
53 AT_CLEANUP
54
55 AT_SETUP([GET DATA /TYPE=$1 with CELLRANGE and READNAMES])
56 SPREADSHEET_TEST_PREP($1)
57 AT_DATA([get-data.sps], [dnl
58 GET DATA /TYPE=$1 /FILE='testsheet'  /READNAMES=on /SHEET=name 'This' /CELLRANGE=range 'g8:i13' .
59 DISPLAY VARIABLES.
60 LIST.
61 ])
62 AT_CHECK([pspp -o pspp.csv get-data.sps])
63 AT_CHECK([cat pspp.csv], [0], [dnl
64 Table: Variables
65 Name,Position,Print Format,Write Format,Missing Values
66 V1,1,F8.2,F8.2,
67 V2,2,A8,A8,
68 VAR001,3,F8.2,F8.2,
69
70 Table: Data List
71 V1,V2,VAR001
72 .00,fred,20.00
73 1.00,11,21.00
74 2.00,twelve,22.00
75 3.00,13,23.00
76 4.00,14,24.00
77 ])
78 AT_CLEANUP
79
80 AT_SETUP([GET DATA /TYPE=$1 without CELLRANGE])
81 SPREADSHEET_TEST_PREP($1)
82 AT_DATA([get-data.sps], [dnl
83 GET DATA /TYPE=$1 /FILE='testsheet' /SHEET=index 3.
84 DISPLAY VARIABLES.
85 LIST.
86 ])
87 AT_CHECK([pspp -O format=csv get-data.sps], [0], [dnl
88 Table: Variables
89 Name,Position,Print Format,Write Format,Missing Values
90 name,1,A8,A8,
91 id,2,F8.2,F8.2,
92 height,3,F8.2,F8.2,
93
94 warning: Cannot convert the value in the spreadsheet cell C4 to format (F8.2): Field contents are not numeric.
95
96 Table: Data List
97 name,id,height
98 fred,.00,23.40
99 bert,1.00,.56
100 charlie,2.00,.  @&t@
101 dick,3.00,-34.09
102 ])
103 AT_CLEANUP
104
105 AT_SETUP([GET DATA /TYPE=$1 with missing data])
106 SPREADSHEET_TEST_PREP($1)
107 AT_DATA([get-data.sps], [dnl
108 * This sheet has no data in one of its variables
109 GET DATA /TYPE=$1 /FILE='testsheet' /READNAMES=on /SHEET=index 5.
110 DISPLAY VARIABLES.
111 LIST.
112 ])
113 AT_CHECK([pspp -o pspp.csv get-data.sps])
114 AT_CHECK([cat pspp.csv], [0], [dnl
115 Table: Variables
116 Name,Position,Print Format,Write Format,Missing Values
117 vone,1,F8.2,F8.2,
118 vtwo,2,F8.2,F8.2,
119 vthree,3,A8,A8,
120 v4,4,F8.2,F8.2,
121
122 Table: Data List
123 vone,vtwo,vthree,v4
124 1.00,3.00,,5.00
125 2.00,4.00,,6.00
126 ])
127 AT_CLEANUP
128
129 dnl This syntax doesn't do anything particularly useful.
130 dnl It has been seen to cause a few crashes, so we check here that it
131 dnl doesn't do anthing bad.
132 AT_SETUP([GET DATA /TYPE=$1 with no options])
133 SPREADSHEET_TEST_PREP($1)
134 AT_DATA([get-data.sps], [dnl
135 * This sheet is empty
136 GET DATA /TYPE=$1 /FILE='testsheet'.
137 DISPLAY DICTIONARY.
138 LIST.
139 ])
140 AT_CHECK([pspp -o pspp.csv get-data.sps], [0], [ignore])
141 AT_CLEANUP
142
143
144
145 AT_SETUP([GET DATA /TYPE=$1 with empty sheet])
146 SPREADSHEET_TEST_PREP($1)
147 AT_DATA([get-data.sps], [dnl
148 * This sheet is empty
149 GET DATA /TYPE=$1 /FILE='testsheet' /SHEET=name 'Empty'.
150 ])
151 AT_CHECK([pspp -o pspp.csv get-data.sps], [0], [dnl
152 warning: Selected sheet or range of spreadsheet `testsheet' is empty.
153 ])
154 AT_CLEANUP
155
156 AT_SETUP([GET DATA /TYPE=$1 with nonexistent sheet])
157 SPREADSHEET_TEST_PREP($1)
158 AT_DATA([get-data.sps], [dnl
159 * This sheet doesnt exist.
160 GET DATA /TYPE=$1 /FILE='testsheet' /SHEET=name 'foobarxx'.
161 ])
162 AT_CHECK([pspp -o pspp.csv get-data.sps], [0], [dnl
163 warning: Selected sheet or range of spreadsheet `testsheet' is empty.
164 ])
165 AT_CLEANUP
166 ])
167
168
169 AT_BANNER([GET DATA Spreadsheet /TYPE=GNM])
170
171 CHECK_SPREADSHEET_READER([GNM])
172
173 dnl Check for a bug where gnumeric files were interpreted incorrectly
174 AT_SETUP([GET DATA /TYPE=GNM sheet index bug])
175 AT_DATA([minimal3.gnumeric],[dnl
176 <?xml version="1.0" encoding="UTF-8"?>
177 <gnm:Workbook xmlns:gnm="http://www.gnumeric.org/v10.dtd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gnumeric.org/v9.xsd">
178   <gnm:Version Epoch="1" Major="10" Minor="8" Full="1.10.8"/>
179   <gnm:SheetNameIndex>
180     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet1</gnm:SheetName>
181     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet2</gnm:SheetName>
182     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet3</gnm:SheetName>
183   </gnm:SheetNameIndex>
184   <gnm:Sheets>
185     <gnm:Sheet DisplayFormulas="0" HideZero="0" HideGrid="0" HideColHeader="0" HideRowHeader="0" DisplayOutlines="1" OutlineSymbolsBelow="1" OutlineSymbolsRight="1" Visibility="GNM_SHEET_VISIBILITY_VISIBLE" GridColor="0:0:0">
186       <gnm:Name>Sheet1</gnm:Name>
187       <gnm:MaxCol>2</gnm:MaxCol>
188       <gnm:MaxRow>3</gnm:MaxRow>
189       <gnm:Names>
190         <gnm:Name>
191           <gnm:name>Print_Area</gnm:name>
192           <gnm:value>#REF!</gnm:value>
193           <gnm:position>A1</gnm:position>
194         </gnm:Name>
195         <gnm:Name>
196           <gnm:name>Sheet_Title</gnm:name>
197           <gnm:value>&quot;Sheet1&quot;</gnm:value>
198           <gnm:position>A1</gnm:position>
199         </gnm:Name>
200       </gnm:Names>
201       <gnm:Cols DefaultSizePts="48">
202         <gnm:ColInfo No="0" Unit="94.5" HardSize="1"/>
203         <gnm:ColInfo No="1" Unit="48" Count="2"/>
204       </gnm:Cols>
205       <gnm:Rows DefaultSizePts="12.75">
206         <gnm:RowInfo No="0" Unit="13.5" Count="4"/>
207       </gnm:Rows>
208       <gnm:Cells>
209         <gnm:Cell Row="0" Col="0" ValueType="60">Name</gnm:Cell>
210         <gnm:Cell Row="0" Col="1" ValueType="60">x</gnm:Cell>
211         <gnm:Cell Row="0" Col="2" ValueType="60">y</gnm:Cell>
212         <gnm:Cell Row="1" Col="0" ValueType="60">Sheet One</gnm:Cell>
213         <gnm:Cell Row="1" Col="1" ValueType="40">1</gnm:Cell>
214         <gnm:Cell Row="1" Col="2" ValueType="40">2</gnm:Cell>
215         <gnm:Cell Row="2" Col="0" ValueType="60">foo</gnm:Cell>
216         <gnm:Cell Row="2" Col="1" ValueType="40">3</gnm:Cell>
217         <gnm:Cell Row="2" Col="2" ValueType="40">4</gnm:Cell>
218         <gnm:Cell Row="3" Col="0" ValueType="60">bar</gnm:Cell>
219         <gnm:Cell Row="3" Col="1" ValueType="40">5</gnm:Cell>
220         <gnm:Cell Row="3" Col="2" ValueType="40">6</gnm:Cell>
221       </gnm:Cells>
222     </gnm:Sheet>
223     <gnm:Sheet DisplayFormulas="0" HideZero="0" HideGrid="0" HideColHeader="0" HideRowHeader="0" DisplayOutlines="1" OutlineSymbolsBelow="1" OutlineSymbolsRight="1" Visibility="GNM_SHEET_VISIBILITY_VISIBLE" GridColor="0:0:0">
224       <gnm:Name>Sheet2</gnm:Name>
225       <gnm:MaxCol>2</gnm:MaxCol>
226       <gnm:MaxRow>2</gnm:MaxRow>
227       <gnm:Names>
228         <gnm:Name>
229           <gnm:name>Print_Area</gnm:name>
230           <gnm:value>#REF!</gnm:value>
231           <gnm:position>A1</gnm:position>
232         </gnm:Name>
233         <gnm:Name>
234           <gnm:name>Sheet_Title</gnm:name>
235           <gnm:value>&quot;Sheet2&quot;</gnm:value>
236           <gnm:position>A1</gnm:position>
237         </gnm:Name>
238       </gnm:Names>
239       <gnm:Cols DefaultSizePts="48">
240         <gnm:ColInfo No="0" Unit="48"/>
241         <gnm:ColInfo No="1" Unit="57.75"/>
242         <gnm:ColInfo No="2" Unit="54.75"/>
243       </gnm:Cols>
244       <gnm:Rows DefaultSizePts="12.75">
245         <gnm:RowInfo No="0" Unit="13.5" Count="3"/>
246       </gnm:Rows>
247       <gnm:Cells>
248         <gnm:Cell Row="0" Col="0" ValueType="60">Comment</gnm:Cell>
249         <gnm:Cell Row="0" Col="1" ValueType="60">DOB</gnm:Cell>
250         <gnm:Cell Row="0" Col="2" ValueType="60">wealth</gnm:Cell>
251         <gnm:Cell Row="1" Col="0" ValueType="60">Sheet Two</gnm:Cell>
252         <gnm:Cell Row="1" Col="1" ValueType="60">24/5/1966</gnm:Cell>
253         <gnm:Cell Row="1" Col="2" ValueType="40" ValueFormat="_($* 0.00_);_($* (0.00);_($* &quot;-&quot;??_);_(@_)">0.02</gnm:Cell>
254         <gnm:Cell Row="2" Col="0" ValueType="60">wee</gnm:Cell>
255         <gnm:Cell Row="2" Col="1" ValueType="40" ValueFormat="dd/mm/yyyy">37145</gnm:Cell>
256         <gnm:Cell Row="2" Col="2" ValueType="40" ValueFormat="_($* 0.00_);_($* (0.00);_($* &quot;-&quot;??_);_(@_)">3000</gnm:Cell>
257       </gnm:Cells>
258     </gnm:Sheet>
259     <gnm:Sheet DisplayFormulas="0" HideZero="0" HideGrid="0" HideColHeader="0" HideRowHeader="0" DisplayOutlines="1" OutlineSymbolsBelow="1" OutlineSymbolsRight="1" Visibility="GNM_SHEET_VISIBILITY_VISIBLE" GridColor="0:0:0">
260       <gnm:Name>Sheet3</gnm:Name>
261       <gnm:MaxCol>2</gnm:MaxCol>
262       <gnm:MaxRow>2</gnm:MaxRow>
263       <gnm:Names>
264         <gnm:Name>
265           <gnm:name>Print_Area</gnm:name>
266           <gnm:value>#REF!</gnm:value>
267           <gnm:position>A1</gnm:position>
268         </gnm:Name>
269         <gnm:Name>
270           <gnm:name>Sheet_Title</gnm:name>
271           <gnm:value>&quot;Sheet3&quot;</gnm:value>
272           <gnm:position>A1</gnm:position>
273         </gnm:Name>
274       </gnm:Names>
275       <gnm:Cols DefaultSizePts="48">
276         <gnm:ColInfo No="0" Unit="48" Count="3"/>
277       </gnm:Cols>
278       <gnm:Rows DefaultSizePts="12.75">
279         <gnm:RowInfo No="0" Unit="13.5"/>
280         <gnm:RowInfo No="1" Unit="12.75" Count="2"/>
281       </gnm:Rows>
282       <gnm:Cells>
283         <gnm:Cell Row="0" Col="0" ValueType="40">3</gnm:Cell>
284         <gnm:Cell Row="0" Col="1" ValueType="40">4</gnm:Cell>
285         <gnm:Cell Row="0" Col="2" ValueType="40">5</gnm:Cell>
286         <gnm:Cell Row="1" Col="0" ValueType="40">6</gnm:Cell>
287         <gnm:Cell Row="1" Col="1" ValueType="40">7</gnm:Cell>
288         <gnm:Cell Row="1" Col="2" ValueType="40">8</gnm:Cell>
289         <gnm:Cell Row="2" Col="0" ValueType="40">9</gnm:Cell>
290         <gnm:Cell Row="2" Col="1" ValueType="40">10</gnm:Cell>
291         <gnm:Cell Row="2" Col="2" ValueType="40">11</gnm:Cell>
292       </gnm:Cells>
293     </gnm:Sheet>
294   </gnm:Sheets>
295 </gnm:Workbook>
296 ])
297
298 AT_DATA([gnum.sps], [dnl
299 GET DATA        
300         /TYPE=GNM
301         /FILE='minimal3.gnumeric'
302         /SHEET=index 3
303         /READNAMES=off
304         .
305
306 LIST.
307 ])
308
309 AT_CHECK([pspp -O format=csv gnum.sps], [0], [dnl
310 Table: Data List
311 VAR001,VAR002,VAR003
312 3,4.00,5.00
313 6,7.00,8.00
314 9,10.00,11.00
315 ])
316
317
318 AT_CLEANUP
319
320
321 dnl Check for a bug where certain gnumeric files failed an assertion
322 AT_SETUP([GET DATA /TYPE=GNM assert-fail])
323 AT_DATA([read.sps],[dnl
324 GET DATA 
325         /TYPE=GNM
326         /FILE='crash.gnumeric' 
327         .
328 list.
329 ])
330
331
332 AT_DATA([crash.gnumeric],[dnl
333 <?xml version="1.0" encoding="UTF-8"?>
334 <gnm:Workbook xmlns:gnm="http://www.gnumeric.org/v10.dtd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.gnumeric.org/v9.xsd">
335   <office:document-meta xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:ooo="http://openoffice.org/2004/office" office:version="1.1">
336   </office:document-meta>
337   <gnm:SheetNameIndex>
338     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet1</gnm:SheetName>
339   </gnm:SheetNameIndex>
340   <gnm:Sheets>
341     <gnm:Sheet DisplayFormulas="0" HideZero="0" HideGrid="0" HideColHeader="0" HideRowHeader="0" DisplayOutlines="1" OutlineSymbolsBelow="1" OutlineSymbolsRight="1" Visibility="GNM_SHEET_VISIBILITY_VISIBLE" GridColor="0:0:0">
342       <gnm:Name>Sheet1</gnm:Name>
343       <gnm:MaxCol>2</gnm:MaxCol>
344       <gnm:MaxRow>4</gnm:MaxRow>
345       <gnm:Styles>
346         <gnm:StyleRegion startCol="0" startRow="0" endCol="255" endRow="65535">
347           <gnm:Style HAlign="1" VAlign="2" WrapText="0" ShrinkToFit="0" Rotation="0" Shade="0" Indent="0" Locked="1" Hidden="0" Fore="0:0:0" Back="FFFF:FFFF:FFFF" PatternColor="0:0:0" Format="General">
348           </gnm:Style>
349         </gnm:StyleRegion>
350       </gnm:Styles>
351       <gnm:Cells>
352         <gnm:Cell Row="1" Col="1" ValueType="60">one</gnm:Cell>
353         <gnm:Cell Row="1" Col="2" ValueType="60">two</gnm:Cell>
354         <gnm:Cell Row="2" Col="1" ValueType="40">1</gnm:Cell>
355         <gnm:Cell Row="2" Col="2" ValueType="40">2</gnm:Cell>
356         <gnm:Cell Row="3" Col="1" ValueType="40">1</gnm:Cell>
357         <gnm:Cell Row="3" Col="2" ValueType="40">2</gnm:Cell>
358         <gnm:Cell Row="4" Col="1" ValueType="40">1</gnm:Cell>
359         <gnm:Cell Row="4" Col="2" ValueType="40">2</gnm:Cell>
360       </gnm:Cells>
361     </gnm:Sheet>
362   </gnm:Sheets>
363 </gnm:Workbook>
364 ])
365
366 AT_CHECK([pspp -O format=csv read.sps], [0], [ignore])
367
368
369 AT_CLEANUP
370
371
372
373 AT_BANNER([GET DATA Spreadsheet /TYPE=ODS])
374
375 CHECK_SPREADSHEET_READER([ODS])
376
377
378 AT_SETUP([GET DATA /TYPE=ODS crash])
379
380                      
381 AT_CHECK([cp $top_srcdir/tests/language/data-io/newone.ods this.ods])dnl
382
383 AT_DATA([crash.sps],[dnl
384 GET DATA /TYPE=ODS /FILE='this.ods' /CELLRANGE=RANGE 'A1:C8'  /READNAMES=ON
385 LIST.
386 ])
387
388 AT_CHECK([pspp -O format=csv crash.sps], [0], [ignore])
389
390 AT_CLEANUP
391
392
393 AT_SETUP([GET DATA /TYPE=ODS readnames])
394
395 dnl Check for a bug where in the ODS reader /READNAMES incorrectly
396 dnl dealt with repeated names.
397 AT_CHECK([cp $top_srcdir/tests/language/data-io/readnames.ods this.ods])dnl
398
399 AT_DATA([readnames.sps],[dnl
400 GET DATA /TYPE=ODS /FILE='this.ods' /CELLRANGE=RANGE 'A1:H8' /READNAMES=ON
401 DISPLAY DICTIONARY.
402 LIST.
403 ])
404
405
406 AT_CHECK([pspp -O format=csv readnames.sps], [0], [dnl
407 Table: Variables
408 Name,Position,Label,Measurement Level,Role,Width,Alignment,Print Format,Write Format,Missing Values
409 freda,1,,Scale,Input,8,Right,F8.2,F8.2,
410 fred,2,,Scale,Input,8,Right,F8.2,F8.2,
411 fred_A,3,,Scale,Input,8,Right,F8.2,F8.2,
412 fred_B,4,,Scale,Input,8,Right,F8.2,F8.2,
413 fred_C,5,,Scale,Input,8,Right,F8.2,F8.2,
414 fred_D,6,,Scale,Input,8,Right,F8.2,F8.2,
415 fred_E,7,,Scale,Input,8,Right,F8.2,F8.2,
416
417 Table: Data List
418 freda,fred,fred_A,fred_B,fred_C,fred_D,fred_E
419 1.00,2.00,3.00,4.00,5.00,6.00,7.00
420 8.00,9.00,10.00,11.00,12.00,13.00,14.00
421 ])
422
423 AT_CLEANUP
424