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