@@ -57,7 +57,7 @@ main = hspec spec
57spec :: Spec
57spec :: Spec
60− (supportPurs, supportForeigns, passingTestCases, failingTestCases) <- runIO $ do
60+ (supportExterns, supportForeigns, passingTestCases, failingTestCases) <- runIO $ do
61 cwd <- getCurrentDirectory
61 cwd <- getCurrentDirectory
62 let passing = cwd </> "examples" </> "passing"
62 let passing = cwd </> "examples" </> "passing"
63 let failing = cwd </> "examples" </> "failing"
63 let failing = cwd </> "examples" </> "failing"
@@ -67,13 +67,20 @@ spec = do
67 failingFiles <- getTestFiles failing <$> testGlob failing
67 failingFiles <- getTestFiles failing <$> testGlob failing
68 supportPurs <- supportFiles "purs"
68 supportPurs <- supportFiles "purs"
69 supportForeigns <- loadForeigns =<< supportFiles "js"
69 supportForeigns <- loadForeigns =<< supportFiles "js"
70+ supportPursFiles <- readInput supportPurs
71+ supportExterns <- runExceptT $ do
72+ modules <- ExceptT . return $ P.parseModulesFromFiles id supportPursFiles
73+ externs <- ExceptT . runTest $ P.make (makeActions supportForeigns) (map snd modules)
74+ return (zip (map snd modules) externs)
75+ case supportExterns of
76+ Left errs -> fail (P.prettyPrintMultipleErrors False errs)
70− return (supportPurs, supportForeigns, passingFiles, failingFiles)
77+ Right externs -> return (externs, supportForeigns, passingFiles, failingFiles)
72 context ("Passing examples") $ do
79 context ("Passing examples") $ do
73 forM_ passingTestCases $ \(testPurs, testJS) ->
80 forM_ passingTestCases $ \(testPurs, testJS) ->
74 it ("'" <> takeFileName (getTestMain testPurs) <> "' should compile and run without error") $ do
81 it ("'" <> takeFileName (getTestMain testPurs) <> "' should compile and run without error") $ do
75 testForeigns <- loadForeigns testJS
82 testForeigns <- loadForeigns testJS
76− assertCompiles (supportPurs ++ testPurs) (supportForeigns <> testForeigns)
83+ assertCompiles supportExterns testPurs (supportForeigns <> testForeigns)
78 context ("Failing examples") $ do
85 context ("Failing examples") $ do
79 forM_ failingTestCases $ \(testPurs, testJS) -> do
86 forM_ failingTestCases $ \(testPurs, testJS) -> do
@@ -81,7 +88,7 @@ spec = do
81 expectedFailures <- runIO $ getShouldFailWith mainPath
88 expectedFailures <- runIO $ getShouldFailWith mainPath
82 it ("'" <> takeFileName mainPath <> "' should fail with '" <> intercalate "', '" expectedFailures <> "'") $ do
89 it ("'" <> takeFileName mainPath <> "' should fail with '" <> intercalate "', '" expectedFailures <> "'") $ do
83 testForeigns <- loadForeigns testJS
90 testForeigns <- loadForeigns testJS
84− assertDoesNotCompile (supportPurs ++ testPurs) (supportForeigns <> testForeigns) expectedFailures
91+ assertDoesNotCompile supportExterns testPurs (supportForeigns <> testForeigns) expectedFailures
@@ -166,27 +173,36 @@ runTest :: P.Make a -> IO (Either P.MultipleErrors a)
166runTest = fmap fst . P.runMake P.defaultOptions
173runTest = fmap fst . P.runMake P.defaultOptions
176+ :: [(P.Module, P.ExternsFile)]
169− :: [FilePath]
177+ -> [FilePath]
170 -> M.Map P.ModuleName FilePath
178 -> M.Map P.ModuleName FilePath
171− -> IO (Either P.MultipleErrors P.Environment)
179+ -> IO (Either P.MultipleErrors [P.ExternsFile])
172−compile inputFiles foreigns = silence $ runTest $ do
180+compile supportExterns inputFiles foreigns = silence $ runTest $ do
173 fs <- liftIO $ readInput inputFiles
181 fs <- liftIO $ readInput inputFiles
174 ms <- P.parseModulesFromFiles id fs
182 ms <- P.parseModulesFromFiles id fs
175− P.make (makeActions foreigns) (map snd ms)
183+ let actions = makeActions foreigns
185+ [singleModule] -> pure <$> P.rebuildModule actions (map snd supportExterns) (snd singleModule)
186+ _ -> P.make actions (map fst supportExterns ++ map snd ms)
189+ :: [(P.Module, P.ExternsFile)]
178− :: [FilePath]
190+ -> [FilePath]
179 -> M.Map P.ModuleName FilePath
191 -> M.Map P.ModuleName FilePath
180− -> (Either P.MultipleErrors P.Environment -> IO (Maybe String))
192+ -> (Either P.MultipleErrors [P.ExternsFile] -> IO (Maybe String))
181 -> Expectation
193 -> Expectation
182−assert inputFiles foreigns f = do
194+assert supportExterns inputFiles foreigns f = do
183− e <- compile inputFiles foreigns
195+ e <- compile supportExterns inputFiles foreigns
184 maybeErr <- f e
196 maybeErr <- f e
185 maybe (return ()) expectationFailure maybeErr
197 maybe (return ()) expectationFailure maybeErr
200+ :: [(P.Module, P.ExternsFile)]
187−assertCompiles :: [FilePath] -> M.Map P.ModuleName FilePath -> Expectation
202+ -> M.Map P.ModuleName FilePath
188−assertCompiles inputFiles foreigns = do
204+assertCompiles supportExterns inputFiles foreigns = do
189− assert inputFiles foreigns $ \e ->
205+ assert supportExterns inputFiles foreigns $ \e ->
190 case e of
206 case e of
191 Left errs -> return . Just . P.prettyPrintMultipleErrors False $ errs
207 Left errs -> return . Just . P.prettyPrintMultipleErrors False $ errs
192 Right _ -> do
208 Right _ -> do
@@ -203,12 +219,13 @@ assertCompiles inputFiles foreigns = do
203 Nothing -> return $ Just "Couldn't find node.js executable"
219 Nothing -> return $ Just "Couldn't find node.js executable"
205assertDoesNotCompile
221assertDoesNotCompile
222+ :: [(P.Module, P.ExternsFile)]
206− :: [FilePath]
223+ -> [FilePath]
207 -> M.Map P.ModuleName FilePath
224 -> M.Map P.ModuleName FilePath
208 -> [String]
225 -> [String]
209 -> Expectation
226 -> Expectation
210−assertDoesNotCompile inputFiles foreigns shouldFailWith = do
227+assertDoesNotCompile supportExterns inputFiles foreigns shouldFailWith = do
211− assert inputFiles foreigns $ \e ->
228+ assert supportExterns inputFiles foreigns $ \e ->
212 case e of
229 case e of
213 Left errs -> do
230 Left errs -> do
214 return $ if null shouldFailWith
231 return $ if null shouldFailWith