data-interval-2.1.1: test/TestIntervalRelation.hs
{-# LANGUAGE ScopedTypeVariables, TemplateHaskell #-}
module TestIntervalRelation (intervalRelationTestGroup) where
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck
import Test.Tasty.TH
import Data.Interval as I
import Data.IntervalRelation
import Data.Ord (Down(..))
import TestInstances
{--------------------------------------------------------------------
invert
--------------------------------------------------------------------}
prop_invert_is_involution a =
invert (invert a) === a
prop_invert_inverts_relation =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
relate a b === invert (relate b a)
------------------------------------------------------------------------
case_empty1 =
relate (empty :: Interval Rational) empty @?= Equal
prop_empty2 =
forAllShrink intervals shrink $ \a -> not (I.null a) ==>
relate (empty :: Interval Rational) a === During
prop_empty3 =
forAllShrink intervals shrink $ \a -> not (I.null a) ==>
relate a (empty :: Interval Rational) === Contains
prop_universal_lt =
forAllShrink intervals shrink $ \a -> not (I.null a) ==>
forAllShrink intervals shrink $ \b -> not (I.null b) ==>
let r = relate a b in counterexample (show r) $
if a <! b then r `elem` [Before, JustBefore]
else r `notElem` [Before, JustBefore]
prop_universal_le =
forAllShrink intervals shrink $ \a -> not (I.null a) ==>
forAllShrink intervals shrink $ \b -> not (I.null b) ==>
let r = relate a b in counterexample (show r) $
if a <=! b then r `elem` [Before, JustBefore, Overlaps, Starts, Equal, FinishedBy]
else r `notElem` [Before, JustBefore]
prop_universal_eq =
forAllShrink intervals shrink $ \a -> not (I.null a) ==>
forAllShrink intervals shrink $ \b -> not (I.null b) ==>
not (a ==! b) || relate a b == Equal
prop_universal_gt =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a >! b) === (b <! a)
prop_universal_ge =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a >=! b) === (b <=! a)
prop_universal_ne =
forAllShrink intervals shrink $ \a -> not (I.null a) ==>
forAllShrink intervals shrink $ \b -> not (I.null b) ==>
let r = relate a b in counterexample (show r) $
if a /=! b then r `elem` [Before, JustBefore, After, JustAfter]
else r `notElem` [Before, JustBefore, After, JustAfter]
------------------------------------------------------------------------
prop_existential_lt =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a <? b) === not (a >=! b)
prop_existential_le =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a <=? b) === not (a >! b)
prop_existential_eq =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a ==? b) === not (a /=! b)
prop_existential_gt =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a >? b) === not (a <=! b)
prop_existential_ge =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a >=? b) === not (a <! b)
prop_existential_ne =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
(a /=? b) === not (a ==! b)
------------------------------------------------------------------------
prop_before =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == Before) === (a <! b && not (isConnected a b))
prop_just_before =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == JustBefore) === (a <! b && isConnected a b && not (I.null a) && not (I.null b))
prop_overlaps =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == Overlaps) === (not (I.null (intersection a b)) && fmap Down (lowerBound' a) < fmap Down (lowerBound' b) && upperBound' a < upperBound' b)
prop_starts =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == Starts) === (isProperSubsetOf a b && lowerBound' a == lowerBound' b)
prop_during =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == During) === (isProperSubsetOf a b && lowerBound' a /= lowerBound' b && upperBound' a /= upperBound' b)
prop_finishes =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == Finishes) === (isProperSubsetOf a b && upperBound' a == upperBound' b)
prop_equal =
forAllShrink intervals shrink $ \a ->
forAllShrink intervals shrink $ \b ->
let r = relate a b in counterexample (show r) $
(r == Equal) === (a == b)
------------------------------------------------------------------------
-- Test harness
intervalRelationTestGroup = $(testGroupGenerator)