mirror of
https://github.com/anoma/juvix.git
synced 2024-12-24 07:57:58 +03:00
440 lines
13 KiB
Haskell
440 lines
13 KiB
Haskell
module Compilation.Positive where
|
|
|
|
import Base
|
|
import Compilation.Base
|
|
import Data.HashSet qualified as HashSet
|
|
|
|
data PosTest = PosTest
|
|
{ _name :: String,
|
|
_dir :: Path Abs Dir,
|
|
_file :: Path Abs File,
|
|
_assertionMode :: CompileAssertionMode,
|
|
_expectedFile :: Path Abs File
|
|
}
|
|
|
|
makeLenses ''PosTest
|
|
|
|
root :: Path Abs Dir
|
|
root = relToProject $(mkRelDir "tests/Compilation/positive/")
|
|
|
|
toTestDescr :: Int -> PosTest -> TestDescr
|
|
toTestDescr optLevel PosTest {..} =
|
|
let tRoot = _dir
|
|
file' = _file
|
|
expected' = _expectedFile
|
|
in TestDescr
|
|
{ _testName = _name,
|
|
_testRoot = tRoot,
|
|
_testAssertion = Steps $ compileAssertion _dir optLevel _assertionMode file' expected'
|
|
}
|
|
|
|
allTests :: TestTree
|
|
allTests =
|
|
testGroup
|
|
"Juvix compilation pipeline positive tests"
|
|
(map (mkTest . toTestDescr 3) tests)
|
|
|
|
allTestsNoOptimize :: TestTree
|
|
allTestsNoOptimize =
|
|
testGroup
|
|
"Juvix compilation pipeline positive tests (no optimization)"
|
|
(map (mkTest . toTestDescr 0) tests)
|
|
|
|
posTest' :: CompileAssertionMode -> String -> Path Rel Dir -> Path Rel File -> Path Rel File -> PosTest
|
|
posTest' _assertionMode _name rdir rfile routfile =
|
|
let _dir = root <//> rdir
|
|
_file = _dir <//> rfile
|
|
_expectedFile = root <//> routfile
|
|
in PosTest {..}
|
|
|
|
posTestStdin :: String -> Path Rel Dir -> Path Rel File -> Path Rel File -> Text -> PosTest
|
|
posTestStdin _name rdir rfile routfile _stdinText =
|
|
let t = posTest _name rdir rfile routfile
|
|
in t
|
|
{ _assertionMode = CompileOnly _stdinText
|
|
}
|
|
|
|
posTest :: String -> Path Rel Dir -> Path Rel File -> Path Rel File -> PosTest
|
|
posTest = posTest' EvalAndCompile
|
|
|
|
-- tests which use large integers are only evaluated but not compiled
|
|
posTestEval :: String -> Path Rel Dir -> Path Rel File -> Path Rel File -> PosTest
|
|
posTestEval = posTest' EvalOnly
|
|
|
|
isIgnored :: PosTest -> Bool
|
|
isIgnored t = HashSet.member (t ^. name) ignored
|
|
|
|
ignored :: HashSet String
|
|
ignored =
|
|
HashSet.fromList
|
|
[ -- TODO allow lambda branches of different number of patterns
|
|
"Test027: Church numerals"
|
|
]
|
|
|
|
tests :: [PosTest]
|
|
tests =
|
|
filter
|
|
(not . isIgnored)
|
|
[ posTest
|
|
"Test001: Arithmetic operators"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test001.juvix")
|
|
$(mkRelFile "out/test001.out"),
|
|
posTest
|
|
"Test002: Arithmetic operators inside lambdas"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test002.juvix")
|
|
$(mkRelFile "out/test002.out"),
|
|
posTest
|
|
"Test003: Integer arithmetic"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test003.juvix")
|
|
$(mkRelFile "out/test003.out"),
|
|
posTest
|
|
"Test004: IO builtins"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test004.juvix")
|
|
$(mkRelFile "out/test004.out"),
|
|
posTest
|
|
"Test005: Higher-order functions"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test005.juvix")
|
|
$(mkRelFile "out/test005.out"),
|
|
posTest
|
|
"Test006: If-then-else and lazy boolean operators"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test006.juvix")
|
|
$(mkRelFile "out/test006.out"),
|
|
posTest
|
|
"Test007: Pattern matching and lambda-case"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test007.juvix")
|
|
$(mkRelFile "out/test007.out"),
|
|
posTest
|
|
"Test008: Recursion"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test008.juvix")
|
|
$(mkRelFile "out/test008.out"),
|
|
posTest
|
|
"Test009: Tail recursion"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test009.juvix")
|
|
$(mkRelFile "out/test009.out"),
|
|
posTest
|
|
"Test010: Let"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test010.juvix")
|
|
$(mkRelFile "out/test010.out"),
|
|
posTestEval
|
|
"Test011: Tail recursion: Fibonacci numbers in linear time"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test011.juvix")
|
|
$(mkRelFile "out/test011.out"),
|
|
posTest
|
|
"Test012: Trees"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test012.juvix")
|
|
$(mkRelFile "out/test012.out"),
|
|
posTest
|
|
"Test013: Functions returning functions with variable capture"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test013.juvix")
|
|
$(mkRelFile "out/test013.out"),
|
|
posTest
|
|
"Test014: Arithmetic"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test014.juvix")
|
|
$(mkRelFile "out/test014.out"),
|
|
posTest
|
|
"Test015: Local functions with free variables"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test015.juvix")
|
|
$(mkRelFile "out/test015.out"),
|
|
posTest
|
|
"Test016: Recursion through higher-order functions"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test016.juvix")
|
|
$(mkRelFile "out/test016.out"),
|
|
posTest
|
|
"Test017: Tail recursion through higher-order functions"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test017.juvix")
|
|
$(mkRelFile "out/test017.out"),
|
|
posTest
|
|
"Test018: Higher-order functions and recursion"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test018.juvix")
|
|
$(mkRelFile "out/test018.out"),
|
|
posTest
|
|
"Test019: Self-application"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test019.juvix")
|
|
$(mkRelFile "out/test019.out"),
|
|
posTest
|
|
"Test020: Recursive functions: McCarthy's 91 function, subtraction by increments"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test020.juvix")
|
|
$(mkRelFile "out/test020.out"),
|
|
posTest
|
|
"Test021: Fast exponentiation"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test021.juvix")
|
|
$(mkRelFile "out/test021.out"),
|
|
posTest
|
|
"Test022: Lists"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test022.juvix")
|
|
$(mkRelFile "out/test022.out"),
|
|
posTest
|
|
"Test023: Mutual recursion"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test023.juvix")
|
|
$(mkRelFile "out/test023.out"),
|
|
posTest
|
|
"Test024: Nested binders with variable capture"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test024.juvix")
|
|
$(mkRelFile "out/test024.out"),
|
|
posTest
|
|
"Test025: Euclid's algorithm"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test025.juvix")
|
|
$(mkRelFile "out/test025.out"),
|
|
posTest
|
|
"Test026: Functional queues"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test026.juvix")
|
|
$(mkRelFile "out/test026.out"),
|
|
posTest
|
|
"Test027: Church numerals"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test027.juvix")
|
|
$(mkRelFile "out/test027.out"),
|
|
posTest
|
|
"Test028: Streams without memoization"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test028.juvix")
|
|
$(mkRelFile "out/test028.out"),
|
|
posTest
|
|
"Test029: Ackermann function"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test029.juvix")
|
|
$(mkRelFile "out/test029.out"),
|
|
posTest
|
|
"Test030: Ackermann function (higher-order definition)"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test030.juvix")
|
|
$(mkRelFile "out/test030.out"),
|
|
posTest
|
|
"Test031: Nested lists"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test031.juvix")
|
|
$(mkRelFile "out/test031.out"),
|
|
posTest
|
|
"Test032: Merge sort"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test032.juvix")
|
|
$(mkRelFile "out/test032.out"),
|
|
posTest
|
|
"Test033: Eta-expansion of builtins and constructors"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test033.juvix")
|
|
$(mkRelFile "out/test033.out"),
|
|
posTest
|
|
"Test034: Recursive let"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test034.juvix")
|
|
$(mkRelFile "out/test034.out"),
|
|
posTest
|
|
"Test035: Pattern matching"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test035.juvix")
|
|
$(mkRelFile "out/test035.out"),
|
|
posTest
|
|
"Test036: Eta-expansion"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test036.juvix")
|
|
$(mkRelFile "out/test036.out"),
|
|
posTest
|
|
"Test037: Applications with lets and cases in function position"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test037.juvix")
|
|
$(mkRelFile "out/test037.out"),
|
|
posTest
|
|
"Test038: Simple case expression"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test038.juvix")
|
|
$(mkRelFile "out/test038.out"),
|
|
posTest
|
|
"Test039: Mutually recursive let expression"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test039.juvix")
|
|
$(mkRelFile "out/test039.out"),
|
|
posTest
|
|
"Test040: Pattern matching nullary constructor"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test040.juvix")
|
|
$(mkRelFile "out/test040.out"),
|
|
posTest
|
|
"Test041: Use a builtin inductive in an inductive constructor"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test041.juvix")
|
|
$(mkRelFile "out/test041.out"),
|
|
posTest
|
|
"Test042: Builtin string-to-nat"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test042.juvix")
|
|
$(mkRelFile "out/test042.out"),
|
|
posTest
|
|
"Test043: Builtin trace"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test043.juvix")
|
|
$(mkRelFile "out/test043.out"),
|
|
posTestStdin
|
|
"Test044: Builtin readline"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test044.juvix")
|
|
$(mkRelFile "out/test044.out")
|
|
"a\n",
|
|
posTest
|
|
"Test045: Implicit builtin bool"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test045.juvix")
|
|
$(mkRelFile "out/test045.out"),
|
|
posTest
|
|
"Test046: Polymorphic type arguments"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test046.juvix")
|
|
$(mkRelFile "out/test046.out"),
|
|
posTest
|
|
"Test047: Local Modules"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test047.juvix")
|
|
$(mkRelFile "out/test047.out"),
|
|
posTest
|
|
"Test048: String quoting"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test048.juvix")
|
|
$(mkRelFile "out/test048.out"),
|
|
posTest
|
|
"Test049: Builtin Int"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test049.juvix")
|
|
$(mkRelFile "out/test049.out"),
|
|
posTest
|
|
"Test050: Pattern matching with integers"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test050.juvix")
|
|
$(mkRelFile "out/test050.out"),
|
|
posTest
|
|
"Test051: Local recursive function using IO >>"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test051.juvix")
|
|
$(mkRelFile "out/test051.out"),
|
|
posTest
|
|
"Test052: Simple lambda calculus"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test052.juvix")
|
|
$(mkRelFile "out/test052.out"),
|
|
posTest
|
|
"Test053: Inlining"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test053.juvix")
|
|
$(mkRelFile "out/test053.out"),
|
|
posTest
|
|
"Test054: Iterators"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test054.juvix")
|
|
$(mkRelFile "out/test054.out"),
|
|
posTest
|
|
"Test055: Constructor printing"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test055.juvix")
|
|
$(mkRelFile "out/test055.out"),
|
|
posTest
|
|
"Test056: Argument specialization"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test056.juvix")
|
|
$(mkRelFile "out/test056.out"),
|
|
posTest
|
|
"Test057: Case folding"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test057.juvix")
|
|
$(mkRelFile "out/test057.out"),
|
|
posTest
|
|
"Test058: Ranges"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test058.juvix")
|
|
$(mkRelFile "out/test058.out"),
|
|
posTest
|
|
"Test059: Builtin list"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test059.juvix")
|
|
$(mkRelFile "out/test059.out"),
|
|
posTest
|
|
"Test060: Record update"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test060.juvix")
|
|
$(mkRelFile "out/test060.out"),
|
|
posTest
|
|
"Test061: Traits"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test061.juvix")
|
|
$(mkRelFile "out/test061.out"),
|
|
posTest
|
|
"Test062: Overapplication"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test062.juvix")
|
|
$(mkRelFile "out/test062.out"),
|
|
posTest
|
|
"Test063: Coercions"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test063.juvix")
|
|
$(mkRelFile "out/test063.out"),
|
|
posTest
|
|
"Test064: Constant folding"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test064.juvix")
|
|
$(mkRelFile "out/test064.out"),
|
|
posTest
|
|
"Test065: Arithmetic simplification"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test065.juvix")
|
|
$(mkRelFile "out/test065.out"),
|
|
posTest
|
|
"Test066: Import function with a function call in default argument"
|
|
$(mkRelDir "test066")
|
|
$(mkRelFile "M.juvix")
|
|
$(mkRelFile "out/test066.out"),
|
|
posTest
|
|
"Test067: Dependent default values inserted during translation FromConcrete"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test067.juvix")
|
|
$(mkRelFile "out/test067.out"),
|
|
posTest
|
|
"Test068: Dependent default values inserted in the arity checker"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test068.juvix")
|
|
$(mkRelFile "out/test068.out"),
|
|
posTest
|
|
"Test069: Dependent default values for Ord trait"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test069.juvix")
|
|
$(mkRelFile "out/test069.out"),
|
|
posTest
|
|
"Test070: Nested default values and named arguments"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test070.juvix")
|
|
$(mkRelFile "out/test070.out"),
|
|
posTest
|
|
"Test071: Named application (Ord instance with default cmp)"
|
|
$(mkRelDir ".")
|
|
$(mkRelFile "test071.juvix")
|
|
$(mkRelFile "out/test071.out"),
|
|
posTest
|
|
"Test072: Monad transformers (ReaderT + StateT + Identity)"
|
|
$(mkRelDir "test072")
|
|
$(mkRelFile "ReaderT.juvix")
|
|
$(mkRelFile "out/test072.out")
|
|
]
|