Skip to content
1 change: 1 addition & 0 deletions CHANGELOG.d/internal_document-hspec-accept.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Document the `HSPEC_ACCEPT` flag for generating golden files
1 change: 1 addition & 0 deletions CHANGELOG.d/internal_error-on-non-Main-modules.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
* Fail test if PureScript file(s) don't have a `Main` module
2 changes: 2 additions & 0 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion tests/TestBundle.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
8 changes: 4 additions & 4 deletions tests/TestCompiler.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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)
Expand All @@ -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 _ ->
Expand Down
26 changes: 21 additions & 5 deletions tests/TestUtils.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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 ((***), (>>>))
Expand Down Expand Up @@ -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)
Expand Down