2022-02-18 15:01:42 +03:00
|
|
|
module Scope.Positive where
|
|
|
|
|
|
|
|
import Base
|
2022-03-24 19:04:22 +03:00
|
|
|
import Data.Algorithm.Diff
|
|
|
|
import Data.Algorithm.DiffOutput
|
2022-04-05 20:57:21 +03:00
|
|
|
import Data.HashMap.Strict qualified as HashMap
|
|
|
|
import MiniJuvix.Syntax.Concrete.Scoped.Pretty.Text qualified as M
|
|
|
|
import MiniJuvix.Syntax.Concrete.Scoped.Scoper qualified as M
|
|
|
|
import MiniJuvix.Syntax.Concrete.Scoped.Utils
|
|
|
|
import Text.Show.Pretty hiding (Html)
|
2022-02-18 15:01:42 +03:00
|
|
|
|
2022-04-05 20:57:21 +03:00
|
|
|
data PosTest = PosTest
|
|
|
|
{ name :: String,
|
|
|
|
relDir :: FilePath,
|
|
|
|
file :: FilePath
|
2022-02-18 15:01:42 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
root :: FilePath
|
|
|
|
root = "tests/positive"
|
|
|
|
|
|
|
|
testDescr :: PosTest -> TestDescr
|
2022-04-05 20:57:21 +03:00
|
|
|
testDescr PosTest {..} =
|
|
|
|
TestDescr
|
|
|
|
{ testName = name,
|
|
|
|
testRoot = root </> relDir,
|
|
|
|
testAssertion = Steps $ \step -> do
|
|
|
|
step "Parse"
|
|
|
|
p <- parseModuleIO file
|
2022-02-18 15:01:42 +03:00
|
|
|
|
2022-04-05 20:57:21 +03:00
|
|
|
step "Scope"
|
|
|
|
s <- scopeModuleIO p
|
|
|
|
let fs :: HashMap FilePath Text
|
|
|
|
fs =
|
|
|
|
HashMap.fromList
|
|
|
|
[ (getModuleFilePath m, M.renderPrettyCodeDefault m)
|
|
|
|
| m <- toList (getAllModules s)
|
|
|
|
]
|
2022-02-18 15:01:42 +03:00
|
|
|
|
2022-04-05 20:57:21 +03:00
|
|
|
step "Pretty"
|
|
|
|
let scopedPretty = M.renderPrettyCodeDefault s
|
|
|
|
let parsedPretty = M.renderPrettyCodeDefault p
|
2022-02-18 15:01:42 +03:00
|
|
|
|
2022-04-05 20:57:21 +03:00
|
|
|
step "Parse again"
|
|
|
|
p' <- parseTextModuleIO scopedPretty
|
|
|
|
parsedPretty' <- parseTextModuleIO parsedPretty
|
2022-02-21 18:38:39 +03:00
|
|
|
|
2022-04-05 20:57:21 +03:00
|
|
|
step "Scope again"
|
2022-04-07 13:53:05 +03:00
|
|
|
s' <-
|
|
|
|
head . Scoper._resultModules
|
|
|
|
<$> fromRightIO' printErrorAnsi (return (Scoper.scopeCheck1Pure fs "." p'))
|
2022-04-05 20:57:21 +03:00
|
|
|
step "Checks"
|
|
|
|
assertEqDiff "check: scope . parse . pretty . scope . parse = scope . parse" s s'
|
|
|
|
assertEqDiff "check: parse . pretty . scope . parse = parse" p p'
|
|
|
|
assertEqDiff "check: parse . pretty . parse = parse" p parsedPretty'
|
|
|
|
}
|
2022-02-18 15:01:42 +03:00
|
|
|
|
2022-03-24 19:04:22 +03:00
|
|
|
assertEqDiff :: (Eq a, Show a) => String -> a -> a -> Assertion
|
|
|
|
assertEqDiff msg a b
|
|
|
|
| a == b = return ()
|
|
|
|
| otherwise = do
|
|
|
|
putStrLn (pack $ ppDiff (getGroupedDiff pa pb))
|
|
|
|
putStrLn "End diff"
|
|
|
|
fail msg
|
2022-04-05 20:57:21 +03:00
|
|
|
where
|
2022-03-24 19:04:22 +03:00
|
|
|
pa = lines $ ppShow a
|
|
|
|
pb = lines $ ppShow b
|
|
|
|
|
2022-02-18 15:01:42 +03:00
|
|
|
allTests :: TestTree
|
2022-04-05 20:57:21 +03:00
|
|
|
allTests =
|
|
|
|
testGroup
|
|
|
|
"Scope positive tests"
|
|
|
|
(map (mkTest . testDescr) tests)
|
2022-02-18 15:01:42 +03:00
|
|
|
|
|
|
|
tests :: [PosTest]
|
2022-04-05 20:57:21 +03:00
|
|
|
tests =
|
|
|
|
[ PosTest
|
|
|
|
"Inductive"
|
|
|
|
"."
|
|
|
|
"Inductive.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Imports and qualified names"
|
|
|
|
"Imports"
|
|
|
|
"A.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Data.Bool from the stdlib"
|
|
|
|
"StdlibList"
|
|
|
|
"Data/Bool.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Data.Nat from the stdlib"
|
|
|
|
"StdlibList"
|
|
|
|
"Data/Nat.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Data.Ord from the stdlib"
|
|
|
|
"StdlibList"
|
|
|
|
"Data/Ord.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Data.Product from the stdlib"
|
|
|
|
"StdlibList"
|
|
|
|
"Data/Product.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Data.List and friends from the stdlib"
|
|
|
|
"StdlibList"
|
|
|
|
"Data/List.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Operators (+)"
|
|
|
|
"."
|
|
|
|
"Operators.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Literals"
|
|
|
|
"."
|
|
|
|
"Literals.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Hello World backends"
|
|
|
|
"."
|
|
|
|
"HelloWorld.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Axiom with backends"
|
|
|
|
"."
|
|
|
|
"Axiom.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Foreign block parsing"
|
|
|
|
"."
|
|
|
|
"Foreign.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Multiple modules non-ambiguous symbol - same file"
|
|
|
|
"QualifiedSymbol"
|
|
|
|
"M.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Multiple modules non-ambiguous symbol"
|
|
|
|
"QualifiedSymbol2"
|
|
|
|
"N.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"Multiple modules constructor non-ambiguous symbol"
|
|
|
|
"QualifiedConstructor"
|
|
|
|
"M.mjuvix",
|
|
|
|
PosTest
|
|
|
|
"open overrides open public"
|
|
|
|
"."
|
|
|
|
"ShadowPublicOpen.mjuvix"
|
|
|
|
]
|