{-|
    Module      :  Data.Number.ER.Real.Approx.Tests.Run
    Description :  (testing) running all function enclosure base tests in a batch
    Copyright   :  (c) 2007-2008 Michal Konecny
    License     :  BSD3

    Maintainer  :  mik@konecny.aow.cz
    Stability   :  experimental
    Portability :  portable
    
    Support for running all function enclosure base tests in a batch.
-}
module Data.Number.ER.Real.Approx.Tests.Run
where

import Data.Number.ER.Real.Approx.Tests.Generate
import Data.Number.ER.Real.Approx.Tests.Properties
import Data.Number.ER.Real.Approx.Tests.Reporting

import qualified Data.Number.ER.Real.Approx as RA
import qualified Data.Number.ER.Real.Approx.Elementary as RAEL

import Data.Number.ER.BasicTypes.DomainBox (VariableID(..), DomainBox, DomainBoxMappable, DomainIntBox)

import Data.Number.ER.Misc.Tests
import Data.Number.ER.Misc

import Test.QuickCheck
import Test.QuickCheck.Batch

import System.Directory
import qualified System.FilePath as FP
import Data.Time.Clock
import Data.Time.Calendar

runRATests :: 
    (RAEL.ERApproxElementary ra, 
     RAEL.ERInnerOuterApproxElementary ra,
     Ord ra) =>
    String -> ra -> IO () -> IO ()
runRATests title sampleRA initialise =
    do
    (UTCTime (ModifiedJulianDay days) secs) <- getCurrentTime
    let folder = "tests-" ++ title ++ "-" ++ (show days) ++ "-" ++ (show $ floor $ toRational secs)
    createDirectory folder
    erRunTests (title ++ " real approx tests") raTestOptions initialise (raTests sampleRA folder)

raTestOptions = 
    TestOptions
      { 
--        no_of_tests = 10
--        no_of_tests = 50
--        no_of_tests = 200
        no_of_tests = 500
      , 
        length_of_tests = 240 * 3600 -- ie 4h time limit
      ,
        debug_tests = False 
      }

raTests sampleRA folder =
    (propTuple "a-a=0" "AMinusAIsZero" props_ra_AMinusA_eq_oi)
    ++
    (propTuple "a/a=1" "ADivAIsOne" props_ra_ADivA_eq_oi)
    ++
    (propTuple "a+b=b+a" "AddCommut" props_ra_AddCommut_eq_oi)
    ++
    (propTuple "a*b=b*a" "MultCommut" props_ra_MultCommut_eq_oi)
    ++
    (propTuple "(a+b)+c=a+(b+c)" "AddAssoc" props_ra_AddAssoc_eq_oi)
    ++
    (propTuple "(a*b)*c=a*(b*c)" "MultAssoc" props_ra_MultAssoc_eq_oi)
    ++
    (propTuple "a*(b+c)=a*b+a*c" "Distr" props_ra_Distr_eq_oi)
    ++
    (propTuple "log(exp(a))=a" "LogExp" props_ra_LogExp_eq_oi)
    ++
    (propTuple "(sin a)^2+(cos a)^2=1" "SinCos" props_ra_SinCos_eq_oi)
    ++
    (propTuple "tan(atan(a))=a" "TanATan" props_ra_TanATan_eq_oi)
    where
    propTuple testName testFileName propGen =
        [
            (testName  ++ ", equality, thin intervals", runR prop_eq_Thin $ filepath ++ "_Eq_Thin"),
            (testName  ++ ", equality, consistent intervals", runR prop_eq_Consistent $ filepath ++ "_Eq_Consistent"),
            (testName  ++ ", inner in outer, thin intervals", runR prop_oi_Thin $ filepath ++ "_OI_Thin"),
            (testName  ++ ", inner in outer, consistent intervals", runR prop_oi_Consistent $ filepath ++ "_OI_Consistent"),
            (testName  ++ ", inner in outer, directed intervals", runR prop_oi_Directed $ filepath ++ "_OI_Directed")
        ]
        where
        (prop_eq_Thin, prop_eq_Consistent, prop_oi_Thin, prop_oi_Consistent, prop_oi_Directed) = 
            propGen sampleRA filepath
        filepath = FP.combine folder testFileName
    runR test filepath opts =
        unsafeReport filepath "started" $
            do 
            result <- run test opts
            produceSummary filepath
            return result