packages feed

baikai-0.6.0.0: test/ThinkingLevelSpec.hs

module ThinkingLevelSpec (tests) where

import Baikai.ThinkingLevel
import Data.Text (Text)
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit (testCase, (@?=))

tests :: TestTree
tests =
  testGroup
    "ThinkingLevel"
    [ testGroup "canonical rendering" renderTests,
      testGroup "canonical parsing" parseTests,
      testGroup "token budgets" budgetTests
    ]

levels :: [(String, ThinkingLevel, Text, Integer)]
levels =
  [ ("minimal", ThinkingMinimal, "minimal", 1024),
    ("low", ThinkingLow, "low", 2048),
    ("medium", ThinkingMedium, "medium", 8192),
    ("high", ThinkingHigh, "high", 16384),
    ("xhigh", ThinkingXHigh, "xhigh", 24576),
    ("max", ThinkingMax, "max", 32768)
  ]

renderTests :: [TestTree]
renderTests =
  [ testCase name $ renderThinkingLevel level @?= expected
  | (name, level, expected, _) <- levels
  ]

-- | 'parseThinkingLevel' is the inverse of 'renderThinkingLevel' on
-- every level, which is what lets @baikai-agent@'s KDL decoder and the
-- evidence schema read the table instead of copying it.
parseTests :: [TestTree]
parseTests =
  [ testCase name $ do
      parseThinkingLevel expected @?= Just level
      parseThinkingLevel (renderThinkingLevel level) @?= Just level
  | (name, level, expected, _) <- levels
  ]
    <> [testCase "an unknown name is Nothing" $ parseThinkingLevel "enormous" @?= Nothing]

budgetTests :: [TestTree]
budgetTests =
  [ testCase name $ thinkingTokenBudget level @?= fromInteger expected
  | (name, level, _, expected) <- levels
  ]