+
+# Bug #24752.
+AT_SETUP([3-way CROSSTABS])
+AT_DATA([crosstabs.sps],
+ [[DATA LIST FIXED
+ / x 1-2
+ y 3
+ z 4.
+
+BEGIN DATA.
+0111
+0222
+0311
+0412
+0521
+0612
+0711
+0811
+0912
+END DATA.
+
+LIST.
+
+
+CROSSTABS TABLES x by y by z.
+]])
+AT_CHECK([pspp -O format=csv crosstabs.sps], [0],
+ [[Table: Reading 1 record from INLINE.
+Variable,Record,Columns,Format
+x,1,1- 2,F2.0
+y,1,3- 3,F1.0
+z,1,4- 4,F1.0
+
+Table: Data List
+x,y,z
+1,1,1
+2,2,2
+3,1,1
+4,1,2
+5,2,1
+6,1,2
+7,1,1
+8,1,1
+9,1,2
+
+Table: Summary.
+,Cases,,,,,
+,Valid,,Missing,,Total,
+,N,Percent,N,Percent,N,Percent
+x * y * z,9,100.0%,0,0.0%,9,100.0%
+
+Table: x * y * z [count].
+z,,y,,
+,x,1,2,Total
+1,1,1.0,.0,1.0
+,3,1.0,.0,1.0
+,5,.0,1.0,1.0
+,7,1.0,.0,1.0
+,8,1.0,.0,1.0
+Total,,4.0,1.0,5.0
+2,2,.0,1.0,1.0
+,4,1.0,.0,1.0
+,6,1.0,.0,1.0
+,9,1.0,.0,1.0
+Total,,3.0,1.0,4.0
+]])
+AT_CLEANUP
+
+
+
+AT_SETUP([CROSSTABS descending sort order])
+AT_DATA([crosstabs-descending.sps],
+ [[DATA LIST NOTABLE LIST /x * y *.
+BEGIN DATA.
+2 2
+2 2
+3 1
+4 1
+3 2
+3 2
+END DATA.
+
+CROSSTABS
+ /TABLES= x BY y
+ /FORMAT = DVALUE.
+]])
+
+AT_CHECK([pspp -O format=csv crosstabs-descending.sps], [0],
+ [[Table: Summary.
+,Cases,,,,,
+,Valid,,Missing,,Total,
+,N,Percent,N,Percent,N,Percent
+x * y,6,100.0%,0,0.0%,6,100.0%
+
+Table: x * y [count].
+,y,,
+x,2.00,1.00,Total
+4.00,.0,1.0,1.0
+3.00,2.0,1.0,3.0
+2.00,2.0,.0,2.0
+Total,4.0,2.0,6.0
+]])
+AT_CLEANUP
+
+# Bug #31260.
+AT_SETUP([CROSSTABS crash when all cases missing])
+AT_DATA([crosstabs.sps], [dnl
+DATA LIST LIST NOTABLE /X1 X2.
+BEGIN DATA.
+1 1
+END DATA.
+
+MISSING VALUES x2 (1).
+
+CROSSTABS /TABLES= X1 by X2.
+])
+AT_CHECK([pspp -O format=csv crosstabs.sps], [0], [dnl
+Table: Summary.
+,Cases,,,,,
+,Valid,,Missing,,Total,
+,N,Percent,N,Percent,N,Percent
+X1 * X2,0,0.0%,1,100.0%,1,100.0%
+
+crosstabs.sps:8: warning: CROSSTABS: Crosstabulation X1 * X2 contained no non-missing cases.
+])
+AT_CLEANUP