d64e97586afce6d90092f813640434356f57fb2b
[pspp-builds.git] / tests / command / rank.sh
1 #!/bin/sh
2
3 # This program tests the RANK command.
4
5 TEMPDIR=/tmp/pspp-tst-$$
6 TESTFILE=$TEMPDIR/`basename $0`.sps
7
8 # ensure that top_srcdir and top_builddir  are absolute
9 if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
10 if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
11 top_srcdir=`cd $top_srcdir; pwd`
12 top_builddir=`cd $top_builddir; pwd`
13
14 PSPP=$top_builddir/src/ui/terminal/pspp
15
16 STAT_CONFIG_PATH=$top_srcdir/config
17 export STAT_CONFIG_PATH
18
19 LANG=C
20 export LANG
21
22
23 cleanup()
24 {
25      if [ x"$PSPP_TEST_NO_CLEANUP" != x ] ; then 
26         echo "NOT cleaning $TEMPDIR"
27         return ; 
28      fi
29      rm -rf $TEMPDIR
30 }
31
32
33 fail()
34 {
35     echo $activity
36     echo FAILED
37     cleanup;
38     exit 1;
39 }
40
41
42 no_result()
43 {
44     echo $activity
45     echo NO RESULT;
46     cleanup;
47     exit 2;
48 }
49
50 pass()
51 {
52     cleanup;
53     exit 0;
54 }
55
56 mkdir -p $TEMPDIR
57
58 cd $TEMPDIR
59
60
61 # Some tests for proper behaviour in the face of invalid input.
62 activity="create file 1"
63 cat > $TESTFILE <<EOF
64 DATA LIST LIST NOTABLE /x * a (a2).
65 BEGIN DATA.
66 -1 s
67 0  s
68 1  s
69 2  s
70 2  s
71 4  s
72 5  s
73 END DATA.
74
75 DEBUG XFORM FAIL.
76
77 RANK x.
78
79 EOF
80 if [ $? -ne 0 ] ; then no_result ; fi
81
82 # Check that it properly handles failed transformations.
83 activity="run program 1"
84 $SUPERVISOR $PSPP --testing-mode -o raw-ascii -e $TEMPDIR/err $TESTFILE 
85 if [ $? -ne 1 ] ; then fail ; fi
86
87 activity="diff 1"
88 perl -pi -e 's/^\s*$//g' $TEMPDIR/err
89 diff  -b $TEMPDIR/err - <<EOF
90 $TEMPDIR/rank.sh.sps:14: error: Stopping syntax file processing here to avoid a cascade of dependent command failures.
91 EOF
92 if [ $? -ne 0 ] ; then fail ; fi
93
94
95 #Now for some general error conditions.
96 activity="create file 2"
97 cat > $TESTFILE <<EOF
98 DATA LIST LIST NOTABLE /x * a (a2).
99 BEGIN DATA.
100 -1 s
101 0  s
102 1  s
103 2  s
104 2  s
105 4  s
106 5  s
107 END DATA.
108
109 * invalid NTILES (no parameter)
110 RANK x 
111   /NTILES
112 .
113
114 * invalid NTILES (not an integer)
115 RANK x 
116   /NTILES(d)
117 .
118
119
120 * destination variable already exists
121 RANK x 
122  /RANK INTO x.
123
124
125 * Too many variables in INTO
126 RANK x 
127  /RANK INTO foo  bar wiz.
128 EOF
129 if [ $? -ne 0 ] ; then no_result ; fi
130
131
132 activity="run program (syntax errors)"
133 $SUPERVISOR $PSPP --testing-mode -o raw-ascii -e $TEMPDIR/errs $TESTFILE 
134 if [ $? -ne 1 ] ; then fail ; fi
135
136 activity="compare errors"
137 perl -pi -e 's/^\s*$//g' $TEMPDIR/errs
138 diff  -b $TEMPDIR/errs - << EOF
139 $TEMPDIR/rank.sh.sps:15: error: RANK: Syntax error expecting \`(' at end of command.
140 $TEMPDIR/rank.sh.sps:19: error: RANK: Syntax error expecting integer at \`d'.
141 $TEMPDIR/rank.sh.sps:25: error: RANK: Variable x already exists.
142 $TEMPDIR/rank.sh.sps:30: error: RANK: Too many variables in INTO clause.
143 EOF
144 if [ $? -ne 0 ] ; then fail ; fi
145
146 # Now some real tests.
147
148 activity="create file 3"
149 cat > $TESTFILE <<EOF
150 DATA LIST LIST NOTABLE /x (f8).
151 BEGIN DATA.
152 -1
153
154
155
156
157
158
159 END DATA.
160
161 ECHO  'Simple example using defaults'.
162
163 RANK x.
164
165 LIST.
166
167 NEW FILE.
168 DATA LIST LIST NOTABLE /a * b *.
169 BEGIN DATA.
170 0 24
171 1 32
172 2 31
173 2 32
174 4 30
175 5 29
176 6 1
177 7 43
178 8 .
179 9 45
180 END DATA.
181
182 RANK a b (D)
183    /PRINT=YES 
184    /RANK
185    /TIES=HIGH
186    /RFRACTION
187    /N INTO count
188    .
189
190 DISPLAY DICTIONARY.
191
192 LIST.
193
194
195 ECHO  'Test variable name fallback'.
196
197 NEW FILE.
198 DATA LIST LIST NOTABLE /foo * rfoo * ran003 *.
199 BEGIN DATA.
200 0 3 2
201 1 3 2
202 2 3 2
203 2 3 2
204 4 3 2
205 5 3 2
206 6 3 2
207 7 3 2
208 8 3 2
209 9 3 2
210 END DATA.
211
212 RANK foo.
213
214
215 DISPLAY DICTIONARY.
216
217
218 NEW FILE.
219 DATA LIST LIST NOTABLE /a * b *.
220 BEGIN DATA.
221 0 24
222 1 32
223 2 31
224 2 32
225 4 30
226 5 29
227 6 1
228 7 43
229 8 8 
230 9 45
231 END DATA.
232
233 RANK a
234   /PRINT=YES
235   /TIES=CONDENSE
236   /SAVAGE
237   /PERCENT
238   /PROPORTION
239   /NTILES(4)
240   /NORMAL
241 .
242
243 LIST.
244
245 NEW FILE.
246 DATA LIST LIST NOTABLE /a * g1 g2 *.
247 BEGIN DATA.
248 1 0 2
249 2 0 2
250 3 0 2
251 4 0 2
252 5 0 2
253 6 0 2
254 7 0 2
255 8 0 2
256 2 1 2
257 2 1 2
258 3 1 2
259 4 1 2
260 5 1 2
261 6 1 2
262 7 1 2
263 7 1 2
264 8 1 2
265 9 1 1
266 END DATA.
267
268 RANK a (D) BY g2 g1
269   /PRINT=YES
270   /TIES=LOW
271   /MISSING=INCLUDE
272   /FRACTION=RANKIT
273   /RANK
274   /NORMAL
275   .
276
277 LIST.
278
279
280 ECHO 'fractional ranks ( including small ones for special case of SAVAGE ranks)'
281 NEW FILE.
282 DATA LIST LIST NOTABLE  /a *  w * .
283 BEGIN DATA.
284 1 1.5
285 2 0.2
286 3 0.1
287 4 1
288 5 1
289 6 1
290 7 1
291 8 1
292 END DATA.
293
294 WEIGHT BY w.
295
296 RANK a 
297   /FRACTION=TUKEY
298   /PROPORTION
299   /SAVAGE
300 .
301
302 LIST.
303
304
305 ECHO 'test all the ties cases with low caseweight values'.
306
307 NEW FILE.
308 DATA LIST LIST NOTABLE /x * w *.
309 BEGIN DATA.
310 1 0.1
311 2 0.1
312 3 0.1
313 4 0.2
314 5 0.1
315 6 0.1
316 7 0.1
317 8 0.1
318 END DATA.
319
320 WEIGHT BY w.
321
322 RANK x
323  /TIES=low
324  /RANK into xl.
325
326
327 RANK x
328  /TIES=high
329  /RANK into xh.
330
331 RANK x
332  /TIES=condense
333  /RANK into xc.
334
335
336 * Test VW fraction
337
338 RANK x
339  /FRACTION=VW
340  /NORMAL.
341
342 LIST.
343 EOF
344 if [ $? -ne 0 ] ; then no_result ; fi
345
346
347 activity="run program 3"
348 $SUPERVISOR $PSPP --testing-mode -o raw-ascii $TESTFILE
349 if [ $? -ne 0 ] ; then no_result ; fi
350
351
352 activity="compare output 3"
353 perl -pi -e 's/^\s*$//g' $TEMPDIR/pspp.list
354 diff  -b $TEMPDIR/pspp.list - <<EOF
355 Simple example using defaults
356 Variables Created By RANK
357 x into Rx(RANK of x)
358        x        Rx
359 -------- ---------
360       -1     1.000 
361        0     2.000 
362        1     3.000 
363        2     4.500 
364        2     4.500 
365        4     6.000 
366        5     7.000 
367 Variables Created By RANK
368 a into Ra(RANK of a)
369 b into Rb(RANK of b)
370 a into RFR001(RFRACTION of a)
371 b into RFR002(RFRACTION of b)
372 a into count(N of a)
373 b into Nb(N of b)
374 1.1 DISPLAY.  
375 +--------+-------------------------------------------+--------+
376 |Variable|Description                                |Position|
377 #========#===========================================#========#
378 |a       |Format: F8.2                               |       1|
379 +--------+-------------------------------------------+--------+
380 |b       |Format: F8.2                               |       2|
381 +--------+-------------------------------------------+--------+
382 |count   |N of a                                     |       3|
383 |        |Format: F6.0                               |        |
384 +--------+-------------------------------------------+--------+
385 |Ra      |RANK of a                                  |       4|
386 |        |Format: F9.3                               |        |
387 +--------+-------------------------------------------+--------+
388 |Rb      |RANK of b                                  |       5|
389 |        |Format: F9.3                               |        |
390 +--------+-------------------------------------------+--------+
391 |RFR001  |RFRACTION of a                             |       6|
392 |        |Format: F6.4                               |        |
393 +--------+-------------------------------------------+--------+
394 |RFR002  |RFRACTION of b                             |       7|
395 |        |Format: F6.4                               |        |
396 +--------+-------------------------------------------+--------+
397 |Nb      |N of b                                     |       8|
398 |        |Format: F6.0                               |        |
399 +--------+-------------------------------------------+--------+
400        a        b  count        Ra        Rb RFR001 RFR002     Nb
401 -------- -------- ------ --------- --------- ------ ------ ------
402      .00    24.00     10    10.000     8.000 1.0000  .8889      9 
403     1.00    32.00     10     9.000     4.000  .9000  .4444      9 
404     2.00    31.00     10     8.000     5.000  .8000  .5556      9 
405     2.00    32.00     10     8.000     4.000  .8000  .4444      9 
406     4.00    30.00     10     6.000     6.000  .6000  .6667      9 
407     5.00    29.00     10     5.000     7.000  .5000  .7778      9 
408     6.00     1.00     10     4.000     9.000  .4000 1.0000      9 
409     7.00    43.00     10     3.000     2.000  .3000  .2222      9 
410     8.00      .       10     2.000      .     .2000  .          . 
411     9.00    45.00     10     1.000     1.000  .1000  .1111      9 
412 Test variable name fallback
413 Variables Created By RANK
414 foo into RAN001(RANK of foo)
415 2.1 DISPLAY.  
416 +--------+-------------------------------------------+--------+
417 |Variable|Description                                |Position|
418 #========#===========================================#========#
419 |foo     |Format: F8.2                               |       1|
420 +--------+-------------------------------------------+--------+
421 |rfoo    |Format: F8.2                               |       2|
422 +--------+-------------------------------------------+--------+
423 |ran003  |Format: F8.2                               |       3|
424 +--------+-------------------------------------------+--------+
425 |RAN001  |RANK of foo                                |       4|
426 |        |Format: F9.3                               |        |
427 +--------+-------------------------------------------+--------+
428 Variables Created By RANK
429 a into Sa(SAVAGE of a)
430 a into Pa(PERCENT of a)
431 a into PRO001(PROPORTION of a using BLOM)
432 a into Na(NTILES of a)
433 a into NOR001(NORMAL of a using BLOM)
434        a        b       Sa     Pa PRO001  Na NOR001
435 -------- -------- -------- ------ ------ --- ------
436      .00    24.00   -.9000  10.00  .0610   1 -1.547 
437     1.00    32.00   -.7889  20.00  .1585   1 -1.000 
438     2.00    31.00   -.5925  30.00  .2561   2 -.6554 
439     2.00    32.00   -.5925  30.00  .2561   2 -.6554 
440     4.00    30.00   -.3544  40.00  .3537   2 -.3755 
441     5.00    29.00   -.1544  50.00  .4512   2 -.1226 
442     6.00     1.00    .0956  60.00  .5488   3  .1226 
443     7.00    43.00    .4290  70.00  .6463   3  .3755 
444     8.00     8.00    .9290  80.00  .7439   3  .6554 
445     9.00    45.00   1.9290  90.00  .8415   4 1.0005 
446 Variables Created By RANK
447 a into Ra(RANK of a BY g2 g1)
448 a into Na(NORMAL of a using RANKIT BY g2 g1)
449        a       g1       g2        Ra     Na
450 -------- -------- -------- --------- ------
451     1.00      .00     2.00     8.000 1.5341 
452     2.00      .00     2.00     7.000  .8871 
453     3.00      .00     2.00     6.000  .4888 
454     4.00      .00     2.00     5.000  .1573 
455     5.00      .00     2.00     4.000 -.1573 
456     6.00      .00     2.00     3.000 -.4888 
457     7.00      .00     2.00     2.000 -.8871 
458     8.00      .00     2.00     1.000 -1.534 
459     2.00     1.00     2.00     8.000  .9674 
460     2.00     1.00     2.00     8.000  .9674 
461     3.00     1.00     2.00     7.000  .5895 
462     4.00     1.00     2.00     6.000  .2822 
463     5.00     1.00     2.00     5.000  .0000 
464     6.00     1.00     2.00     4.000 -.2822 
465     7.00     1.00     2.00     2.000 -.9674 
466     7.00     1.00     2.00     2.000 -.9674 
467     8.00     1.00     2.00     1.000 -1.593 
468     9.00     1.00     1.00     1.000  .0000 
469 fractional ranks ( including small ones for special case of SAVAGE ranks)
470 Variables Created By RANK
471 a into Pa(PROPORTION of a using TUKEY)
472 a into Sa(SAVAGE of a)
473        a        w     Pa       Sa
474 -------- -------- ------ --------
475     1.00     1.50  .1285   -.8016 
476     2.00      .20  .1776   -.6905 
477     3.00      .10  .1986   -.6905 
478     4.00     1.00  .3458   -.5305 
479     5.00     1.00  .4860   -.2905 
480     6.00     1.00  .6262    .0262 
481     7.00     1.00  .7664    .4929 
482     8.00     1.00  .9065   1.3929 
483 test all the ties cases with low caseweight values
484 Variables Created By RANK
485 x into xl(RANK of x)
486 Variables Created By RANK
487 x into xh(RANK of x)
488 Variables Created By RANK
489 x into xc(RANK of x)
490 Variables Created By RANK
491 x into Nx(NORMAL of x using VW)
492        x        w        xl        xh        xc     Nx
493 -------- -------- --------- --------- --------- ------
494     1.00      .10      .000      .100     1.000 -1.938 
495     2.00      .10      .100      .200     2.000 -1.412 
496     3.00      .10      .200      .300     3.000 -1.119 
497     4.00      .20      .300      .500     4.000 -.8046 
498     5.00      .10      .500      .600     5.000 -.5549 
499     6.00      .10      .600      .700     6.000 -.4067 
500     7.00      .10      .700      .800     7.000 -.2670 
501     8.00      .10      .800      .900     8.000 -.1323 
502 EOF
503 if [ $? -ne 0 ] ; then fail ; fi
504
505
506
507 # A test to make sure that variable name creation is really robust
508 activity="create file 4"
509 cat > $TESTFILE <<EOF
510 DATA LIST LIST notable /x * rx * ran001 TO ran999.
511 BEGIN DATA.
512 1
513 2
514 3
515 4
516 5
517 6
518 7
519 END DATA.
520
521 RANK x.
522
523 DELETE VAR ran001 TO ran999.
524
525 LIST.
526
527 EOF
528 if [ $? -ne 0 ] ; then no_result ; fi
529
530 activity="run program 4"
531 $SUPERVISOR $PSPP --testing-mode -o raw-ascii -e /dev/null $TESTFILE 
532 if [ $? -ne 0 ] ; then fail ; fi
533
534
535 activity="compare output 4"
536 perl -pi -e 's/^\s*$//g' $TEMPDIR/pspp.list
537 diff  -b $TEMPDIR/pspp.list - << EOF
538 Variables Created By RANK
539 x into RNKRA01(RANK of x)
540        x       rx   RNKRA01
541 -------- -------- ---------
542     1.00      .       1.000 
543     2.00      .       2.000 
544     3.00      .       3.000 
545     4.00      .       4.000 
546     5.00      .       5.000 
547     6.00      .       6.000 
548     7.00      .       7.000 
549 EOF
550 if [ $? -ne 0 ] ; then fail ; fi
551
552 pass;