Idris2/tests/Main.idr

446 lines
17 KiB
Idris

module Main
import System
import System.Directory
import System.File
import Test.Golden
%default covering
------------------------------------------------------------------------
-- Test cases
ttimpTests : TestPool
ttimpTests = MkTestPool "TTImp" [] Nothing
[ "basic001", "basic002", "basic003", "basic004", "basic005"
, "basic006"
, "coverage002"
, "dot001"
, "eta001"
, "lazy001"
, "nest001", "nest002"
, "perf001", "perf002", "perf003"
, "record001", "record002", "record003", "record004"
, "qtt001", "qtt003"
, "total001", "total002", "total003"
]
idrisTestsBasic : TestPool
idrisTestsBasic = MkTestPool "Fundamental language features" [] Nothing
-- Fundamental language features
["basic001", "basic002", "basic003", "basic004", "basic005",
"basic006", "basic007", "basic008", "basic009", "basic010",
"basic011", "basic012", "basic013", "basic014", "basic015",
"basic016", "basic017", "basic018", "basic019", "basic020",
"basic021", "basic022", "basic023", "basic024", "basic025",
"basic026", "basic027", "basic028", "basic029", "basic030",
"basic031", "basic032", "basic033", "basic034", "basic035",
"basic036", "basic037", "basic038", "basic039", "basic040",
"basic041", "basic042", "basic043", "basic044", "basic045",
"basic046", "basic047", "basic049", "basic050",
"basic051", "basic052", "basic053", "basic054", "basic055",
"basic056", "basic057", "basic058", "basic059", "basic060",
"basic061", "basic062", "basic063", "basic064", "basic065",
"basic066", "basic067", "basic068", "basic069", "basic070",
"idiom001",
"dotted001",
"rewrite001",
"interpolation001", "interpolation002", "interpolation003",
"interpolation004"]
idrisTestsDebug : TestPool
idrisTestsDebug = MkTestPool "Debug features" [] Nothing
["debug001"]
idrisTestsCoverage : TestPool
idrisTestsCoverage = MkTestPool "Coverage checking" [] Nothing
-- Coverage checking
["coverage001", "coverage002", "coverage003", "coverage004",
"coverage005", "coverage006", "coverage007", "coverage008",
"coverage009", "coverage010", "coverage011", "coverage012",
"coverage013", "coverage014", "coverage015", "coverage016",
"coverage017", "coverage018", "coverage019"]
idrisTestsTermination : TestPool
idrisTestsTermination = MkTestPool "Termination checking" [] Nothing
-- Termination checking
["termination001"]
idrisTestsCasetree : TestPool
idrisTestsCasetree = MkTestPool "Case tree building" [] Nothing
-- Case tree building
["casetree001", "casetree002", "casetree003", "casetree004"]
idrisTestsWarning : TestPool
idrisTestsWarning = MkTestPool "Warnings" [] Nothing
["warning001", "warning002", "warning003", "warning004"]
idrisTestsFailing : TestPool
idrisTestsFailing = MkTestPool "Failing blocks" [] Nothing
["failing001", "failing002", "failing003", "failing004"
]
idrisTestsError : TestPool
idrisTestsError = MkTestPool "Error messages" [] Nothing
-- Error messages
["error001", "error002", "error003", "error004", "error005",
"error006", "error007", "error008", "error009", "error010",
"error011", "error012", "error013", "error014", "error015",
"error016", "error017", "error018", "error019", "error020",
"error021", "error022", "error023", "error024", "error025",
"error026", "error027",
-- Parse errors
"perror001", "perror002", "perror003", "perror004", "perror005",
"perror006", "perror007", "perror008", "perror009", "perror010",
"perror011", "perror012", "perror013", "perror014", "perror015",
"perror016", "perror017", "perror018", "perror019", "perror020",
"perror021", "perror022", "perror023", "perror024", "perror025",
"perror026", "perror027", "perror028", "perror029"]
idrisTestsInteractive : TestPool
idrisTestsInteractive = MkTestPool "Interactive editing" [] Nothing
-- Interactive editing support
["interactive001", "interactive002", "interactive003", "interactive004",
"interactive005", "interactive006", "interactive007", "interactive008",
"interactive009", "interactive010", "interactive011", "interactive012",
"interactive013", "interactive014", "interactive015", "interactive016",
"interactive017", "interactive018", "interactive019", "interactive020",
"interactive021", "interactive022", "interactive023", "interactive024",
"interactive025", "interactive026", "interactive027", "interactive028",
"interactive029", "interactive030", "interactive031", "interactive032",
"interactive033", "interactive034", "interactive035", "interactive036",
"interactive037", "interactive038", "interactive039", "interactive040",
"interactive041", "interactive042", "interactive043", "interactive044",
"interactive045", "interactive046"
]
idrisTestsInterface : TestPool
idrisTestsInterface = MkTestPool "Interface" [] Nothing
-- Interfaces
["interface001", "interface002", "interface003", "interface004",
"interface005", "interface006", "interface007", "interface008",
"interface009", "interface010", "interface011", "interface012",
"interface013", "interface014", "interface015", "interface016",
"interface017", "interface018", "interface019", "interface020",
"interface021", "interface022", "interface023", "interface024",
"interface025", "interface026", "interface027", "interface028",
"interface029"]
idrisTestsLinear : TestPool
idrisTestsLinear = MkTestPool "Quantities" [] Nothing
-- QTT and linearity related
["linear001", "linear002", "linear003", -- "linear004" -- disabled due to requiring linearity subtyping
"linear005", "linear006", "linear007", "linear008",
"linear009", "linear010", "linear011", "linear012",
"linear013", "linear014", "linear015", "linear016",
"linear017"]
idrisTestsLiterate : TestPool
idrisTestsLiterate = MkTestPool "Literate programming" [] Nothing
-- Literate
["literate001", "literate002", "literate003", "literate004",
"literate005", "literate006", "literate007", "literate008",
"literate009", "literate010", "literate011", "literate012",
"literate013", "literate014", "literate015", "literate016",
"literate017"]
idrisTestsPerformance : TestPool
idrisTestsPerformance = MkTestPool "Performance" [] Nothing
-- Performance: things which have been slow in the past, or which
-- pose interesting challenges for the elaborator
["perf001", "perf002", "perf003", "perf004", "perf005",
"perf007", "perf008", "perf009", "perf010", "perf011",
"perf012",
"perf2202"]
idrisTestsRegression : TestPool
idrisTestsRegression = MkTestPool "Various regressions" [] Nothing
-- Miscellaneous regressions
["reg001", "reg002", "reg003", "reg004", "reg005", "reg006", "reg007",
"reg008", "reg009", "reg010", "reg011", "reg012", "reg013", "reg014",
"reg015", "reg016", "reg017", "reg018", "reg019", "reg020", "reg021",
"reg022", "reg023", "reg024", "reg025", "reg026", "reg027", "reg028",
"reg029", "reg030", "reg031", "reg032", "reg033", "reg034", "reg035",
"reg036", "reg037", "reg038", "reg039", "reg040", "reg041", "reg042",
"reg043", "reg044", "reg045", "reg046", "reg047", "reg048", "reg049",
"reg050", "reg051", "reg052"]
idrisTestsData : TestPool
idrisTestsData = MkTestPool "Data and record types" [] Nothing
[-- Data types
"data001", "data002",
-- Records, access and dependent update
"record001", "record002", "record003", "record004", "record005",
"record006", "record007", "record008", "record009", "record010",
"record011", "record012", "record013", "record014", "record015",
"record016", "record017", "record018", "record019" ]
idrisTestsBuiltin : TestPool
idrisTestsBuiltin = MkTestPool "Builtin types and functions" [] Nothing
-- %builtin related tests for the frontend (type-checking)
["builtin001", "builtin002", "builtin003", "builtin004", "builtin005",
"builtin006", "builtin007", "builtin008", "builtin009", "builtin010",
"builtin011"]
idrisTestsEvaluator : TestPool
idrisTestsEvaluator = MkTestPool "Evaluation" [] Nothing
[ -- Evaluator
"evaluator001", "evaluator002", "evaluator003", "evaluator004",
-- Miscellaneous REPL
"interpreter001", "interpreter002", "interpreter003", "interpreter004",
"interpreter005", "interpreter006", "interpreter007", "interpreter008",
-- Specialisation
"spec001"
]
idrisTestsREPL : TestPool
idrisTestsREPL = MkTestPool "REPL commands and help" [] Nothing
[ "repl001", "repl002", "repl003", "repl004", "repl005"
, "repl006"
]
idrisTestsAllSchemes : Requirement -> TestPool
idrisTestsAllSchemes cg = MkTestPool
("Test across all scheme backends: " ++ show cg ++ " instance")
[] (Just cg)
[ "scheme001", "scheme002"
, "channels001", "channels002", "channels003", "channels004", "channels005"
, "channels006"
]
idrisTestsAllBackends : Requirement -> TestPool
idrisTestsAllBackends cg = MkTestPool
("Test across all backends: " ++ show cg ++ " instance")
[] (Just cg)
-- RefC implements IEEE standard and distinguishes between 0.0 and -0.0
-- unlike other backends. So turn this test for now.
$ ([ "issue2362" ] <* guard (cg /= C))
++ ([ "popen2" ] <* guard (cg /= Node))
++ [ -- Evaluator
"evaluator004",
-- Unfortunately the behaviour of Double is platform dependent so the
-- following test is turned off.
-- "evaluator005",
"basic048",
"perf006"]
idrisTestsTotality : TestPool
idrisTestsTotality = MkTestPool "Totality checking" [] Nothing
-- Positivity checking
["positivity001", "positivity002", "positivity003", "positivity004",
-- Totality checking
"total001", "total002", "total003", "total004", "total005",
"total006", "total007", "total008", "total009", "total010",
"total011", "total012", "total013", "total014", "total015",
"total016", "total017", "total018", "total019"
]
-- This will only work with an Idris compiled via Chez or Racket, but at
-- least for the moment we're not officially supporting self hosting any
-- other way. If we do, we'll need to have a way to disable these.
idrisTestsSchemeEval : TestPool
idrisTestsSchemeEval = MkTestPool "Scheme Evaluator" [] Nothing
["schemeeval001", "schemeeval002", "schemeeval003", "schemeeval004",
"schemeeval005", "schemeeval006"]
idrisTestsReflection : TestPool
idrisTestsReflection = MkTestPool "Quotation and Reflection" [] Nothing
["reflection001", "reflection002", "reflection003", "reflection004",
"reflection005", "reflection006", "reflection007", "reflection008",
"reflection009", "reflection010", "reflection011", "reflection012",
"reflection013", "reflection014", "reflection015", "reflection016",
"reflection017", "reflection018", "reflection019", "reflection020"]
idrisTestsWith : TestPool
idrisTestsWith = MkTestPool "With abstraction" [] Nothing
[ "with001", "with002", "with004", "with005", "with006", "with007",
"with008", "with009", "with010", "with011"
]
idrisTestsIPKG : TestPool
idrisTestsIPKG = MkTestPool "Package and .ipkg files" [] Nothing
["pkg001", "pkg002", "pkg003", "pkg004", "pkg005", "pkg006", "pkg007",
"pkg008", "pkg009", "pkg010", "pkg011", "pkg012", "pkg013", "pkg014",
"pkg015", "pkg016", "pkg017" ]
idrisTests : TestPool
idrisTests = MkTestPool "Misc" [] Nothing
-- Documentation strings
["docs001", "docs002", "docs003", "docs004", "docs005",
-- Eta equality
"eta001",
-- Modules and imports
"import001", "import002", "import003", "import004", "import005", "import006",
"import007", "import008", "import009",
-- Implicit laziness, lazy evaluation
"lazy001", "lazy002", "lazy003",
-- Namespace blocks
"namespace001", "namespace002", "namespace003", "namespace004", "namespace005",
-- Parameters blocks
"params001", "params002", "params003",
-- Larger programs arising from real usage. Typically things with
-- interesting interactions between features
"real001", "real002",
-- Inlining
"inlining001",
-- with-disambiguation
"with003",
-- pretty printing
"pretty001", "pretty002",
-- PrimIO
"primloop",
-- golden file testing
"golden001",
-- quantifiers
"quantifiers001",
-- unification
"unification001"
]
typeddTests : IO TestPool
typeddTests = testsInDir "typedd-book" (const True) "Type Driven Development" [] Nothing
chezTests : TestPool
chezTests = MkTestPool "Chez backend" [] (Just Chez)
[ "chez001", "chez002", "chez003", "chez004", "chez005", "chez006"
, "chez007", "chez008", "chez009", "chez010", "chez011", "chez012"
, "chez013", "chez014", "chez015", "chez016", "chez017", "chez018"
, "chez019", "chez020", "chez021", "chez022", "chez023", "chez024"
, "chez025", "chez026", "chez027", "chez028", "chez029", "chez030"
, "chez031", "chez032", "chez033", "chez034", "chez035", "chez036"
, "futures001"
, "bitops"
, "casts"
, "constfold", "constfold2", "constfold3"
, "memo"
, "newints"
, "integers"
, "nat2fin"
, "inlineiobind"
, "semaphores001"
, "semaphores002"
, "perf001"
, "reg001"
, "buffer001"
]
refcTests : IO TestPool
refcTests = testsInDir "refc" (const True) "Reference counting C backend" [] (Just C)
racketTests : TestPool
racketTests = MkTestPool "Racket backend" [] (Just Racket)
[ "forkjoin001"
, "semaphores001", "semaphores002"
, "futures001"
, "mutex001", "mutex002", "mutex003", "mutex004", "mutex005"
, "conditions001" , "conditions002" , "conditions003" , "conditions004"
, "conditions005"
-- , "conditions006"
-- , "conditions007"
]
nodeTests : TestPool
nodeTests = MkTestPool "Node backend" [] (Just Node)
[ "node001", "node002", "node003", "node004", "node005", "node006"
, "node007", "node008", "node009", "node011", "node012", "node015"
, "node017", "node018", "node019", "node020", "node021", "node022"
, "node023", "node024", "node025", "node026", "node027"
, "perf001"
-- , "node14"
, "args"
, "bitops"
, "casts"
, "memo"
, "fastConcat"
, "newints"
, "reg001", "reg002"
, "stringcast"
, "syntax001"
, "tailrec001"
, "tailrec002"
, "idiom001"
, "integers"
, "doubles"
, "fix1839"
, "tailrec_libs"
, "nomangle001", "nomangle002"
, "integer_array"
]
vmcodeInterpTests : IO TestPool
vmcodeInterpTests = testsInDir "vmcode" (const True) "VMCode interpreter" [] Nothing
ideModeTests : IO TestPool
ideModeTests = testsInDir "ideMode" (const True) "IDE mode" [] Nothing
preludeTests : IO TestPool
preludeTests = testsInDir "prelude" (const True) "Prelude library" [] Nothing
templateTests : IO TestPool
templateTests = testsInDir "templates" (const True) "Test templates" [] Nothing
-- base library tests are run against
-- each codegen supported and to keep
-- things simple it's all one test group
-- that only runs if all backends are
-- available.
baseLibraryTests : IO TestPool
baseLibraryTests = testsInDir "base" (const True) "Base library" [Chez, Node] Nothing
-- same behavior as `baseLibraryTests`
contribLibraryTests : IO TestPool
contribLibraryTests = testsInDir "contrib" (const True) "Contrib library" [Chez, Node] Nothing
codegenTests : IO TestPool
codegenTests = testsInDir "codegen" (const True) "Code generation" [] Nothing
main : IO ()
main = runner $
[ testPaths "ttimp" ttimpTests
, testPaths "idris2" idrisTestsBasic
, testPaths "idris2" idrisTestsCoverage
, testPaths "idris2" idrisTestsTermination
, testPaths "idris2" idrisTestsCasetree
, testPaths "idris2" idrisTestsError
, testPaths "idris2" idrisTestsFailing
, testPaths "idris2" idrisTestsWarning
, testPaths "idris2" idrisTestsInteractive
, testPaths "idris2" idrisTestsInterface
, testPaths "idris2" idrisTestsLiterate
, testPaths "idris2" idrisTestsLinear
, testPaths "idris2" idrisTestsPerformance
, testPaths "idris2" idrisTestsRegression
, testPaths "idris2" idrisTestsData
, testPaths "idris2" idrisTestsBuiltin
, testPaths "idris2" idrisTestsEvaluator
, testPaths "idris2" idrisTestsREPL
, testPaths "idris2" idrisTestsTotality
, testPaths "idris2" idrisTestsSchemeEval
, testPaths "idris2" idrisTestsReflection
, testPaths "idris2" idrisTestsWith
, testPaths "idris2" idrisTestsDebug
, testPaths "idris2" idrisTestsIPKG
, testPaths "idris2" idrisTests
, !typeddTests
, !ideModeTests
, !preludeTests
, !baseLibraryTests
, !contribLibraryTests
, testPaths "chez" chezTests
, !refcTests
, testPaths "racket" racketTests
, testPaths "node" nodeTests
, !vmcodeInterpTests
, !templateTests
, !codegenTests
]
++ map (testPaths "allschemes" . idrisTestsAllSchemes) [Chez, Racket]
++ map (testPaths "allbackends" . idrisTestsAllBackends) [Chez, Node, Racket, C]
where
testPaths : String -> TestPool -> TestPool
testPaths dir = { testCases $= map ((dir ++ "/") ++) }