2022-02-15 16:12:53 +03:00
|
|
|
module Scope.Negative (allTests) where
|
|
|
|
|
|
|
|
import Base
|
2022-02-18 15:01:42 +03:00
|
|
|
import MiniJuvix.Syntax.Concrete.Scoped.Error
|
2022-04-05 20:57:21 +03:00
|
|
|
import MiniJuvix.Syntax.Concrete.Scoped.Scoper qualified as M
|
2022-02-15 16:12:53 +03:00
|
|
|
|
|
|
|
type FailMsg = String
|
|
|
|
|
2022-04-05 20:57:21 +03:00
|
|
|
data NegTest = NegTest
|
|
|
|
{ name :: String,
|
|
|
|
relDir :: FilePath,
|
|
|
|
file :: FilePath,
|
|
|
|
checkErr :: ScopeError -> Maybe FailMsg
|
2022-02-15 16:12:53 +03:00
|
|
|
}
|
|
|
|
|
2022-02-18 15:01:42 +03:00
|
|
|
testDescr :: NegTest -> TestDescr
|
2022-04-05 20:57:21 +03:00
|
|
|
testDescr NegTest {..} =
|
|
|
|
TestDescr
|
|
|
|
{ testName = name,
|
|
|
|
testRoot = root </> relDir,
|
|
|
|
testAssertion = Single $ do
|
|
|
|
p <- parseModuleIO file >>= M.scopeCheck1IO "."
|
|
|
|
case p of
|
|
|
|
Left err -> whenJust (checkErr err) assertFailure
|
|
|
|
Right _ -> assertFailure "The scope checker did not find an error."
|
|
|
|
}
|
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
|
|
|
|
2022-02-15 16:12:53 +03:00
|
|
|
root :: FilePath
|
|
|
|
root = "tests/negative"
|
|
|
|
|
2022-02-16 17:18:08 +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
|
|
|
]
|