From bfd152f6eafdf79414caa9ee3b1b2ad52b7a389a Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 20:01:50 -0600 Subject: [PATCH 1/9] Add note about HSPEC_ACCEPT env --- CONTRIBUTING.md | 2 ++ 1 file changed, 2 insertions(+) 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. From a8de44ea60eaf1c75737378804626548d8e3ec8c Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 20:23:53 -0600 Subject: [PATCH 2/9] Verify that PS file's module name is 'Main' --- tests/TestUtils.hs | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs index d14cd8d2a9..12ffda9e0b 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 Control.Arrow ((***), (>>>)) import Control.Monad @@ -209,10 +211,23 @@ compile SupportModules{..} inputFiles = runTest $ do 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 (== T.pack "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 + unless 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 + unless hasMainModule $ do + error "When testing a 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) From 054711dee065e626c0485df40dd6da1cbf4e3b3f Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 20:25:22 -0600 Subject: [PATCH 3/9] Add changelog entry --- CHANGELOG.d/internal_document-hspec-accept.md | 1 + CHANGELOG.d/internal_error-on-non-Main-modules.md | 1 + 2 files changed, 2 insertions(+) create mode 100644 CHANGELOG.d/internal_document-hspec-accept.md create mode 100644 CHANGELOG.d/internal_error-on-non-Main-modules.md 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 From 0230ca098f3fce193b11edde7036c7dc4c2704d0 Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 20:34:46 -0600 Subject: [PATCH 4/9] Verify test fails if module name isn't `Main` --- tests/purs/passing/NotNamedMain.purs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 tests/purs/passing/NotNamedMain.purs diff --git a/tests/purs/passing/NotNamedMain.purs b/tests/purs/passing/NotNamedMain.purs new file mode 100644 index 0000000000..a568122f78 --- /dev/null +++ b/tests/purs/passing/NotNamedMain.purs @@ -0,0 +1,9 @@ +module NotNamedMain where + +import Prelude +import Effect (Effect) +import Effect.Console (log) + +main :: Effect Unit +main = do + log "Done" From 7592d7f71b42f26e2edf06c1eb9a198cb8b4d6ab Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 21:01:52 -0600 Subject: [PATCH 5/9] Do Main module name check on passing/bundle tests --- tests/TestBundle.hs | 2 +- tests/TestCompiler.hs | 8 ++++---- tests/TestUtils.hs | 9 +++++---- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/tests/TestBundle.hs b/tests/TestBundle.hs index 42712c6100..ac809bacb4 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 3b06a66d2c..7a15efda8e 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 @@ -158,7 +158,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 @@ -174,7 +174,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) @@ -194,7 +194,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 12ffda9e0b..c3ff93cdaa 100644 --- a/tests/TestUtils.hs +++ b/tests/TestUtils.hs @@ -201,10 +201,11 @@ 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 @@ -216,12 +217,12 @@ compile SupportModules{..} inputFiles = runTest $ do hasMainModule = (==) 1 $ length $ filter (== T.pack "Main") $ fmap getPsModuleName ms case ms of [singleModule] -> do - unless hasMainModule $ do + unless (checkForMainModule && 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 - unless hasMainModule $ do + unless (checkForMainModule && hasMainModule) $ do error "When testing a multiple PureScript files, the main file's module's name must be 'Main'." P.make actions (CST.pureResult <$> supportModules ++ map snd ms) From 5ed4dd44e0b287994f6eef058f21ff06ea4a8c1c Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 21:10:24 -0600 Subject: [PATCH 6/9] Fix logic bug --- tests/TestUtils.hs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs index c3ff93cdaa..a5d81535d1 100644 --- a/tests/TestUtils.hs +++ b/tests/TestUtils.hs @@ -217,12 +217,12 @@ compile checkForMainModule SupportModules{..} inputFiles = runTest $ do hasMainModule = (==) 1 $ length $ filter (== T.pack "Main") $ fmap getPsModuleName ms case ms of [singleModule] -> do - unless (checkForMainModule && hasMainModule) $ 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 - unless (checkForMainModule && hasMainModule) $ do + when (checkForMainModule && not hasMainModule) $ do error "When testing a multiple PureScript files, the main file's module's name must be 'Main'." P.make actions (CST.pureResult <$> supportModules ++ map snd ms) From 29cd3f5627649b95a3adcfb7c6708f4cbae771de Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Wed, 23 Feb 2022 21:18:54 -0600 Subject: [PATCH 7/9] Drop unneeded T.pack --- tests/TestUtils.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs index a5d81535d1..8d7c179909 100644 --- a/tests/TestUtils.hs +++ b/tests/TestUtils.hs @@ -214,7 +214,7 @@ compile checkForMainModule SupportModules{..} inputFiles = runTest $ do foreigns <- inferForeignModules ms let actions = makeActions supportModules (foreigns `M.union` supportForeigns) - hasMainModule = (==) 1 $ length $ filter (== T.pack "Main") $ fmap getPsModuleName ms + hasMainModule = (==) 1 $ length $ filter (== "Main") $ fmap getPsModuleName ms case ms of [singleModule] -> do when (checkForMainModule && not hasMainModule) $ do From 34ab26e1b1f1dc8cb40fa9b4dac7201ed609f6a6 Mon Sep 17 00:00:00 2001 From: JordanMartinez Date: Thu, 24 Feb 2022 08:25:52 -0600 Subject: [PATCH 8/9] Fix typo Co-authored-by: Ryan Hendrickson --- tests/TestUtils.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/TestUtils.hs b/tests/TestUtils.hs index 8d7c179909..56a9209f62 100644 --- a/tests/TestUtils.hs +++ b/tests/TestUtils.hs @@ -223,7 +223,7 @@ compile checkForMainModule SupportModules{..} inputFiles = runTest $ do pure <$> P.rebuildModule actions supportExterns (snd singleModule) _ -> do when (checkForMainModule && not hasMainModule) $ do - error "When testing a multiple PureScript files, the main file's module's name must be 'Main'." + 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 From 21ec8227b32c34f950d7417093acbde3c90a0f0f Mon Sep 17 00:00:00 2001 From: Jordan Martinez Date: Thu, 24 Feb 2022 08:27:41 -0600 Subject: [PATCH 9/9] Remove 'NotNamedMain.purs' --- tests/purs/passing/NotNamedMain.purs | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 tests/purs/passing/NotNamedMain.purs diff --git a/tests/purs/passing/NotNamedMain.purs b/tests/purs/passing/NotNamedMain.purs deleted file mode 100644 index a568122f78..0000000000 --- a/tests/purs/passing/NotNamedMain.purs +++ /dev/null @@ -1,9 +0,0 @@ -module NotNamedMain where - -import Prelude -import Effect (Effect) -import Effect.Console (log) - -main :: Effect Unit -main = do - log "Done"