packages feed

urbit-hob-0.3.0: test/Co/Tests/Property.hs

module Co.Tests.Property (
  tests
  ) where

import qualified Data.Text as T
import Data.Word (Word64)
import Numeric.Natural (Natural)
import Test.Hspec
import Test.Hspec.Core.QuickCheck (modifyMaxSuccess)
import Test.QuickCheck
import qualified Urbit.Ob.Co as Co

nats :: Gen Natural
nats = fmap fromIntegral (arbitrary :: Gen Word64)

patps :: Gen Co.Patp
patps = fmap Co.patp nats

patqs :: Gen Co.Patq
patqs = fmap Co.patq nats

patpStrings :: Gen T.Text
patpStrings = fmap Co.renderPatp patps

patqStrings :: Gen T.Text
patqStrings = fmap Co.renderPatq patqs

tests :: Spec
tests = do
  describe "fromPatp" $
    modifyMaxSuccess (const 1000) $
      it "inverts patp" $
        forAll nats $ \x -> Co.fromPatp (Co.patp x) == x

  describe "patp" $
    modifyMaxSuccess (const 1000) $
      it "inverts fromPatp" $
        forAll patps $ \x -> Co.patp (Co.fromPatp x) == x

  describe "renderPatp" $
    modifyMaxSuccess (const 1000) $
      it "inverts parsePatp" $
        forAll patpStrings $ \x ->
          case Co.parsePatp x of
            Left _  -> False
            Right p -> Co.renderPatp p == x

  describe "fromPatq" $
    modifyMaxSuccess (const 1000) $
      it "inverts patq" $
        forAll nats $ \x -> Co.fromPatq (Co.patq x) == x

  describe "patq" $
    modifyMaxSuccess (const 1000) $
      it "inverts fromPatq" $
        forAll patqs $ \x -> Co.patq (Co.fromPatq x) == x

  describe "renderPatq" $
    modifyMaxSuccess (const 1000) $
      it "inverts parsePatq" $
        forAll patqStrings $ \x ->
          case Co.parsePatq x of
            Left _  -> False
            Right p -> Co.renderPatq p == x