packages feed

MIP-0.2.0.0: test/Test/MPSFile.hs

{-# LANGUAGE TemplateHaskell #-}
module Test.MPSFile (mpsTestGroup) where

import Control.Monad
import Data.Default.Class
import Data.Either
import Data.List
import Data.Maybe
import Test.Tasty
import Test.Tasty.QuickCheck
import Test.Tasty.HUnit
import Test.Tasty.TH
import Numeric.Optimization.MIP.MPSFile

case_testdata = checkString "testdata" testdata
case_example2 = checkFile "samples/mps/example2.mps"
case_ind1     = checkFile "samples/mps/ind1.mps"
case_intvar1  = checkFile "samples/mps/intvar1.mps"
case_intvar2  = checkFile "samples/mps/intvar2.mps"
case_quadobj1 = checkFile "samples/mps/quadobj1.mps"
case_quadobj2 = checkFile "samples/mps/quadobj2.mps"
case_ranges   = checkFile "samples/mps/ranges.mps"
case_sos      = checkFile "samples/mps/sos.mps"
case_sos2     = checkFile "samples/mps/test-sos2.mps"
case_sc       = checkFile "samples/mps/sc.mps"
case_semicont = checkFile "samples/mps/test-semicont.mps"
case_semiint_sc = checkFile "samples/mps/test-semiint-sc.mps"
case_semiint_si = checkFile "samples/mps/test-semiint-si.mps"
case_bounds_fixed = checkFile "samples/mps/test-bounds-fixed.mps"
case_bounds_free = checkFile "samples/mps/test-bounds-free.mps"
case_bounds_MI = checkFile "samples/mps/test-bounds-mi.mps"
case_bounds_PL = checkFile "samples/mps/test-bounds-pl.mps"
case_bounds_BV = checkFile "samples/mps/test-bounds-bv.mps"
case_implicit_bv = checkFile "samples/mps/test-implicit-bv.mps"
case_negative_upper_bound = checkFile "samples/mps/test-negative-upper-bound.mps"
case_negative_upper_qcp = checkFile "samples/mps/test-qcp.mps"
case_lazy_constraints = checkFile "samples/mps/test-lazy-constraints.mps"
case_user_cuts = checkFile "samples/mps/test-user-cuts.mps"

------------------------------------------------------------------------
-- Sample data

testdata :: String
testdata = unlines
  [ "NAME          example2.mps"
  , "ROWS"
  , " N  obj     "
  , " L  c1      "
  , " L  c2      "
  , "COLUMNS"
  , "    x1        obj                 -1   c1                  -1"
  , "    x1        c2                   1"
  , "    x2        obj                 -2   c1                   1"
  , "    x2        c2                  -3"
  , "    x3        obj                 -3   c1                   1"
  , "    x3        c2                   1"
  , "RHS"
  , "    rhs       c1                  20   c2                  30"
  , "BOUNDS"
  , " UP BOUND     x1                  40"
  , "ENDATA"
  ]

------------------------------------------------------------------------
-- Utilities

checkFile :: FilePath -> Assertion
checkFile fname = do
  lp <- parseFile def fname
  case render def lp of
    Left err -> assertFailure ("render failure: " ++ err)
    Right str -> assertBool ("failed to parse " ++ show str)  $ isRight $ parseString def fname str

checkString :: String -> String -> Assertion
checkString name str = do
  case parseString def name str of
    Left err -> assertFailure (show err)
    Right lp ->
      case render def lp of
        Left err -> assertFailure ("render failure: " ++ err)
        Right str -> assertBool ("failed to parse " ++ show str)  $ isRight $ parseString def name str

------------------------------------------------------------------------
-- Test harness

mpsTestGroup :: TestTree
mpsTestGroup = $(testGroupGenerator)