diff --git a/CHANGELOG.d/internal_document-hspec-accept.md b/CHANGELOG.d/internal_document-hspec-accept.md new file mode 100644 index 0000000000..7c90c240fc --- /dev/null +++ b/CHANGELOG.d/internal_document-hspec-accept.md @@ -0,0 +1 @@ +* Document the `HSPEC_ACCEPT` flag for generating golden files \ No newline at end of file diff --git a/CHANGELOG.d/internal_error-on-non-Main-modules.md b/CHANGELOG.d/internal_error-on-non-Main-modules.md new file mode 100644 index 0000000000..78c52eaf86 --- /dev/null +++ b/CHANGELOG.d/internal_error-on-non-Main-modules.md @@ -0,0 +1 @@ +* Fail test if PureScript file(s) don't have a `Main` module \ No newline at end of file diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 99dc4ac2b6..f896f83d41 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -41,6 +41,8 @@ stack test --fast --test-arguments="--match 1110.purs" This will run whatever test uses the example file `1110.purs`. +The golden files (e.g. `*.out` files) are generated automatically when missing, and can be updated by setting the "HSPEC_ACCEPT" environment variable, e.g. by running `HSPEC_ACCEPT=true stack test`. + ### Adding Dependencies Because the PureScript compiler is distributed in binary form, we include the licenses of all dependencies, including transitive ones, in the LICENSE file. Therefore, whenever the dependencies change, the LICENSE file should be updated. diff --git a/tests/TestBundle.hs b/tests/TestBundle.hs index bff8f30d5a..df766fa3b3 100644 --- a/tests/TestBundle.hs +++ b/tests/TestBundle.hs @@ -47,7 +47,7 @@ assertBundles -> Handle -> Expectation assertBundles support inputFiles outputFile = do - (result, _) <- compile support inputFiles + (result, _) <- compile True support inputFiles case result of Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs Right _ -> do diff --git a/tests/TestCompiler.hs b/tests/TestCompiler.hs index 7d20c9bf0f..8402a08951 100644 --- a/tests/TestCompiler.hs +++ b/tests/TestCompiler.hs @@ -135,7 +135,7 @@ assertCompiles -> Handle -> Expectation assertCompiles support inputFiles outputFile = do - (result, _) <- compile support inputFiles + (result, _) <- compile True support inputFiles case result of Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs Right _ -> do @@ -157,7 +157,7 @@ assertCompilesWithWarnings -> [String] -> Expectation assertCompilesWithWarnings support inputFiles shouldWarnWith = do - result'@(result, warnings) <- compile support inputFiles + result'@(result, warnings) <- compile False support inputFiles case result of Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs @@ -173,7 +173,7 @@ assertDoesNotCompile -> [String] -> Expectation assertDoesNotCompile support inputFiles shouldFailWith = do - result <- compile support inputFiles + result <- compile False support inputFiles case fst result of Left errs -> do when (null shouldFailWith) @@ -193,7 +193,7 @@ assertCompilesToExpectedOutput -> [FilePath] -> Expectation assertCompilesToExpectedOutput support inputFiles = do - (result, _) <- compile support inputFiles + (result, _) <- compile False support inputFiles case result of Left errs -> expectationFailure . P.prettyPrintMultipleErrors P.defaultPPEOptions $ errs Right _ -> diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs index 4db550f8d7..5c66efe20a 100644 --- a/tests/TestUtils.hs +++ b/tests/TestUtils.hs @@ -5,6 +5,8 @@ import Prelude.Compat import qualified Language.PureScript as P import qualified Language.PureScript.CST as CST +import qualified Language.PureScript.AST as AST +import qualified Language.PureScript.Names as N import Language.PureScript.Interactive.IO (findNodeProcess) import Control.Arrow ((***), (>>>)) @@ -195,20 +197,34 @@ getTestFiles testDir = do else dir compile - :: SupportModules + :: Bool + -> SupportModules -> [FilePath] -> IO (Either P.MultipleErrors [P.ExternsFile], P.MultipleErrors) -compile SupportModules{..} inputFiles = runTest $ do +compile checkForMainModule SupportModules{..} inputFiles = runTest $ do -- Sorting the input files makes some messages (e.g., duplicate module) deterministic fs <- liftIO $ readInput (sort inputFiles) msWithWarnings <- CST.parseFromFiles id fs tell $ foldMap (\(fp, (ws, _)) -> CST.toMultipleWarnings fp ws) msWithWarnings let ms = fmap snd <$> msWithWarnings foreigns <- inferForeignModules ms - let actions = makeActions supportModules (foreigns `M.union` supportForeigns) + let + actions = makeActions supportModules (foreigns `M.union` supportForeigns) + hasMainModule = (==) 1 $ length $ filter (== "Main") $ fmap getPsModuleName ms case ms of - [singleModule] -> pure <$> P.rebuildModule actions supportExterns (snd singleModule) - _ -> P.make actions (CST.pureResult <$> supportModules ++ map snd ms) + [singleModule] -> do + when (checkForMainModule && not hasMainModule) $ do + error $ "When testing a single PureScript file, the file's module's name must be 'Main' but got '" + <> T.unpack (getPsModuleName singleModule) <> "'." + pure <$> P.rebuildModule actions supportExterns (snd singleModule) + _ -> do + when (checkForMainModule && not hasMainModule) $ do + error "When testing multiple PureScript files, the main file's module's name must be 'Main'." + P.make actions (CST.pureResult <$> supportModules ++ map snd ms) + +getPsModuleName :: (a, AST.Module) -> T.Text +getPsModuleName psModule = case snd psModule of + AST.Module _ _ (N.ModuleName t) _ _ -> t makeActions :: [P.Module] -> M.Map P.ModuleName FilePath -> P.MakeActions P.Make makeActions modules foreigns = (P.buildMakeActions modulesDir (P.internalError "makeActions: input file map was read.") foreigns False)