1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-16 19:22:26 +03:00
juvix/test/Termination/Positive.hs
Paul Cadman 89ccef3da4
Throw error when reading a file that conflicts with embedded stdlib (#243)
* Throw error when reading a file that conflicts with stdlib

The Files effect first tries to read a file from the embedded stdlib. If
this succeeds and the file also exists in the project then an error is
thrown.

This error can be thrown either at the parsing stage, if the entrypoint
file conflicts with the standard library, or at the scoping stage if an
imported file conflicts.

* Fix module name in test file
2022-07-05 15:54:01 +02:00

79 lines
2.3 KiB
Haskell

module Termination.Positive where
import Base
import MiniJuvix.Pipeline
import Termination.Negative qualified as N
data PosTest = PosTest
{ _name :: String,
_relDir :: FilePath,
_file :: FilePath
}
root :: FilePath
root = "tests/positive/Termination"
testDescr :: PosTest -> TestDescr
testDescr PosTest {..} =
let tRoot = root </> _relDir
in TestDescr
{ _testName = _name,
_testRoot = tRoot,
_testAssertion = Single $ do
let entryPoint = (defaultEntryPoint _file) {_entryPointNoStdlib = True}
(void . runIO) (upToMicroJuvix entryPoint)
}
--------------------------------------------------------------------------------
-- Testing --no-termination flag with all termination negative tests
--------------------------------------------------------------------------------
rootNegTests :: FilePath
rootNegTests = "tests/negative/Termination"
testDescrFlag :: N.NegTest -> TestDescr
testDescrFlag N.NegTest {..} =
let tRoot = rootNegTests </> _relDir
in TestDescr
{ _testName = _name,
_testRoot = tRoot,
_testAssertion = Single $ do
let entryPoint = EntryPoint "." True True (pure _file)
(void . runIO) (upToMicroJuvix entryPoint)
}
--------------------------------------------------------------------------------
tests :: [PosTest]
tests =
[ PosTest "Ackerman nice def. is terminating" "." "Ack.mjuvix",
PosTest "Recursive functions on Lists" "." "Data/List.mjuvix"
]
testsWithKeyword :: [PosTest]
testsWithKeyword =
[ PosTest "terminating added to fx:=fx" "." "ToEmpty.mjuvix",
PosTest "terminating for all functions in the mutual block" "." "Mutual.mjuvix",
PosTest "Undefined is terminating by assumption" "." "Undefined.mjuvix"
]
negTests :: [N.NegTest]
negTests = N.tests
--------------------------------------------------------------------------------
allTests :: TestTree
allTests =
testGroup
"Positive tests"
[ testGroup
"Well-known terminating functions"
(map (mkTest . testDescr) tests),
testGroup
"Bypass checking using --non-termination flag on negative tests"
(map (mkTest . testDescrFlag) negTests),
testGroup
"Terminating keyword"
(map (mkTest . testDescr) testsWithKeyword)
]