1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-19 12:51:39 +03:00
juvix/test/Typecheck/Positive.hs

196 lines
5.4 KiB
Haskell
Raw Normal View History

module Typecheck.Positive where
import Base
2023-01-17 11:41:07 +03:00
import Compilation.Positive qualified as Compilation
import Juvix.Compiler.Builtins (iniState)
import Juvix.Compiler.Pipeline
import Typecheck.Negative qualified as N
data PosTest = PosTest
2022-04-08 13:46:37 +03:00
{ _name :: String,
2023-01-17 11:41:07 +03:00
_dir :: Path Abs Dir,
_file :: Path Abs File
}
2022-12-20 15:05:40 +03:00
root :: Path Abs Dir
root = relToProject $(mkRelDir "tests/positive")
2023-01-17 11:41:07 +03:00
posTest :: String -> Path Rel Dir -> Path Rel File -> PosTest
posTest _name rdir rfile =
let _dir = root <//> rdir
_file = _dir <//> rfile
in PosTest {..}
testDescr :: PosTest -> TestDescr
testDescr PosTest {..} =
2023-01-17 11:41:07 +03:00
TestDescr
{ _testName = _name,
_testRoot = _dir,
_testAssertion = Single $ do
let entryPoint = defaultEntryPoint _dir _file
(void . runIO' iniState entryPoint) upToInternalTyped
}
--------------------------------------------------------------------------------
-- Testing --no-positivity flag with all related negative tests
--------------------------------------------------------------------------------
2022-12-20 15:05:40 +03:00
rootNegTests :: Path Abs Dir
rootNegTests = relToProject $(mkRelDir "tests/negative/")
testNoPositivityFlag :: N.NegTest -> TestDescr
testNoPositivityFlag N.NegTest {..} =
2022-12-20 15:05:40 +03:00
let tRoot = rootNegTests <//> _relDir
file' = tRoot <//> _file
in TestDescr
{ _testName = _name,
_testRoot = tRoot,
_testAssertion = Single $ do
let entryPoint =
2022-12-20 15:05:40 +03:00
(defaultEntryPoint tRoot file')
2022-08-19 17:57:07 +03:00
{ _entryPointNoPositivity = True
}
(void . runIO' iniState entryPoint) upToInternal
}
negPositivityTests :: [N.NegTest]
negPositivityTests = N.negPositivityTests
testPositivityKeyword :: [PosTest]
testPositivityKeyword =
2023-01-17 11:41:07 +03:00
[ posTest
"Mark T0 data type as strictly positive"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal/Positivity")
$(mkRelFile "E5.juvix")
]
positivityTestGroup :: TestTree
positivityTestGroup =
testGroup
"Positive tests for the positivity condition"
[ testGroup
"Bypass positivity checking using --non-positivity flag on negative tests"
(map (mkTest . testNoPositivityFlag) negPositivityTests),
testGroup
"Usages of the positive keyword"
(map (mkTest . testDescr) testPositivityKeyword)
]
--------------------------------------------------------------------------------
allTests :: TestTree
allTests =
testGroup
"Typecheck positive tests"
[ testGroup
"General typechecking tests"
(map (mkTest . testDescr) tests),
positivityTestGroup
]
2023-01-17 11:41:07 +03:00
compilationTest :: Compilation.PosTest -> PosTest
compilationTest Compilation.PosTest {..} = PosTest {..}
tests :: [PosTest]
tests =
2023-01-17 11:41:07 +03:00
[ posTest
"Simple"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "Simple.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Literal String matches any type"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "LiteralString.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Box type"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "Box.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Literal Int matches any type"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "LiteralInt.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"PolySimpleFungibleToken"
2022-12-20 15:05:40 +03:00
$(mkRelDir "FullExamples")
$(mkRelFile "SimpleFungibleTokenImplicit.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"GHC backend MonoSimpleFungibleToken"
2022-12-20 15:05:40 +03:00
$(mkRelDir "FullExamples")
$(mkRelFile "MonoSimpleFungibleToken.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Axiom"
2022-12-20 15:05:40 +03:00
$(mkRelDir ".")
$(mkRelFile "Axiom.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Inductive"
2022-12-20 15:05:40 +03:00
$(mkRelDir ".")
$(mkRelFile "Inductive.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Operators"
2022-12-20 15:05:40 +03:00
$(mkRelDir ".")
$(mkRelFile "Operators.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Holes in type signature"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "HoleInSignature.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Polymorphism and higher rank functions"
2022-12-20 15:05:40 +03:00
$(mkRelDir ".")
$(mkRelFile "Polymorphism.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Polymorphism and higher rank functions with explicit holes"
2022-12-20 15:05:40 +03:00
$(mkRelDir ".")
$(mkRelFile "PolymorphismHoles.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Implicit arguments"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "Implicit.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Simple type alias"
2022-12-20 15:05:40 +03:00
$(mkRelDir ".")
$(mkRelFile "TypeAlias.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Refine hole in type signature"
2022-12-20 15:05:40 +03:00
$(mkRelDir "272")
$(mkRelFile "M.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Pattern match a hole type"
2022-12-20 15:05:40 +03:00
$(mkRelDir "265")
$(mkRelFile "M.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Pattern match type synonym"
2022-12-20 15:05:40 +03:00
$(mkRelDir "issue1466")
$(mkRelFile "M.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Import a builtin multiple times"
2022-12-20 15:05:40 +03:00
$(mkRelDir "BuiltinsMultiImport")
$(mkRelFile "Input.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"Basic lambda functions"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "Lambda.juvix"),
2023-01-17 11:41:07 +03:00
posTest
2022-09-26 20:14:17 +03:00
"Simple mutual inference"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
$(mkRelFile "Mutual.juvix"),
2023-01-17 11:41:07 +03:00
posTest
"open import a builtin multiple times"
2022-12-20 15:05:40 +03:00
$(mkRelDir "BuiltinsMultiOpenImport")
$(mkRelFile "Input.juvix"),
2023-01-17 11:41:07 +03:00
posTest
2022-10-27 13:17:03 +03:00
"As Patterns"
2022-12-20 15:05:40 +03:00
$(mkRelDir "Internal")
2023-01-09 20:56:28 +03:00
$(mkRelFile "AsPattern.juvix"),
2023-01-17 11:41:07 +03:00
posTest
2023-01-09 20:56:28 +03:00
"Issue 1693 (Inference and higher order functions)"
$(mkRelDir "issue1693")
2023-01-10 19:31:15 +03:00
$(mkRelFile "M.juvix"),
2023-01-17 11:41:07 +03:00
posTest
2023-01-10 19:31:15 +03:00
"Issue 1704 (Type synonyms)"
$(mkRelDir "Internal")
$(mkRelFile "Synonyms.juvix")
]
Refactor `html` command with extra options (#1725) This PR redefines the `html` command unifying our previous subcommands for the HTML backend. You should use the command in the following way to obtain the same results as before: - `juvix html src.juvix` -> `juvix html src.juvix --only-source` - `juvix dev doc src.juvix` -> `juvix html src.juvix` - Other fixes here include the flag `--non-recursive`, which replaces the previous behavior in that we now generate all the HTML recursively by default. - The flag `--no-print-metadata` is now called `--no-footer` - Also, another change introduced by this PR is asset handling; for example, with our canonical Juvix program, the new output is organized as follows. ``` juvix html HelloWorld.juvix --only-source && tree html/ Copying assets files to test/html/assets Writing HelloWorld.html html/ ├── assets │ ├── css │ │ ├── linuwial.css │ │ ├── source-ayu-light.css │ │ └── source-nord.css │ ├── images │ │ ├── tara-magicien.png │ │ ├── tara-seating.svg │ │ ├── tara-smiling.png │ │ ├── tara-smiling.svg │ │ ├── tara-teaching.png │ │ └── tara-teaching.svg │ └── js │ ├── highlight.js │ └── tex-chtml.js └── HelloWorld.html ├── Stdlib.Data.Bool.html ├── Stdlib.Data.List.html ├── Stdlib.Data.Maybe.html ├── Stdlib.Data.Nat.html ├── Stdlib.Data.Ord.html ├── Stdlib.Data.Product.html ├── Stdlib.Data.String.html ├── Stdlib.Function.html ├── Stdlib.Prelude.html └── Stdlib.System.IO.html ``` In addition, for the vscode-plugin, this PR adds two flags, `--prefix-assets` and `--prefix-url`, for which one provides input to help vscode find resource locations and Juvix files. PS. Make sure to run `make clean` the first time you run `make install` for the first time.
2023-01-17 20:11:59 +03:00
<> [ compilationTest t | t <- Compilation.tests, t ^. Compilation.name /= "Self-application"
2023-01-17 11:41:07 +03:00
]