packages feed

hydra-0.15.0: src/test/haskell/Hydra/Test/TestEnv.hs

-- | Test environment providing the test graph and context with primitives.
-- This is a hand-written bridge module referenced by the generated TestGraph.
-- It should NOT be overwritten by code generation.

module Hydra.Test.TestEnv (testGraph, testContext) where

import Hydra.Kernel
import Hydra.Sources.Libraries (standardLibraries)
import Hydra.Json.Bootstrap (typesByName)
import qualified Hydra.Sources.Kernel.Terms.Annotations as TermAnnotations
import qualified Hydra.Sources.Kernel.Terms.Constants as TermConstants
import qualified Hydra.Sources.Kernel.Terms.Dependencies as TermDependencies
import qualified Hydra.Sources.Kernel.Terms.Extract.Core as TermExtractCore
import qualified Hydra.Sources.Kernel.Terms.Lexical as TermLexical
import qualified Hydra.Sources.Kernel.Terms.Rewriting as TermRewriting
import qualified Hydra.Sources.Kernel.Terms.Scoping as TermScoping
import qualified Hydra.Sources.Kernel.Terms.Show.Core as TermShowCore
import qualified Hydra.Sources.Kernel.Terms.Strip as TermStrip
import qualified Hydra.Sources.Kernel.Terms.Variables as TermVariables
import qualified Hydra.Decode.Core as TermDecodeCore
import qualified Hydra.Encode.Core as TermEncodeCore
import qualified Data.List as L
import qualified Data.Map as M

-- | Convert a Type to a TypeScheme, extracting forall-bound variables.
-- Also strips top-level annotations.
typeToScheme :: Type -> TypeScheme
typeToScheme = go []
  where
    go vars (TypeForall (ForallType var body)) = go (vars ++ [var]) body
    go vars (TypeAnnotated (AnnotatedType body _)) = go vars body
    go vars body = TypeScheme vars body Nothing

-- | The test graph with primitives, schema types, and kernel term bindings.
testGraph :: M.Map Name Type -> Graph
testGraph testTypes = let
    allPrims = L.concatMap libraryPrimitives standardLibraries
    primsMap = M.fromList $ fmap (\p -> (primitiveName p, p)) allPrims
    kernelSchemas = M.map typeToScheme typesByName
    testSchemas = M.map typeToScheme testTypes
    allSchemas = M.union kernelSchemas testSchemas
    -- Kernel term bindings needed for reduceTerm to evaluate kernel functions
    kernelTermBindings = L.concat $ fmap moduleBindings
      [ TermAnnotations.module_
      , TermConstants.module_
      , TermDependencies.module_
      , TermExtractCore.module_
      , TermLexical.module_
      , TermRewriting.module_
      , TermScoping.module_
      , TermShowCore.module_
      , TermStrip.module_
      , TermVariables.module_
      ]
    boundTerms = M.fromList $ fmap (\b -> (bindingName b, bindingTerm b)) kernelTermBindings
    boundTypes = M.fromList
      [ (bindingName b, ts) | b <- kernelTermBindings, Just ts <- [bindingTypeScheme b] ]
    base = emptyGraph
  in base {
    graphPrimitives = primsMap,
    graphSchemaTypes = allSchemas,
    graphBoundTerms = boundTerms,
    graphBoundTypes = boundTypes }

-- | The test context (empty).
testContext :: Context
testContext = emptyContext