packages feed

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

module PostgresqlTypes.RangeSpec (spec) where

import Data.Data (Proxy (Proxy))
import qualified PostgresqlTypes.Int4 as Int4
import qualified PostgresqlTypes.Range as Range
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 @(Range.Range Int4.Int4))

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

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

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

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

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