hydra-0.15.0: src/main/haskell/Hydra/Sources/Test/TestSuite.hs
-- | Complete test suite combining all Hydra test groups
module Hydra.Sources.Test.TestSuite where
-- Standard imports for deep DSL tests (produces TTerm a with specific types)
import Hydra.Kernel
import Hydra.Dsl.Meta.Testing as Testing
import Hydra.Dsl.Meta.Phantoms as Phantoms hiding ((++))
import Hydra.Sources.Kernel.Types.All
import qualified Hydra.Dsl.Meta.Core as Core
import qualified Hydra.Dsl.Meta.Types as T
import qualified Hydra.Sources.Test.TestGraph as TestGraph
import qualified Hydra.Sources.Test.TestTerms as TestTerms
import qualified Hydra.Sources.Test.TestTypes as TestTypes
import qualified Data.List as L
import qualified Data.Map as M
-- Test module imports
import qualified Hydra.Sources.Test.Lib.Chars as Chars
import qualified Hydra.Sources.Test.Lib.Eithers as Eithers
import qualified Hydra.Sources.Test.Lib.Equality as Equality
import qualified Hydra.Sources.Test.Lib.Lists as Lists
import qualified Hydra.Sources.Test.Lib.Literals as Literals
import qualified Hydra.Sources.Test.Lib.Logic as Logic
import qualified Hydra.Sources.Test.Lib.Maps as Maps
import qualified Hydra.Sources.Test.Lib.Math as Math
import qualified Hydra.Sources.Test.Lib.Maybes as Maybes
import qualified Hydra.Sources.Test.Annotations as Annotations
import qualified Hydra.Sources.Test.Ordering as Ordering
import qualified Hydra.Sources.Test.Lib.Pairs as Pairs
import qualified Hydra.Sources.Test.Lib.Regex as Regex
import qualified Hydra.Sources.Test.Lib.Sets as Sets
import qualified Hydra.Sources.Test.Lib.Strings as Strings
import qualified Hydra.Sources.Test.Checking.All as CheckingAll
import qualified Hydra.Sources.Test.Checking.Advanced as CheckingAdvanced
import qualified Hydra.Sources.Test.Checking.AlgebraicTypes as CheckingAlgebraicTypes
import qualified Hydra.Sources.Test.Checking.Collections as CheckingCollections
import qualified Hydra.Sources.Test.Checking.Failures as CheckingFailures
import qualified Hydra.Sources.Test.Checking.Fundamentals as CheckingFundamentals
import qualified Hydra.Sources.Test.Checking.NominalTypes as CheckingNominalTypes
import qualified Hydra.Sources.Test.EtaExpansion as EtaExpansion
import qualified Hydra.Sources.Test.Formatting as Formatting
import qualified Hydra.Sources.Test.Generation as Generation
import qualified Hydra.Sources.Test.Inference.All as InferenceAll
import qualified Hydra.Sources.Test.Inference.AlgebraicTypes as InferenceAlgebraicTypes
import qualified Hydra.Sources.Test.Inference.AlgorithmW as InferenceAlgorithmW
import qualified Hydra.Sources.Test.Inference.Failures as InferenceFailures
import qualified Hydra.Sources.Test.Inference.Fundamentals as InferenceFundamentals
import qualified Hydra.Sources.Test.Inference.KernelExamples as InferenceKernelExamples
import qualified Hydra.Sources.Test.Inference.Classes as InferenceClasses
import qualified Hydra.Sources.Test.Inference.NominalTypes as InferenceNominalTypes
import qualified Hydra.Sources.Test.Json.Parser as JsonParser
import qualified Hydra.Sources.Test.Json.Roundtrip as JsonRoundtrip
import qualified Hydra.Sources.Test.Json.Writer as JsonWriter
import qualified Hydra.Sources.Test.Json.Yaml as JsonYaml
import qualified Hydra.Sources.Test.Hoisting.All as HoistingAll
import qualified Hydra.Sources.Test.Hoisting.Cases as HoistingCases
import qualified Hydra.Sources.Test.Hoisting.Let as HoistingLet
import qualified Hydra.Sources.Test.Dependencies as Dependencies
import qualified Hydra.Sources.Test.Differentiation as Differentiation
import qualified Hydra.Sources.Test.Reduction as Reduction
import qualified Hydra.Sources.Test.Rewriting as Rewriting
import qualified Hydra.Sources.Test.Serialization as Serialization
import qualified Hydra.Sources.Test.Sorting as Sorting
import qualified Hydra.Sources.Test.Strip as Strip
import qualified Hydra.Sources.Test.Substitution as Substitution
import qualified Hydra.Sources.Test.Unification as Unification
import qualified Hydra.Sources.Test.Validate.All as ValidateAll
import qualified Hydra.Sources.Test.Validate.Core as ValidateCore
import qualified Hydra.Sources.Test.Variables as Variables
ns :: Namespace
ns = Namespace "hydra.test.testSuite"
module_ :: Module
module_ = Module {
moduleNamespace = ns,
moduleDefinitions = definitions,
moduleTermDependencies = namespaces,
moduleTypeDependencies = kernelTypesNamespaces,
moduleDescription = Just ("Hydra's common test suite, which is designed to run identically in each Hydra implementation;"
<> " the criterion for a true Hydra implementation is that all test cases pass.")}
where
definitions = [Phantoms.toDefinition allTests]
namespaces = fst <$> testPairs
allTests :: TTermDefinition TestGroup
allTests = definitionInModule module_ "allTests" $
doc "The group of all common tests" $
Testing.testGroup (string "common") nothing (list subgroups) (list ([] :: [TTerm TestCaseWithMetadata]))
where
subgroups = snd <$> testPairs
libPairs :: [(Namespace, TTermDefinition TestGroup)]
libPairs = [
(Chars.ns, Chars.allTests),
(Eithers.ns, Eithers.allTests),
(Equality.ns, Equality.allTests),
(Lists.ns, Lists.allTests),
(Literals.ns, Literals.allTests),
(Logic.ns, Logic.allTests),
(Maps.ns, Maps.allTests),
(Math.ns, Math.allTests),
(Maybes.ns, Maybes.allTests),
(Pairs.ns, Pairs.allTests),
(Regex.ns, Regex.allTests),
(Sets.ns, Sets.allTests),
(Strings.ns, Strings.allTests)]
otherPairs :: [(Namespace, TTermDefinition TestGroup)]
otherPairs = [
(Annotations.ns, Annotations.allTests),
(CheckingAll.ns, CheckingAll.allTests),
(Dependencies.ns, Dependencies.allTests),
(Differentiation.ns, Differentiation.allTests),
(EtaExpansion.ns, EtaExpansion.allTests),
(Formatting.ns, Formatting.allTests),
(Generation.ns, Generation.allTests),
(HoistingAll.ns, HoistingAll.allTests),
(InferenceAll.ns, InferenceAll.allTests),
-- TODO #336: JsonParser temporarily excluded — polymorphic ParseResult type blocks code generation
-- (JsonParser.ns, JsonParser.allTests),
(JsonRoundtrip.ns, JsonRoundtrip.allTests),
(JsonWriter.ns, JsonWriter.allTests),
(JsonYaml.ns, JsonYaml.allTests),
-- TODO #336: (Ordering.ns, Ordering.allTests) temporarily removed - needs investigation
(Reduction.ns, Reduction.allTests),
(Rewriting.ns, Rewriting.allTests),
(Serialization.ns, Serialization.allTests),
(Sorting.ns, Sorting.allTests),
(Strip.ns, Strip.allTests),
(Substitution.ns, Substitution.allTests),
(Unification.ns, Unification.allTests),
(ValidateAll.ns, ValidateAll.allTests),
(Variables.ns, Variables.allTests)]
testPairs :: [(Namespace, TTermDefinition TestGroup)]
testPairs = libPairs ++ otherPairs
-- | All test suite modules (the actual Module values)
testSuiteModules :: [Module]
testSuiteModules =
-- Lib tests
[Chars.module_, Eithers.module_, Equality.module_,
Lists.module_, Literals.module_, Logic.module_, Maps.module_,
Math.module_, Maybes.module_, Pairs.module_, Regex.module_, Sets.module_, Strings.module_,
-- Hoisting tests (including sub-modules)
HoistingAll.module_, HoistingCases.module_, HoistingLet.module_,
-- Other tests
Annotations.module_, Dependencies.module_, Differentiation.module_, EtaExpansion.module_, Formatting.module_,
Generation.module_,
JsonRoundtrip.module_, JsonWriter.module_, JsonYaml.module_,
Reduction.module_, Rewriting.module_, Serialization.module_, Sorting.module_,
Strip.module_, Variables.module_,
-- TODO #336: Ordering.module_ temporarily removed - needs investigation
-- Checking tests (including sub-modules)
CheckingAll.module_,
CheckingAdvanced.module_, CheckingAlgebraicTypes.module_, CheckingCollections.module_,
CheckingFailures.module_, CheckingFundamentals.module_, CheckingNominalTypes.module_,
-- Inference tests (including sub-modules)
InferenceAll.module_,
InferenceAlgebraicTypes.module_, InferenceAlgorithmW.module_, InferenceClasses.module_, InferenceFailures.module_,
InferenceFundamentals.module_, InferenceKernelExamples.module_, InferenceNominalTypes.module_,
-- Substitution and unification tests
Substitution.module_, Unification.module_,
-- Validation tests
ValidateAll.module_, ValidateCore.module_]