packages feed

shikumi-eval-0.1.0.0: test/GoldenSpec.hs

{-# LANGUAGE RankNTypes #-}

-- | A golden test for a stub program, run deterministically and offline under a
-- constant mock LM. The committed @test/golden/qa-program.golden@ pins the
-- transcript; the plan records the fail-before/pass-after demonstration.
module GoldenSpec (tests) where

import Effectful (Eff, IOE, runEff)
import Effectful.Error.Static (Error, runErrorNoCallStack)
import EvalFixtures (Answer (..), Question (..), answerResponse, qaProg, runConstLLM)
import Shikumi.Error (ShikumiError)
import Shikumi.Eval.Golden (goldenProgram)
import Shikumi.Eval.Types (Dataset, dataset, example)
import Shikumi.LLM (LLM)
import Test.Tasty (TestTree, testGroup)

-- | Two questions; the constant mock always answers "yes", so the transcript is
-- deterministic regardless of the inputs.
goldenData :: Dataset Question Answer
goldenData =
  dataset
    [ example (Question "what is 2+2?") (Answer "ignored"),
      example (Question "capital of France?") (Answer "ignored")
    ]

-- | Discharge @'[LLM, Error ShikumiError, IOE]@ to 'IO' under the constant mock,
-- failing on a 'ShikumiError'.
runMock :: forall a. Eff '[LLM, Error ShikumiError, IOE] a -> IO a
runMock act = do
  r <- runEff . runErrorNoCallStack @ShikumiError . runConstLLM (answerResponse "yes") $ act
  either (fail . show) pure r

tests :: TestTree
tests =
  testGroup
    "Golden"
    [ goldenProgram
        "qa-program golden"
        "test/golden/qa-program.golden"
        runMock
        goldenData
        qaProg
        answer
    ]