packages feed

exp-pairs-0.2.0.0: tests/MenzerNowak.hs

module MenzerNowak where

import Data.Ratio
import Math.ExpPairs
import Math.ExpPairs.MenzerNowak
import Math.ExpPairs.Kratzel

import Test.Tasty
import Test.Tasty.SmallCheck as SC
import Test.Tasty.QuickCheck as QC (testProperty)

import Instances

testMonotonic :: Sorted (Positive Integer, Positive Integer, Positive Integer, Positive Integer) -> Bool
testMonotonic (Sorted (Positive a, Positive c, Positive b, Positive d))
  =  (a == c && b == d) || zab > zcd
    where
      zab = optimalValue $ menzerNowak a b
      zcd = optimalValue $ menzerNowak c d

testCompareLow :: Sorted (Positive Integer, Positive Integer) -> Bool
testCompareLow (Sorted (Positive a, Positive b))
  = optimalValue (snd $ tauab a b) <= optimalValue (menzerNowak a b) + Finite eps
    where
      eps = 1 % (10 ^ (30::Integer))

testCompareHigh :: Sorted (Positive Integer, Positive Integer) -> Bool
testCompareHigh (Sorted (Positive a, Positive b))
  = optimalValue (menzerNowak a b) < 1

testSuite :: TestTree
testSuite = testGroup "MenzerNowak"
  [ SC.testProperty "compare with tauab" testCompareLow
  , QC.testProperty "compare with tauab" testCompareLow
  , SC.testProperty "compare with 1" testCompareHigh
  , QC.testProperty "compare with 1" testCompareHigh
  , adjustOption (\(SC.SmallCheckDepth n) -> SC.SmallCheckDepth (n `div` 2)) $
      SC.testProperty "monotonic" testMonotonic
  , QC.testProperty "monotonic" testMonotonic
  ]