{-|
    Module      :  Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Tests.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.ChebyshevBase.Polynom.Tests.Ring
where

import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Ring
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Basic
import Data.Number.ER.RnToRm.UnitDom.ChebyshevBase.Polynom.Tests.Generate

prop_chplAdd_consistent (PSize30 (_,p1), PSize30 (_, p2)) =
    chplAtKeyPointsPointwiseBinaryDownUpConsistent (+) p1 p2 (sumLow, sumHigh)
    where
    (sumLow, sumHigh, _) = chplAdd p1 p2

prop_chplAddConst_consistent (SmallRatio num denom, PSize30 (_, p)) =
    chplAtKeyPointsPointwiseBinaryDownUpConsistent (+) cP p (sumLow, sumHigh)
    where
    (sumLow, sumHigh, _) = chplAddConst cB p
    cP = chplConst cB
    cB = numB / denomB
    numB = fromInteger $ toInteger num
    denomB = fromInteger $ toInteger denom

prop_chplMult_consistent (PSize30 (_,p1), PSize30 (_, p2)) =
    chplAtKeyPointsPointwiseBinaryDownUpConsistent (*) p1 p2 (prodLow, prodHigh)
    where
    (prodLow, prodHigh, _) = chplMultiply p1 p2

prop_chplScale_consistent (SmallRatio num denom, PSize30 (_, p)) =
    chplAtKeyPointsPointwiseBinaryDownUpConsistent (*) cP p (prodLow, prodHigh)
    where
    (prodLow, prodHigh, _) = chplScale cB p
    cP = chplConst cB
    cB = numB / denomB
    numB = fromInteger $ toInteger num
    denomB = fromInteger $ toInteger denom