1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-15 01:52:11 +03:00
juvix/test/Scope/Negative.hs

167 lines
3.9 KiB
Haskell
Raw Normal View History

2022-02-15 16:12:53 +03:00
module Scope.Negative (allTests) where
import Base
2022-04-07 19:10:53 +03:00
import MiniJuvix.Pipeline
2022-02-18 15:01:42 +03:00
import MiniJuvix.Syntax.Concrete.Scoped.Error
2022-02-15 16:12:53 +03:00
type FailMsg = String
2022-04-05 20:57:21 +03:00
data NegTest = NegTest
2022-04-07 19:10:53 +03:00
{ _name :: String,
_relDir :: FilePath,
_file :: FilePath,
_checkErr :: ScopeError -> Maybe FailMsg
2022-02-15 16:12:53 +03:00
}
2022-04-07 19:10:53 +03:00
root :: FilePath
root = "tests/negative"
2022-02-18 15:01:42 +03:00
testDescr :: NegTest -> TestDescr
2022-04-05 20:57:21 +03:00
testDescr NegTest {..} =
2022-04-07 19:10:53 +03:00
let tRoot = root </> _relDir
in TestDescr
{ _testName = _name,
_testRoot = tRoot,
_testAssertion = Single $ do
2022-04-08 13:46:37 +03:00
let entryPoint = EntryPoint "." (pure _file)
2022-04-07 19:10:53 +03:00
res <- runIOEither (upToScoping entryPoint)
let msg1 = "The scope checker did not find an error."
let msg2 = "An error ocurred but it was not in the scoper."
case mapLeft fromAJuvixError res of
Left (Just err) -> whenJust (_checkErr err) assertFailure
Left Nothing -> assertFailure msg1
Right _ -> assertFailure msg2
}
2022-02-15 16:12:53 +03:00
2022-02-18 15:01:42 +03:00
allTests :: TestTree
2022-04-05 20:57:21 +03:00
allTests =
testGroup
"Scope negative tests"
(map (mkTest . testDescr) tests)
2022-02-16 22:15:14 +03:00
wrongError :: Maybe FailMsg
2022-02-15 16:12:53 +03:00
wrongError = Just "Incorrect error"
tests :: [NegTest]
2022-04-05 20:57:21 +03:00
tests =
[ NegTest
"Not in scope"
"."
"NotInScope.mjuvix"
$ \case
ErrSymNotInScope {} -> Nothing
_ -> wrongError,
NegTest
"Multiple declarations"
"."
"MultipleDeclarations.mjuvix"
$ \case
ErrMultipleDeclarations {} -> Nothing
_ -> wrongError,
NegTest
"Import cycle"
"ImportCycle"
"A.mjuvix"
$ \case
ErrImportCycle {} -> Nothing
_ -> wrongError,
NegTest
"Binding group conflict (function clause)"
"BindGroupConflict"
"Clause.mjuvix"
$ \case
ErrBindGroup {} -> Nothing
_ -> wrongError,
NegTest
"Binding group conflict (lambda clause)"
"BindGroupConflict"
"Lambda.mjuvix"
$ \case
ErrBindGroup {} -> Nothing
_ -> wrongError,
NegTest
"Infix error (expression)"
"."
"InfixError.mjuvix"
$ \case
ErrInfixParser {} -> Nothing
_ -> wrongError,
NegTest
"Infix error (pattern)"
"."
"InfixErrorP.mjuvix"
$ \case
ErrInfixPattern {} -> Nothing
_ -> wrongError,
NegTest
"Duplicate fixity declaration"
"."
"DuplicateFixity.mjuvix"
$ \case
ErrDuplicateFixity {} -> Nothing
_ -> wrongError,
NegTest
"Multiple export conflict"
"."
"MultipleExportConflict.mjuvix"
$ \case
ErrMultipleExport {} -> Nothing
_ -> wrongError,
NegTest
"Module not in scope"
"."
"ModuleNotInScope.mjuvix"
$ \case
ErrModuleNotInScope {} -> Nothing
_ -> wrongError,
NegTest
"Unused operator syntax definition"
"."
"UnusedOperatorDef.mjuvix"
$ \case
ErrUnusedOperatorDef {} -> Nothing
_ -> wrongError,
NegTest
"Ambiguous symbol"
"."
"AmbiguousSymbol.mjuvix"
$ \case
ErrAmbiguousSym {} -> Nothing
_ -> wrongError,
NegTest
"Lacks function clause"
"."
"LacksFunctionClause.mjuvix"
$ \case
ErrLacksFunctionClause {} -> Nothing
_ -> wrongError,
NegTest
"Incorrect top module path"
"."
"WrongModuleName.mjuvix"
$ \case
ErrWrongTopModuleName {} -> Nothing
_ -> wrongError,
NegTest
"Ambiguous export"
"."
"AmbiguousExport.mjuvix"
$ \case
ErrMultipleExport {} -> Nothing
_ -> wrongError,
NegTest
"Ambiguous nested modules"
"."
"AmbiguousModule.mjuvix"
$ \case
ErrAmbiguousModuleSym {} -> Nothing
_ -> wrongError,
NegTest
"Ambiguous nested constructors"
"."
"AmbiguousConstructor.mjuvix"
$ \case
ErrAmbiguousSym {} -> Nothing
_ -> wrongError
2022-02-16 22:15:14 +03:00
]