{-# LANGUAGE FlexibleContexts #-}

module Math.Programming.Tests where

import Control.Monad
import Control.Monad.IO.Class
import Math.Programming
import Math.Programming.Tests.Api
import Math.Programming.Tests.Fuzz
import Math.Programming.Tests.IP
import Math.Programming.Tests.LP
import Test.Hspec
import Text.Printf

makeAllTests ::
  (MonadIO m, MonadIP v c o m) =>
  -- | The name of the API being tested. This will
  -- be used to generate test group names.
  String ->
  -- | The runner for the API being tested.
  (m () -> IO ()) ->
  -- | The resulting test suite.
  Spec
makeAllTests :: forall (m :: * -> *) v c o.
(MonadIO m, MonadIP v c o m) =>
String -> (m () -> IO ()) -> Spec
makeAllTests String
apiName m () -> IO ()
runner =
  String -> Spec -> Spec
forall a. HasCallStack => String -> SpecWith a -> SpecWith a
describe (String -> String -> String
forall r. PrintfType r => String -> r
printf String
"Math.Programming API tests (%s backend)" String
apiName) (Spec -> Spec) -> Spec -> Spec
forall a b. (a -> b) -> a -> b
$ do
    (m () -> IO ()) -> Spec
forall (m :: * -> *) v c o.
(MonadIO m, MonadLP v c o m) =>
(m () -> IO ()) -> Spec
makeApiTests m () -> IO ()
runner
    (m () -> IO ()) -> Spec
forall (m :: * -> *) v c o.
(MonadIO m, MonadLP v c o m) =>
(m () -> IO ()) -> Spec
makeLPTests m () -> IO ()
runner
    (m () -> IO ()) -> Spec
forall (m :: * -> *) v c o.
(MonadIO m, MonadIP v c o m) =>
(m () -> IO ()) -> Spec
makeIPTests m () -> IO ()
runner
    (m (Seq String) -> IO ()) -> Spec
forall (m :: * -> *) v c o.
(MonadIO m, MonadLP v c o m) =>
(m (Seq String) -> IO ()) -> Spec
makeFuzzTests (m () -> IO ()
runner (m () -> IO ())
-> (m (Seq String) -> m ()) -> m (Seq String) -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m (Seq String) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void)