module RegressionTests where import Control.Monad.IO.Class import Test.Tasty import Test.Tasty.HUnit import Math.Programming import Math.Programming.Glpk test_tree :: TestTree test_tree = testGroup "Regression tests" [ testCase "Free variables (LP)" testFreeVariablesLP , testCase "Free variables (IP)" testFreeVariablesIP ] assertFeasible :: SolutionStatus -> Glpk () assertFeasible result = liftIO $ case result of Error -> assertFailure "Failed to solve program" Unbounded -> assertFailure "Unbounded program" Infeasible -> assertFailure "Infeasible program" _ -> pure () assertRunGlpk :: Glpk a -> IO () assertRunGlpk program = do eResult <- runGlpk program case eResult of Left err -> assertFailure ("Error solving program: " <> show err) Right _ -> pure () testFreeVariablesLP :: IO () testFreeVariablesLP = assertRunGlpk $ do x <- free y <- free z <- free _ <- x @==# 0 _ <- y @==# 3.1 _ <- z @==# -3.1 optimizeLP >>= assertFeasible vx <- getVariableValue x vy <- getVariableValue y vz <- getVariableValue z liftIO $ 0 @=? vx liftIO $ 3.1 @=? vy liftIO $ -3.1 @=? vz testFreeVariablesIP :: IO () testFreeVariablesIP = assertRunGlpk $ do x <- integer y <- integer z <- integer _ <- x @==# 0 _ <- y @==# 3 _ <- z @==# -3 optimizeIP >>= assertFeasible vx <- getVariableValue x vy <- getVariableValue y vz <- getVariableValue z liftIO $ 0 @=? vx liftIO $ 3 @=? vy liftIO $ -3 @=? vz