===============================================================================

Various test material, mostly converted from selftest entries in PJ_xxx.c

Contrary to the material in builtins.gie, this material is handwritten and
intends to exercise corner cases.

===============================================================================


<gie>

-------------------------------------------------------------------------------
Two ob_tran tests from nad/testvarious
-------------------------------------------------------------------------------
operation +proj=ob_tran  +o_proj=moll  +R=6378137.0  +o_lon_p=0  +o_lat_p=0  +lon_0=180
-------------------------------------------------------------------------------
tolerance 1 mm
direction inverse

accept    300000 400000
expect    -42.7562158333  85.5911341667

direction forward

accept    10 20
expect    -1384841.18787 7581707.88240
-------------------------------------------------------------------------------





-------------------------------------------------------------------------------
Two tests from PJ_molodensky.c
-------------------------------------------------------------------------------
operation proj=molodensky a=6378160 rf=298.25
          da=-23  df=-8.120449e-8  dx=-134  dy=-48  dz=149
          abridged
-------------------------------------------------------------------------------
tolerance 2 m

accept    144.9667  -37.8      50     0
expect    144.968   -37.79848  46.378 0

roundtrip 100    1 m
-------------------------------------------------------------------------------
Same thing once more, but this time unabridged
-------------------------------------------------------------------------------
operation proj=molodensky a=6378160 rf=298.25
          da=-23  df=-8.120449e-8  dx=-134  dy=-48  dz=149
-------------------------------------------------------------------------------
tolerance 2 m

accept    144.9667  -37.8      50     0
expect    144.968   -37.79848  46.378 0

roundtrip 100    1 m
-------------------------------------------------------------------------------





-------------------------------------------------------------------------------
Some tests from PJ_pipeline.c
-------------------------------------------------------------------------------
Forward-reverse geo->utm->geo (4D functions)
-------------------------------------------------------------------------------
operation proj=pipeline zone=32 step
          proj=utm  ellps=GRS80 step
          proj=utm  ellps=GRS80 inv
-------------------------------------------------------------------------------
tolerance 0.1 mm

accept 12 55 0 0
expect 12 55 0 0

Now the inverse direction (still same result: the pipeline is symmetrical)

direction inverse
expect 12 55 0 0
-------------------------------------------------------------------------------
And now the back-to-back situation utm->geo->utm (4D functions)
-------------------------------------------------------------------------------
operation proj=pipeline zone=32 ellps=GRS80 step
          proj=utm inv                      step
          proj=utm
-------------------------------------------------------------------------------
accept 691875.63214  6098907.82501  0  0
expect 691875.63214  6098907.82501  0  0
direction inverse
expect 691875.63214  6098907.82501  0  0
-------------------------------------------------------------------------------
Forward-reverse geo->utm->geo (3D functions)
-------------------------------------------------------------------------------
operation proj=pipeline zone=32 step
          proj=utm  ellps=GRS80 step
          proj=utm  ellps=GRS80 inv
-------------------------------------------------------------------------------
tolerance 0.1 mm

accept 12 55 0
expect 12 55 0

Now the inverse direction (still same result: the pipeline is symmetrical)

direction inverse
expect 12 55 0
-------------------------------------------------------------------------------
And now the back-to-back situation utm->geo->utm (3D functions)
-------------------------------------------------------------------------------
operation proj=pipeline zone=32 ellps=GRS80 step
          proj=utm inv                      step
          proj=utm
-------------------------------------------------------------------------------
accept 691875.63214  6098907.82501  0
expect 691875.63214  6098907.82501  0
direction inverse
expect 691875.63214  6098907.82501  0
-------------------------------------------------------------------------------
Test a corner case: A rather pointless one-step pipeline geo->utm
-------------------------------------------------------------------------------
operation proj=pipeline step proj=utm zone=32 ellps=GRS80
-------------------------------------------------------------------------------
accept    12 55 0 0
expect    691875.63214  6098907.82501  0  0
direction inverse
accept    691875.63214  6098907.82501  0  0
expect    12 55 0 0
-------------------------------------------------------------------------------
Finally test a pipeline with more than one init step
-------------------------------------------------------------------------------
operation proj=pipeline
          step init=epsg:25832 inv
          step init=epsg:25833
          step init=epsg:25833 inv
          step init=epsg:25832
-------------------------------------------------------------------------------
accept    691875.63214  6098907.82501  0  0
expect    691875.63214  6098907.82501  0  0
direction inverse
accept    12 55 0 0
expect    12 55 0 0
-------------------------------------------------------------------------------
Test a few inversion scenarios (urm5 has no inverse operation)
-------------------------------------------------------------------------------
operation   proj=pipeline       step
            proj=urm5 n=0.5 inv
expect      failure pjd_err_malformed_pipeline

operation   proj=pipeline   inv step
            proj=urm5 n=0.5
expect      failure pjd_err_malformed_pipeline

operation   proj=pipeline   inv step
            proj=urm5 n=0.5 inv
accept      12 56
expect      1215663.2814182492      5452209.5424045017

operation   proj=pipeline step
            proj=urm5 n=0.5
accept      12 56
expect      1215663.2814182492      5452209.5424045017
-------------------------------------------------------------------------------
Test various failing scenarios.
-------------------------------------------------------------------------------
operation   proj=pipeline   step
            proj=pipeline   step
            proj=merc
expect      failure pjd_err_malformed_pipeline

operation   step proj=pipeline step proj=merc
expect      failure pjd_err_malformed_pipeline

operation   proj=pipeline
expect      failure pjd_err_malformed_pipeline


-------------------------------------------------------------------------------
Some tests from PJ_vgridshift.c
-------------------------------------------------------------------------------
operation  proj=vgridshift  grids=egm96_15.gtx  ellps=GRS80
-------------------------------------------------------------------------------
Appears there is a difference between the egm96_15.gtx distributed by OSGeo4W,
and the one from http://download.osgeo.org/proj/vdatum/egm96_15/egm96_15.gtx
N(12.5, 55.5) = -36.021305084228515625  (download.osgeo.org)
N(12.5, 55.5) = -35.880001068115234000  (OSGeo4W)
This is annoying, but must be handled elsewhere. We jump through the hoop by
setting a very lax tolerance.
-------------------------------------------------------------------------------
tolerance 15 cm
ignore    pjd_err_failed_to_load_grid
accept    12.5 55.5   0                  0
expect    12.5 55.5 -36.021305084228516  0

roundtrip 100 1 nm
-------------------------------------------------------------------------------
Fail on purpose: +grids parameter is mandatory
operation proj=vgridshift
expect    failure errno no_args

Fail on purpose: open non-existing grid
operation proj=vgridshift grids=nonexistinggrid.gtx
expect    failure errno failed_to_load_grid
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
operation  proj=vgridshift  grids=egm96_15.gtx  ellps=GRS80     multiplier=0.1
tolerance 15 cm
ignore    pjd_err_failed_to_load_grid
accept    12.5 55.5   0                  0
expect    12.5 55.5  3.6021305084228516  0

-------------------------------------------------------------------------------
Some tests from PJ_hgridshift.c
-------------------------------------------------------------------------------
operation  proj=hgridshift +grids=nzgd2kgrid0005.gsb  ellps=GRS80
-------------------------------------------------------------------------------
Note: These data are home grown and suitable for regression testing only
We need a set of authoritative test cases to test the nzgd2000 grid.
-------------------------------------------------------------------------------
tolerance 1 mm
ignore    pjd_err_failed_to_load_grid
accept    172.999892181021551 -45.001620431954613
expect    173                 -45
direction inverse
accept    173                 -45
expect    172.999892181021551 -45.001620431954613
-------------------------------------------------------------------------------



-------------------------------------------------------------------------------
# Fail on purpose: open non-existing grid:
operation proj=hgridshift grids=@nonexistinggrid.gsb,anothernonexistinggrid.gsb
expect    failure errno failed_to_load_grid

# Fail on purpose: +grids parameter is mandatory:
operation proj=hgridshift
expect    failure errno no_args
-------------------------------------------------------------------------------




-------------------------------------------------------------------------------
A number of tests from PJ_helmert.c
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
This example is from Lotti Jivall: "Simplified transformations from
ITRF2008/IGS08 to ETRS89 for maritime applications"
-------------------------------------------------------------------------------
operation  proj=helmert convention=coordinate_frame
           x=0.67678    y=0.65495   z=-0.52827
           rx=-0.022742 ry=0.012667 rz=0.022704  s=-0.01070
-------------------------------------------------------------------------------
tolerance 1 um
accept     3565285.00000000  855949.00000000  5201383.00000000
expect     3565285.41342351  855948.67986759  5201382.72939791
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
This example is a random point, transformed from ED50 to ETRS89 using KMStrans2
-------------------------------------------------------------------------------
operation   proj=helmert   exact    convention=coordinate_frame
            x=-081.0703    rx=-0.48488
            y=-089.3603    ry=-0.02436
            z=-115.7526    rz=-0.41321   s=-0.540645
-------------------------------------------------------------------------------
tolerance  1 um
accept     3494994.30120000 1056601.97250000 5212382.16660000
expect     3494909.84026368 1056506.78938633 5212265.66699761
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
This example is a coordinate from the geodetic observatory in Onsala,
Sweden transformed from ITRF2000 @ 2017.0 to ITRF93 @ 2017.0.

The test coordinate was transformed using GNSStrans, using transformation
parameters published by ITRF: ftp://itrf.ensg.ign.fr/pub/itrf/ITRF.TP
-------------------------------------------------------------------------------
operation  proj=helmert convention=position_vector
           x =  0.0127   dx = -0.0029   rx = -0.00039  drx = -0.00011
           y =  0.0065   dy = -0.0002   ry =  0.00080  dry = -0.00019
           z = -0.0209   dz = -0.0006   rz = -0.00114  drz =  0.00007

           s =  0.00195  ds =  0.00001  t_epoch = 1988.0
-------------------------------------------------------------------------------
tolerance  0.03 mm
accept     3370658.37800 711877.31400 5349787.08600  2017.0  # ITRF2000@2017.0
expect     3370658.18890 711877.42370 5349787.12430  2017.0  # ITRF93@2017.0
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
This example is from "A mathematical relationship between NAD27 and NAD83 (91)
State Plane coordinates in Southeastern Wisconsin":
http://www.sewrpc.org/SEWRPCFiles/Publications/TechRep/tr-034-Mathematical-Relationship-Between-NAD27-and-NAD83-91-State-Plane-Coordinates-Southeastern-Wisconsin.pdf

The test data is taken from p. 29. Here we are using point 203 and converting it
from NAD27 (ft) -> NAD83 (m). The paper reports a difference of 0.0014 m from
measured to computed coordinates, hence the test tolerance is set accordingly.
-------------------------------------------------------------------------------
operation  proj=helmert convention=coordinate_frame
           x=-9597.3572 y=.6112
           s=0.304794780637 theta=-1.244048
-------------------------------------------------------------------------------
tolerance  1 mm
accept     2546506.957 542256.609  0
expect     766563.675  165282.277  0
-------------------------------------------------------------------------------


-------------------------------------------------------------------------------
Finally test the 4D-capabilities of the proj.h API, especially that the
rotation matrix is updated when necessary.

Test coordinates from GNSStrans.
-------------------------------------------------------------------------------
operation  proj=helmert convention=position_vector
           x = 0.01270  dx =-0.0029  rx =-0.00039  drx =-0.00011
           y = 0.00650  dy =-0.0002  ry = 0.00080  dry =-0.00019
           z =-0.0209   dz =-0.0006  rz =-0.00114  drz = 0.00007
           s = 0.00195  ds = 0.00001
           t_epoch=1988.0
-------------------------------------------------------------------------------
tolerance  0.1 mm
accept     3370658.378    711877.314    5349787.086    2017.0
expect     3370658.18890  711877.42370  5349787.12430  2017.0
accept     3370658.378    711877.314    5349787.086    2018.0
expect     3370658.18087  711877.42750  5349787.12648  2018.0
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Test error cases of helmert
-------------------------------------------------------------------------------
# A rotational term implies an explicit convention to be specified
operation  proj=helmert rx=1
expect     failure   errno missing_arg

operation  proj=helmert rx=1 convention=foo
expect     failure   errno invalid_arg

operation  proj=helmert rx=1 convention=1
expect     failure   errno invalid_arg

# towgs84 in helmert context should alwas be position_vector
operation  proj=helmert towgs84=1,2,3,4,5,6,7 convention=coordinate_frame
expect     failure   errno invalid_arg

# Transpose no longer accepted
operation  proj=helmert transpose
expect     failure   errno invalid_arg


-------------------------------------------------------------------------------
geocentric latitude
-------------------------------------------------------------------------------
operation  proj=geoc ellps=GRS80
accept     12   55                  0 0
expect     12   54.818973308324573  0 0
roundtrip  1000

accept     12   90                  0 0
expect     12   90                  0 0

accept     12  -90                  0 0
expect     12  -90                  0 0

accept     12   89.99999999999      0 0
expect     12   89.999999999989996  0 0
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
geocentric latitude using old +geoc flag
-------------------------------------------------------------------------------
operation  proj=pipeline step proj=longlat ellps=GRS80 geoc inv
accept     12   55                  0 0
expect     12   54.818973308324573  0 0
roundtrip  1
-------------------------------------------------------------------------------



-------------------------------------------------------------------------------
some less used options
-------------------------------------------------------------------------------
operation  proj=utm  ellps=GRS80  zone=32  to_meter=0
expect     failure   errno unit_factor_less_than_0

operation  proj=utm  ellps=GRS80  zone=32  to_meter=10
accept     12   55
expect        69187.5632    609890.7825
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Test that gie can read DMS style coordinates as well as coordinates where _
is used as a thousands separator.
-------------------------------------------------------------------------------
operation      +step +proj=latlong
-------------------------------------------------------------------------------
tolerance   1 m

accept      -64d43'75.34    17d32'45.6
expect      -64.737589      17.546000

accept      164d43'75.34    17d32'45.6
expect      164.737589      17.546000

accept      164d43'75.34    17d32'45.6
expect      164d43'75.34    17d32'45.6

accept      164d43'75.34W   17d32'45.6S
expect      -164.737589     -17.546000

accept      90d00'00.00     0d00'00.00
expect      90.0             0.0

accept      0d00'00.00     0d00'00.00
expect      0.0             0.0



operation      +proj=pipeline
               +step +proj=latlong +datum=NAD27 +inv
               +step +units=us-ft +init=nad27:3901
tolerance      1 mm

accept       -80d32'30.000 34d32'30.000 0.0
expect       2_138_028.224 561_330.721 0.0

accept       -81d00'00.000 34d32'30.000 0.0
expect       2_000_000.000 561_019.077 0.0
-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
Some tests from PJ_eqearth.c
-------------------------------------------------------------------------------
operation +proj=eqearth +ellps=WGS84
-------------------------------------------------------------------------------
direction forward
tolerance 1cm

accept    0 0
expect    0 0

accept    -180 90
expect    -10216474.79 8392927.6

accept    0 90
expect    0 8392927.6

accept    180 90
expect    10216474.79 8392927.6

accept    180 45
expect    14792474.75 5466867.76

accept    180 0
expect    17243959.06 0

accept    -70 -31.2
expect    -6241081.64 -3907019.16


direction inverse

accept    -6241081.64 -3907019.16
expect    -70 -31.2

accept    17243959.06 0
expect    180 0

accept    14792474.75 5466867.76
expect    180 45

accept    0 0
expect    0 0

accept    -10216474.79 8392927.6
expect    -180 90

accept    0 8392927.6
expect    0 90

accept    10216474.79 8392927.6
expect    180 90


operation +proj=eqearth +R=6378137
direction forward
tolerance 1cm

accept    0 0
expect    0 0

accept    -180 90
expect    -10227908.09 8402320.16

accept    0 90
expect    0.00 8402320.16

accept    180 90
expect    10227908.09 8402320.16

accept    180 45
expect    14795421.79 5486671.72

accept    180 0
expect    17263256.84 0.00

accept    -70 -31.2
expect    -6244707.88 -3924893.29

direction inverse

accept    -6244707.88 -3924893.29
expect    -70 -31.2

accept    17263256.84 0.00
expect    180 0

accept    14795421.79 5486671.72
expect    180 45

accept    0 0
expect    0 0

accept    -10227908.09 8402320.16
expect    -180 90

accept    0.00 8402320.16
expect    0 90

accept    10227908.09 8402320.16
expect    180 90

operation +proj=eqearth +R=1
direction inverse

# coordinate in valid region
accept    0 -1.3
expect    0 -82.318

# coordinate on edge
accept    0 -1.3173627591574
expect    0 -90

# coordinate outside valid region, should be clamped
accept    0 -1.4
expect    0 -90

-------------------------------------------------------------------------------

-------------------------------------------------------------------------------
run the few gie-builtin tests, which are currently either awkward or impossible
to express in the gie command set
-------------------------------------------------------------------------------
builtins
-------------------------------------------------------------------------------

</gie>