toysolver-0.4.0: test/Test/Misc.hs
{-# OPTIONS_GHC -Wall #-}
{-# LANGUAGE TemplateHaskell, ScopedTypeVariables #-}
module Test.Misc (miscTestGroup) where
import Control.Monad
import Test.Tasty
import Test.Tasty.QuickCheck hiding ((.&&.), (.||.))
import Test.Tasty.HUnit
import Test.Tasty.TH
import ToySolver.Data.Boolean
import ToySolver.Data.BoolExpr
import qualified ToySolver.Internal.Data.Vec as Vec
import ToySolver.Internal.Util
import ToySolver.Internal.TextUtil
import qualified ToySolver.Wang as Wang
case_showRationalAsDecimal :: Assertion
case_showRationalAsDecimal = do
showRationalAsFiniteDecimal 0 @?= Just "0.0"
showRationalAsFiniteDecimal 1 @?= Just "1.0"
showRationalAsFiniteDecimal (-1) @?= Just "-1.0"
showRationalAsFiniteDecimal 0.1 @?= Just "0.1"
showRationalAsFiniteDecimal (-0.1) @?= Just "-0.1"
showRationalAsFiniteDecimal 1.1 @?= Just "1.1"
showRationalAsFiniteDecimal (-1.1) @?= Just "-1.1"
showRationalAsFiniteDecimal (5/4) @?= Just "1.25"
showRationalAsFiniteDecimal (-5/4) @?= Just "-1.25"
showRationalAsFiniteDecimal (4/3) @?= Nothing
showRationalAsFiniteDecimal (-4/3) @?= Nothing
case_readUnsignedInteger_maxBound_bug :: Assertion
case_readUnsignedInteger_maxBound_bug =
readUnsignedInteger "006666666666666667" @?= 6666666666666667
prop_readUnsignedInteger :: Property
prop_readUnsignedInteger =
forAll (choose (0, 2^(128::Int))) $ \i ->
readUnsignedInteger (show i) == i
-- ---------------------------------------------------------------------
-- Vec
case_Vec :: Assertion
case_Vec = do
(v::Vec.UVec Int) <- Vec.new
let xs = [0..100]
forM_ xs $ \i -> Vec.push v i
ys <- Vec.getElems v
ys @?= xs
Vec.resize v 4
zs <- Vec.getElems v
zs @?= take 4 xs
Vec.push v 1
Vec.push v 2
Vec.push v 3
ws <- Vec.getElems v
ws @?= take 4 xs ++ [1,2,3]
x3 <- Vec.unsafePop v
x3 @?= 3
s <- Vec.getSize v
s @?= 6
ws <- Vec.getElems v
ws @?= take 4 xs ++ [1,2]
case_Vec_clone :: Assertion
case_Vec_clone = do
(v::Vec.UVec Int) <- Vec.new
Vec.push v 0
v2 <- Vec.clone v
Vec.write v2 0 1
a <- Vec.read v 0
a @?= 0
b <- Vec.read v2 0
b @?= 1
-- ---------------------------------------------------------------------
-- Wang
-- (x1 ∨ x2) ∧ (x1 ∨ ¬x2) ∧ (¬x1 ∨ ¬x2) is satisfiable
-- ¬((x1 ∨ x2) ∧ (x1 ∨ ¬x2) ∧ (¬x1 ∨ ¬x2)) is invalid
case_Wang_1 :: Assertion
case_Wang_1 =
Wang.isValid ([], [phi]) @?= False
where
phi = notB $ andB [x1 .||. x2, x1 .||. notB x2, notB x1 .||. notB x2]
x1, x2 :: BoolExpr Int
x1 = Atom 1
x2 = Atom 2
-- (x1 ∨ x2) ∧ (¬x1 ∨ x2) ∧ (x1 ∨ ¬x2) ∧ (¬x1 ∨ ¬x2) is unsatisfiable
-- ¬((x1 ∨ x2) ∧ (¬x1 ∨ x2) ∧ (x1 ∨ ¬x2) ∧ (¬x1 ∨ ¬x2)) is valid
case_Wang_2 :: Assertion
case_Wang_2 =
Wang.isValid ([], [phi]) @?= True
where
phi = notB $ andB [x1 .||. x2, notB x1 .||. x2, x1 .||. notB x2, notB x1 .||. notB x2]
x1, x2 :: BoolExpr Int
x1 = Atom 1
x2 = Atom 2
case_Wang_EM :: Assertion
case_Wang_EM =
Wang.isValid ([], [phi]) @?= True
where
phi = x1 .||. notB x1
x1 :: BoolExpr Int
x1 = Atom 1
case_Wang_DNE :: Assertion
case_Wang_DNE =
Wang.isValid ([], [phi]) @?= True
where
phi = notB (notB x1) .<=>. x1
x1 :: BoolExpr Int
x1 = Atom 1
case_Wang_Peirces_Law :: Assertion
case_Wang_Peirces_Law =
Wang.isValid ([], [phi]) @?= True
where
phi = ((x1 .=>. x2) .=>. x1) .=>. x1
x1, x2 :: BoolExpr Int
x1 = Atom 1
x2 = Atom 2
------------------------------------------------------------------------
-- Test harness
miscTestGroup :: TestTree
miscTestGroup = $(testGroupGenerator)