{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE FlexibleContexts #-}
import Test.Tasty (TestName, TestTree, defaultMain, localOption, testGroup)
import Test.Tasty.QuickCheck hiding ((.&.))
import Data.Bits (Bits(..))
import Data.Int
import Data.Word
import Data.BinaryWord
main ∷ IO ()
main = defaultMain
$ localOption (QuickCheckTests 10000)
$ testGroup "Tests"
[ binWordGroup "Word8" (0 ∷ Word8)
, binWordGroup "Word16" (0 ∷ Word16)
, binWordGroup "Word32" (0 ∷ Word32)
, binWordGroup "Word64" (0 ∷ Word64)
, binWordGroup "Int8" (0 ∷ Int8)
, binWordGroup "Int16" (0 ∷ Int16)
, binWordGroup "Int32" (0 ∷ Int32)
, binWordGroup "Int64" (0 ∷ Int64)
]
sameType ∷ α → α → α
sameType = const id
binWordGroup ∷ (Show w, Arbitrary w, Integral w, Integral (UnsignedWord w),
BinaryWord w) ⇒ TestName → w → TestTree
binWordGroup n w = testGroup n
[ testProperty "allZeroes" $ popCount (sameType w allZeroes) == 0
, testProperty "allOnes" $ popCount (sameType w allOnes) == bitSize w
, testProperty "unwrappedAdd" $ \w₁ w₂ →
let (h, l) = unwrappedAdd (sameType w w₁) w₂ in
toInteger h * 2 ^ bitSize w + toInteger l ==
toInteger w₁ + toInteger w₂
, testProperty "unwrappedMul" $ \w₁ w₂ →
let (h, l) = unwrappedMul (sameType w w₁) w₂ in
toInteger h * 2 ^ bitSize w + toInteger l ==
toInteger w₁ * toInteger w₂
]