@@ -57,7 +57,7 @@ main = hspec spec
5757spec :: Spec
5858spec = do
5959
60− (supportPurs, supportForeigns, passingTestCases, failingTestCases) <- runIO $ do
60+ (supportExterns, supportForeigns, passingTestCases, failingTestCases) <- runIO $ do
6161 cwd <- getCurrentDirectory
6262 let passing = cwd </> "examples" </> "passing"
6363 let failing = cwd </> "examples" </> "failing"
@@ -67,13 +67,20 @@ spec = do
6767 failingFiles <- getTestFiles failing <$> testGlob failing
6868 supportPurs <- supportFiles "purs"
6969 supportForeigns <- loadForeigns =<< supportFiles "js"
70− return (supportPurs, supportForeigns, passingFiles, failingFiles)
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)
77+ Right externs -> return (externs, supportForeigns, passingFiles, failingFiles)
7178
7279 context ("Passing examples") $ do
7380 forM_ passingTestCases $ \(testPurs, testJS) ->
7481 it ("'" <> takeFileName (getTestMain testPurs) <> "' should compile and run without error") $ do
7582 testForeigns <- loadForeigns testJS
76− assertCompiles (supportPurs ++ testPurs) (supportForeigns <> testForeigns)
83+ assertCompiles supportExterns testPurs (supportForeigns <> testForeigns)
7784
7885 context ("Failing examples") $ do
7986 forM_ failingTestCases $ \(testPurs, testJS) -> do
@@ -81,7 +88,7 @@ spec = do
8188 expectedFailures <- runIO $ getShouldFailWith mainPath
8289 it ("'" <> takeFileName mainPath <> "' should fail with '" <> intercalate "', '" expectedFailures <> "'") $ do
8390 testForeigns <- loadForeigns testJS
84− assertDoesNotCompile (supportPurs ++ testPurs) (supportForeigns <> testForeigns) expectedFailures
91+ assertDoesNotCompile supportExterns testPurs (supportForeigns <> testForeigns) expectedFailures
8592
8693 where
8794
@@ -166,27 +173,36 @@ runTest :: P.Make a -> IO (Either P.MultipleErrors a)
166173runTest = fmap fst . P.runMake P.defaultOptions
167174
168175compile
169− :: [FilePath]
176+ :: [(P.Module, P.ExternsFile)]
177+ -> [FilePath]
170178 -> M.Map P.ModuleName FilePath
171− -> IO (Either P.MultipleErrors P.Environment)
172−compile inputFiles foreigns = silence $ runTest $ do
179+ -> IO (Either P.MultipleErrors [P.ExternsFile])
180+compile supportExterns inputFiles foreigns = silence $ runTest $ do
173181 fs <- liftIO $ readInput inputFiles
174182 ms <- P.parseModulesFromFiles id fs
175− P.make (makeActions foreigns) (map snd ms)
183+ let actions = makeActions foreigns
184+ case ms of
185+ [singleModule] -> pure <$> P.rebuildModule actions (map snd supportExterns) (snd singleModule)
186+ _ -> P.make actions (map fst supportExterns ++ map snd ms)
176187
177188assert
178− :: [FilePath]
189+ :: [(P.Module, P.ExternsFile)]
190+ -> [FilePath]
179191 -> M.Map P.ModuleName FilePath
180− -> (Either P.MultipleErrors P.Environment -> IO (Maybe String))
192+ -> (Either P.MultipleErrors [P.ExternsFile] -> IO (Maybe String))
181193 -> Expectation
182−assert inputFiles foreigns f = do
183− e <- compile inputFiles foreigns
194+assert supportExterns inputFiles foreigns f = do
195+ e <- compile supportExterns inputFiles foreigns
184196 maybeErr <- f e
185197 maybe (return ()) expectationFailure maybeErr
186198
187−assertCompiles :: [FilePath] -> M.Map P.ModuleName FilePath -> Expectation
188−assertCompiles inputFiles foreigns = do
189− assert inputFiles foreigns $ \e ->
199+assertCompiles
200+ :: [(P.Module, P.ExternsFile)]
201+ -> [FilePath]
202+ -> M.Map P.ModuleName FilePath
203+ -> Expectation
204+assertCompiles supportExterns inputFiles foreigns = do
205+ assert supportExterns inputFiles foreigns $ \e ->
190206 case e of
191207 Left errs -> return . Just . P.prettyPrintMultipleErrors False $ errs
192208 Right _ -> do
@@ -203,12 +219,13 @@ assertCompiles inputFiles foreigns = do
203219 Nothing -> return $ Just "Couldn't find node.js executable"
204220
205221assertDoesNotCompile
206− :: [FilePath]
222+ :: [(P.Module, P.ExternsFile)]
223+ -> [FilePath]
207224 -> M.Map P.ModuleName FilePath
208225 -> [String]
209226 -> Expectation
210−assertDoesNotCompile inputFiles foreigns shouldFailWith = do
211− assert inputFiles foreigns $ \e ->
227+assertDoesNotCompile supportExterns inputFiles foreigns shouldFailWith = do
228+ assert supportExterns inputFiles foreigns $ \e ->
212229 case e of
213230 Left errs -> do
214231 return $ if null shouldFailWith