@@ -176,10 +176,12 @@ compile
176176 :: [(P.Module, P.ExternsFile)]
177177 -> [FilePath]
178178 -> M.Map P.ModuleName FilePath
179+ -> ([P.Module] -> IO ())
179180 -> IO (Either P.MultipleErrors [P.ExternsFile])
180−compile supportExterns inputFiles foreigns = silence $ runTest $ do
181+compile supportExterns inputFiles foreigns check = silence $ runTest $ do
181182 fs <- liftIO $ readInput inputFiles
182183 ms <- P.parseModulesFromFiles id fs
184+ liftIO (check (map snd ms))
183185 let actions = makeActions foreigns
184186 case ms of
185187 [singleModule] -> pure <$> P.rebuildModule actions (map snd supportExterns) (snd singleModule)
@@ -189,10 +191,11 @@ assert
189191 :: [(P.Module, P.ExternsFile)]
190192 -> [FilePath]
191193 -> M.Map P.ModuleName FilePath
194+ -> ([P.Module] -> IO ())
192195 -> (Either P.MultipleErrors [P.ExternsFile] -> IO (Maybe String))
193196 -> Expectation
194−assert supportExterns inputFiles foreigns f = do
195− e <- compile supportExterns inputFiles foreigns
197+assert supportExterns inputFiles foreigns check f = do
198+ e <- compile supportExterns inputFiles foreigns check
196199 maybeErr <- f e
197200 maybe (return ()) expectationFailure maybeErr
198201
@@ -201,8 +204,8 @@ assertCompiles
201204 -> [FilePath]
202205 -> M.Map P.ModuleName FilePath
203206 -> Expectation
204−assertCompiles supportExterns inputFiles foreigns = do
205− assert supportExterns inputFiles foreigns $ \e ->
207+assertCompiles supportExterns inputFiles foreigns =
208+ assert supportExterns inputFiles foreigns checkMain $ \e ->
206209 case e of
207210 Left errs -> return . Just . P.prettyPrintMultipleErrors False $ errs
208211 Right _ -> do
@@ -217,6 +220,10 @@ assertCompiles supportExterns inputFiles foreigns = do
217220 | otherwise -> return $ Just $ "Test did not finish with 'Done':\n\n" <> out
218221 Just (ExitFailure _, _, err) -> return $ Just err
219222 Nothing -> return $ Just "Couldn't find node.js executable"
223+ where
224+ checkMain ms =
225+ unless (any ((== P.moduleNameFromString "Main") . P.getModuleName) ms)
226+ (fail "Main module missing")
220227
221228assertDoesNotCompile
222229 :: [(P.Module, P.ExternsFile)]
@@ -224,10 +231,10 @@ assertDoesNotCompile
224231 -> M.Map P.ModuleName FilePath
225232 -> [String]
226233 -> Expectation
227−assertDoesNotCompile supportExterns inputFiles foreigns shouldFailWith = do
228− assert supportExterns inputFiles foreigns $ \e ->
234+assertDoesNotCompile supportExterns inputFiles foreigns shouldFailWith =
235+ assert supportExterns inputFiles foreigns noPreCheck $ \e ->
229236 case e of
230− Left errs -> do
237+ Left errs ->
231238 return $ if null shouldFailWith
232239 then Just $ "shouldFailWith declaration is missing (errors were: "
233240 ++ show (map P.errorCode (P.runMultipleErrors errs))
@@ -237,6 +244,8 @@ assertDoesNotCompile supportExterns inputFiles foreigns shouldFailWith = do
237244 return $ Just "Should not have compiled"
238245
239246 where
247+ noPreCheck = const (return ())
248+
240249 checkShouldFailWith expected errs =
241250 let actual = map P.errorCode $ P.runMultipleErrors errs
242251 in if sort expected == sort actual