packages feed

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

module PostgresqlTypes.MultirangeSpec (spec) where

import Data.Data (Proxy (Proxy))
import qualified PostgresqlTypes.Int4 as Int4
import qualified PostgresqlTypes.Multirange as Multirange
import Test.Hspec
import Test.QuickCheck
import qualified UnitTests.Scripts as Scripts
import Prelude

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

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

  describe "Multirange Int4" do
    it "has Eq instance" do
      property \(mr1 :: Multirange.Multirange Int4.Int4) ->
        (mr1 == mr1) `shouldBe` True

    it "has Functor instance - fmap id = id" do
      property \(multirange :: Multirange.Multirange Int4.Int4) ->
        fmap id multirange === multirange

    it "has Functor instance - composition law" do
      property \(multirange :: Multirange.Multirange Int4.Int4) ->
        let f = Int4.fromInt32 . (* 2) . Int4.toInt32
            g = Int4.fromInt32 . (+ 1) . Int4.toInt32
         in fmap (f . g) multirange === fmap f (fmap g multirange)

  describe "Property Tests" do
    it "arbitrary generates valid multiranges" do
      property \(multirange :: Multirange.Multirange Int4.Int4) ->
        -- Multirange instances should be well-formed
        multirange === multirange

    it "equality is reflexive" do
      property \(multirange :: Multirange.Multirange Int4.Int4) ->
        multirange === multirange