wkt-geom-0.0.2: test/Data/WkbPolygonSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Data.WkbPolygonSpec where
import qualified Data.ByteString.Builder as ByteStringBuilder
import qualified Data.ByteString.Lazy as LazyByteString
import qualified Data.Geospatial as Geospatial
import Data.Monoid ((<>))
import qualified Data.Sequence as Sequence
import Test.Hspec (Spec, describe, it, shouldBe)
import qualified Data.Wkb as Wkb
import qualified Data.SpecHelper as SpecHelper
spec :: Spec
spec = do
testWkbPolygonParsing
testWkbMultiPolygonParsing
testWkbPolygonParsing :: Spec
testWkbPolygonParsing =
describe "Test wkb polygon" $ do
it "Parse valid wkb polygon" $
Wkb.parseByteString exampleWkbPolygon `shouldBe` (Right $ Geospatial.Polygon $ Geospatial.GeoPolygon (Sequence.singleton SpecHelper.linearRing1))
it "Not parse bad wkb polygon" $
Wkb.parseByteString exampleBadWkbPolygon `shouldBe` Left "Could not parse wkb: First and last points of linear ring are different: first=GeoPointXY (PointXY {_xyX = 1.0, _xyY = 2.0}) last=GeoPointXY (PointXY {_xyX = 7.0, _xyY = 8.0})"
exampleWkbPolygon :: LazyByteString.ByteString
exampleWkbPolygon =
ByteStringBuilder.toLazyByteString $
ByteStringBuilder.word8 0
<> ByteStringBuilder.int32BE 3
<> ByteStringBuilder.int32BE 1
<> ByteStringBuilder.int32BE 4
<> ByteStringBuilder.doubleBE 1.0
<> ByteStringBuilder.doubleBE 2.0
<> ByteStringBuilder.doubleBE 3.0
<> ByteStringBuilder.doubleBE 4.0
<> ByteStringBuilder.doubleBE 5.0
<> ByteStringBuilder.doubleBE 6.0
<> ByteStringBuilder.doubleBE 1.0
<> ByteStringBuilder.doubleBE 2.0
exampleBadWkbPolygon :: LazyByteString.ByteString
exampleBadWkbPolygon =
ByteStringBuilder.toLazyByteString $
ByteStringBuilder.word8 0
<> ByteStringBuilder.int32BE 3
<> ByteStringBuilder.int32BE 1
<> ByteStringBuilder.int32BE 4
<> ByteStringBuilder.doubleBE 1.0
<> ByteStringBuilder.doubleBE 2.0
<> ByteStringBuilder.doubleBE 3.0
<> ByteStringBuilder.doubleBE 4.0
<> ByteStringBuilder.doubleBE 5.0
<> ByteStringBuilder.doubleBE 6.0
<> ByteStringBuilder.doubleBE 7.0
<> ByteStringBuilder.doubleBE 8.0
testWkbMultiPolygonParsing :: Spec
testWkbMultiPolygonParsing =
describe "Test wkb multi polygon" $
it "Parse valid wkb multi polygon" $
Wkb.parseByteString exampleWkbMultiPolygon `shouldBe` (Right $ Geospatial.MultiPolygon $ Geospatial.GeoMultiPolygon
(Sequence.fromList
[ Sequence.singleton SpecHelper.linearRing1
, Sequence.singleton SpecHelper.linearRing2
]))
exampleWkbMultiPolygon :: LazyByteString.ByteString
exampleWkbMultiPolygon =
ByteStringBuilder.toLazyByteString $
ByteStringBuilder.word8 0
<> ByteStringBuilder.int32BE 6
<> ByteStringBuilder.int32BE 2
<> ByteStringBuilder.word8 0
<> ByteStringBuilder.int32BE 3
<> ByteStringBuilder.int32BE 1
<> ByteStringBuilder.int32BE 4
<> ByteStringBuilder.doubleBE 1.0
<> ByteStringBuilder.doubleBE 2.0
<> ByteStringBuilder.doubleBE 3.0
<> ByteStringBuilder.doubleBE 4.0
<> ByteStringBuilder.doubleBE 5.0
<> ByteStringBuilder.doubleBE 6.0
<> ByteStringBuilder.doubleBE 1.0
<> ByteStringBuilder.doubleBE 2.0
<> ByteStringBuilder.word8 0
<> ByteStringBuilder.int32BE 3
<> ByteStringBuilder.int32BE 1
<> ByteStringBuilder.int32BE 4
<> ByteStringBuilder.doubleBE 1.5
<> ByteStringBuilder.doubleBE 2.5
<> ByteStringBuilder.doubleBE 3.5
<> ByteStringBuilder.doubleBE 4.5
<> ByteStringBuilder.doubleBE 5.5
<> ByteStringBuilder.doubleBE 6.5
<> ByteStringBuilder.doubleBE 1.5
<> ByteStringBuilder.doubleBE 2.5