{-# LANGUAGE TemplateHaskell #-}
module Test.SequentialIndex
where
import Data.Maybe
import Data.SequentialIndex
import Test.QuickCheck
import Test.QuickCheck.All
instance Arbitrary SequentialIndex where
arbitrary = fmap fromJust (fmap tryFromBools arbitrary `suchThat` isJust)
prop_sequentialIndexFromToByteString si = Just si == fromByteString (toByteString si)
prop_between a b = let m = between a b in (a == m && m == b) || (a < m && m < b) || (b < m && m < a)
prop_leftChild x = case leftChild x of
Nothing -> True
Just v -> v < x
prop_leftChildZero = leftChild zero == Nothing
prop_leftChildOne = leftChild one == Just root
prop_leftChildRoot = isJust $ leftChild root
prop_rightChild x = case rightChild x of
Nothing -> True
Just v -> v > x
prop_rightChildZero = rightChild zero == Nothing
prop_rightChildOne = rightChild one == Nothing
prop_rightChildRoot = isJust $ rightChild root
prop_parentLeft x = maybe True (== x) $ parent =<< leftChild x
prop_parentRight x = maybe True (== x) $ parent =<< rightChild x
prop_parentZero = parent zero == Nothing
prop_parentOne = parent one == Nothing
prop_parentRoot = parent root == Just one
prop_parentRootLeft = (parent =<< leftChild root) == Just root
prop_parentRootRight = (parent =<< rightChild root) == Just root
main = $(quickCheckAll)
testWith = $(forAllProperties)