packages feed

hydra-0.13.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.Flows as Flows
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.Monads as Monads
import qualified Hydra.Sources.Test.Lib.Pairs as Pairs
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.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.NominalTypes as InferenceNominalTypes
import qualified Hydra.Sources.Test.Json.Coder as JsonCoder
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.Hoisting as Hoisting
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.Substitution as Substitution
import qualified Hydra.Sources.Test.Unification as Unification


ns :: Namespace
ns = Namespace "hydra.test.testSuite"

module_ :: Module
module_ = Module ns elements namespaces kernelTypesNamespaces $
    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
    elements = [Phantoms.toBinding allTests]
    namespaces = fst <$> testPairs

allTests :: TBinding 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, TBinding TestGroup)]
libPairs = [
  (Chars.ns, Chars.allTests),
  (Eithers.ns, Eithers.allTests),
  (Equality.ns, Equality.allTests),
  (Flows.ns, Flows.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),
  (Sets.ns, Sets.allTests),
  (Strings.ns, Strings.allTests)]

otherPairs :: [(Namespace, TBinding TestGroup)]
otherPairs = [
  (Annotations.ns, Annotations.allTests),
  (CheckingAll.ns, CheckingAll.allTests),
  (EtaExpansion.ns, EtaExpansion.allTests),
  (Formatting.ns, Formatting.allTests),
  (Hoisting.ns, Hoisting.allTests),
  (InferenceAll.ns, InferenceAll.allTests),
  (JsonCoder.ns, JsonCoder.allTests),
  (JsonParser.ns, JsonParser.allTests),
  (JsonRoundtrip.ns, JsonRoundtrip.allTests),
  (JsonWriter.ns, JsonWriter.allTests),
  (Monads.ns, Monads.allTests),
  -- TODO: (Ordering.ns, Ordering.allTests) temporarily removed - needs investigation
  (Reduction.ns, Reduction.allTests),
  (Rewriting.ns, Rewriting.allTests),
  (Serialization.ns, Serialization.allTests),
  (Sorting.ns, Sorting.allTests),
  (Substitution.ns, Substitution.allTests),
  (Unification.ns, Unification.allTests)]

testPairs :: [(Namespace, TBinding TestGroup)]
testPairs = libPairs ++ otherPairs

-- | All test suite modules (the actual Module values)
testSuiteModules :: [Module]
testSuiteModules =
  -- Lib tests
  [Chars.module_, Eithers.module_, Equality.module_, Flows.module_,
   Lists.module_, Literals.module_, Logic.module_, Maps.module_,
   Math.module_, Maybes.module_, Pairs.module_, Sets.module_, Strings.module_,
   -- Other tests
   Annotations.module_, EtaExpansion.module_, Formatting.module_, Hoisting.module_,
   JsonCoder.module_, JsonParser.module_, JsonRoundtrip.module_, JsonWriter.module_,
   Monads.module_, Reduction.module_, Rewriting.module_, Serialization.module_, Sorting.module_,
   -- TODO: 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_, InferenceFailures.module_,
   InferenceFundamentals.module_, InferenceKernelExamples.module_, InferenceNominalTypes.module_,
   -- Substitution and unification tests
   Substitution.module_, Unification.module_]