sbv-8.1: SBVTestSuite/TestSuite/Queries/Sums.hs
-----------------------------------------------------------------------------
-- |
-- Module : TestSuite.Queries.Sums
-- Copyright : (c) Joel Burget
-- Levent Erkok
-- License : BSD3
-- Maintainer : erkokl@gmail.com
-- Stability : experimental
--
-- Testing sum queries
-----------------------------------------------------------------------------
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module TestSuite.Queries.Sums (tests) where
import Data.SBV
import Data.SBV.Control
import Data.SBV.Either as E
import Data.SBV.Maybe as M
import qualified Data.SBV.List as L
import Utils.SBVTestFramework
-- Test suite
tests :: TestTree
tests =
testGroup "Basics.QuerySums"
[ goldenCapturedIO "query_Sums" $ testQuery querySums
, goldenCapturedIO "query_ListOfSum" $ testQuery queryListOfSum
, goldenCapturedIO "query_Maybe" $ testQuery queryMaybe
, goldenCapturedIO "query_ListOfMaybe" $ testQuery queryListOfMaybe
, goldenCapturedIO "query_SumMaybeBoth" $ testQuery querySumMaybeBoth
, goldenCapturedIO "query_sumMergeMaybe1" $ testQuery querySumMergeMaybe1
, goldenCapturedIO "query_sumMergeMaybe2" $ testQuery querySumMergeMaybe2
, goldenCapturedIO "query_sumMergeEither1" $ testQuery querySumMergeEither1
, goldenCapturedIO "query_sumMergeEither2" $ testQuery querySumMergeEither2
]
testQuery :: Show a => Symbolic a -> FilePath -> IO ()
testQuery t rf = do r <- runSMTWith defaultSMTCfg{verbose=True, redirectVerbose=Just rf} t
appendFile rf ("\nFINAL OUTPUT:\n" ++ show r ++ "\n")
querySums :: Symbolic (Either Integer Char)
querySums = do
a <- sEither @Integer @Char "a"
constrain $ E.either (.== 1) (const sFalse) a
query $ do
_ <- checkSat
av <- getValue a
if av == Left 1
then return av
else error $ "Didn't expect this: " ++ show av
queryListOfSum :: Symbolic [Either Integer Char]
queryListOfSum = do
lst <- sList @(Either Integer Char) "lst"
constrain $ L.length lst .== 2
constrain $ isLeft $ L.head lst
constrain $ isRight $ L.head $ L.tail lst
query $ do
_ <- checkSat
av <- getValue lst
case av of
[Left _, Right _] -> return av
_ -> error $ "Didn't expect this: " ++ show av
queryMaybe :: Symbolic (Maybe Integer)
queryMaybe = do
a <- sMaybe @Integer "a"
constrain $ M.maybe sFalse (.== 1) a
query $ do
_ <- checkSat
av <- getValue a
if av == Just 1
then return av
else error $ "Didn't expect this: " ++ show av
queryListOfMaybe :: Symbolic [Maybe Char]
queryListOfMaybe = do
lst <- sList @(Maybe Char) "lst"
constrain $ L.length lst .== 2
constrain $ isJust $ L.head lst
constrain $ isNothing $ L.head $ L.tail lst
query $ do
_ <- checkSat
av <- getValue lst
case av of
[Just _, Nothing] -> return av
_ -> error $ "Didn't expect this: " ++ show av
querySumMaybeBoth :: Symbolic (Either Integer Integer, Maybe Integer)
querySumMaybeBoth = query $ do
(x :: SEither Integer Integer) <- freshVar_
(y :: SMaybe Integer) <- freshVar_
constrain $ isLeft x
constrain $ isJust y
_ <- checkSat
xv <- getValue x
yv <- getValue y
return (xv, yv)
querySumMergeMaybe1 :: Symbolic (Maybe Integer, Maybe Integer, Bool)
querySumMergeMaybe1 = query $ do
(x :: SMaybe Integer) <- freshVar_
(y :: SMaybe Integer) <- freshVar_
b <- freshVar_
constrain $ isNothing $ ite b x y
_ <- checkSat
xv <- getValue x
yv <- getValue y
bv <- getValue b
return (xv, yv, bv)
querySumMergeMaybe2 :: Symbolic (Maybe Integer, Maybe Integer, Bool)
querySumMergeMaybe2 = query $ do
(x :: SMaybe Integer) <- freshVar_
(y :: SMaybe Integer) <- freshVar_
b <- freshVar_
constrain $ isJust $ ite b x y
_ <- checkSat
xv <- getValue x
yv <- getValue y
bv <- getValue b
return (xv, yv, bv)
querySumMergeEither1 :: Symbolic (Either Integer Bool, Either Integer Bool, Bool)
querySumMergeEither1 = query $ do
(x :: SEither Integer Bool) <- freshVar_
(y :: SEither Integer Bool) <- freshVar_
b <- freshVar_
constrain $ isLeft $ ite b x y
_ <- checkSat
xv <- getValue x
yv <- getValue y
bv <- getValue b
return (xv, yv, bv)
querySumMergeEither2 :: Symbolic (Either Integer Bool, Either Integer Bool, Bool)
querySumMergeEither2 = query $ do
(x :: SEither Integer Bool) <- freshVar_
(y :: SEither Integer Bool) <- freshVar_
b <- freshVar_
constrain $ isRight $ ite b x y
_ <- checkSat
xv <- getValue x
yv <- getValue y
bv <- getValue b
return (xv, yv, bv)
{-# ANN module ("HLint: ignore Reduce duplication" :: String) #-}