packages feed

postgresql-types-0.1: src/unit-tests/PostgresqlTypes/LsegSpec.hs

module PostgresqlTypes.LsegSpec (spec) where

import Data.Data (Proxy (Proxy))
import qualified PostgresqlTypes.Lseg as Lseg
import Test.Hspec
import Test.QuickCheck
import qualified UnitTests.Scripts as Scripts

spec :: Spec
spec = do
  describe "Show/Read laws" do
    Scripts.testShowRead (Proxy @Lseg.Lseg)

  describe "IsScalar laws" do
    Scripts.testIsScalar (Proxy @Lseg.Lseg)

  describe "Constructors" do
    describe "fromEndpoints" do
      it "creates Lseg from two points (4 params)" do
        let lseg = Lseg.fromEndpoints 0.0 0.0 3.0 4.0
        Lseg.toX1 lseg `shouldBe` 0.0
        Lseg.toY1 lseg `shouldBe` 0.0
        Lseg.toX2 lseg `shouldBe` 3.0
        Lseg.toY2 lseg `shouldBe` 4.0

      it "creates Lseg with coincident endpoints" do
        let lseg = Lseg.fromEndpoints 1.0 1.0 1.0 1.0
        (Lseg.toX1 lseg, Lseg.toY1 lseg, Lseg.toX2 lseg, Lseg.toY2 lseg) `shouldBe` (1.0, 1.0, 1.0, 1.0)

  describe "Accessors" do
    it "extracts individual coordinates" do
      let lseg = Lseg.fromEndpoints 1.5 2.5 3.5 4.5
      Lseg.toX1 lseg `shouldBe` 1.5
      Lseg.toY1 lseg `shouldBe` 2.5
      Lseg.toX2 lseg `shouldBe` 3.5
      Lseg.toY2 lseg `shouldBe` 4.5

  describe "Property Tests" do
    it "roundtrips through accessors and fromEndpoints" do
      property \(lseg :: Lseg.Lseg) ->
        let lseg' = Lseg.fromEndpoints (Lseg.toX1 lseg) (Lseg.toY1 lseg) (Lseg.toX2 lseg) (Lseg.toY2 lseg)
         in lseg' === lseg