packages feed

ddc-war-0.2.1.1: DDC/War/Create/CreateTestDS.hs

module DDC.War.Create.CreateTestDS
        (create)
where
import DDC.War.Create.Way
import DDC.War.Driver
import System.FilePath
import Data.List
import DDC.War.Job                              ()
import Data.Set                                 (Set)
import qualified DDC.War.Job.CompileDS          as CompileDS
import qualified DDC.War.Job.Diff               as Diff
import qualified Data.Set                       as Set


-- | Compile Test.ds files.
create :: Way -> Set FilePath -> FilePath -> Maybe Chain
create way allFiles filePath
 | isSuffixOf ".ds" filePath
 = let  
        fileName        = takeFileName filePath
        sourceDir       = takeDirectory  filePath
        buildDir        = sourceDir </> "war-" ++ wayName way
        testName        = filePath

        mainDS          = sourceDir </> "Main.ds"
        mainSH          = sourceDir </> "Main.sh"
        testErrorCheck  = sourceDir </> replaceExtension fileName ".error.check"

        testCompStdout  = buildDir  </> replaceExtension fileName ".compile.stdout"
        testCompStderr  = buildDir  </> replaceExtension fileName ".compile.stderr"
        testCompDiff    = buildDir  </> replaceExtension fileName ".compile.stderr.diff"
        shouldSucceed   = not $ Set.member testErrorCheck allFiles

        -- Compile the .ds file
        compile         = jobOfSpec (JobId testName (wayName way))
                        $ CompileDS.Spec
                                filePath
                                (wayOptsComp way) ["-M50M"]
                                buildDir testCompStdout testCompStderr
                                Nothing shouldSucceed

        diffError       = jobOfSpec (JobId testName (wayName way))
                        $ Diff.Spec
                                testErrorCheck
                                testCompStderr testCompDiff

   in   -- Don't do anything if there is a Main.ds here.
        -- This other .ds file is probably a part of a larger program.
        if   Set.member mainDS allFiles
          || Set.member mainSH allFiles
           then Nothing
           else Just $ Chain
                        $ [compile] 
                        ++ (if shouldSucceed then [] else [diffError])

 | otherwise    = Nothing