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

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable
    
    Quickcheck properties of ring operations, ie addition and multiplication.
-}
module Data.Number.ER.RnToRm.UnitDom.Base.Tests.Properties.Ring
where

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

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

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

prop_fbAddConst_consistent sample reportFileName 
        (SmallRatio num denom, FBSize10 (n, fb)) =
    fbAtKeyPointsPointwiseBinaryDownUpConsistent
        reportFileName ((num, denom), n) 
        (+) cFB fb (sumLow, sumHigh)
    where
    _ = [fb,sample]
    sumHigh = UFB.addConstUp cB fb
    sumLow = UFB.neg $ UFB.addConstUp (-cB) (UFB.neg fb)
    cFB = UFB.const cB
    cB = numB / denomB
    numB = fromInteger $ toInteger num
    denomB = fromInteger $ toInteger denom

prop_fbScale_consistent sample reportFileName
        (SmallRatio num denom, FBSize10 (n, fb)) =
    fbAtKeyPointsPointwiseBinaryDownUpConsistent 
        reportFileName ((num, denom), n) 
        (*) cP fb (prodLow, prodHigh)
    where
    _ = [fb,sample]
    prodHigh = UFB.scaleUp cB fb
    prodLow = UFB.neg $ UFB.scaleUp (-cB) fb
    cP = UFB.const cB
    cB = numB / denomB
    numB = fromInteger $ toInteger num
    denomB = fromInteger $ toInteger denom

prop_fbAdd_consistent sample reportFileName 
        (FBSize10 (n1,fb1), FBSize10 (n2, fb2)) =
    fbAtKeyPointsPointwiseBinaryDownUpConsistent 
        reportFileName (n1,n2)
        (+) fb1 fb2 (sumLow, sumHigh)
    where
    _ = [fb1,sample]
    sumLow = UFB.neg $ (UFB.neg fb1) UFB.+^ (UFB.neg fb2)
    sumHigh = fb1 UFB.+^ fb2

prop_fbMult_consistent sample reportFileName
        (FBSize10 (n1,fb1), FBSize10 (n2, fb2)) =
    fbAtKeyPointsPointwiseBinaryDownUpConsistent
        reportFileName (n1,n2) 
        (*) fb1 fb2 (prodLow, prodHigh)
    where
    _ = [fb1,sample]
    prodHigh = fb1 UFB.*^ fb2
    prodLow = UFB.neg $ (UFB.neg fb1) UFB.*^ fb2