git.iko.soy/rowtype-yoga/purescript-native
on 24fdff2 help sign in
140 lines 4.8 kB history raw
1-------------------------------------------------------------------------------
2--
3-- Module : Main
4-- Copyright : (c) 2015 Andy Arvanitis and other contributors
5-- License : MIT
6--
7-- Maintainer : Andy Arvanitis
8-- Stability : experimental
9-- Portability :
10--
11--
12--
13-------------------------------------------------------------------------------
14module Main where
16import Data.List
17import Control.Applicative
18import Control.Monad
20import System.Process
21import System.FilePath
22import System.Directory
24-------------------------------------------------------------------------------
25testsDir :: IO (FilePath, FilePath)
26-------------------------------------------------------------------------------
27testsDir = do
28 baseDir <- getCurrentDirectory
29 return (baseDir </> "pcc-tests", baseDir)
31-------------------------------------------------------------------------------
32main :: IO ()
33-------------------------------------------------------------------------------
34main = do
36 (outputDir, baseDir) <- testsDir
38 outputDirExists <- doesDirectoryExist outputDir
39 when outputDirExists $ removeDirectoryRecursive outputDir
40 createDirectory outputDir
42 fetchPackages
44 let srcDir = outputDir </> "src"
45 createDirectory srcDir
47 let buildDir = outputDir </> "build"
48 createDirectory buildDir
50 let makefile = outputDir </> "Makefile"
51 writeFile makefile makefileText
53 let passingDir = baseDir </> "examples" </> "passing"
54 passingTestCases <- sort . filter (".purs" `isSuffixOf`) <$> getDirectoryContents passingDir
56 let tests = filter (`notElem` skipped) passingTestCases
58 -- Run the tests
59 --
60 forM_ tests $ \inputFile -> do
61 --
62 -- Compile PureScript file
63 --
64 putStrLn $ "Compiling test " ++ inputFile ++ " ..."
65 setCurrentDirectory outputDir
66 copyFile (passingDir </> inputFile) (srcDir </> inputFile)
67 callProcess "make" ["clean", "main"]
68 --
69 -- Build and run C++ files
70 --
71 setCurrentDirectory buildDir
72 callProcess "cmake" ["../output"]
73 callProcess "make" []
74 callProcess (buildDir </> "Main") []
76 removeFile (srcDir </> inputFile)
78 -- TODO: support failing test cases
79 --
80 -- let failing = baseDir </> "examples" </> "failing"
81 -- failingTestCases <- sort . filter (".purs" `isSuffixOf`) <$> getDirectoryContents failing
82 --
84 setCurrentDirectory baseDir
85 putStrLn "pcc-tests finished"
86 putStrLn $ "Total tests available: " ++ show (length passingTestCases)
87 putStrLn $ "Tests run: " ++ show (length tests)
88 putStrLn $ "Tests skipped: " ++ show (length skipped)
90-------------------------------------------------------------------------------
91repo :: String
92-------------------------------------------------------------------------------
93repo = "git://github.com/pure11/"
95-------------------------------------------------------------------------------
96packages :: [(String, String)]
97-------------------------------------------------------------------------------
98packages =
99 [ ("purescript-eff", "")
100 , ("purescript-prelude", "")
101 , ("purescript-assert", "")
102 , ("purescript-st", "")
103 , ("purescript-console", "")
104 , ("purescript-functions", "")
105 ]
107-------------------------------------------------------------------------------
108fetchPackages :: IO ()
109-------------------------------------------------------------------------------
110fetchPackages = do
111 (outputDir, baseDir) <- testsDir
112 let packageDir = outputDir </> "packages"
113 createDirectory packageDir
114 setCurrentDirectory packageDir
115 forM_ packages $ \package -> let branch = snd package in
116 callProcess "git" $ ["clone"] ++ (if null branch then [] else ["--branch", branch]) ++ [repo ++ (fst package) ++ ".git"]
117 setCurrentDirectory baseDir
119-------------------------------------------------------------------------------
120makefileText :: String
121-------------------------------------------------------------------------------
122makefileText = intercalate "\n" lines'
123 where lines' = [ "PCC := '../.cabal-sandbox/bin/pcc'"
124 , "MODULE_DIR='packages'"
125 , "SOURCE_DIR='src'"
126 , "MODULES := $(shell find $(MODULE_DIR) -name '*.purs' | grep -v \\/test\\/ | grep -v \\/example\\/ | grep -v \\/examples\\/)"
127 , "SOURCES := $(shell find $(SOURCE_DIR) -name '*.purs')"
128 , "all: main"
129 , "main:"
130 , "\t$(PCC) $(MODULES) $(SOURCES)"
131 , "clean:"
132 , "\t@rm -rf output/*"
133 ]
135-------------------------------------------------------------------------------
136skipped :: [String]
137-------------------------------------------------------------------------------
138skipped =
139 [ "ExplicitImportReExport.purs" -- OK, test has no main (would pass otherwise)
140 ]