Fixed crash reading ODS spreadsheets and added a test case
[pspp] / tests / language / data-io / get-data-spreadsheet.at
1
2 m4_define([SPREADSHEET_TEST_PREP],[dnl
3  m4_if($1,[GNM],[dnl
4     AT_CHECK([gzip -c $top_srcdir/tests/language/data-io/Book1.gnm.unzipped > Book1.gnumeric])dnl
5     m4_define([testsheet],[Book1.gnumeric])dnl
6     AT_SKIP_IF([test n$GNM_SUPPORT != nyes])dnl
7     ]) dnl
8  m4_if($1,[ODS],[dnl
9     AT_CHECK([cp $top_srcdir/tests/language/data-io/test.ods test.ods])dnl
10     m4_define([testsheet],[test.ods])dnl
11     AT_SKIP_IF([test n$ODF_READ_SUPPORT != nyes])dnl
12     ])dnl
13 ])
14
15 m4_define([CHECK_SPREADSHEET_READER],
16  [dnl
17 AT_SETUP([GET DATA /TYPE=$1 with CELLRANGE])
18 SPREADSHEET_TEST_PREP($1)
19 AT_DATA([get-data.sps], [dnl
20 GET DATA /TYPE=$1 /FILE='testsheet'  /READNAMES=off /SHEET=name 'This' /CELLRANGE=range 'g9:i13' .
21 DISPLAY VARIABLES.
22 LIST.
23 ])
24 AT_CHECK([pspp -o pspp.csv get-data.sps])
25 AT_CHECK([cat pspp.csv], [0], [dnl
26 Variable,Description,,Position
27 VAR001,Format: F8.2,,1
28 ,Measure: Scale,,
29 ,Display Alignment: Right,,
30 ,Display Width: 8,,
31 VAR002,Format: A8,,2
32 ,Measure: Nominal,,
33 ,Display Alignment: Left,,
34 ,Display Width: 8,,
35 VAR003,Format: F8.2,,3
36 ,Measure: Scale,,
37 ,Display Alignment: Right,,
38 ,Display Width: 8,,
39
40 Table: Data List
41 VAR001,VAR002,VAR003
42 .00,fred    ,20.00
43 1.00,11      ,21.00
44 2.00,twelve  ,22.00
45 3.00,13      ,23.00
46 4.00,14      ,24.00
47 ])
48 AT_CLEANUP
49
50 AT_SETUP([GET DATA /TYPE=$1 with CELLRANGE and READNAMES])
51 SPREADSHEET_TEST_PREP($1)
52 AT_DATA([get-data.sps], [dnl
53 GET DATA /TYPE=$1 /FILE='testsheet'  /READNAMES=on /SHEET=name 'This' /CELLRANGE=range 'g8:i13' .
54 DISPLAY VARIABLES.
55 LIST.
56 ])
57 AT_CHECK([pspp -o pspp.csv get-data.sps])
58 AT_CHECK([cat pspp.csv], [0], [dnl
59 Variable,Description,,Position
60 V1,Format: F8.2,,1
61 ,Measure: Scale,,
62 ,Display Alignment: Right,,
63 ,Display Width: 8,,
64 V2,Format: A8,,2
65 ,Measure: Nominal,,
66 ,Display Alignment: Left,,
67 ,Display Width: 8,,
68 VAR001,Format: F8.2,,3
69 ,Measure: Scale,,
70 ,Display Alignment: Right,,
71 ,Display Width: 8,,
72
73 Table: Data List
74 V1,V2,VAR001
75 .00,fred    ,20.00
76 1.00,11      ,21.00
77 2.00,twelve  ,22.00
78 3.00,13      ,23.00
79 4.00,14      ,24.00
80 ])
81 AT_CLEANUP
82
83 AT_SETUP([GET DATA /TYPE=$1 without CELLRANGE])
84 SPREADSHEET_TEST_PREP($1)
85 AT_DATA([get-data.sps], [dnl
86 GET DATA /TYPE=$1 /FILE='testsheet' /SHEET=index 3.
87 DISPLAY VARIABLES.
88 LIST.
89 ])
90 AT_CHECK([pspp -o pspp.csv get-data.sps])
91 AT_CHECK([cat pspp.csv], [0], [dnl
92 Variable,Description,,Position
93 name,Format: A8,,1
94 ,Measure: Nominal,,
95 ,Display Alignment: Left,,
96 ,Display Width: 8,,
97 id,Format: F8.2,,2
98 ,Measure: Scale,,
99 ,Display Alignment: Right,,
100 ,Display Width: 8,,
101 height,Format: F8.2,,3
102 ,Measure: Scale,,
103 ,Display Alignment: Right,,
104 ,Display Width: 8,,
105
106 Table: Data List
107 name,id,height
108 fred    ,.00,23.40
109 bert    ,1.00,.56
110 charlie ,2.00,.  @&t@
111 dick    ,3.00,-34.09
112 ])
113 AT_CLEANUP
114
115 AT_SETUP([GET DATA /TYPE=$1 with missing data])
116 SPREADSHEET_TEST_PREP($1)
117 AT_DATA([get-data.sps], [dnl
118 * This sheet has no data in one of its variables
119 GET DATA /TYPE=$1 /FILE='testsheet' /READNAMES=on /SHEET=index 5.
120 DISPLAY VARIABLES.
121 LIST.
122 ])
123 AT_CHECK([pspp -o pspp.csv get-data.sps])
124 AT_CHECK([cat pspp.csv], [0], [dnl
125 Variable,Description,,Position
126 vone,Format: F8.2,,1
127 ,Measure: Scale,,
128 ,Display Alignment: Right,,
129 ,Display Width: 8,,
130 vtwo,Format: F8.2,,2
131 ,Measure: Scale,,
132 ,Display Alignment: Right,,
133 ,Display Width: 8,,
134 vthree,Format: A8,,3
135 ,Measure: Nominal,,
136 ,Display Alignment: Left,,
137 ,Display Width: 8,,
138 v4,Format: F8.2,,4
139 ,Measure: Scale,,
140 ,Display Alignment: Right,,
141 ,Display Width: 8,,
142
143 Table: Data List
144 vone,vtwo,vthree,v4
145 1.00,3.00,,5.00
146 2.00,4.00,,6.00
147 ])
148 AT_CLEANUP
149
150 dnl This syntax doesn't do anything particularly useful.
151 dnl It has been seen to cause a few crashes, so we check here that it
152 dnl doesn't do anthing bad.
153 AT_SETUP([GET DATA /TYPE=$1 with no options])
154 SPREADSHEET_TEST_PREP($1)
155 AT_DATA([get-data.sps], [dnl
156 * This sheet is empty
157 GET DATA /TYPE=$1 /FILE='testsheet'.
158 DISPLAY DICTIONARY.
159 LIST.
160 ])
161 AT_CHECK([pspp -o pspp.csv get-data.sps], [0], [ignore])
162 AT_CLEANUP
163
164
165
166 AT_SETUP([GET DATA /TYPE=$1 with empty sheet])
167 SPREADSHEET_TEST_PREP($1)
168 AT_DATA([get-data.sps], [dnl
169 * This sheet is empty
170 GET DATA /TYPE=$1 /FILE='testsheet' /SHEET=name 'Empty'.
171 ])
172 AT_CHECK([pspp -o pspp.csv get-data.sps], [0], [dnl
173 warning: Selected sheet or range of spreadsheet `testsheet' is empty.
174 ])
175 AT_CLEANUP
176
177 AT_SETUP([GET DATA /TYPE=$1 with nonexistent sheet])
178 SPREADSHEET_TEST_PREP($1)
179 AT_DATA([get-data.sps], [dnl
180 * This sheet doesnt exist.
181 GET DATA /TYPE=$1 /FILE='testsheet' /SHEET=name 'foobarxx'.
182 ])
183 AT_CHECK([pspp -o pspp.csv get-data.sps], [0], [dnl
184 warning: Selected sheet or range of spreadsheet `testsheet' is empty.
185 ])
186 AT_CLEANUP
187 ])
188
189
190 AT_BANNER([GET DATA Spreadsheet /TYPE=GNM])
191
192 CHECK_SPREADSHEET_READER([GNM])
193
194 dnl Check for a bug where gnumeric files were interpreted incorrectly
195 AT_SETUP([GET DATA /TYPE=GNM sheet index bug])
196 AT_DATA([minimal3.gnumeric],[dnl
197 <?xml version="1.0" encoding="UTF-8"?>
198 <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">
199   <gnm:Version Epoch="1" Major="10" Minor="8" Full="1.10.8"/>
200   <gnm:SheetNameIndex>
201     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet1</gnm:SheetName>
202     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet2</gnm:SheetName>
203     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet3</gnm:SheetName>
204   </gnm:SheetNameIndex>
205   <gnm:Sheets>
206     <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">
207       <gnm:Name>Sheet1</gnm:Name>
208       <gnm:MaxCol>2</gnm:MaxCol>
209       <gnm:MaxRow>3</gnm:MaxRow>
210       <gnm:Names>
211         <gnm:Name>
212           <gnm:name>Print_Area</gnm:name>
213           <gnm:value>#REF!</gnm:value>
214           <gnm:position>A1</gnm:position>
215         </gnm:Name>
216         <gnm:Name>
217           <gnm:name>Sheet_Title</gnm:name>
218           <gnm:value>&quot;Sheet1&quot;</gnm:value>
219           <gnm:position>A1</gnm:position>
220         </gnm:Name>
221       </gnm:Names>
222       <gnm:Cols DefaultSizePts="48">
223         <gnm:ColInfo No="0" Unit="94.5" HardSize="1"/>
224         <gnm:ColInfo No="1" Unit="48" Count="2"/>
225       </gnm:Cols>
226       <gnm:Rows DefaultSizePts="12.75">
227         <gnm:RowInfo No="0" Unit="13.5" Count="4"/>
228       </gnm:Rows>
229       <gnm:Cells>
230         <gnm:Cell Row="0" Col="0" ValueType="60">Name</gnm:Cell>
231         <gnm:Cell Row="0" Col="1" ValueType="60">x</gnm:Cell>
232         <gnm:Cell Row="0" Col="2" ValueType="60">y</gnm:Cell>
233         <gnm:Cell Row="1" Col="0" ValueType="60">Sheet One</gnm:Cell>
234         <gnm:Cell Row="1" Col="1" ValueType="40">1</gnm:Cell>
235         <gnm:Cell Row="1" Col="2" ValueType="40">2</gnm:Cell>
236         <gnm:Cell Row="2" Col="0" ValueType="60">foo</gnm:Cell>
237         <gnm:Cell Row="2" Col="1" ValueType="40">3</gnm:Cell>
238         <gnm:Cell Row="2" Col="2" ValueType="40">4</gnm:Cell>
239         <gnm:Cell Row="3" Col="0" ValueType="60">bar</gnm:Cell>
240         <gnm:Cell Row="3" Col="1" ValueType="40">5</gnm:Cell>
241         <gnm:Cell Row="3" Col="2" ValueType="40">6</gnm:Cell>
242       </gnm:Cells>
243     </gnm:Sheet>
244     <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">
245       <gnm:Name>Sheet2</gnm:Name>
246       <gnm:MaxCol>2</gnm:MaxCol>
247       <gnm:MaxRow>2</gnm:MaxRow>
248       <gnm:Names>
249         <gnm:Name>
250           <gnm:name>Print_Area</gnm:name>
251           <gnm:value>#REF!</gnm:value>
252           <gnm:position>A1</gnm:position>
253         </gnm:Name>
254         <gnm:Name>
255           <gnm:name>Sheet_Title</gnm:name>
256           <gnm:value>&quot;Sheet2&quot;</gnm:value>
257           <gnm:position>A1</gnm:position>
258         </gnm:Name>
259       </gnm:Names>
260       <gnm:Cols DefaultSizePts="48">
261         <gnm:ColInfo No="0" Unit="48"/>
262         <gnm:ColInfo No="1" Unit="57.75"/>
263         <gnm:ColInfo No="2" Unit="54.75"/>
264       </gnm:Cols>
265       <gnm:Rows DefaultSizePts="12.75">
266         <gnm:RowInfo No="0" Unit="13.5" Count="3"/>
267       </gnm:Rows>
268       <gnm:Cells>
269         <gnm:Cell Row="0" Col="0" ValueType="60">Comment</gnm:Cell>
270         <gnm:Cell Row="0" Col="1" ValueType="60">DOB</gnm:Cell>
271         <gnm:Cell Row="0" Col="2" ValueType="60">wealth</gnm:Cell>
272         <gnm:Cell Row="1" Col="0" ValueType="60">Sheet Two</gnm:Cell>
273         <gnm:Cell Row="1" Col="1" ValueType="60">24/5/1966</gnm:Cell>
274         <gnm:Cell Row="1" Col="2" ValueType="40" ValueFormat="_($* 0.00_);_($* (0.00);_($* &quot;-&quot;??_);_(@_)">0.02</gnm:Cell>
275         <gnm:Cell Row="2" Col="0" ValueType="60">wee</gnm:Cell>
276         <gnm:Cell Row="2" Col="1" ValueType="40" ValueFormat="dd/mm/yyyy">37145</gnm:Cell>
277         <gnm:Cell Row="2" Col="2" ValueType="40" ValueFormat="_($* 0.00_);_($* (0.00);_($* &quot;-&quot;??_);_(@_)">3000</gnm:Cell>
278       </gnm:Cells>
279     </gnm:Sheet>
280     <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">
281       <gnm:Name>Sheet3</gnm:Name>
282       <gnm:MaxCol>2</gnm:MaxCol>
283       <gnm:MaxRow>2</gnm:MaxRow>
284       <gnm:Names>
285         <gnm:Name>
286           <gnm:name>Print_Area</gnm:name>
287           <gnm:value>#REF!</gnm:value>
288           <gnm:position>A1</gnm:position>
289         </gnm:Name>
290         <gnm:Name>
291           <gnm:name>Sheet_Title</gnm:name>
292           <gnm:value>&quot;Sheet3&quot;</gnm:value>
293           <gnm:position>A1</gnm:position>
294         </gnm:Name>
295       </gnm:Names>
296       <gnm:Cols DefaultSizePts="48">
297         <gnm:ColInfo No="0" Unit="48" Count="3"/>
298       </gnm:Cols>
299       <gnm:Rows DefaultSizePts="12.75">
300         <gnm:RowInfo No="0" Unit="13.5"/>
301         <gnm:RowInfo No="1" Unit="12.75" Count="2"/>
302       </gnm:Rows>
303       <gnm:Cells>
304         <gnm:Cell Row="0" Col="0" ValueType="40">3</gnm:Cell>
305         <gnm:Cell Row="0" Col="1" ValueType="40">4</gnm:Cell>
306         <gnm:Cell Row="0" Col="2" ValueType="40">5</gnm:Cell>
307         <gnm:Cell Row="1" Col="0" ValueType="40">6</gnm:Cell>
308         <gnm:Cell Row="1" Col="1" ValueType="40">7</gnm:Cell>
309         <gnm:Cell Row="1" Col="2" ValueType="40">8</gnm:Cell>
310         <gnm:Cell Row="2" Col="0" ValueType="40">9</gnm:Cell>
311         <gnm:Cell Row="2" Col="1" ValueType="40">10</gnm:Cell>
312         <gnm:Cell Row="2" Col="2" ValueType="40">11</gnm:Cell>
313       </gnm:Cells>
314     </gnm:Sheet>
315   </gnm:Sheets>
316 </gnm:Workbook>
317 ])
318
319 AT_DATA([gnum.sps], [dnl
320 GET DATA        
321         /TYPE=GNM
322         /FILE='minimal3.gnumeric'
323         /SHEET=index 3
324         /READNAMES=off
325         .
326
327 LIST.
328 ])
329
330 AT_CHECK([pspp -O format=csv gnum.sps], [0], [dnl
331 Table: Data List
332 VAR001,VAR002,VAR003
333 3       ,4.00,5.00
334 6       ,7.00,8.00
335 9       ,10.00,11.00
336 ])
337
338
339 AT_CLEANUP
340
341
342 dnl Check for a bug where certain gnumeric files failed an assertion
343 AT_SETUP([GET DATA /TYPE=GNM assert-fail])
344 AT_DATA([read.sps],[dnl
345 GET DATA 
346         /TYPE=GNM
347         /FILE='crash.gnumeric' 
348         .
349 list.
350 ])
351
352
353 AT_DATA([crash.gnumeric],[dnl
354 <?xml version="1.0" encoding="UTF-8"?>
355 <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">
356   <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">
357   </office:document-meta>
358   <gnm:SheetNameIndex>
359     <gnm:SheetName gnm:Cols="256" gnm:Rows="65536">Sheet1</gnm:SheetName>
360   </gnm:SheetNameIndex>
361   <gnm:Sheets>
362     <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">
363       <gnm:Name>Sheet1</gnm:Name>
364       <gnm:MaxCol>2</gnm:MaxCol>
365       <gnm:MaxRow>4</gnm:MaxRow>
366       <gnm:Styles>
367         <gnm:StyleRegion startCol="0" startRow="0" endCol="255" endRow="65535">
368           <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">
369           </gnm:Style>
370         </gnm:StyleRegion>
371       </gnm:Styles>
372       <gnm:Cells>
373         <gnm:Cell Row="1" Col="1" ValueType="60">one</gnm:Cell>
374         <gnm:Cell Row="1" Col="2" ValueType="60">two</gnm:Cell>
375         <gnm:Cell Row="2" Col="1" ValueType="40">1</gnm:Cell>
376         <gnm:Cell Row="2" Col="2" ValueType="40">2</gnm:Cell>
377         <gnm:Cell Row="3" Col="1" ValueType="40">1</gnm:Cell>
378         <gnm:Cell Row="3" Col="2" ValueType="40">2</gnm:Cell>
379         <gnm:Cell Row="4" Col="1" ValueType="40">1</gnm:Cell>
380         <gnm:Cell Row="4" Col="2" ValueType="40">2</gnm:Cell>
381       </gnm:Cells>
382     </gnm:Sheet>
383   </gnm:Sheets>
384 </gnm:Workbook>
385 ])
386
387 AT_CHECK([pspp -O format=csv read.sps], [0], [ignore])
388
389
390 AT_CLEANUP
391
392
393
394 AT_BANNER([GET DATA Spreadsheet /TYPE=ODS])
395
396 CHECK_SPREADSHEET_READER([ODS])
397