sbv-0.9.24: Data/SBV/BitVectors/GenTest.hs
-----------------------------------------------------------------------------
-- |
-- Module : Data.SBV.BitVectors.GenTest
-- Copyright : (c) Levent Erkok
-- License : BSD3
-- Maintainer : erkokl@gmail.com
-- Stability : experimental
-- Portability : portable
--
-- Test generation from symbolic programs
-----------------------------------------------------------------------------
module Data.SBV.BitVectors.GenTest (genTest) where
import Data.Maybe (fromMaybe)
import Data.SBV.BitVectors.Data
-- | Generate a set of concrete test values from a symbolic program. The output
-- can be rendered as test vectors in different languages as necessary. Use the
-- function 'output' call to indicate what fields should be in the test result.
-- (Also see 'constrain' and 'pConstrain' for filtering acceptable test values.)
genTest :: Int -> Symbolic () -> IO [([CW], [CW])]
genTest n m = gen 0 []
where gen i sofar
| i == n = return (reverse sofar)
| True = do mbT <- tc
case mbT of
Nothing -> gen i sofar
Just t -> gen (i+1) (t:sofar)
tc = do (_, Result _ tvals _ _ cs _ _ _ _ _ cstrs os) <- runSymbolic' Concrete m
let cval = fromMaybe (error "Cannot generate tests in the presence of uninterpeted constants!") . (`lookup` cs)
cond = all (cwToBool . cval) cstrs
io = (map snd tvals, map cval os)
if cond
then return $ Just io
else return Nothing