packages feed

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

{-# LANGUAGE OverloadedStrings #-}

module Wkb.GeometrySpec where

import qualified Data.Binary.Get            as BinaryGet
import qualified Data.ByteString.Builder    as ByteStringBuilder
import           Test.Hspec                 (Spec, describe, it, shouldBe)

import qualified Database.Esqueleto.Postgis.Wkb   as Endian
import qualified Database.Esqueleto.Postgis.Wkb as Geometry

spec :: Spec
spec =
  testValidGetGeometryTypeWithCoords

testValidGetGeometryTypeWithCoords :: Spec
testValidGetGeometryTypeWithCoords =
  describe "get geometry type with coords type for valid data" $
    mapM_ testGetGeometryTypeWithCoords geometryTypes

testGetGeometryTypeWithCoords :: Geometry.WkbGeometryType -> Spec
testGetGeometryTypeWithCoords geometryType =
  it ("Parse " ++ show geometryType) $
    mapM_ test [Endian.BigEndian, Endian.LittleEndian]
    where test endianType =
            roundTrip endianType geometryType `shouldBe` geometryType

roundTrip :: Endian.EndianType -> Geometry.WkbGeometryType -> Geometry.WkbGeometryType
roundTrip endianType geometryType =
  BinaryGet.runGet (Geometry.getWkbGeom endianType) encodedGeometryType
  where encodedGeometryType = ByteStringBuilder.toLazyByteString $ Geometry.builderWkbGeom endianType geometryType

geometryTypes :: [Geometry.WkbGeometryType]
geometryTypes =
  [ Geometry.WkbGeom Geometry.Geometry Geometry.TwoD
  , Geometry.WkbGeom Geometry.Point Geometry.TwoD
  , Geometry.WkbGeom Geometry.LineString Geometry.TwoD
  , Geometry.WkbGeom Geometry.Polygon Geometry.TwoD
  , Geometry.WkbGeom Geometry.MultiPoint Geometry.TwoD
  , Geometry.WkbGeom Geometry.MultiLineString Geometry.TwoD
  , Geometry.WkbGeom Geometry.MultiPolygon Geometry.TwoD
  , Geometry.WkbGeom Geometry.GeometryCollection Geometry.TwoD
  , Geometry.WkbGeom Geometry.Geometry Geometry.Z
  , Geometry.WkbGeom Geometry.Point Geometry.Z
  , Geometry.WkbGeom Geometry.LineString Geometry.Z
  , Geometry.WkbGeom Geometry.Polygon Geometry.Z
  , Geometry.WkbGeom Geometry.MultiPoint Geometry.Z
  , Geometry.WkbGeom Geometry.MultiLineString Geometry.Z
  , Geometry.WkbGeom Geometry.MultiPolygon Geometry.Z
  , Geometry.WkbGeom Geometry.GeometryCollection Geometry.Z
  , Geometry.WkbGeom Geometry.Geometry Geometry.M
  , Geometry.WkbGeom Geometry.Point Geometry.M
  , Geometry.WkbGeom Geometry.LineString Geometry.M
  , Geometry.WkbGeom Geometry.Polygon Geometry.M
  , Geometry.WkbGeom Geometry.MultiPoint Geometry.M
  , Geometry.WkbGeom Geometry.MultiLineString Geometry.M
  , Geometry.WkbGeom Geometry.MultiPolygon Geometry.M
  , Geometry.WkbGeom Geometry.GeometryCollection Geometry.M
  , Geometry.WkbGeom Geometry.Geometry Geometry.ZM
  , Geometry.WkbGeom Geometry.Point Geometry.ZM
  , Geometry.WkbGeom Geometry.LineString Geometry.ZM
  , Geometry.WkbGeom Geometry.Polygon Geometry.ZM
  , Geometry.WkbGeom Geometry.MultiPoint Geometry.ZM
  , Geometry.WkbGeom Geometry.MultiLineString Geometry.ZM
  , Geometry.WkbGeom Geometry.MultiPolygon Geometry.ZM
  , Geometry.WkbGeom Geometry.GeometryCollection Geometry.ZM
  ]