{-|
    Module      :  Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Bounds
    Description :  (testing) properties of bounding operations
    Copyright   :  (c) 2007-2008 Michal Konecny
    License     :  BSD3

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable
    
    Quickcheck properties of bounding operations, ie constant bounds and binary min/max.
-}
module Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Bounds
where

import Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Common
import Data.Number.ER.RnToRm.UnitDom.Base.Tests.Generate

import qualified Data.Number.ER.RnToRm.UnitDom.Base as UFB

import Data.Number.ER.BasicTypes
import Data.Number.ER.BasicTypes.Tests.Generate

import Test.QuickCheck

prop_fbBounds_consistent sample reportFileName (Ix20 ix, FBSize10 (n,fb)) =
    fbAtKeyPointsCanBeLeq reportFileName (ix,n,True) fb fbHigh
    &&
    fbAtKeyPointsCanBeLeq reportFileName (ix,n,False) fbLow fb
    where
    _ = [fb,sample]
    fbLow = UFB.const cLow
    fbHigh = UFB.const cHigh
    (cLow, cHigh) = UFB.bounds ix fb

prop_fbMax_consistent sample reportFileName
        (Deg20Size20 maxDegree maxSize, FBSize10 (n1,fb1), FBSize10 (n2, fb2)) =
    fbAtKeyPointsPointwiseBinaryDownUpConsistent 
        reportFileName ((maxDegree, maxSize), n1, n2) 
        max fb1 fb2 (maxLow, maxHigh)
    where
    _ = [fb1,sample]
    maxLow = UFB.maxDown maxDegree maxSize fb1 fb2
    maxHigh = UFB.maxUp maxDegree maxSize fb1 fb2

prop_fbMin_consistent sample reportFileName
        (Deg20Size20 maxDegree maxSize, FBSize10 (n1,fb1), FBSize10 (n2, fb2)) =
    fbAtKeyPointsPointwiseBinaryDownUpConsistent 
        reportFileName ((maxDegree, maxSize), n1, n2) 
        min fb1 fb2 (minLow, minHigh)
    where
    _ = [fb1,sample]
    minLow = UFB.minDown maxDegree maxSize fb1 fb2
    minHigh = UFB.minUp maxDegree maxSize fb1 fb2