packages feed

hsoptions-1.0.0.0: tests/unit/System/Console/HsOptionsTestHelpers.hs

module System.Console.HsOptionsTestHelpers
where

import Test.HUnit
import Control.Monad
import Control.Exception
import qualified System.Console.HsOptions as HSO

f2d :: HSO.Flag a -> HSO.FlagData
f2d = HSO.flagToData

data TestProcessResult =
    TestProcessError [HSO.FlagError]
  | TestProcessSuccess HSO.ProcessResults

errorsToString :: [HSO.FlagError] -> String
errorsToString  [] = ""
errorsToString  (er:errs) = aux er ++ errorsToString errs
  where aux (HSO.FlagNonFatalError erMessage) = " * '" ++ erMessage ++ "'\n"
        aux (HSO.FlagFatalError erMessage) = " * '" ++erMessage ++ "'\n"

assertError :: TestProcessResult -> String -> Assertion
assertError (TestProcessSuccess _) errorMessage =
  assertFailure $ "assertError failed. expected '" ++ errorMessage ++ "' but zero errors occurred"
assertError (TestProcessError errs) errorMessage =
  let nfErrs = [er | (HSO.FlagNonFatalError er) <- errs] ++ [er | (HSO.FlagFatalError er) <- errs]in
  when ( errorMessage `notElem` nfErrs)
    (assertFailure $ "assertError failed. expected '" ++
                       errorMessage ++
                       "' but error not found.\n" ++
                       "** other errors that where found:\n" ++
                       errorsToString errs)

assertSingleError :: TestProcessResult -> Assertion
assertSingleError (TestProcessSuccess _) =
  assertFailure "assertSingleError failed. expected single error but zero errors occurred"
assertSingleError (TestProcessError errs) = let count = length errs in
  when (count /= 1) (assertFailure $ "assertSingleError failed. expected single error but "++
                                    show count ++ " errors occurred")


assertFlagValueEquals :: (Eq a, Show a) => TestProcessResult -> HSO.Flag a -> a -> Assertion
assertFlagValueEquals (TestProcessError errs) _flag _value =
  assertFailure ("assertFlagValueEquals failed. expected no errors when getting flag value" ++
                " but errors found:\n" ++
                "** errors that where found:\n" ++
                errorsToString errs)

assertFlagValueEquals (TestProcessSuccess (results, _args)) flag expected = assertEqual "" expected value
  where value = HSO.get results flag

assertArgsEquals :: TestProcessResult -> [String] -> Assertion
assertArgsEquals (TestProcessError errs) _args =
  assertFailure ("assertFlagValueEquals failed. expected no errors when getting args value" ++
                " but errors found:\n" ++
                "** errors that where found:\n" ++
                errorsToString errs)
assertArgsEquals (TestProcessSuccess (_results, args)) expected = assertEqual "" expected args


assertException :: a -> String -> Assertion
assertException expr msg = do result <- evaluate' expr
                              case result of
                                  Left err -> assertEqual "" msg (show err)
                                  Right _ -> fail "Expected exception but no exception occurred"

evaluate' ::  a -> IO (Either SomeException a)
evaluate' flag = try (evaluate flag)

process :: HSO.FlagData -> String -> IO TestProcessResult
process fd input = do result <- HSO.process fd (words input)
                      case result of
                          Left errs -> return (TestProcessError errs)
                          Right r -> return (TestProcessSuccess r)

makeFlagData :: [HSO.FlagData] -> HSO.FlagData
makeFlagData = HSO.combine


makeConfFile :: [String] -> String
makeConfFile = unlines