Add copyright and licence notices to files which lack them.
[pspp] / tests / language / xforms / recode.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 AT_BANNER([RECODE transformation])
17
18 m4_define([RECODE_SAMPLE_DATA],
19   [DATA LIST LIST NOTABLE/x (f1) s (a4) t (a10).
20 MISSING VALUES x(9)/s('xxx').
21 BEGIN DATA.
22 0, '', ''
23 1, a, a
24 2, ab, ab
25 3, abc, abc
26 4, abcd, abcd
27 5, 123, 123
28 6, ' 123', ' 123'
29 7, +1, +1
30 8, 1x, 1x
31 9, abcd, abcdefghi
32 ,  xxx, abcdefghij
33 END DATA.
34 ])
35
36 AT_SETUP([RECODE numeric to numeric, without INTO])
37 AT_DATA([recode.sps],
38   [RECODE_SAMPLE_DATA
39 NUMERIC x0 TO x8 (F3).
40 MISSING VALUES x0 to x8 (9).
41 COMPUTE x0=value(x).
42 RECODE x0 (1=9).
43 COMPUTE x1=value(x).
44 RECODE x1 (1=9)(3=8)(5=7).
45 COMPUTE x2=value(x).
46 RECODE x2 (1=8)(2,3,4,5,6,8=9)(9=1).
47 COMPUTE x3=value(x).
48 RECODE x3 (1 THRU 9=10)(MISSING=11).
49 COMPUTE x4=value(x).
50 RECODE x4 (MISSING=11)(1 THRU 9=10).
51 COMPUTE x5=value(x).
52 RECODE x5 (LOWEST THRU 5=1).
53 COMPUTE x6=value(x).
54 RECODE x6 (4 THRU HIGHEST=2).
55 COMPUTE x7=value(x).
56 RECODE x7 (LO THRU HI=3).
57 COMPUTE x8=value(x).
58 RECODE x8 (SYSMIS=4).
59 LIST x x0 TO x8.
60 ])
61 AT_CHECK([pspp -O format=csv recode.sps], [0],
62   [Table: Data List
63 x,x0,x1,x2,x3,x4,x5,x6,x7,x8
64 0,0,0,0,0,0,1,0,3,0
65 1,9,9,8,10,10,1,1,3,1
66 2,2,2,9,10,10,1,2,3,2
67 3,3,8,9,10,10,1,3,3,3
68 4,4,4,9,10,10,1,2,3,4
69 5,5,7,9,10,10,1,2,3,5
70 6,6,6,9,10,10,6,2,3,6
71 7,7,7,7,10,10,7,2,3,7
72 8,8,8,9,10,10,8,2,3,8
73 9,9,9,1,10,11,9,2,3,9
74 .,.,.,.,11,11,.,.,.,4
75 ])
76 AT_CLEANUP
77
78 AT_SETUP([RECODE numeric to numeric, with INTO, without COPY])
79 AT_DATA([recode.sps],
80   [RECODE_SAMPLE_DATA
81 NUMERIC ix0 TO ix8 (F3).
82 RECODE x (1=9) INTO ix0.
83 RECODE x (1=9)(3=8)(5=7) INTO ix1.
84 RECODE x (1=8)(2,3,4,5,6,8=9)(9=1) INTO ix2.
85 RECODE x (1 THRU 9=10)(MISSING=11) INTO ix3.
86 RECODE x (MISSING=11)(1 THRU 9=10) INTO ix4.
87 RECODE x (LOWEST THRU 5=1) INTO ix5.
88 RECODE x (4 THRU HIGHEST=2) INTO ix6.
89 RECODE x (LO THRU HI=3) INTO ix7.
90 RECODE x (SYSMIS=4) INTO ix8.
91 LIST x ix0 TO ix8.
92 ])
93 AT_CHECK([pspp -O format=csv recode.sps], [0],
94   [Table: Data List
95 x,ix0,ix1,ix2,ix3,ix4,ix5,ix6,ix7,ix8
96 0,.,.,.,.,.,1,.,3,.
97 1,9,9,8,10,10,1,.,3,.
98 2,.,.,9,10,10,1,.,3,.
99 3,.,8,9,10,10,1,.,3,.
100 4,.,.,9,10,10,1,2,3,.
101 5,.,7,9,10,10,1,2,3,.
102 6,.,.,9,10,10,.,2,3,.
103 7,.,.,.,10,10,.,2,3,.
104 8,.,.,9,10,10,.,2,3,.
105 9,.,.,1,10,11,.,2,3,.
106 .,.,.,.,11,11,.,.,.,4
107 ])
108 AT_CLEANUP
109
110 AT_SETUP([RECODE numeric to numeric, with INTO, with COPY])
111 AT_DATA([recode.sps],
112   [RECODE_SAMPLE_DATA
113 NUMERIC cx0 TO cx8 (F3).
114 RECODE x (1=9)(ELSE=COPY) INTO cx0.
115 RECODE x (1=9)(3=8)(5=7)(ELSE=COPY) INTO cx1.
116 RECODE x (1=8)(2,3,4,5,6,8=9)(9=1)(ELSE=COPY) INTO cx2.
117 RECODE x (1 THRU 9=10)(MISSING=11)(ELSE=COPY) INTO cx3.
118 RECODE x (MISSING=11)(1 THRU 9=10)(ELSE=COPY) INTO cx4.
119 RECODE x (LOWEST THRU 5=1)(ELSE=COPY) INTO cx5.
120 RECODE x (4 THRU HIGHEST=2)(ELSE=COPY) INTO cx6.
121 RECODE x (LO THRU HI=3)(ELSE=COPY) INTO cx7.
122 RECODE x (SYSMIS=4)(ELSE=COPY) INTO cx8.
123 RECODE x (5=COPY)(ELSE=22) INTO cx9.
124 LIST x cx0 TO cx9.
125 ])
126 AT_CHECK([pspp -O format=csv recode.sps], [0],
127   [Table: Data List
128 x,cx0,cx1,cx2,cx3,cx4,cx5,cx6,cx7,cx8,cx9
129 0,0,0,0,0,0,1,0,3,0,22.00
130 1,9,9,8,10,10,1,1,3,1,22.00
131 2,2,2,9,10,10,1,2,3,2,22.00
132 3,3,8,9,10,10,1,3,3,3,22.00
133 4,4,4,9,10,10,1,2,3,4,22.00
134 5,5,7,9,10,10,1,2,3,5,5.00
135 6,6,6,9,10,10,6,2,3,6,22.00
136 7,7,7,7,10,10,7,2,3,7,22.00
137 8,8,8,9,10,10,8,2,3,8,22.00
138 9,9,9,1,10,11,9,2,3,9,22.00
139 .,.,.,.,11,11,.,.,.,4,22.00
140 ])
141 AT_CLEANUP
142
143 AT_SETUP([RECODE string to string, with INTO, without COPY])
144 AT_DATA([recode.sps],
145   [RECODE_SAMPLE_DATA
146 STRING s0 TO s3 (A4)/t0 TO t3 (A10).
147 RECODE s t ('a'='b')('ab'='bc') INTO s0 t0.
148 RECODE s t ('abcd'='xyzw') INTO s1 t1.
149 RECODE s t ('abc'='def')(ELSE='xyz') INTO s2 t2.
150 RECODE t ('a'='b')('abcdefghi'='xyz')('abcdefghij'='jklmnopqr') INTO t3.
151 RECODE s (MISSING='gone') INTO s3.
152 LIST s t s0 TO s3 t0 TO t3.
153 ])
154 AT_CHECK([pspp -O format=csv recode.sps], [0],
155   [Table: Data List
156 s,t,s0,s1,s2,s3,t0,t1,t2,t3
157 ,,,,xyz ,,,,xyz       ,
158 a   ,a         ,b   ,,xyz ,,b         ,,xyz       ,b         @&t@
159 ab  ,ab        ,bc  ,,xyz ,,bc        ,,xyz       ,
160 abc ,abc       ,,,def ,,,,def       ,
161 abcd,abcd      ,,xyzw,xyz ,,,xyzw      ,xyz       ,
162 123 ,123       ,,,xyz ,,,,xyz       ,
163 123,123      ,,,xyz ,,,,xyz       ,
164 +1  ,+1        ,,,xyz ,,,,xyz       ,
165 1x  ,1x        ,,,xyz ,,,,xyz       ,
166 abcd,abcdefghi ,,xyzw,xyz ,,,,xyz       ,xyz       @&t@
167 xxx ,abcdefghij,,,xyz ,gone,,,xyz       ,jklmnopqr @&t@
168 ])
169 AT_CLEANUP
170
171 AT_SETUP(RECODE string to string, with INTO, with COPY])
172 AT_DATA([recode.sps],
173   [RECODE_SAMPLE_DATA
174 STRING cs0 TO cs2 (A4)/ct0 TO ct3 (A10).
175 RECODE s t ('a'='b')('ab'='bc')(ELSE=COPY) INTO cs0 ct0.
176 RECODE s t ('abcd'='xyzw')(ELSE=COPY) INTO cs1 ct1.
177 RECODE s t ('abc'='def')(ELSE='xyz')(ELSE=COPY) INTO cs2 ct2.
178 RECODE t ('a'='b')('abcdefghi'='xyz')('abcdefghij'='jklmnopqr')(ELSE=COPY)
179     INTO ct3.
180 LIST s t cs0 TO cs2 ct0 TO ct3.
181 ])
182 AT_CHECK([pspp -O format=csv recode.sps], [0],
183   [Table: Data List
184 s,t,cs0,cs1,cs2,ct0,ct1,ct2,ct3
185 ,,,,xyz ,,,xyz       ,
186 a   ,a         ,b   ,a   ,xyz ,b         ,a         ,xyz       ,b         @&t@
187 ab  ,ab        ,bc  ,ab  ,xyz ,bc        ,ab        ,xyz       ,ab        @&t@
188 abc ,abc       ,abc ,abc ,def ,abc       ,abc       ,def       ,abc       @&t@
189 abcd,abcd      ,abcd,xyzw,xyz ,abcd      ,xyzw      ,xyz       ,abcd      @&t@
190 123 ,123       ,123 ,123 ,xyz ,123       ,123       ,xyz       ,123       @&t@
191 123,123      ,123,123,xyz ,123      ,123      ,xyz       ,123      @&t@
192 +1  ,+1        ,+1  ,+1  ,xyz ,+1        ,+1        ,xyz       ,+1        @&t@
193 1x  ,1x        ,1x  ,1x  ,xyz ,1x        ,1x        ,xyz       ,1x        @&t@
194 abcd,abcdefghi ,abcd,xyzw,xyz ,abcdefghi ,abcdefghi ,xyz       ,xyz       @&t@
195 xxx ,abcdefghij,xxx ,xxx ,xyz ,abcdefghij,abcdefghij,xyz       ,jklmnopqr @&t@
196 ])
197 AT_CLEANUP
198
199 AT_SETUP([RECODE string to numeric])
200 AT_DATA([recode.sps],
201   [RECODE_SAMPLE_DATA
202 NUMERIC ns0 TO ns2 (F3)/nt0 TO nt2 (F3).
203 RECODE s t (CONVERT)(' '=0)('abcd'=1) INTO ns0 nt0.
204 RECODE s t (' '=0)(CONVERT)('abcd'=1) INTO ns1 nt1.
205 RECODE s t ('1x'=1)('abcd'=2)(ELSE=3) INTO ns2 nt2.
206 LIST s t ns0 TO ns2 nt0 TO nt2.
207 ])
208 AT_CHECK([pspp -O format=csv recode.sps], [0],
209   [Table: Data List
210 s,t,ns0,ns1,ns2,nt0,nt1,nt2
211 ,,.,0,3,.,0,3
212 a   ,a         ,.,.,3,.,.,3
213 ab  ,ab        ,.,.,3,.,.,3
214 abc ,abc       ,.,.,3,.,.,3
215 abcd,abcd      ,1,1,2,1,1,2
216 123 ,123       ,123,123,3,123,123,3
217 123,123      ,123,123,3,123,123,3
218 +1  ,+1        ,1,1,3,1,1,3
219 1x  ,1x        ,.,.,1,.,.,1
220 abcd,abcdefghi ,1,1,2,.,.,3
221 xxx ,abcdefghij,.,.,3,.,.,3
222 ])
223 AT_CLEANUP
224
225 AT_SETUP([RECODE numeric to string])
226 AT_DATA([recode.sps],
227   [RECODE_SAMPLE_DATA
228 STRING sx0 TO sx2 (a10).
229 RECODE x (1 THRU 9='abcdefghij') INTO sx0.
230 RECODE x (0,1,3,5,7,MISSING='xxx') INTO sx1.
231 RECODE x (2 THRU 6,SYSMIS='xyz')(ELSE='foobar') INTO sx2.
232 LIST x sx0 TO sx2.
233 ])
234 AT_CHECK([pspp -O format=csv recode.sps], [0],
235   [Table: Data List
236 x,sx0,sx1,sx2
237 0,,xxx       ,foobar    @&t@
238 1,abcdefghij,xxx       ,foobar    @&t@
239 2,abcdefghij,,xyz       @&t@
240 3,abcdefghij,xxx       ,xyz       @&t@
241 4,abcdefghij,,xyz       @&t@
242 5,abcdefghij,xxx       ,xyz       @&t@
243 6,abcdefghij,,xyz       @&t@
244 7,abcdefghij,xxx       ,foobar    @&t@
245 8,abcdefghij,,foobar    @&t@
246 9,abcdefghij,xxx       ,foobar    @&t@
247 .,,xxx       ,xyz       @&t@
248 ])
249 AT_CLEANUP
250
251 AT_SETUP([RECODE bug in COPY])
252 AT_DATA([recode.sps],
253   [DATA LIST LIST
254  /A (A1)
255  B (A1).
256
257 BEGIN DATA
258 1     2
259 2     3
260 3     4
261 END DATA.
262
263 ** Clearly, the else=copy is superfluous here
264 RECODE A ("1"="3") ("3"="1") (ELSE=COPY).
265 EXECUTE.
266 LIST.
267 ])
268 AT_CHECK([pspp -O format=csv recode.sps], [0],
269   [Table: Reading free-form data from INLINE.
270 Variable,Format
271 A,A1
272 B,A1
273
274 Table: Data List
275 A,B
276 3,2
277 2,3
278 1,4
279 ])
280 AT_CLEANUP
281
282 AT_SETUP([RECODE bug in COPY with INTO])
283 AT_DATA([recode.sps],
284   [DATA LIST LIST
285  /A (A1)
286  B (A1).
287
288 BEGIN DATA
289 1     2
290 2     3
291 3     4
292 END DATA.
293
294 STRING A1 (A1).
295 RECODE A ("1"="3") ("3"="1") (ELSE=COPY) INTO a1.
296 EXECUTE.
297 LIST.
298 ])
299 AT_CHECK([pspp -O format=csv recode.sps], [0],
300   [Table: Reading free-form data from INLINE.
301 Variable,Format
302 A,A1
303 B,A1
304
305 Table: Data List
306 A,B,A1
307 1,2,3
308 2,3,2
309 3,4,1
310 ])
311 AT_CLEANUP
312
313
314
315 AT_SETUP([RECODE increased string widths])
316
317 AT_DATA([recode.sps],[dnl
318 data list notable list /x (a1) y (a8) z *.
319 begin data.
320 a a         2
321 a two       2
322 b three     2
323 c b         2
324 end data.
325
326 recode x y ("a" = "first") .
327
328 list.
329 ])
330
331 AT_CHECK([pspp -O format=csv recode.sps], [1], [dnl
332 "error: Cannot recode because the variable x would require a width of 5 bytes or greater, but it has a width of only 1 bytes."
333
334 Table: Data List
335 x,y,z
336 a,a       ,2.00
337 a,two     ,2.00
338 b,three   ,2.00
339 c,b       ,2.00
340 ])
341
342 AT_CLEANUP
343
344
345
346 AT_SETUP([RECODE crash on invalid dest variable])
347
348 AT_DATA([recode.sps],[dnl
349 DATA LIST LIST NOTABLE/x (f1) s (a4) t (a10).
350 MISSING VALUES x(9)/s('xxx').
351 BEGIN DATA.
352 0, '', ''
353 1, a, a
354 2, ab, ab
355 3, abc, abc
356 END DATA.
357
358 RECODE x (1=9) INTO ".
359 EXECUTE.
360 ])
361
362 AT_CHECK([pspp -O format=csv recode.sps], [1], [ignore])
363
364 AT_CLEANUP