source: git/tests/cavern.tst

main
Last change on this file was c3bd62a, checked in by Olly Betts <olly@…>, 3 weeks ago

Allow exporting/not exporting anonymous stations

The default is chosen as most appropriate for each format.

  • Property mode set to 100755
File size: 14.0 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 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.