packages feed

geojson-4.1.3: test/Data/Geospatial/Internal/GeometryTests.hs

{-# LANGUAGE OverloadedStrings #-}

module Data.Geospatial.Internal.GeometryTests where

import qualified Data.Aeson as A
import qualified Data.ByteString.Lazy.Char8 as BS
-- Local
import Data.Geospatial.Internal.Geometry
import Fixture
import Test.Hspec
  ( Spec,
    context,
    describe,
    it,
    shouldBe,
  )
import Test.Tasty
import Test.Tasty.Hspec
  ( testSpec,
  )

-- Tests

tests :: IO TestTree
tests = do
  specs <- specTests
  pure $ testGroup "Data.Geospatial.Internal.GeometryTests" [specs]

specTests :: IO TestTree
specTests = do
  specs <-
    sequence
      [ testSpec "Data.Geospatial.Internal.Geometry.fromJSON" testFromJSON,
        testSpec "Data.Geospatial.Internal.Geometry.toJSON" testToJSON
      ]
  pure $ testGroup "Data.Geospatial.Internal.GeometryTests.Spec" specs

-- Spec

-- >>> decode' lShapedPolyJSON == Just lShapedPoly
-- True
--
-- >>> decode' emptyPolyJSON == Just emptyPoly
-- True
--
-- >>> decode' emptyMultiPolyJSON == Just emptyMultiPoly
-- True
--
-- >>> decode' singleLineMultiLineJSON == Just singleLineMultiLine
-- True
--
-- >>> decode' multiLineJSON == Just multiLine
-- True
--
-- >>> decode' emptyCollectionJSON == Just emptyCollection
-- True
--
-- >>> decode' bigassCollectionJSON == Just bigassCollection
-- True

--
-- decode' "null" :: Maybe GeospatialGeometry
-- Just NoGeometry
--
testFromJSON :: Spec
testFromJSON =
  describe "fromJSON" $
    it "decode Feature Objects from GeoJSON" $ do
      A.decode lShapedPolyJSON `shouldBe` Just lShapedPoly
      A.decode emptyPolyJSON `shouldBe` Just emptyPoly
      A.decode emptyMultiPolyJSON `shouldBe` Just emptyMultiPoly
      A.decode singleLineMultiLineJSON `shouldBe` Just singleLineMultiLine
      A.decode multiLineJSON `shouldBe` Just multiLine
      A.decode emptyCollectionJSON `shouldBe` Just emptyCollection
      A.decode bigassCollectionJSON `shouldBe` Just bigassCollection
      (A.decode . BS.pack) "null" `shouldBe` Just NoGeometry

-- >>> A.encode NoGeometry
-- "null"
--
-- >>> (A.decode . A.encode) lShapedPoly == Just lShapedPoly
-- True
--
-- >>> (A.decode . A.encode) emptyPoly == Just emptyPoly
-- True
--
-- >>> (A.decode . A.encode) emptyMultiPoly == Just emptyMultiPoly
-- True
--
-- >>> (A.decode . A.encode) singleLineMultiLine == Just singleLineMultiLine
-- True
--
-- >>> (A.decode . A.encode) multiLine == Just multiLine
-- True
--
-- >>> (A.decode . A.encode) emptyCollection == Just emptyCollection
-- True
--
-- >>> (A.decode . A.encode) bigassCollection == Just bigassCollection
-- True
--
testToJSON :: Spec
testToJSON =
  describe "toJSON" $
    it "encode Feature Objects to GeoJSON" $ do
      A.encode NoGeometry `shouldBe` "null"
      (A.decode . A.encode) lShapedPoly `shouldBe` Just lShapedPoly
      (A.decode . A.encode) emptyPoly `shouldBe` Just emptyPoly
      (A.decode . A.encode) emptyMultiPoly `shouldBe` Just emptyMultiPoly
      (A.decode . A.encode) singleLineMultiLine `shouldBe` Just singleLineMultiLine
      (A.decode . A.encode) multiLine `shouldBe` Just multiLine
      (A.decode . A.encode) emptyCollection `shouldBe` Just emptyCollection
      (A.decode . A.encode) bigassCollection `shouldBe` Just bigassCollection