ddc-war-0.2.1.1: DDC/War/Create/CreateDCE.hs
module DDC.War.Create.CreateDCE
(create)
where
import DDC.War.Create.Way
import DDC.War.Driver
import System.FilePath
import DDC.War.Job ()
import Data.Set (Set)
import qualified DDC.War.Job.CompileDCE as CompileDCE
import qualified DDC.War.Job.RunExe as RunExe
import qualified DDC.War.Job.Diff as Diff
import qualified Data.Set as Set
-- | Compile and run .dce files.
create :: Way -> Set FilePath -> FilePath -> Maybe Chain
create way allFiles filePath
| takeFileName filePath == "Main.dce"
= let
sourceDir = takeDirectory filePath
buildDir = sourceDir </> "war-" ++ wayName way
testName = filePath
mainSH = sourceDir </> "Main.sh"
mainBin = buildDir </> "Main.bin"
mainCompStdout = buildDir </> "Main.compile.stdout"
mainCompStderr = buildDir </> "Main.compile.stderr"
mainCompDiff = buildDir </> "Main.compile.stderr.diff"
mainRunStdout = buildDir </> "Main.run.stdout"
mainRunStderr = buildDir </> "Main.run.stderr"
mainErrorCheck = sourceDir </> "Main.error.check"
shouldSucceed = not $ Set.member mainErrorCheck allFiles
mainStdoutCheck = sourceDir </> "Main.stdout.check"
mainStdoutDiff = buildDir </> "Main.run.stdout.diff"
shouldDiffStdout = Set.member mainStdoutCheck allFiles
mainStderrCheck = sourceDir </> "Main.stderr.check"
mainStderrDiff = buildDir </> "Main.run.stderr.diff"
shouldDiffStderr = Set.member mainStderrCheck allFiles
-- compile the .ds into a .bin
compile = jobOfSpec (JobId testName (wayName way))
$ CompileDCE.Spec
filePath
buildDir mainCompStdout mainCompStderr
(Just mainBin) shouldSucceed
-- run the binary
run = jobOfSpec (JobId testName (wayName way))
$ RunExe.Spec
filePath
mainBin []
mainRunStdout mainRunStderr
True
-- diff errors produced by the compilation
diffError = jobOfSpec (JobId testName (wayName way))
$ Diff.Spec
mainErrorCheck
mainCompStderr mainCompDiff
-- diff the stdout of the run
diffStdout = jobOfSpec (JobId testName (wayName way))
$ Diff.Spec
mainStdoutCheck
mainRunStdout mainStdoutDiff
-- diff the stderr of the run
diffStderr = jobOfSpec (JobId testName (wayName way))
$ Diff.Spec
mainStderrCheck
mainRunStderr mainStderrDiff
in if Set.member mainSH allFiles
then Nothing
else Just $ Chain
$ [compile]
++ (if shouldSucceed then [run] else [diffError])
++ (if shouldDiffStdout then [diffStdout] else [])
++ (if shouldDiffStderr then [diffStderr] else [])
| otherwise = Nothing