Patch #6441. Reviewed by John Darrington.
[pspp-builds.git] / tests / formats / format-guesser.sh
1 #! /bin/sh
2
3 # Tests guessing of data formats from data.
4
5 TEMPDIR=/tmp/pspp-tst-$$
6
7 # ensure that top_builddir  are absolute
8 if [ -z "$top_builddir" ] ; then top_builddir=. ; fi
9 if [ -z "$top_srcdir" ] ; then top_srcdir=. ; fi
10 top_builddir=`cd $top_builddir; pwd`
11 PSPP=$top_builddir/src/ui/terminal/pspp
12
13 # ensure that top_srcdir is absolute
14 top_srcdir=`cd $top_srcdir; pwd`
15
16 STAT_CONFIG_PATH=$top_srcdir/config
17 export STAT_CONFIG_PATH
18
19
20 cleanup()
21 {
22      cd /
23      rm -rf $TEMPDIR
24      :
25 }
26
27
28 fail()
29 {
30     echo $activity
31     echo FAILED
32     cleanup;
33     exit 1;
34 }
35
36
37 no_result()
38 {
39     echo $activity
40     echo NO RESULT;
41     cleanup;
42     exit 2;
43 }
44
45 pass()
46 {
47     cleanup;
48     exit 0;
49 }
50
51 mkdir -p $TEMPDIR
52
53 cd $TEMPDIR
54 activity="create test data"
55 sed -ne 's/#.*//;/^[    ]*$/!p' > $TEMPDIR/test-list <<'EOF'
56 # No data.
57 => F8.2
58 "" => F8.2
59 "." => F8.2
60
61 # Numeric formats.
62 "1.2" => F3.1
63 "$1.2" => DOLLAR4.1
64 "1.2%" => PCT4.1
65 "$1.2%" => A5
66 "1e5" => E3.0
67 "1e+5" => E4.0
68 "1+5" => E3.0
69 "1-5" => E3.0
70 "1.2e5" => E5.1
71 "1.3e+5" => E6.1
72 "1.4+5" => E5.1
73 "1e" => A2
74 "1e+" => A3
75 "1+" => A2
76 "1-" => A2
77 "1.5-5" => E5.1
78 "1,123" => COMMA5.0         # Is , is grouping or decimal? Assume grouping.
79 "1.123" => F5.3             # Ditto.
80 "1,12" => F4.2              # Not a group of 3, so last delim must be decimal.
81 "1.12" => F4.2              # Ditto.
82 "1,1234" => F6.4            # Not a group of 3, so last delim must be decimal.
83 "1.1234" => F6.4            # Ditto.
84 "$1.234" => DOLLAR6.3       # Dollar sign means decimal has to be '.'.
85 "$1,234" => DOLLAR6.0       # Ditto.
86 "1.234%" => PCT6.3          # Percent sign means decimal has to be '.'.
87 "1,234%" => PCT6.0          # Ditto.
88 "1,123.456" => COMMA9.3     # Both '.' and ',', so last delim must be decimal.
89 "1.123,456" => DOT9.3       # Ditto.
90 "1,123,456.45" => COMMA12.2 # Ditto.
91 "1.123.456,45" => DOT12.2   # Ditto.
92 "1,123,456" => COMMA9.0     # Ditto.
93 "1.123.456" => DOT9.0       # Ditto.
94
95 # Date and time formats.
96 "01-OCT-1978" => DATE11
97 "01-13-99" => ADATE8
98 "1-13-99" => ADATE7 (ADATE8)
99 "13-01-99" => EDATE8
100 "13-1-99" => EDATE7 (EDATE8)
101 "32-1-1" => SDATE6 (SDATE8)
102 "1q01" => QYR4
103 "1Q01" => QYR4
104 "1 q 01" => QYR6
105 "1 Q 01" => QYR6
106 "1q2001" => QYR6
107 "1Q2001" => QYR6
108 "1 q 2001" => QYR8
109 "1 Q 2001" => QYR8
110 "oct 05" => MOYR6
111 "oct 2005" => MOYR8
112 "1-1-01 1:2" => A10             # Minute needs at least two digits.
113 "1-1-01 1:02" => DATETIME11.0 (DATETIME17.0)
114 "1-1-01 1:02:3" => A13          # Second needs at least two digits.
115 "1-1-01 1:02:03" => DATETIME20.0
116 "1-1-01 1:02:03.1" => DATETIME20.1 (DATETIME22.1)
117 "1-1-01 +1:02:03.1" => DATETIME20.1 (DATETIME22.1)
118 "1-1-01 -1:02:03.1" => DATETIME20.1 (DATETIME22.1)
119 "1:30" => TIME4.0 (TIME5.0)
120 "1:30:05" => TIME8.0
121 "-1:30" => TIME5.0
122 "+1:30" => TIME5.0
123 "-1:30:15" => TIME8.0
124 "+1:30:15" => TIME8.0
125 "-1:30:15.5" => TIME10.1
126 "+1:30:15.75" => TIME11.2
127 "1 1:30" => DTIME6.0 (DTIME8.0)
128 "+1 1:30" => DTIME7.0 (DTIME8.0)
129 "-1 1:30" => DTIME7.0 (DTIME8.0)
130 "-1-13-99" => A8
131 "+1-13-99" => A8
132 "1+13+99" => A7
133 "1:00:01.03" => TIME10.2 (TIME11.2)
134 "12 1:00:01.3" => DTIME12.1 (DTIME13.1)
135 "jan" => MONTH3
136 "Feb" => MONTH3
137 "MAR" => MONTH3
138 "i" => MONTH1 (MONTH3)
139 "ii" => MONTH2 (MONTH3)
140 "iii" => MONTH3
141 "iiii" => A4
142 "iv" => MONTH2 (MONTH3)
143 "v" => MONTH1 (MONTH3)
144 "vi" => MONTH2 (MONTH3)
145 "vii" => MONTH3
146 "viii" => MONTH4
147 "ix" => MONTH2 (MONTH3)
148 "viiii" => A5
149 "x" => MONTH1 (MONTH3)
150 "xi" => MONTH2 (MONTH3)
151 "xii" => MONTH3
152 "january" => MONTH7
153 "janaury" => MONTH7
154 "february" => MONTH8
155 "febraury" => MONTH8
156 "march" => MONTH5
157 "marhc" => MONTH5
158 "april" => MONTH5
159 "may" => MONTH3
160 "june" => MONTH4
161 "july" => MONTH4
162 "august" => MONTH6
163 "september" => MONTH9
164 "october" => MONTH7
165 "november" => MONTH8
166 "decmeber" => MONTH8
167 "december" => MONTH8
168 "monady" => WKDAY6
169 "tuseday" => WKDAY7
170 "wedensday" => WKDAY9
171 "thurdsay" => WKDAY8
172 "fridya" => WKDAY6
173 "saturady" => WKDAY8
174 "sudnay" => WKDAY6
175
176 # Ambiguous; bias in favor of more sensible DD/MM/YY format:
177 "1/1/1978" => EDATE8
178 "01/01/01" => EDATE8
179
180 # Several ambiguous dates can be clarified by one unambiguous example:
181 "1/1/1978" "1/2/1978" "1/3/1978" "1/13/1978" => ADATE9 # MM/DD/YY
182 "01/01/01" "02/01/01" "03/01/01" "13/01/01" => EDATE8  # DD/MM/YY
183 "01/01/01" "02/01/01" "03/01/01" "2013/01/01" => SDATE10 # YY/MM/DD
184 EOF
185 if [ $? -ne 0 ] ; then no_result ; fi
186
187 activity="create syntax file"
188 {
189   echo "SET DECIMAL=DOT." &&
190   sed < $TEMPDIR/test-list -e 's#^\(.*\)=> \(.*\)$#DEBUG FORMAT GUESSER \1.#'
191 } > $TEMPDIR/test.stat
192 if [ $? -ne 0 ] ; then no_result ; fi
193
194 activity="run program"
195 $SUPERVISOR $PSPP --testing-mode \
196          $TEMPDIR/test.stat >$TEMPDIR/test.err 2> $TEMPDIR/test.out
197
198 activity="compare output"
199 perl -pi -e 's/^\s*$//g' $TEMPDIR/test-list $TEMPDIR/test.out
200 diff -b $TEMPDIR/test-list $TEMPDIR/test.out
201 if [ $? -ne 0 ] ; then fail ; fi
202
203 pass