packages feed

langchain-hs-0.0.5.0: test/Test/Langchain/TextSplitter/MarkdownSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Test.Langchain.TextSplitter.MarkdownSpec (tests) where

import qualified Data.Map.Strict as Map
import qualified Data.Text.Lazy as TL
import Test.Tasty
import Test.Tasty.HUnit

import Langchain.TextSplitter.Markdown

tests :: TestTree
tests =
  testGroup
    "Langchain.TextSplitter.MarkdownSpec"
    [ testCase "Splits markdown and preserves header hierarchy in metadata" $ do
        let doc =
              "# Title\n\nIntroductory text.\n\n## Section 1\n\nSection 1 details.\n\n### SubSection A\n\nSubSection content.\n\n## Section 2\n\nSection 2 details."
            chunks = splitMarkdownToChunks defaultMarkdownSplitterOps doc
        case chunks of
          [c1, _c2, subSecChunk, _c4] -> do
            chunkHeaders c1 @?= Map.singleton "Header 1" "Title"
            Map.lookup "Header 1" (chunkHeaders subSecChunk) @?= Just "Title"
            Map.lookup "Header 2" (chunkHeaders subSecChunk) @?= Just "Section 1"
            Map.lookup "Header 3" (chunkHeaders subSecChunk) @?= Just "SubSection A"
          _ -> assertFailure ("Expected 4 chunks, got " ++ show (length chunks))
    , testCase "Section 2 clears previous subsection headers" $ do
        let doc =
              "# Title\n\n## Section 1\n\n### SubSection\n\nDetails.\n\n## Section 2\n\nNew section."
            chunks = splitMarkdownToChunks defaultMarkdownSplitterOps doc
        case chunks of
          [_, _, _, sec2Chunk] -> do
            Map.lookup "Header 2" (chunkHeaders sec2Chunk) @?= Just "Section 2"
            Map.lookup "Header 3" (chunkHeaders sec2Chunk) @?= Nothing
          _ -> assertFailure ("Expected 4 chunks, got " ++ show (length chunks))
    , testCase "Plain text markdown splitting produces non-empty chunks" $ do
        let doc = "# Main\n\nBody paragraph 1.\n\n## Sub\n\nBody paragraph 2."
            chunks = splitMarkdown defaultMarkdownSplitterOps doc
        case chunks of
          (firstChunk : _) -> do
            length chunks @?= 2
            assertBool "Chunk contains Main" ("Main" `TL.isInfixOf` firstChunk)
          [] -> assertFailure "Expected chunks to be non-empty"
    ]