-- 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