packages feed

wkt-geom-0.0.1: test/Data/Internal/Wkb/GeometrySpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Data.Internal.Wkb.GeometrySpec where

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

import qualified Data.Internal.Wkb.Endian   as Endian
import qualified Data.Internal.Wkb.Geometry as Geometry

spec :: Spec
spec =
  testValidGetGeometryTypeWithCoords

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

testGetGeometryTypeWithCoords :: (Word.Word32, Geometry.WkbGeometryType) -> Spec
testGetGeometryTypeWithCoords (int, expected) =
  it ("Parse " ++ show expected) $
    mapM_ test [Endian.BigEndian, Endian.LittleEndian]
    where test endianType =
            BinaryGet.runGet (Geometry.geometryTypeWithCoords endianType) (getByteString endianType int) `shouldBe` expected

getByteString :: Endian.EndianType -> Word.Word32 -> LazyByteString.ByteString
getByteString endianType int =
  ByteStringBuilder.toLazyByteString $
    case endianType of
      Endian.LittleEndian ->
        ByteStringBuilder.word32LE int
      Endian.BigEndian ->
        ByteStringBuilder.word32BE int

expectations :: [(Word.Word32, Geometry.WkbGeometryType)]
expectations =
  [ (0000, Geometry.WkbGeom Geometry.Geometry Geometry.TwoD)
  , (0001, Geometry.WkbGeom Geometry.Point Geometry.TwoD)
  , (0002, Geometry.WkbGeom Geometry.LineString Geometry.TwoD)
  , (0003, Geometry.WkbGeom Geometry.Polygon Geometry.TwoD)
  , (0004, Geometry.WkbGeom Geometry.MultiPoint Geometry.TwoD)
  , (0005, Geometry.WkbGeom Geometry.MultiLineString Geometry.TwoD)
  , (0006, Geometry.WkbGeom Geometry.MultiPolygon Geometry.TwoD)
  , (0007, Geometry.WkbGeom Geometry.GeometryCollection Geometry.TwoD)
  , (1000, Geometry.WkbGeom Geometry.Geometry Geometry.Z)
  , (1001, Geometry.WkbGeom Geometry.Point Geometry.Z)
  , (1002, Geometry.WkbGeom Geometry.LineString Geometry.Z)
  , (1003, Geometry.WkbGeom Geometry.Polygon Geometry.Z)
  , (1004, Geometry.WkbGeom Geometry.MultiPoint Geometry.Z)
  , (1005, Geometry.WkbGeom Geometry.MultiLineString Geometry.Z)
  , (1006, Geometry.WkbGeom Geometry.MultiPolygon Geometry.Z)
  , (1007, Geometry.WkbGeom Geometry.GeometryCollection Geometry.Z)
  , (2000, Geometry.WkbGeom Geometry.Geometry Geometry.M)
  , (2001, Geometry.WkbGeom Geometry.Point Geometry.M)
  , (2002, Geometry.WkbGeom Geometry.LineString Geometry.M)
  , (2003, Geometry.WkbGeom Geometry.Polygon Geometry.M)
  , (2004, Geometry.WkbGeom Geometry.MultiPoint Geometry.M)
  , (2005, Geometry.WkbGeom Geometry.MultiLineString Geometry.M)
  , (2006, Geometry.WkbGeom Geometry.MultiPolygon Geometry.M)
  , (2007, Geometry.WkbGeom Geometry.GeometryCollection Geometry.M)
  , (3000, Geometry.WkbGeom Geometry.Geometry Geometry.ZM)
  , (3001, Geometry.WkbGeom Geometry.Point Geometry.ZM)
  , (3002, Geometry.WkbGeom Geometry.LineString Geometry.ZM)
  , (3003, Geometry.WkbGeom Geometry.Polygon Geometry.ZM)
  , (3004, Geometry.WkbGeom Geometry.MultiPoint Geometry.ZM)
  , (3005, Geometry.WkbGeom Geometry.MultiLineString Geometry.ZM)
  , (3006, Geometry.WkbGeom Geometry.MultiPolygon Geometry.ZM)
  , (3007, Geometry.WkbGeom Geometry.GeometryCollection Geometry.ZM)
  ]