packages feed

urbit-hob-0.2.0: test/Ob/Tests/Property.hs

module Ob.Tests.Property (
  tests
  ) where

import Data.Word (Word32, Word64)
import Numeric.Natural (Natural)
import Test.Hspec
import Test.Hspec.Core.QuickCheck (modifyMaxSuccess)
import Test.QuickCheck
import qualified Urbit.Ob.Ob as Ob

planets :: Gen Word32
planets = arbitrary `suchThat` (> 0xFFFF)

word64 :: Gen Word64
word64 = arbitrary

nat :: Gen Natural
nat = do
  a <- fmap fromIntegral word64
  b <- fmap fromIntegral word64
  return (a * b)

tests :: Spec
tests = do
  describe "fynd" $
    modifyMaxSuccess (const 1000) $
      it "inverts fein" $
        forAll nat $ \x ->
          Ob.fynd (Ob.fein x) == x

  describe "fein" $
    modifyMaxSuccess (const 1000) $
      it "inverts fynd" $
        forAll nat $ \x ->
          Ob.fein (Ob.fynd x) == x

  describe "feis" $
    modifyMaxSuccess (const 1000) $
      it "inverts tail" $
        forAll planets $ \planet -> property $
          Ob.feis (Ob.tail planet) == planet

  describe "tail" $
    modifyMaxSuccess (const 1000) $
      it "inverts feis" $
        forAll planets $ \planet -> property $
          Ob.tail (Ob.feis planet) == planet