source: git/tests/cavern.tst

main
Last change on this file was 75ff53a, checked in by Olly Betts <olly@…>, 85 minutes ago

Fixes to *data handling

  • "ignoreall" as the final reading in style "nosurvey" was getting ignored - e.g. in:

*data nosurvey station ignoreall

  • Report an error for a reading after ignoreall.
  • Report NEWLINE can't be the last reading when the readings list ends ignoreall newline (we were reporting the less clear `Too few readings for data style "..."`), e.g.:

*data cylpolar station depth ignoreall newline

  • Fix context for NEWLINE can't be the last reading error to indicate the whole NEWLINE token.
  • Add test coverage for *data normal error cases.
  • Improve test coverage for *data cylpolar and *data nosurvey error cases.
  • Property mode set to 100755
File size: 14.1 KB
Line 
1#!/bin/sh
2#
3# Survex test suite - cavern tests
4# Copyright (C) 1999-2025 Olly Betts
5#
6# This program is free software; you can redistribute it and/or modify
7# it under the terms of the GNU General Public License as published by
8# the Free Software Foundation; either version 2 of the License, or
9# (at your option) any later version.
10#
11# This program is distributed in the hope that it will be useful,
12# but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14# GNU General Public License for more details.
15#
16# You should have received a copy of the GNU General Public License
17# along with this program; if not, see
18# <https://www.gnu.org/licenses/>.
19
20testdir=`echo $0 | sed 's!/[^/]*$!!' || echo '.'`
21
22test -x "$testdir"/../src/cavern || testdir=.
23
24# Make testdir absolute, so we can cd before running cavern to get a consistent
25# path in diagnostic messages.
26testdir=`cd "$testdir" && pwd`
27
28# allow us to run tests standalone more easily
29: ${srcdir="$testdir"}
30if [ -z "$SURVEXLIB" ] ; then
31 SURVEXLIB=`cd "$srcdir/../lib" && pwd`
32 export SURVEXLIB
33fi
34
35# force VERBOSE if we're run on a subset of tests
36test -n "$*" && VERBOSE=1
37
38case `uname -a` in
39 MINGW*)
40 DIFF='diff --strip-trailing-cr'
41 QUIET_DIFF='diff -q --strip-trailing-cr'
42 ;;
43 *)
44 DIFF=diff
45 # Use cmp when we can as a small optimisation.
46 QUIET_DIFF='cmp -s'
47 ;;
48esac
49
50: ${CAVERN="$testdir"/../src/cavern}
51: ${DIFFPOS="$testdir"/../src/diffpos}
52: ${DUMP3D="$testdir"/../src/dump3d}
53: ${SURVEXPORT="$testdir"/../src/survexport}
54
55# FIXME survexport is failing to run in CI on msys+mingw.
56TESTS_=
57[ "$OSTYPE" = "cygwin" ] || TESTS_="3dexport \
58 dxffullcoords dxfsurfequate\
59 gpxexport\
60 hpglexport hpglexportanon\
61 jsonexport\
62 kmlexport kmlexportanon\
63 pltexport\
64 svgexport"
65
66: ${TESTS=${*:-"singlefix singlereffix oneleg midpoint lollipop fixedlollipop\
67 cross firststn\
68 deltastar deltastar2 deltastarhanging\
69 bug3 calibrate_tape nosurvey2 cartesian cartesian2\
70 lengthunits angleunits cmd_alias cmd_alias_bad cmd_case cmd_case_bad\
71 cmd_copyright cmd_copyright_bad cmd_fix cmd_fix2 cmd_fix_bad cmd_fix_bad2\
72 cmd_solve cmd_entrance cmd_entrance_bad cmd_ref cmd_ref_bad\
73 cmd_sd cmd_sd_bad cmd_set cmd_set_bad cmd_set_dot_in_name\
74 cmd_truncate cmd_truncate_bad\
75 beginroot revcomplist break_replace_pfx bug0 bug1 bug2 bug4 bug5\
76 equate_bug\
77 expobug require export export2 includecomment\
78 self_loop self_eq_loop reenterwarn cmd_default cmd_default_bad\
79 cmd_prefix cmd_prefix_bad\
80 cmd_begin_bad cmd_equate_bad cmd_export_bad\
81 singlefixerr singlereffixerr\
82 begin_no_end end_no_begin end_no_begin_nest require_fail\
83 exporterr1 exporterr2 exporterr3 exporterr4 exporterr5\
84 exporterr1b exporterr2b exporterr3b exporterr6 exporterr6b\
85 hanging_cpt badinc badinc2 badinc3 badinc4 badinc5.mak nonexistent_file ONELEG\
86 stnsurvey1 stnsurvey2\
87 tapelessthandepth longname chinabug chinabug2\
88 multinormal multinormignall multidiving multicylpolar multicartesian\
89 multinosurv multinormalbad multibug\
90 cmd_instruments cmd_instruments_bad\
91 cmd_team cmd_team_bad\
92 cmd_title cmd_titlebad cmd_dummy cmd_infer cmd_date cmd_datebad cmd_datebad2\
93 cartes diving cylpolar normal normal_bad normignall nosurv cmd_flags\
94 bad_cmd_flags plumb unusedstation exportnakedbegin oldestyle bugdz\
95 baddatacylpolar baddatanormal baddatanosurv badnewline badquantities\
96 imgoffbyone infereqtopofil 3sdfixbug\
97 omitclino back back2 bad_back\
98 notentranceorexport inferunknown inferexports bad_units_factor\
99 bad_units_qlist\
100 percent_gradient dotinsurvey leandroclino lowsd revdir gettokennullderef\
101 nosurveyhanging nosurveyhanging2\
102 cmd_solve_nothing cmd_solve_nothing_implicit\
103 cmd_cartesian cmd_cartesian_bad\
104 cmd_calibrate cmd_declination cmd_declination_auto cmd_declination_auto_bad\
105 cmd_declination_conv cmd_declination_conv_proj_bug\
106 lech level 2fixbug dot17 3dcorner\
107 unconnected-bug\
108 backread.dat corrections.dat depthguage.dat flags.dat karstcompat.dat\
109 lrud.dat nomeasure.dat noteam.dat\
110 badmak.mak\
111 fixfeet.mak utm.mak\
112 clptest.dat clptest.clp\
113 walls.srv\
114 badomit.srv badopts.srv badreadings.srv\
115 unknowndirective.srv\
116 wallsbaddatum.wpj\
117 wallsdecl.wpj\
118 wallsdiving.srv\
119 passage hanging_lrud equatenosuchstn surveytypo\
120 skipafterbadomit passagebad badreadingdotplus badcalibrate calibrate_clino\
121 badunits badbegin anonstn anonstnbad anonstnrev doubleinc reenterlots\
122 cs csbad csbadsdfix csfeet cslonglat omitfixaroundsolve repeatreading\
123 mixedeols utf8bom nonewlineateof suspectreadings cmd_data_default\
124 cmd_data_ignore\
125 quadrant_bearing bad_quadrant_bearing\
126 samename tabinhighlight legacytokens\
127 component_count_bug component_count_bug2\
128 $TESTS_
129"}}
130
131# Skip 3dexport...svgexport for mingw for now FIXME
132
133# Test file stnsurvey3.svx missing: pos=fail # We exit before the error count.
134
135LC_ALL=C
136export LC_ALL
137SURVEXLANG=en
138export SURVEXLANG
139
140# Suppress checking for leaks on exit if we're build with lsan - we don't
141# generally waste effort to free all allocations as the OS will reclaim
142# memory on exit.
143LSAN_OPTIONS=leak_check_at_exit=0
144export LSAN_OPTIONS
145
146# Allow datestamps in 3d files (we normalise the expected output for GPX
147# etc) to allow for the datestamp not being fixed, but under SOURCE_DATE_EPOCH
148# the datestamp is omitted entirely which would break those testcases.
149unset SOURCE_DATE_EPOCH
150
151vg_error=123
152vg_log=$testdir/vg.log
153if [ -n "$VALGRIND" ] ; then
154 rm -f "$vg_log"
155 CAVERN="$VALGRIND --log-file=$vg_log --error-exitcode=$vg_error $CAVERN"
156 DIFFPOS="$VALGRIND --log-file=$vg_log --error-exitcode=$vg_error $DIFFPOS"
157 DUMP3D="$VALGRIND --log-file=$vg_log --error-exitcode=$vg_error $DUMP3D"
158 SURVEXPORT="$VALGRIND --log-file=$vg_log --error-exitcode=$vg_error $SURVEXPORT"
159fi
160
161for file in $TESTS ; do
162 case $file in
163 nonexistent_file*|ONELEG)
164 # ONELEG tests that we don't apply special handling to command line
165 # arguments, only those in *include.
166 realfile= ;;
167 *.*) realfile=$srcdir/$file ;;
168 *) realfile=$srcdir/$file.svx ;;
169 esac
170
171 if [ x"$file" = xONELEG ] && [ -f "ONELEG.SVX" ] ; then
172 echo "Case insensitive filing system - skipping ONELEG testcase"
173 continue
174 fi
175
176 if [ -n "$realfile" ] && [ ! -r "$realfile" ] ; then
177 echo "Don't know how to run test '$file'"
178 exit 1
179 fi
180
181 echo "$file"
182
183 # how many warnings to expect (or empty not to check)
184 warn=
185
186 # how many errors to expect (or empty not to check)
187 error=
188
189 # One of:
190 # yes : diffpos 3D file output with <testcase_name>.pos
191 # no : Check that a 3D file is produced, but not positions in it
192 # fail : Check that a 3D file is NOT produced
193 # dump : Compare output of dump3d to <testcase_name>.dump
194 # 3d : Convert to 3D with survexport, compare dump3d to <testcase_name>.dump
195 # dxf : Convert to DXF with survexport and compare with <testcase_name>.dxf
196 # gpx : Convert to GPX with survexport and compare with <testcase_name>.gpx
197 # json : Convert to JSON with survexport and compare with <testcase_name>.json
198 # kml : Convert to KML with survexport and compare with <testcase_name>.kml
199 # plt : Convert to PLT with survexport and compare with <testcase_name>.plt
200 # svg : Convert to SVG with survexport and compare with <testcase_name>.svg
201 pos=
202
203 case $file in
204 backread.dat|clptest.dat|clptest.clp|depthguage.dat|karstcompat.dat)
205 pos=dump
206 warn=0
207 ;;
208 flags.dat)
209 pos=dump
210 warn=1
211 ;;
212 *.dat)
213 # .dat files can't start with a comment. All the other .dat tests
214 # have the same settings.
215 pos=yes
216 warn=0
217 ;;
218 nonexistent_file*|ONELEG)
219 # These testcase files don't exist (or for ONELEG exist with a different
220 # case). They all have the same settings.
221 pos=fail
222 ;;
223 wallsbaddatum.wpj)
224 # .wpj files can't start with a comment.
225 pos=fail
226 warn=0
227 err=1
228 ;;
229 *.wpj)
230 # .wpj files can't start with a comment.
231 pos=dump
232 warn=0
233 ;;
234 *)
235 survexportopts=
236 read header < "$realfile"
237 set dummy $header
238 while shift && [ -n "$1" ] ; do
239 case $1 in
240 pos=*) pos=`expr "$1" : 'pos=\(.*\)'` ;;
241 warn=*) warn=`expr "$1" : 'warn=\(.*\)'` ;;
242 error=*) error=`expr "$1" : 'error=\(.*\)'` ;;
243 survexportopt=*)
244 survexportopts="$survexportopts "`expr "$1" : 'survexportopt=\(.*\)'`
245 ;;
246 esac
247 done
248 ;;
249 esac
250
251 basefile=$srcdir/$file
252 case $file in
253 *.*)
254 input="./$file"
255 basefile=`echo "$basefile"|sed 's/\.[^.]*$//'` ;;
256 *)
257 input="./$file.svx" ;;
258 esac
259 outfile=$basefile.out
260 outfile2=$basefile.altout
261 posfile=$basefile.pos
262 rm -f tmp.*
263 pwd=`pwd`
264 cd "$srcdir"
265 srcdir=. SOURCE_DATE_EPOCH=1 $CAVERN "$input" --output="$pwd/tmp" > "$pwd/tmp.out"
266 exitcode=$?
267 cd "$pwd"
268 if test "$VERBOSE" = 1 ; then
269 if test fail = "$pos" ; then
270 test $exitcode != 0 || cat tmp.out
271 else
272 test $exitcode = 0 || cat tmp.out
273 fi
274 elif test -n "$VERBOSE" ; then
275 cat tmp.out
276 fi
277 if [ -n "$VALGRIND" ] ; then
278 if [ $exitcode = "$vg_error" ] ; then
279 cat "$vg_log"
280 rm "$vg_log"
281 exit 1
282 fi
283 rm "$vg_log"
284 fi
285 if test fail = "$pos" ; then
286 # success gives 0, signal (128 + <signal number>)
287 test $exitcode = 1 || exit 1
288 else
289 test $exitcode = 0 || exit 1
290 fi
291 if test -n "$warn" ; then
292 w=`sed '$!d;s/^There were \([0-9]*\).*/\1/p;d' tmp.out`
293 if test x"${w:-0}" != x"$warn" ; then
294 test -n "$VERBOSE" && echo "Got $w warnings, expected $warn"
295 exit 1
296 fi
297 fi
298 if test -n "$error" ; then
299 e=`sed '$!d;s/^There were .* and \([0-9][0-9]*\).*/\1/p;d' tmp.out`
300 if test x"${e:-0}" != x"$error" ; then
301 test -n "$VERBOSE" && echo "Got $e errors, expected $error"
302 exit 1
303 fi
304 fi
305 # Fail if nan, NaN, etc in output (which might be followed by m for metres or
306 # s for seconds).
307 if egrep -q '(^|[^A-Za-z0-9])nan[ms]?($|[^A-Za-z0-9])' tmp.out ; then
308 echo "Not-a-number appears in output"
309 exit 1
310 fi
311
312 case $pos in
313 yes)
314 if test "$VERBOSE" = 1 ; then
315 $DIFFPOS "$posfile" tmp.3d > tmp.stdout
316 exitcode=$?
317 test $exitcode = 0 || cat tmp.stdout
318 rm tmp.stdout
319 elif test -n "$VERBOSE" ; then
320 $DIFFPOS "$posfile" tmp.3d
321 exitcode=$?
322 else
323 $DIFFPOS "$posfile" tmp.3d > /dev/null
324 exitcode=$?
325 fi
326 if [ -n "$VALGRIND" ] ; then
327 if [ $exitcode = "$vg_error" ] ; then
328 cat "$vg_log"
329 rm "$vg_log"
330 exit 1
331 fi
332 rm "$vg_log"
333 fi
334 [ "$exitcode" = 0 ] || exit 1
335 ;;
336 dump)
337 expectedfile=$basefile.dump
338 tmpfile=tmp.dump
339 $DUMP3D --show-dates --legs tmp.3d > "$tmpfile"
340 exitcode=$?
341 if [ -n "$VALGRIND" ] ; then
342 if [ $exitcode = "$vg_error" ] ; then
343 cat "$vg_log"
344 rm "$vg_log"
345 exit 1
346 fi
347 rm "$vg_log"
348 fi
349 [ "$exitcode" = 0 ] || exit 1
350
351 if ! $QUIET_DIFF "$expectedfile" "$tmpfile" ; then
352 test -z "$VERBOSE" || $DIFF "$expectedfile" "$tmpfile"
353 exit 1
354 fi
355 ;;
356 dxf|gpx|hpgl|json|kml|plt|svg)
357 # $pos gives us the file extension here.
358 expectedfile=$basefile.$pos
359 tmpfile=tmp.$pos
360 if test "$VERBOSE" = 1 ; then
361 $SURVEXPORT --defaults$survexportopts tmp.3d "$tmpfile" > tmp.stdout
362 exitcode=$?
363 test $exitcode = 0 || cat tmp.stdout
364 rm tmp.stdout
365 elif test -n "$VERBOSE" ; then
366 $SURVEXPORT --defaults$survexportopts tmp.3d "$tmpfile"
367 exitcode=$?
368 else
369 $SURVEXPORT --defaults$survexportopts tmp.3d "$tmpfile" > /dev/null
370 exitcode=$?
371 fi
372 if [ -n "$VALGRIND" ] ; then
373 if [ $exitcode = "$vg_error" ] ; then
374 cat "$vg_log"
375 rm "$vg_log"
376 exit 1
377 fi
378 rm "$vg_log"
379 fi
380 [ "$exitcode" = 0 ] || exit 1
381
382 # Normalise exported file if required.
383 case $pos in
384 dxf)
385 # On x86 excess precision can result in -0.00 for some coordinates.
386 sed 's/^-0\.00\>/0.00/;s/ -0\.00\>/ 0.00/g' < "$tmpfile" > tmp.tmp
387 mv tmp.tmp "$tmpfile"
388 ;;
389 json)
390 # On x86 excess precision can result in -0.00 for some coordinates.
391 sed 's/-0\.00\>/0.00/g' < "$tmpfile" > tmp.tmp
392 mv tmp.tmp "$tmpfile"
393 ;;
394 gpx)
395 sed 's,<time>[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]T[0-9][0-9]:[0-9][0-9]:[0-9][0-9]Z</time>,<time>REDACTED</time>,;s,survex [0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*,survex REDACTED,' < "$tmpfile" > tmp.tmp
396 mv tmp.tmp "$tmpfile"
397 ;;
398 esac
399
400 if ! $QUIET_DIFF "$expectedfile" "$tmpfile" ; then
401 test -z "$VERBOSE" || $DIFF "$expectedfile" "$tmpfile"
402 exit 1
403 fi
404 ;;
405 3d)
406 expectedfile=$basefile.dump
407 tmpfile=tmp.dump
408 if test "$VERBOSE" = 1 ; then
409 SOURCE_DATE_EPOCH=1 $SURVEXPORT --defaults$survexportopts tmp.3d "$tmpfile.3d" > tmp.stdout
410 exitcode=$?
411 test $exitcode = 0 || cat tmp.stdout
412 elif test -n "$VERBOSE" ; then
413 SOURCE_DATE_EPOCH=1 $SURVEXPORT --defaults$survexportopts tmp.3d "$tmpfile.3d"
414 exitcode=$?
415 else
416 SOURCE_DATE_EPOCH=1 $SURVEXPORT --defaults$survexportopts tmp.3d "$tmpfile.3d" > /dev/null
417 exitcode=$?
418 fi
419 $DUMP3D --show-dates --legs "$tmpfile.3d" > "$tmpfile"
420 if [ -n "$VALGRIND" ] ; then
421 if [ $exitcode = "$vg_error" ] ; then
422 cat "$vg_log"
423 rm "$vg_log"
424 exit 1
425 fi
426 rm "$vg_log"
427 fi
428 [ "$exitcode" = 0 ] || exit 1
429
430 if ! $QUIET_DIFF "$expectedfile" "$tmpfile" ; then
431 test -z "$VERBOSE" || $DIFF "$expectedfile" "$tmpfile"
432 exit 1
433 fi
434 ;;
435 no)
436 test -f tmp.3d || exit 1 ;;
437 fail)
438 test -f tmp.3d && exit 1
439 # Check that last line doesn't contains "Bug in program detected"
440 case `tail -n 1 tmp.out` in
441 *"Bug in program detected"*) exit 1 ;;
442 esac ;;
443 *)
444 echo "Bad value for pos: '$pos'" ; exit 1 ;;
445 esac
446
447 if test -f "$outfile" ; then
448 # Version and time used info from output, working around Apple's stone-age
449 # sed.
450 sed '1,/^Copyright/d;/^\(CPU \)*[Tt]ime used *[0-9][0-9.]*s$/d;s!.*/src/\(cavern: \)!\1!' tmp.out > tmp.out2
451 mv tmp.out2 tmp.out
452 # Check output is as expected.
453 if $QUIET_DIFF "$outfile" tmp.out ; then
454 : # Matches.
455 elif [ -f "$outfile2" ] && $QUIET_DIFF "$outfile2" tmp.out ; then
456 : # Matches alternative output (e.g. due to older PROJ).
457 else
458 test -z "$VERBOSE" || $DIFF "$outfile" tmp.out
459 exit 1
460 fi
461 fi
462 rm -f tmp.*
463done
464test -n "$VERBOSE" && echo "Test passed"
465exit 0
Note: See TracBrowser for help on using the repository browser.