source: git/tests/cavern.tst @ 7ee64a0

stereo-2025
Last change on this file since 7ee64a0 was f189010, checked in by Olly Betts <olly@…>, 8 months ago

Handle a lollipop with a fixed stick end specially

We can just calculate the position of the unfixed station by adding
vectors and solve the position of the unfixed point without having to
build and solve a single element matrix.

This will generally reduce the number of "Solving one equation..."
messages when solving a complex survey network.

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