z3-4.1.0: test/Z3/Base/Spec.hs
-- TODO: Create a context for all the tests, use push; ...; pop to rollback
module Z3.Base.Spec
( spec )
where
import Test.Hspec
import Test.QuickCheck ( property )
import Test.QuickCheck.Monadic
import qualified Z3.Base as Z3
withContext :: ActionWith Z3.Context -> IO ()
withContext k = do
ctx <- Z3.withConfig Z3.mkContext
k ctx
anyZ3Error :: Selector Z3.Z3Error
anyZ3Error = const True
spec :: Spec
spec = around withContext $ do
context "Propositional Logic and Equality" $ do
specify "mkBool" $ \ctx -> property $ \b ->
monadicIO $ do
x::Maybe Bool <- run $ do
ast <- Z3.mkBool ctx b
Z3.getBoolValue ctx ast
assert $ x == Just b
context "Numerals" $ do
specify "mkInt" $ \ctx -> property $ \(i :: Integer) ->
monadicIO $ do
x::Integer <- run $ do
ast <- Z3.mkInteger ctx i;
Z3.getInt ctx ast;
assert $ x == i
context "Bit-vectors" $ do
specify "mkBvmul" $ \ctx ->
let bad = do
x <- Z3.mkFreshIntVar ctx "x";
Z3.mkBvmul ctx x x
in bad `shouldThrow` anyZ3Error