packages feed

esqueleto-postgis-2.0.0: test/Wkb/PointSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Wkb.PointSpec where

import qualified Data.Binary.Get             as BinaryGet
import qualified Data.ByteString.Builder     as ByteStringBuilder
import qualified Data.Geospatial             as Geospatial
import qualified HaskellWorks.Hspec.Hedgehog as HedgehogHspec
import           Hedgehog
import           Test.Hspec                  (Spec, describe, it)

import qualified Database.Esqueleto.Postgis.Wkb  as Geometry
import qualified Database.Esqueleto.Postgis.Wkb     as Point
import qualified Data.SpecHelper             as SpecHelper

spec :: Spec
spec = do
  testCoordPointParsing
  testWkbPointParsing
  testWkbMultiPointParsing


-- Test Coord Point Parsing

testCoordPointParsing :: Spec
testCoordPointParsing =
  describe "Test coord point parsing" $
    mapM_ testCoordPointParsing' SpecHelper.coordPointGenerators

testCoordPointParsing' :: (Geometry.CoordinateType, Gen Geospatial.GeoPositionWithoutCRS) -> Spec
testCoordPointParsing' (coordType, genCoordPoint) =
  it ("round trips coord point: " ++ show coordType) $ HedgehogHspec.require $ property $ do
    coordPoint <- forAll genCoordPoint
    endianType <- forAll SpecHelper.genEndianType
    roundTrip endianType coordPoint === coordPoint
  where
    roundTrip endianType coordPoint  =
      BinaryGet.runGet (Point.getCoordPoint endianType coordType) (encodedCoordPoint endianType coordPoint)
    encodedCoordPoint endianType coordPoint =
      ByteStringBuilder.toLazyByteString $ Point.builderCoordPoint endianType coordPoint


-- Test Wkb Point Parsing

testWkbPointParsing :: Spec
testWkbPointParsing =
  describe "Test wkb point parsing" $
    SpecHelper.testRoundTripWkbGeometryParsing "point" SpecHelper.genPoint


-- Test Wkb MultiPoint Parsing

testWkbMultiPointParsing :: Spec
testWkbMultiPointParsing =
  describe "Test wkb multipoint parsing" $
    SpecHelper.testRoundTripWkbGeometryParsing "multipoint" SpecHelper.genMultiPoint