hydra-0.13.0: src/test/haskell/Hydra/Reference/AlgorithmWSpec.hs
{-
stack ghci hydra:lib hydra:hydra-test
Test.Hspec.hspec Hydra.Reference.AlgorithmWSpec.spec
-}
module Hydra.Reference.AlgorithmWSpec where
import Hydra.Kernel
import Hydra.Sources.Libraries
import Hydra.TestUtils
import Hydra.TestData
import qualified Hydra.Extract.Core as ExtractCore
import Hydra.Dsl.Terms as Terms
import qualified Hydra.Dsl.Annotations as Ann
import qualified Hydra.Dsl.Types as Types
import qualified Hydra.Show.Core as ShowCore
import qualified Hydra.Reference.AlgorithmWBridge as W
import qualified Hydra.TestUtils as TU
import Hydra.Testing
import Hydra.TestSuiteSpec
import Hydra.Test.TestSuite
import qualified Hydra.Dsl.Meta.Testing as Testing
import qualified Test.Hspec as H
import qualified Test.QuickCheck as QC
import qualified Data.List as L
import qualified Data.Map as M
import qualified Data.Set as S
import Control.Monad
testHydraContext = W.HydraContext $ graphPrimitives testGraph
inferType :: Term -> IO (Term, TypeScheme)
inferType = W.termToInferredTerm testHydraContext
expectType :: Term -> TypeScheme -> H.SpecWith ()
expectType term ts = do
result <- H.runIO $ inferType term
H.it "inferred type" $
H.shouldBe (ShowCore.typeScheme $ snd result) (ShowCore.typeScheme ts)
H.it "inferred term" $
H.shouldBe (ShowCore.term $ removeTypesFromTerm $ fst result) (ShowCore.term $ removeTypesFromTerm term)
algorithmWRunner :: TestRunner
algorithmWRunner desc tcase = if Testing.isDisabled tcase || Testing.isDisabledForMinimalInference tcase
then Nothing
else case testCaseWithMetadataCase tcase of
TestCaseInference (InferenceTestCase input output) -> Just $ expectType input output
_ -> Nothing
spec :: H.Spec
spec = runTestGroup "" algorithmWRunner allTests