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

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable
    
    Quickcheck properties of operations that reduce the size of polynomials.
-}
module Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Reduce
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 Test.QuickCheck

prop_fbReduceTermCount_consistent sample reportFileName 
        (FBSize10 (n,fb), Deg5Size10 _ maxSize) =
    maxSize < UFB.getSize fb ==>
    fbAtKeyPointsCanBeLeq reportFileName (n, maxSize, True) fb fbUp
    && 
    fbAtKeyPointsCanBeLeq reportFileName (n, maxSize, False) fbDown fb
    where
    _ = [fb,sample]
    fbUp = UFB.reduceSizeUp maxSize fb 
    fbDown = UFB.neg $ UFB.reduceSizeUp maxSize $ UFB.neg fb 
    
prop_fbReduceDegree_consistent sample reportFileName 
        (FBSize10 (n,fb), Deg5Size10 maxDegree _) =
    maxDegree < UFB.getDegree fb ==>
    fbAtKeyPointsCanBeLeq reportFileName (n, maxDegree, True) fb fbUp
    && 
    fbAtKeyPointsCanBeLeq reportFileName (n, maxDegree, False) fbDown fb
    where
    _ = [fb,sample]
    fbUp = UFB.reduceDegreeUp maxDegree fb 
    fbDown = UFB.neg $ UFB.reduceDegreeUp maxDegree $ UFB.neg fb