1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-14 17:32:00 +03:00
juvix/test/Scope/Positive.hs

141 lines
3.4 KiB
Haskell
Raw Normal View History

2022-02-18 15:01:42 +03:00
module Scope.Positive where
import Base
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
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
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"
]