packages feed

langchain-hs-0.0.5.0: test/Test/Langchain/Memory/TokenBufferMemory.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Langchain.Memory.TokenBufferMemory (tests) where

import Control.Monad.Except (runExceptT)
import qualified Data.Text as T
import Test.Tasty (TestTree, testGroup)
import Test.Tasty.HUnit

import Langchain.Core.Error (errorMessage)
import Langchain.Core.Model
  ( systemMessage
  , userMessage
  )
import Langchain.Memory.Core (BaseMemory (..))
import qualified Langchain.Memory.Core as TB

tests :: TestTree
tests =
  testGroup
    "TokenBufferMemory Tests"
    [ testCase "Initializes with provided messages" $ do
        mem <- TB.newTokenBufferMemory 100 [systemMessage "You are an AI model"]
        TB.maxTokens mem @?= 100
        res <- runExceptT $ messages mem
        res @?= Right [systemMessage "You are an AI model"]
    , testCase "Adds message within token limit" $ do
        let sysMsg = systemMessage "sys"
            user1 = userMessage "12345678"
            user2 = userMessage "12345678"
        mem <- TB.newTokenBufferMemory 10 [sysMsg, user1]
        res <- runExceptT $ do
          addMessage mem user2
          messages mem
        case res of
          Left err -> assertFailure $ "Expected Right but got Left: " ++ show err
          Right msgs -> msgs @?= [sysMsg, user1, user2]
    , testCase "Evicts oldest non-system message when exceeding token limit" $ do
        let sysMsg = systemMessage "sys!"
            user1 = userMessage "12345678"
            user2 = userMessage "12345678"
        mem <- TB.newTokenBufferMemory 4 [sysMsg, user1]
        res <- runExceptT $ do
          addMessage mem user2
          messages mem
        case res of
          Left err -> assertFailure $ "Expected Right but got Left: " ++ show err
          Right msgs -> msgs @?= [sysMsg, user2]
    , testCase "Returns error when message itself exceeds token limit" $ do
        let sysMsg = systemMessage "12345678"
            userMsg = userMessage "12345678901234567890"
        mem <- TB.newTokenBufferMemory 3 [sysMsg]
        res <- runExceptT $ addMessage mem userMsg
        case res of
          Left err ->
            assertBool "Error mentions exceeds" ("exceeds" `T.isInfixOf` errorMessage err)
          Right _ -> assertFailure "Expected Left due to overflow"
    , testCase "clear resets to default system message" $ do
        mem <- TB.newTokenBufferMemory 100 [userMessage "old"]
        res <- runExceptT $ do
          clear mem
          messages mem
        case res of
          Right msgs -> msgs @?= [systemMessage "You are a helpful AI assistant"]
          Left _ -> assertFailure "Clear failed unexpectedly"
    ]