jord-1.0.0.0: test/Data/Geo/Jord/PositionSpec.hs
module Data.Geo.Jord.PositionSpec
( spec
) where
import Test.Hspec
import Data.Geo.Jord.Position
spec :: Spec
spec = do
describe "antipode" $ do
it "returns the antipodal position" $ do
antipode (wgs84Pos 45 154 (metres 15000)) `shouldBe` wgs84Pos (-45) (-26) (metres 15000)
antipode (s84Pos 45 154 (metres 15000)) `shouldBe` s84Pos (-45) (-26) (metres 15000)
it "returns the south pole when called with the north pole" $ do
latitude (antipode (northPole WGS84)) `shouldBe` latitude (southPole WGS84)
latitude (antipode (northPole S84)) `shouldBe` latitude (southPole S84)
it "returns the north pole when called with the south pole" $ do
latitude (antipode (southPole WGS84)) `shouldBe` latitude (northPole WGS84)
latitude (antipode (southPole S84)) `shouldBe` latitude (northPole S84)
describe "wrapping latitude/longitude" $ do
it "wraps a Earth position to [-90°, 90°] and [-180°, 180°]" $
latLong (s84Pos 91 54 zero) `shouldBe` (89, -126)
it "wraps a Mars position to [-90°, 90°] and [0°, 360°]" $
latLong (latLongPos 91 (-150) Mars2000) `shouldBe` (89, 210)
describe "Geodetic <=> Geocentric (Ellipsoidal)" $ do
it "n-vector <=> Geocentric" $ do
let p = nvectorPos 0.5 0.5 0.7071 WGS84
let g = geocentricMetresPos 3194434.410968 3194434.410968 4487326.819509 WGS84
p `shouldBe` g
it "latitude, longitude and height <=> Geocentric" $ do
let refLlh =
[ latLongHeightPos 0 0 zero WGS84
, latLongHeightPos 90 0 zero WGS84
, latLongHeightPos (-90) 0 zero WGS84
, latLongHeightPos 45.0 45.0 (metres 500) WGS84
, latLongHeightPos (-45) (-45) (metres 500) WGS84
]
let refGeocentrics =
[ geocentricMetresPos 6378137 0 0 WGS84
, geocentricMetresPos 0 0 6356752.314245 WGS84
, geocentricMetresPos 0 0 (-6356752.314245) WGS84
, geocentricMetresPos 3194669.145061 3194669.145061 4487701.962256 WGS84
, geocentricMetresPos
3194669.145061
(-3194669.145061)
(-4487701.962256)
WGS84
]
refLlh `shouldBe` refGeocentrics
describe "Geodetic <=> Geocentric (Spherical)" $ do
it "n-vector <=> Geocentric" $ do
let p = nvectorPos 0.5 0.5 0.7071 S84
let g = geocentricMetresPos 3185519.660311 3185519.660311 4504961.903612 S84
p `shouldBe` g
it "latitude, longitude and height <=> Geocentric" $ do
let refLlh =
[ latLongHeightPos 0 0 zero S84
, latLongHeightPos 90 0 zero S84
, latLongHeightPos (-90) 0 zero S84
, latLongHeightPos 45.0 45.0 (metres 500) S84
, latLongHeightPos (-45) (-45) (metres 500) S84
]
let refGeocentrics =
[ geocentricMetresPos 6371008.771415 0 0 S84
, geocentricMetresPos 0 0 6371008.771415 S84
, geocentricMetresPos 0 0 (-6371008.771415) S84
, geocentricMetresPos 3185754.385708 3185754.385708 4505337.058657 S84
, geocentricMetresPos 3185754.385708 (-3185754.385708) (-4505337.058657) S84
]
refLlh `shouldBe` refGeocentrics