@@ -61,13 +61,13 @@ main = hspec spec
6161spec :: Spec
6262spec = do
6363
64− (supportExterns, passingTestCases, warningTestCases, failingTestCases) <- runIO $ do
64+ (supportExterns, supportForeigns, passingTestCases, warningTestCases, failingTestCases) <- runIO $ do
6565 cwd <- getCurrentDirectory
6666 let passing = cwd </> "examples" </> "passing"
6767 let warning = cwd </> "examples" </> "warning"
6868 let failing = cwd </> "examples" </> "failing"
6969 let supportDir = cwd </> "tests" </> "support" </> "bower_components"
70− let supportFiles ext = Glob.globDir1 (Glob.compile ("purescript-*/**/*." ++ ext)) supportDir
70+ let supportFiles ext = Glob.globDir1 (Glob.compile ("purescript-*/src/**/*." ++ ext)) supportDir
7171 passingFiles <- getTestFiles passing <$> testGlob passing
7272 warningFiles <- getTestFiles warning <$> testGlob warning
7373 failingFiles <- getTestFiles failing <$> testGlob failing
@@ -77,10 +77,10 @@ spec = do
7777 modules <- ExceptT . return $ P.parseModulesFromFiles id supportPursFiles
7878 foreigns <- inferForeignModules modules
7979 externs <- ExceptT . fmap fst . runTest $ P.make (makeActions foreigns) (map snd modules)
80− return (zip (map snd modules) externs)
80+ return (zip (map snd modules) externs, foreigns)
8181 case supportExterns of
8282 Left errs -> fail (P.prettyPrintMultipleErrors P.defaultPPEOptions errs)
83− Right externs -> return (externs, passingFiles, warningFiles, failingFiles)
83+ Right (externs, foreigns) -> return (externs, foreigns, passingFiles, warningFiles, failingFiles)
8484
8585 outputFile <- runIO $ do
8686 tmp <- getTemporaryDirectory
@@ -90,21 +90,21 @@ spec = do
9090 context "Passing examples" $
9191 forM_ passingTestCases $ \testPurs ->
9292 it ("'" <> takeFileName (getTestMain testPurs) <> "' should compile and run without error") $
93− assertCompiles supportExterns testPurs outputFile
93+ assertCompiles supportExterns supportForeigns testPurs outputFile
9494
9595 context "Warning examples" $
9696 forM_ warningTestCases $ \testPurs -> do
9797 let mainPath = getTestMain testPurs
9898 expectedWarnings <- runIO $ getShouldWarnWith mainPath
9999 it ("'" <> takeFileName mainPath <> "' should compile with warning(s) '" <> intercalate "', '" expectedWarnings <> "'") $
100− assertCompilesWithWarnings supportExterns testPurs expectedWarnings
100+ assertCompilesWithWarnings supportExterns supportForeigns testPurs expectedWarnings
101101
102102 context "Failing examples" $
103103 forM_ failingTestCases $ \testPurs -> do
104104 let mainPath = getTestMain testPurs
105105 expectedFailures <- runIO $ getShouldFailWith mainPath
106106 it ("'" <> takeFileName mainPath <> "' should fail with '" <> intercalate "', '" expectedFailures <> "'") $
107− assertDoesNotCompile supportExterns testPurs expectedFailures
107+ assertDoesNotCompile supportExterns supportForeigns testPurs expectedFailures
108108
109109 where
110110
@@ -197,27 +197,29 @@ runTest = P.runMake P.defaultOptions
197197
198198compile
199199 :: [(P.Module, P.ExternsFile)]
200+ -> M.Map P.ModuleName FilePath
200201 -> [FilePath]
201202 -> ([P.Module] -> IO ())
202203 -> IO (Either P.MultipleErrors [P.ExternsFile], P.MultipleErrors)
203−compile supportExterns inputFiles check = silence $ runTest $ do
204+compile supportExterns supportForeigns inputFiles check = silence $ runTest $ do
204205 fs <- liftIO $ readInput inputFiles
205206 ms <- P.parseModulesFromFiles id fs
206207 foreigns <- inferForeignModules ms
207208 liftIO (check (map snd ms))
208− let actions = makeActions foreigns
209+ let actions = makeActions (foreigns `M.union` supportForeigns)
209210 case ms of
210211 [singleModule] -> pure <$> P.rebuildModule actions (map snd supportExterns) (snd singleModule)
211212 _ -> P.make actions (map fst supportExterns ++ map snd ms)
212213
213214assert
214215 :: [(P.Module, P.ExternsFile)]
216+ -> M.Map P.ModuleName FilePath
215217 -> [FilePath]
216218 -> ([P.Module] -> IO ())
217219 -> (Either P.MultipleErrors P.MultipleErrors -> IO (Maybe String))
218220 -> Expectation
219−assert supportExterns inputFiles check f = do
220− (e, w) <- compile supportExterns inputFiles check
221+assert supportExterns supportForeigns inputFiles check f = do
222+ (e, w) <- compile supportExterns supportForeigns inputFiles check
221223 maybeErr <- f (const w <$> e)
222224 maybe (return ()) expectationFailure maybeErr
223225
@@ -235,11 +237,12 @@ checkShouldFailWith expected errs =
235237
236238assertCompiles
237239 :: [(P.Module, P.ExternsFile)]
240+ -> M.Map P.ModuleName FilePath
238241 -> [FilePath]
239242 -> Handle
240243 -> Expectation
241−assertCompiles supportExterns inputFiles outputFile =
242− assert supportExterns inputFiles checkMain $ \e ->
244+assertCompiles supportExterns supportForeigns inputFiles outputFile =
245+ assert supportExterns supportForeigns inputFiles checkMain $ \e ->
243246 case e of
244247 Left errs -> return . Just . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs
245248 Right _ -> do
@@ -260,11 +263,12 @@ assertCompiles supportExterns inputFiles outputFile =
260263
261264assertCompilesWithWarnings
262265 :: [(P.Module, P.ExternsFile)]
266+ -> M.Map P.ModuleName FilePath
263267 -> [FilePath]
264268 -> [String]
265269 -> Expectation
266−assertCompilesWithWarnings supportExterns inputFiles shouldWarnWith =
267− assert supportExterns inputFiles checkMain $ \e ->
270+assertCompilesWithWarnings supportExterns supportForeigns inputFiles shouldWarnWith =
271+ assert supportExterns supportForeigns inputFiles checkMain $ \e ->
268272 case e of
269273 Left errs ->
270274 return . Just . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs
@@ -279,11 +283,12 @@ assertCompilesWithWarnings supportExterns inputFiles shouldWarnWith =
279283
280284assertDoesNotCompile
281285 :: [(P.Module, P.ExternsFile)]
286+ -> M.Map P.ModuleName FilePath
282287 -> [FilePath]
283288 -> [String]
284289 -> Expectation
285−assertDoesNotCompile supportExterns inputFiles shouldFailWith =
286− assert supportExterns inputFiles noPreCheck $ \e ->
290+assertDoesNotCompile supportExterns supportForeigns inputFiles shouldFailWith =
291+ assert supportExterns supportForeigns inputFiles noPreCheck $ \e ->
287292 case e of
288293 Left errs ->
289294 return $ if null shouldFailWith