packages feed

smtlib-backends-tests-0.3: src/SMTLIB/Backends/Tests.hs

{-# LANGUAGE OverloadedStrings #-}

-- | A module providing functions useful for testing a backend for SimpleSMT.
module SMTLIB.Backends.Tests
  ( testBackend,
    Src.Source (..),
    Src.sources,
  )
where

import SMTLIB.Backends (Backend, QueuingFlag (..), command, initSolver)
import qualified SMTLIB.Backends.Tests.Sources as Src
import Test.Tasty
import Test.Tasty.HUnit

-- | Test a backend by using it to run a list of examples.
testBackend ::
  -- | The name of the test group.
  String ->
  -- | A list of examples on which to run the backend.
  [Src.Source] ->
  -- | A function that should create a backend, run a given
  -- computation and release the backend's resources.
  ((Backend -> Assertion) -> Assertion) ->
  TestTree
testBackend name sources with =
  testGroup name $ do
    queuing <- [NoQueuing, Queuing]
    return
      $ testGroup
        ( case queuing of
            Queuing -> "queuing"
            NoQueuing -> "no queuing"
        )
      $ do
        source <- sources
        return $
          testCase (Src.name source) $
            with $ \backend -> do
              solver <- initSolver queuing backend
              Src.run source solver
              -- ensure the sources consisting only of queued commands also run
              _ <- command solver "(get-info :name)"
              return ()