packages feed

PropaFP-0.1.1.0: test/Spec.hs

module Main where

import Prelude
import TestFiles
import System.Directory
import PropaFP.Expression
import PropaFP.VarMap
import PropaFP.Parsers.Smt
import PropaFP.Translators.DReal
import PropaFP.Translators.MetiTarski
import System.Exit
import MixedTypesNumPrelude (ifThenElse)

main :: IO ()
main = do
  putStrLn "Testing dReal translator"
  testProverTranslator allTestFiles DReal []
  putStrLn "Testing MetiTarski translator"
  testProverTranslator allTestFiles MetiTarski unsupportedByMetiTarskiFiles
  exitSuccess

-- |Take a list of input files, a prover for which PropaFP provides a translator, and a list of files unsupported by the translator.
-- Test if PropaFP generates the same file as the one stored (currently under PropaFP/examples/testParent/proverFolderName/testName.proverExt)
testProverTranslator :: [(String, String)] -> SupportedProver -> [(String, String)] -> IO ()
testProverTranslator [] _ _ = putStrLn "All tests passed"
testProverTranslator (test@(testParent, testName) : tests) prover unsupportedTests = do
  mFptaylorPath <- findExecutable "fptaylor"
  currentDirectory <- getCurrentDirectory
  case mFptaylorPath of
    Nothing -> putStrLn "FPTaylor executable not found in PATH"
    Just fptaylorPath -> do
      let vcToProcess = currentDirectory ++ "/examples/" ++ testParent ++ "/why3smt/" ++ testName ++ ".smt2"
      let originalProcessedVCPath = currentDirectory ++  "/examples/" ++ testParent ++ "/" ++ getProverFolderName prover ++ "/" ++ testName ++ "." ++ getFileExtension prover
      if test `elem` unsupportedTests
        then do
          putStrLn ("Test skipped (unsupported): " ++ vcToProcess) 
          testProverTranslator tests prover unsupportedTests
        else do
          originalProcessedVC <- readFile originalProcessedVCPath
          mNewProcessedVC <- parseVCToSolver vcToProcess fptaylorPath (getTranslator prover) (getNegationStatus prover)
          case mNewProcessedVC of
            Just newProcessedVC -> 
              if newProcessedVC == originalProcessedVC
                then do
                  putStrLn ("Test passed: " ++ vcToProcess)
                  testProverTranslator tests prover unsupportedTests
                else do
                  putStrLn $ "Processing the following file for dReal: " ++ vcToProcess
                  putStrLn $ "Resulted in an output that differs from: " ++ originalProcessedVCPath
                  putStrLn $ "The incorrect output is:\n"
                  putStrLn newProcessedVC              
                  putStrLn $ "The correct output is:\n"
                  putStrLn originalProcessedVC
                  putStrLn ("Test failed: " ++ vcToProcess)
                  exitFailure
            Nothing         -> do
              putStrLn $ "Issue generating input for dReal using file: " ++ vcToProcess 
              exitFailure