packages feed

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