packages feed

heap-1.0.0: Test/Heap/Item.hs

{-# LANGUAGE FlexibleContexts #-}

module Test.Heap.Item
    ( runTests
    ) where

import Data.Heap.Item
import Test.Heap.Common
import Test.QuickCheck

runTests :: IO ()
runTests = do
    qc "Eq for MinPolicy" (eqProperty
        :: Prio MinPolicy Int -> Prio MinPolicy Int -> Prio MinPolicy Int -> Bool)
    qc "Eq for MaxPolicy" (eqProperty
        :: Prio MaxPolicy Int -> Prio MaxPolicy Int -> Prio MaxPolicy Int -> Bool)
    qc "Eq for FstMinPolicy" (eqProperty
        :: Prio FstMinPolicy (Int, Char) -> Prio FstMinPolicy (Int, Char)
        -> Prio FstMinPolicy (Int, Char) -> Bool)
    qc "Eq for FstMaxPolicy" (eqProperty
        :: Prio FstMaxPolicy (Int, Char) -> Prio FstMaxPolicy (Int, Char)
        -> Prio FstMaxPolicy (Int, Char) -> Bool)
    qc "Ord for MinPolicy" (ordProperty
        :: Prio MinPolicy Int -> Prio MinPolicy Int -> Prio MinPolicy Int -> Bool)
    qc "Ord for MaxPolicy" (ordProperty
        :: Prio MaxPolicy Int -> Prio MaxPolicy Int -> Prio MaxPolicy Int -> Bool)
    qc "Ord for FstMinPolicy" (ordProperty
        :: Prio FstMinPolicy (Int, Char) -> Prio FstMinPolicy (Int, Char)
        -> Prio FstMinPolicy (Int, Char) -> Bool)
    qc "Ord for FstMaxPolicy" (ordProperty
        :: Prio FstMaxPolicy (Int, Char) -> Prio FstMaxPolicy (Int, Char)
        -> Prio FstMaxPolicy (Int, Char) -> Bool)

    qc "read/show for MinPolicy" (readShowProperty :: [Prio MinPolicy Int] -> Bool)
    qc "read/show for MaxPolicy" (readShowProperty :: [Prio MaxPolicy Int] -> Bool)
    qc "read/show for FstMinPolicy" (readShowProperty :: [Prio FstMinPolicy (Int, Char)] -> Bool)
    qc "read/show for FstMaxPolicy" (readShowProperty :: [Prio FstMaxPolicy (Int, Char)] -> Bool)

    qc "split/merge for MinPolicy" (splitMergeProperty
        :: Prio MinPolicy Int -> Val MinPolicy Int -> Bool)
    qc "split/merge for MaxPolicy" (splitMergeProperty
        :: Prio MaxPolicy Int -> Val MaxPolicy Int -> Bool)
    qc "split/merge for FstMinPolicy" (splitMergeProperty
        :: Prio FstMinPolicy (Int, Char) -> Val FstMinPolicy (Int, Char) -> Bool)
    qc "split/merge for FstMaxPolicy" (splitMergeProperty
        :: Prio FstMaxPolicy (Int, Char) -> Val FstMaxPolicy (Int, Char) -> Bool)

    qc "priority/value for MinPolicy" (priorityValueProperty succ
        :: Prio MinPolicy Int -> Val MinPolicy Int -> Bool)
    qc "priority/value for MaxPolicy" (priorityValueProperty succ
        :: Prio MaxPolicy Int -> Val MaxPolicy Int -> Bool)
    qc "priority/value for FstMinPolicy" (priorityValueProperty succ
        :: Prio FstMinPolicy (Int, Char) -> Val FstMinPolicy (Int, Char) -> Bool)
    qc "priority/value for FstMaxPolicy" (priorityValueProperty succ
        :: Prio FstMaxPolicy (Int, Char) -> Val FstMaxPolicy (Int, Char) -> Bool)

    qc "splitF for MinPolicy" (splitFProperty (\x -> 4 * x - 7)
        :: Prio MinPolicy Int -> Val MinPolicy Int -> Bool)
    qc "splitF for MaxPolicy" (splitFProperty (\x -> 4 * x - 7)
        :: Prio MaxPolicy Int -> Val MaxPolicy Int -> Bool)
    qc "splitF for FstMinPolicy" (splitFProperty (\(x, y) -> (pred x, succ y))
        :: Prio FstMinPolicy (Int, Char) -> Val FstMinPolicy (Int, Char) -> Bool)
    qc "splitF for FstMaxPolicy" (splitFProperty (\(x, y) -> (pred x, succ y))
        :: Prio FstMaxPolicy (Int, Char) -> Val FstMaxPolicy (Int, Char) -> Bool)

instance (Arbitrary item, HeapItem pol item) => Arbitrary (Prio pol item) where
    arbitrary = fmap (fst . split) arbitrary

splitMergeProperty :: (HeapItem pol item, Eq (Prio pol item), Eq (Val pol item))
    => Prio pol item -> Val pol item -> Bool
splitMergeProperty p v = (p, v) == split (merge (p, v))

priorityValueProperty :: (HeapItem pol item, Eq (Prio pol item))
    => (Val pol item -> Val pol item) -> Prio pol item -> Val pol item -> Bool
priorityValueProperty f p v = p == fst (split (merge (p, v)))
    && p == fst (split (merge (p, f v)))

splitFProperty :: (HeapItem pol item, Eq a)
    => (item -> a) -> Prio pol item -> Val pol item -> Bool
splitFProperty f p v = f (merge (p, v)) == splitF f (p, v)