AT_BANNER([EXAMINE])

AT_SETUP([EXAMINE])
AT_DATA([examine.sps], [
DATA LIST LIST /QUALITY * W * BRAND * .
BEGIN DATA
3  1  1
2  2  1
1  2  1
1  1  1
4  1  1
4  1  1
5  1  2
2  1  2
4  4  2
2  1  2
3  1  2
7  1  3
4  2  3
5  3  3
3  1  3
6  1  3
END DATA

WEIGHT BY w.

VARIABLE LABELS brand   'Manufacturer'.
VARIABLE LABELS quality 'Breaking Strain'.

VALUE LABELS /brand 1 'Aspeger' 2 'Bloggs' 3 'Charlies'.

LIST /FORMAT=NUMBERED.

EXAMINE
	quality BY brand
	/STATISTICS descriptives extreme(3)
	.
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl In the following data, only the extreme values have been checked.
dnl The descriptives have been blindly pasted.
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
QUALITY,F8.0
W,F8.0
BRAND,F8.0

Table: Data List
Case Number,QUALITY,W,BRAND
1,3.00,1.00,1.00
2,2.00,2.00,1.00
3,1.00,2.00,1.00
4,1.00,1.00,1.00
5,4.00,1.00,1.00
6,4.00,1.00,1.00
7,5.00,1.00,2.00
8,2.00,1.00,2.00
9,4.00,4.00,2.00
10,2.00,1.00,2.00
11,3.00,1.00,2.00
12,7.00,1.00,3.00
13,4.00,2.00,3.00
14,5.00,3.00,3.00
15,3.00,1.00,3.00
16,6.00,1.00,3.00

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
Breaking Strain,24.00,100%,.00,0%,24.00,100%

Table: Extreme Values
,,,Case Number,Value
Breaking Strain,Highest,1,12,7.00
,,2,16,6.00
,,3,14,5.00
,Lowest,1,3,1.00
,,2,3,1.00
,,3,4,1.00

Table: Descriptives
,,,Statistic,Std. Error
Breaking Strain,Mean,,3.54,.32
,95% Confidence Interval for Mean,Lower Bound,2.87,
,,Upper Bound,4.21,
,5% Trimmed Mean,,3.50,
,Median,,4.00,
,Variance,,2.52,
,Std. Deviation,,1.59,
,Minimum,,1.00,
,Maximum,,7.00,
,Range,,6.00,
,Interquartile Range,,2.75,
,Skewness,,.06,.47
,Kurtosis,,-.36,.92

Table: Case Processing Summary
,,Cases,,,,,
,,Valid,,Missing,,Total,
,Manufacturer,N,Percent,N,Percent,N,Percent
Breaking Strain,Aspeger,8.00,100%,.00,0%,8.00,100%
,Bloggs,8.00,100%,.00,0%,8.00,100%
,Charlies,8.00,100%,.00,0%,8.00,100%

Table: Extreme Values
,Manufacturer,,,Case Number,Value
Breaking Strain,Aspeger,Highest,1,6,4.00
,,,2,5,4.00
,,,3,1,3.00
,,Lowest,1,3,1.00
,,,2,3,1.00
,,,3,4,1.00
,Bloggs,Highest,1,7,5.00
,,,2,9,4.00
,,,3,9,4.00
,,Lowest,1,8,2.00
,,,2,10,2.00
,,,3,11,3.00
,Charlies,Highest,1,12,7.00
,,,2,16,6.00
,,,3,14,5.00
,,Lowest,1,15,3.00
,,,2,13,4.00
,,,3,13,4.00

Table: Descriptives
,Manufacturer,,,Statistic,Std. Error
Breaking Strain,Aspeger,Mean,,2.25,.45
,,95% Confidence Interval for Mean,Lower Bound,1.18,
,,,Upper Bound,3.32,
,,5% Trimmed Mean,,2.22,
,,Median,,2.00,
,,Variance,,1.64,
,,Std. Deviation,,1.28,
,,Minimum,,1.00,
,,Maximum,,4.00,
,,Range,,3.00,
,,Interquartile Range,,2.75,
,,Skewness,,.47,.75
,,Kurtosis,,-1.55,1.48
,Bloggs,Mean,,3.50,.38
,,95% Confidence Interval for Mean,Lower Bound,2.61,
,,,Upper Bound,4.39,
,,5% Trimmed Mean,,3.50,
,,Median,,4.00,
,,Variance,,1.14,
,,Std. Deviation,,1.07,
,,Minimum,,2.00,
,,Maximum,,5.00,
,,Range,,3.00,
,,Interquartile Range,,1.75,
,,Skewness,,-.47,.75
,,Kurtosis,,-.83,1.48
,Charlies,Mean,,4.88,.44
,,95% Confidence Interval for Mean,Lower Bound,3.83,
,,,Upper Bound,5.92,
,,5% Trimmed Mean,,4.86,
,,Median,,5.00,
,,Variance,,1.55,
,,Std. Deviation,,1.25,
,,Minimum,,3.00,
,,Maximum,,7.00,
,,Range,,4.00,
,,Interquartile Range,,1.75,
,,Skewness,,.30,.75
,,Kurtosis,,.15,1.48
])
AT_CLEANUP

AT_SETUP([EXAMINE -- extremes])
AT_DATA([examine.sps], [dnl
data list free /V1 W
begin data.
1  1
2  1
3  2
3  1
4  1
5  1
6  1
7  1
8  1
9  1
10 1
11 1
12 1
13 1
14 1
15 1
16 1
17 1
18 2
19 1
20 1
end data.

weight by w.

examine v1 
 /statistics=extreme(6)
 .
])
AT_CHECK([pspp -o pspp.csv examine.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
V1,23.00,100%,.00,0%,23.00,100%

Table: Extreme Values
,,,Case Number,Value
V1,Highest,1,21,20.00
,,2,20,19.00
,,3,19,18.00
,,4,19,18.00
,,5,18,17.00
,,6,17,16.00
,Lowest,1,1,1.00
,,2,2,2.00
,,3,3,3.00
,,4,3,3.00
,,5,4,3.00
,,6,5,4.00
])
AT_CLEANUP

dnl Test the PERCENTILES subcommand of the EXAMINE command.
dnl In particular test that it behaves properly when there are only 
dnl a few cases.
AT_SETUP([EXAMINE -- percentiles])
AT_DATA([examine.sps], [dnl
DATA LIST LIST /X *.
BEGIN DATA.
2.00 
8.00 
5.00 
END DATA.

EXAMINE /x
	/PERCENTILES=HAVERAGE.

EXAMINE /x
	/PERCENTILES=WAVERAGE.

EXAMINE /x
	/PERCENTILES=ROUND.

EXAMINE /x
	/PERCENTILES=EMPIRICAL.

EXAMINE /x
	/PERCENTILES=AEMPIRICAL.
])
AT_CHECK([pspp -o pspp.csv examine.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
X,F8.0

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X,3,100%,0,0%,3,100%

Table: Percentiles
,,Percentiles,,,,,,
,,5,10,25,50,75,90,95
X,HAverage,.40,.80,2.00,5.00,8.00,8.00,8.00
,Tukey's Hinges,,,3.50,5.00,6.50,,

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X,3,100%,0,0%,3,100%

Table: Percentiles
,,Percentiles,,,,,,
,,5,10,25,50,75,90,95
X,Weighted Average,.30,.60,1.50,3.50,5.75,7.10,7.55
,Tukey's Hinges,,,3.50,5.00,6.50,,

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X,3,100%,0,0%,3,100%

Table: Percentiles
,,Percentiles,,,,,,
,,5,10,25,50,75,90,95
X,Rounded,.00,.00,2.00,5.00,5.00,8.00,8.00
,Tukey's Hinges,,,3.50,5.00,6.50,,

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X,3,100%,0,0%,3,100%

Table: Percentiles
,,Percentiles,,,,,,
,,5,10,25,50,75,90,95
X,Empirical,2.00,2.00,2.00,5.00,8.00,8.00,8.00
,Tukey's Hinges,,,3.50,5.00,6.50,,

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X,3,100%,0,0%,3,100%

Table: Percentiles
,,Percentiles,,,,,,
,,5,10,25,50,75,90,95
X,Empirical with averaging,2.00,2.00,2.00,5.00,8.00,8.00,8.00
,Tukey's Hinges,,,3.50,5.00,6.50,,
])
AT_CLEANUP

AT_SETUP([EXAMINE -- missing values])
AT_DATA([examine.sps], [dnl
DATA LIST LIST /x * y *.
BEGIN DATA.
1   1 
2   1
3   1
4   1
5   2
6   2
.   2
END DATA

EXAMINE /x by y
        /MISSING = PAIRWISE
        .
])
AT_CHECK([pspp -o pspp.csv examine.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
x,F8.0
y,F8.0

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x,6,85.7143%,1,14.2857%,7,100%

Table: Case Processing Summary
,,Cases,,,,,
,,Valid,,Missing,,Total,
,y,N,Percent,N,Percent,N,Percent
x,1.00,4,100%,0,0%,4,100%
,2.00,2,66.6667%,1,33.3333%,3,100%
])
AT_CLEANUP


AT_SETUP([EXAMINE -- user missing values])
AT_DATA([examine-m.sps], [dnl
DATA LIST notable LIST /x * y *.
BEGIN DATA.
1                   2
9999999999          2
9999999999          99
END DATA.

MISSING VALUES x (9999999999).
MISSING VALUES y (99).

EXAMINE
	/VARIABLES= x y
	/MISSING=PAIRWISE.
])
AT_CHECK([pspp -O format=csv examine-m.sps], [0], [dnl
Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x,1,33.3333%,2,66.6667%,3,100%
y,2,66.6667%,1,33.3333%,3,100%
])
AT_CLEANUP

AT_SETUP([EXAMINE -- missing values and percentiles])
AT_DATA([examine.sps], [dnl
DATA LIST LIST /X *.
BEGIN DATA.
99
99
5.00
END DATA.

MISSING VALUE X (99).

EXAMINE /x
        /PERCENTILES=HAVERAGE.
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Tests the trimmed mean calculation in the case
dnl where the data is weighted towards the centre.
AT_SETUP([EXAMINE -- trimmed mean])
AT_DATA([examine.sps], [dnl
DATA LIST LIST /X * C *.
BEGIN DATA.
1 1
2 49
3 2
END DATA.

WEIGHT BY c.

EXAMINE
	x
	/STATISTICS=DESCRIPTIVES
	.
])
AT_CHECK([pspp -o pspp.csv examine.sps])
AT_CHECK([cat pspp.csv], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
X,F8.0
C,F8.0

Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
X,52.00,100%,.00,0%,52.00,100%

Table: Descriptives
,,,Statistic,Std. Error
X,Mean,,2.02,.03
,95% Confidence Interval for Mean,Lower Bound,1.95,
,,Upper Bound,2.09,
,5% Trimmed Mean,,2.00,
,Median,,2.00,
,Variance,,.06,
,Std. Deviation,,.24,
,Minimum,,1.00,
,Maximum,,3.00,
,Range,,2.00,
,Interquartile Range,,.00,
,Skewness,,1.19,.33
,Kurtosis,,15.73,.65
])
AT_CLEANUP

AT_SETUP([EXAMINE -- crash bug])
AT_DATA([examine.sps], [dnl
data list list /a * x * y *.
begin data.
3 1 3
5 1 4
7 2 3
end data.

examine a by x by y
	/statistics=DESCRIPTIVES
	. 
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Test that two consecutive EXAMINE commands don't crash PSPP.
AT_SETUP([EXAMINE -- consecutive runs don't crash])
AT_DATA([examine.sps], [dnl
data list list /y * z *.
begin data.
6 4
5 3
7 6
end data.

EXAMINE /VARIABLES= z BY y.

EXAMINE /VARIABLES= z. 
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Test that /DESCRIPTIVES does not crash in presence of missing values.
AT_SETUP([EXAMINE -- missing values don't crash])
AT_DATA([examine.sps], [dnl
data list list /x * y *.
begin data.
1 0
2 0
. 0
3 1
4 1
end data.
examine x by y /statistics=descriptives. 
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Test that having only a single case doesn't crash.
AT_SETUP([EXAMINE -- single case doesn't crash])
AT_DATA([examine.sps], [dnl
DATA LIST LIST /quality * .
BEGIN DATA
3  
END DATA


EXAMINE
	quality 
	/STATISTICS descriptives 
        /PLOT = histogram
	.
])
AT_CHECK([pspp -o pspp.csv examine.sps], [0], [ignore])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Test that all-missing data doesn't crash.
AT_SETUP([EXAMINE -- all-missing data doesn't crash])
AT_DATA([examine.sps], [dnl
DATA LIST LIST /x *.
BEGIN DATA.
.
.
.
.
END DATA.

EXAMINE /x PLOT=HISTOGRAM.
])
AT_CHECK([pspp -o pspp.csv examine.sps], [0], [ignore])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Test that big input doesn't crash (bug 11307).
AT_SETUP([EXAMINE -- big input doesn't crash])
AT_DATA([examine.sps], [dnl
INPUT PROGRAM.
	LOOP #I=1 TO 50000.
		COMPUTE X=NORMAL(10).
		END CASE.
	END LOOP.
	END FILE.
END INPUT PROGRAM.


EXAMINE /x
	/STATISTICS=DESCRIPTIVES.
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP

dnl Another test that big input doesn't crash.
dnl The actual bug that this checks for has been lost.
AT_SETUP([EXAMINE -- big input doesn't crash 2])
AT_DATA([make-big-input.pl], 
  [for ($i=0; $i<100000; $i++) { print "AB12\n" };
   for ($i=0; $i<100000; $i++) { print "AB04\n" };
])
AT_CHECK([$PERL make-big-input.pl > large.txt])
AT_DATA([examine.sps], [dnl
DATA LIST FILE='large.txt' /S 1-2 (A) X 3 .


AGGREGATE OUTFILE=* /BREAK=X /A=N.


EXAMINE /A BY X.
])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_DATA([more-big-input.pl], 
  [for ($i=0; $i<25000; $i++) { print "AB04\nAB12\n" };
])
AT_CHECK([$PERL more-big-input.pl >> large.txt])
AT_CHECK([pspp -o pspp.csv examine.sps])
dnl Ignore output -- this is just a no-crash check.
AT_CLEANUP


dnl Test that the ID command works with non-numberic variables
AT_SETUP([EXAMINE -- non-numeric ID])

AT_DATA([examine-id.sps], [dnl
data list notable list /x * y (a12).
begin data.
1  one
2  two
3  three
4  four
5  five
6  six
7  seven
8  eight
9  nine
10 ten
11 eleven
12 twelve
30 thirty
300 threehundred
end data.

examine x
	/statistics = extreme
	/id = y
	/plot = boxplot
	.
])

AT_CHECK([pspp -O format=csv examine-id.sps], [0], 
[Table: Case Processing Summary
,Cases,,,,,
,Valid,,Missing,,Total,
,N,Percent,N,Percent,N,Percent
x,14,100%,0,0%,14,100%

Table: Extreme Values
,,,y,Value
x,Highest,1,threehundred,300.00
,,2,thirty      ,30.00
,,3,twelve      ,12.00
,,4,eleven      ,11.00
,,5,ten         ,10.00
,Lowest,1,one         ,1.00
,,2,two         ,2.00
,,3,three       ,3.00
,,4,four        ,4.00
,,5,five        ,5.00
])

AT_CLEANUP 

dnl Test for a crash which happened on cleanup from a bad input syntax
AT_SETUP([EXAMINE -- Bad Input])

AT_DATA([examine-bad.sps], [dnl
data list list /h * g *.
begin data.
1 1
2 1
3 1
4 1
5 2
6 2
7 2
8 2
9 2
end data.

EXAMINE 
	/VARIABLES= h
	BY  g
	/STATISTICS = DESCRIPTIVES EXTREME
        /PLOT = lkajsdas
	.
])

AT_CHECK([pspp -o pspp.csv examine-bad.sps], [1], [ignore])

AT_CLEANUP 


dnl Check the MISSING=REPORT option
AT_SETUP([EXAMINE -- MISSING=REPORT])


AT_DATA([examine-report.sps], [dnl
set format = F22.0.
data list list /x * g *.
begin data.
1   1
2   1
3   1
4   1
5   1
6   1
7   1
8   1
9   1
10   2
20   2
30   2
40   2
50   2
60   2
70   2
80   2
90   2
101   9
201   9
301   9
401   9
501   99
601   99
701   99
801   99
901   99
1001  .
2002  .
3003  .
4004  .
end data.

MISSING VALUES g (9, 99, 999).

EXAMINE
        /VARIABLES = x
        BY  g
        /STATISTICS = EXTREME
        /NOTOTAL
        /MISSING = REPORT.
])


AT_CHECK([pspp -O format=csv examine-report.sps], [0], [dnl
Table: Reading free-form data from INLINE.
Variable,Format
x,F8.0
g,F8.0

Table: Case Processing Summary
,,Cases,,,,,
,,Valid,,Missing,,Total,
,g,N,Percent,N,Percent,N,Percent
x,. (missing),4,100%,0,0%,4,100%
,1,9,100%,0,0%,9,100%
,2,9,100%,0,0%,9,100%
,9 (missing),4,100%,0,0%,4,100%
,99 (missing),5,100%,0,0%,5,100%

Table: Extreme Values
,g,,,Case Number,Value
x,. (missing),Highest,1,31,4004
,,,2,30,3003
,,,3,29,2002
,,,4,28,1001
,,,5,0,0
,,Lowest,1,28,1001
,,,2,29,2002
,,,3,30,3003
,,,4,31,4004
,,,5,31,4004
,1,Highest,1,9,9
,,,2,8,8
,,,3,7,7
,,,4,6,6
,,,5,5,5
,,Lowest,1,1,1
,,,2,2,2
,,,3,3,3
,,,4,4,4
,,,5,5,5
,2,Highest,1,18,90
,,,2,17,80
,,,3,16,70
,,,4,15,60
,,,5,14,50
,,Lowest,1,10,10
,,,2,11,20
,,,3,12,30
,,,4,13,40
,,,5,14,50
,9 (missing),Highest,1,22,401
,,,2,21,301
,,,3,20,201
,,,4,19,101
,,,5,0,0
,,Lowest,1,19,101
,,,2,20,201
,,,3,21,301
,,,4,22,401
,,,5,22,401
,99 (missing),Highest,1,27,901
,,,2,26,801
,,,3,25,701
,,,4,24,601
,,,5,23,501
,,Lowest,1,23,501
,,,2,24,601
,,,3,25,701
,,,4,26,801
,,,5,27,901
])


AT_CLEANUP 