packages feed

mdoc-0.1.0.0: test/Mdoc/GenSpec.hs

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

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

import Mdoc.Prelude

import Data.ByteString.Lazy qualified as BSL
import Data.Text.IO qualified as T
import Data.Time (fromGregorian)
import Env.Mdoc qualified as Env
import Mdoc
import Mdoc.Gen
import Mdoc.Gen.Man1
import Mdoc.Gen.Man5
import Mdoc.Gen.Name
import Mdoc.Input (parseMdocBytes)
import Mdoc.Parse (exitParseError)
import Mdoc.Pretty (renderPlain)
import Mdoc.Test.Fixtures
import Mdoc.UpdateMdocdate (updateMdocdateTo)
import OptEnvConf.Mdoc qualified as OptEnvConf
import Options.Applicative.Mdoc qualified as OA
import System.FilePath ((<.>), (</>))
import Test.Hspec
import Test.Hspec.Golden

spec :: Spec
spec = do
  describe "genMan1" $ do
    it "grep.1"
      $ goldenMan1
      $ grepBase
      & OA.addToMan1 grepOpt
      & Env.addToMan1 grepEnv

    it "example.1"
      $ goldenMan1
      $ exampleBase1
      & OptEnvConf.addToMan1 exampleOptEnvConf

  describe "genMan5" $ do
    it "examplerc.5"
      $ goldenMan5
      $ exampleBase5
      & OptEnvConf.addToMan5 exampleOptEnvConf

    it "conf.5"
      $ goldenMan5
      $ confBase
      & OptEnvConf.addToMan5 confConf

goldenMan1 :: Man1 -> IO (Golden Mdoc)
goldenMan1 man1 = goldenMan (man1.name.primary <.> "1") <$> genMan1 man1

goldenMan5 :: Man5 -> IO (Golden Mdoc)
goldenMan5 man5 = goldenMan (man5.name.primary <.> "5") <$> genMan5 man5

goldenMan :: FilePath -> Mdoc -> Golden Mdoc
goldenMan path mdoc =
  Golden
    { output
    , encodePretty = unpack . renderPlain . prettyMdoc
    , writeToFile = \fp -> T.writeFile fp . renderPlain . prettyMdoc
    , readFromFile = \fp -> either exitParseError pure . parseMdocBytes fp =<< BSL.readFile fp
    , goldenFile = "examples" </> path
    , actualFile = Nothing
    , failFirstTime = False
    }
 where
  output = fixMdocDate mdoc

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