ogma-core-1.8.0: tests/Main.hs
-- | Test ogma-core
module Main where
import Data.Monoid ( mempty )
import Test.Framework ( Test, defaultMainWithOpts )
import Test.Framework.Providers.HUnit ( testCase )
import Test.HUnit ( assertBool )
import System.Directory ( getTemporaryDirectory )
-- Internal imports
import Command.CStructs2Copilot (cstructs2Copilot)
import Command.Result (isSuccess)
import Command.Standalone (CommandOptions (..), command)
-- | Run all unit tests on ogma-core.
main :: IO ()
main =
defaultMainWithOpts tests mempty
-- | All unit tests for ogma-core.
tests :: [Test.Framework.Test]
tests =
[
testCase "standalone-cmd-fcs-ok"
(testStandaloneFCS "tests/fcs_good.json" True)
-- Should pass
, testCase "standalone-cmd-fsc-file-not-found"
(testStandaloneFCS "tests/file-invalid.json" False)
-- Should fail because the file does not exist
, testCase "standalone-cmd-fcs-parse-fail-1"
(testStandaloneFCS
"tests/commands-fcs-error-parsing-failed-1.json"
False
)
-- Should fail because the opening bracket is [ and not {
, testCase "standalone-cmd-fcs-parse-fail-2"
(testStandaloneFCS
"tests/commands-fcs-error-parsing-failed-2.json"
False
)
-- Should fail because a field is missing in an external variable
, testCase "standalone-cmd-fcs-parse-fail-3"
(testStandaloneFCS
"tests/commands-fcs-error-parsing-failed-3.json"
False
)
-- Should fail because a field is missing in an internal variable
, testCase "standalone-reqs-db-lustre"
(testStandaloneFDB "tests/fdb-example1.json" True)
-- Should pass
, testCase "structs-parse-ok"
(testCStructs2Copilot "tests/reduced_geofence_msgs.h" True)
-- Should pass
, testCase "structs-parse-fail-1"
(testCStructs2Copilot "tests/reduced_geofence_msgs_bad.h" False)
-- Should fail because a keyword is incorrect
]
-- | Test C struct parser and conversion to Copilot structs
-- for a particular file.
--
-- This test uses the Copilot backend for C header files, so it generates
-- Copilot types and instances.
--
-- This IO action fails if any of the following are true:
-- * The given file is not found or accessible.
-- * The format in the given file is incorrect.
-- * Ogma fails due to an internal error or bug.
--
testCStructs2Copilot :: FilePath -- ^ Path to a C header file with structs
-> Bool
-> IO ()
testCStructs2Copilot file success = do
result <- cstructs2Copilot file
-- True if success is expected and detected, or niether expected nor
-- detected.
let testPass = success == isSuccess result
assertBool errorMsg testPass
where
errorMsg = "The result of the transformation of the C header file "
++ file ++ " to Copilot struct declarations was unexpected."
-- | Test standalone backend.
--
-- This test uses the standalone, so it generates a Copilot file.
--
-- This IO action fails if any of the following are true:
-- * The given file is not found or accessible.
-- * The format in the given file is incorrect.
-- * Ogma fails due to an internal error or bug.
testStandaloneFCS :: FilePath -- ^ Path to a input file
-> Bool
-> IO ()
testStandaloneFCS file success = do
targetDir <- getTemporaryDirectory
let opts = CommandOptions
{ commandConditionExpr = Nothing
, commandInputFile = Just file
, commandFormat = "fcs"
, commandPropFormat = "smv"
, commandTypeMapping = [("int", "Int64"), ("real", "Float")]
, commandFilename = "monitor"
, commandTargetDir = targetDir
, commandTemplateDir = Nothing
, commandPropVia = Nothing
, commandExtraVars = Nothing
}
result <- command opts
-- True if success is expected and detected, or niether expected nor
-- detected.
let testPass = success == isSuccess result
assertBool errorMsg testPass
where
errorMsg = "The result of the transformation of input file "
++ file ++ " to Copilot was unexpected."
-- | Test standalone backend with FDB format.
--
-- This test uses the standalone backend with the FDB format and the Lustre
-- property format.
--
-- This IO action fails if any of the following are true:
-- * The given file is not found or accessible.
-- * The format in the given file is incorrect.
-- * Ogma fails due to an internal error or bug.
--
testStandaloneFDB :: FilePath -- ^ Path to input file
-> Bool
-> IO ()
testStandaloneFDB file success = do
targetDir <- getTemporaryDirectory
let opts = CommandOptions
{ commandConditionExpr = Nothing
, commandInputFile = Just file
, commandFormat = "fdb"
, commandPropFormat = "lustre"
, commandTypeMapping = []
, commandFilename = "monitor"
, commandTargetDir = targetDir
, commandTemplateDir = Nothing
, commandPropVia = Nothing
, commandExtraVars = Nothing
}
result <- command opts
-- True if success is expected and detected, or niether expected nor
-- detected.
let testPass = success == isSuccess result
assertBool errorMsg testPass
where
errorMsg = "The result of the transformation of input file "
++ file ++ " to Copilot was unexpected."