packages feed

mdoc-0.2.0.0: test/Mdoc/ExamplesSpec.hs

{-# OPTIONS_GHC -Wno-ambiguous-fields #-}

-- |
--
-- Module      : Mdoc.ExamplesSpec
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Mdoc.ExamplesSpec
  ( spec
  ) where

import Mdoc.Prelude

import Data.ByteString.Lazy qualified as BSL
import Data.Text.IO qualified as T
import Data.Time (fromGregorian)
import Mdoc
import Mdoc.Data.Named
import Mdoc.Examples.Grep
import Mdoc.Examples.OptEnvConf
import Mdoc.Examples.Person
import Mdoc.Input (parseMdocBytes)
import Mdoc.Parse (errorBundlePretty, exitParseError)
import Mdoc.Pretty (renderPlain)
import Mdoc.Syntax
import Mdoc.Template
import Mdoc.UpdateMdocdate (updateMdocdateTo)
import System.FilePath ((<.>), (</>))
import Test.Hspec
import Test.Hspec.Golden

spec :: Spec
spec = do
  it "grep.1" $ exampleGolden man1 grep1 1
  it "example.1" $ exampleGolden man1 example1 1
  it "conf.5" $ exampleGolden man5 conf5 5
  it "example.5" $ exampleGolden man5 example5 5
  it "person.5" $ exampleGolden man5 person5 5

exampleGolden :: Template -> Named -> Int -> IO (Golden Mdoc)
exampleGolden template named section = do
  case renderTemplate template named of
    Rendered mdoc -> do
      pure @IO
        Golden
          { output = fixMdocDate mdoc
          , encodePretty = unpack . renderPlain . prettyMdoc
          , writeToFile = \fp -> T.writeFile fp . (<> "\n") . renderPlain . prettyMdoc
          , readFromFile = \fp -> either exitParseError pure . parseMdocBytes fp =<< BSL.readFile fp
          , goldenFile = "examples" </> path
          , actualFile = Nothing
          , failFirstTime = False
          }
    RenderedWarnings ne _ -> do
      expectationFailure $ displayMustacheWarnings ne
      error "unreachable"
    RenderedError err -> do
      expectationFailure $ errorBundlePretty err
      error "unreachable"
 where
  path :: FilePath
  path = unpack (head named.names) <.> show section

fixMdocDate :: Mdoc -> Mdoc
fixMdocDate = updateMdocdateTo $ fromGregorian 2026 9 20