packages feed

jord-1.0.0.0: test/Data/Geo/Jord/ReadPositionSpec.hs

module Data.Geo.Jord.ReadPositionSpec
    ( spec
    ) where

import Data.Maybe (mapMaybe)

import Test.Hspec

import Data.Geo.Jord.Position

spec :: Spec
spec = do
    describe "Reading valid DMS text" $ do
        it "reads WGS84 surface positions" $ do
            let texts =
                    [ "553621N0130002E"
                    , "5536N01300E"
                    , "55N013E"
                    , "011659S0364900E"
                    , "0116S03649E"
                    , "01S036E"
                    , "473622N1221955W"
                    , "4736N12219W"
                    , "47N122W"
                    , "544807S0681811W"
                    , "5448S06818W"
                    , "54S068W"
                    , "55°36'21''N 013°00'02''E"
                    , "1°16'S,36°49'E"
                    , "47°N 122°W"
                    ]
            let positions =
                    [ wgs84Pos 55.60583333333334 13.000555555555556 zero
                    , wgs84Pos 55.6 13.0 zero
                    , wgs84Pos 55.0 13.0 zero
                    , wgs84Pos (-1.2830555555555556) 36.81666666666667 zero
                    , wgs84Pos (-1.2666666666666666) 36.81666666666667 zero
                    , wgs84Pos (-1.0) 36.0 zero
                    , wgs84Pos 47.60611111111111 (-122.33194444444445) zero
                    , wgs84Pos 47.6 (-122.31666666666666) zero
                    , wgs84Pos 47.0 (-122.0) zero
                    , wgs84Pos (-54.801944444444445) (-68.30305555555556) zero
                    , wgs84Pos (-54.8) (-68.3) zero
                    , wgs84Pos (-54.0) (-68.0) zero
                    , wgs84Pos 55.60583333333334 13.000555555555556 zero
                    , wgs84Pos (-1.2666666666666666) 36.81666666666667 zero
                    , wgs84Pos 47.0 (-122.0) zero
                    ]
            mapMaybe (`readPosition` WGS84) texts `shouldBe` positions
        it "reads positions around the WGS84 ellipsoid" $ do
            let texts = ["55°36'21''N 013°00'02''E 5m", "55°36'21''N 013°00'02''E -5m"]
            let positions =
                    [ wgs84Pos 55.60583333333334 13.000555555555556 (metres 5)
                    , wgs84Pos 55.60583333333334 13.000555555555556 (metres (-5))
                    ]
            mapMaybe (`readPosition` WGS84) texts `shouldBe` positions
        it "reads positions around the S84 sphere" $ do
            let texts = ["55°36'21''N 013°00'02''E 5m", "55°36'21''N 013°00'02''E -5m"]
            let positions =
                    [ s84Pos 55.60583333333334 13.000555555555556 (metres 5)
                    , s84Pos 55.60583333333334 13.000555555555556 (metres (-5))
                    ]
            mapMaybe (`readPosition` S84) texts `shouldBe` positions
        it "reads Mars surface positions" $ do
            let texts = ["54S360E", "55°36'21''N 341°34'02''E"]
            let positions = [latLongPos (-54.0) 360 Mars2000, latLongPos 55.60583333333334 341.5672222222222 Mars2000]
            mapMaybe (`readPosition` Mars2000) texts `shouldBe` positions
    describe "Attempting to read invalid DMS text" $ do
        it "fails to read syntactically invalid positions" $ do
            let texts = ["553621K0130002E", "011659S0364900Z", "4736221221955W", "54480S0681811W"]
            mapMaybe (`readPosition` WGS84) texts `shouldBe` []
        it "fails to read invalid WGS84 surface positions" $ do
            let texts = ["914807S0681811W", "804807S1811811W"]
            mapMaybe (`readPosition` WGS84) texts `shouldBe` []
        it "fails to read invalid Mars surface positions" $ do
            let texts = ["914807S0681811E", "5448S06818W"]
            mapMaybe (`readPosition` Mars2000) texts `shouldBe` []