packages feed

ronn-1.2.0.0: tests/Ronn/RenderSpec.hs

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

import Prelude

import Data.List (intersperse)
import Data.Text (Text, unpack)
import Data.Text.IO qualified as T
import Ronn
import System.FilePath ((</>))
import Test.Hspec
import Test.Hspec.Golden

spec :: Spec
spec = do
  describe "ronnToText" $ do
    specify "a complete example"
      $ ronnGolden
      $ Ronn
        { name = ManRef "ronn" ManSection1
        , description = ["example ronn man-page"]
        , sections =
            [ Section
                { name = "SYNOPSIS"
                , content =
                    [ Line
                        [ Code "ronn"
                        , Brackets $ Code "-h"
                        , Brackets $ Code "--help"
                        , Brackets $ mconcat [Code "--debug", "\\|", Code "--trace"]
                        , Brackets $ mconcat [Code "-o", " ", Variable "FILE"]
                        , Brackets $ mconcat [Code "--output", "=", Variable "FILE"]
                        , Variable "INPUT"
                        ]
                    ]
                }
            , Section
                { name = "DESCRIPTION"
                , content =
                    [ Para
                        [ "This is an"
                        , "example man-page to show"
                        , "how rendering the AST looks."
                        , "This description wouldn't normally be this"
                        , "long, but we want to verify the"
                        , "implementation reflows long lines."
                        ]
                    ]
                }
            , Section
                { name = "OPTIONS"
                , content =
                    map
                      Defn
                      [ Definition
                          { name =
                              mconcat
                                [ Code "-h"
                                , ", "
                                , Code "--help"
                                ]
                          , description = ["Display this help"]
                          , content = Nothing
                          }
                      , Definition
                          { name = Code "--debug"
                          , description = ["Enable debug"]
                          , content = Nothing
                          }
                      , Definition
                          { name = Code "--trace"
                          , description = ["Enable trace"]
                          , content = Nothing
                          }
                      , Definition
                          { name =
                              mconcat
                                [ Code "-o"
                                , ", "
                                , Code "--output"
                                , "="
                                , Variable "FILE"
                                ]
                          , description = ["Output to", Variable "FILE"]
                          , content = Nothing
                          }
                      , Definition
                          { name = Variable "INPUT"
                          , description = ["Source input"]
                          , content = Nothing
                          }
                      ]
                }
            , Section
                { name = "ENVIRONMENT"
                , content =
                    [ Defn
                        Definition
                          { name = Code "HOME"
                          , description = ["User's HOME directory"]
                          , content =
                              Just
                                [ "Some further details:"
                                , Defn
                                    Definition
                                      { name = "foo"
                                      , description = ["The foo"]
                                      , content = Nothing
                                      }
                                , Defn
                                    Definition
                                      { name = "bar"
                                      , description = ["The bar"]
                                      , content = Nothing
                                      }
                                ]
                          }
                    ]
                }
            , Section
                { name = "SEE ALSO"
                , content =
                    [ Para
                        [ mconcat
                            $ intersperse
                              (Raw ", ")
                              [ Ref $ ManRef "markdown" ManSection7
                              , Ref $ ManRef "roff" ManSection7
                              ]
                        ]
                    ]
                }
            ]
        }

ronnGolden :: Ronn -> Golden Text
ronnGolden ronn =
  Golden
    { output = ronnToText ronn
    , encodePretty = unpack
    , writeToFile = T.writeFile
    , readFromFile = T.readFile
    , goldenFile = "../doc" </> ronnFilePath ronn
    , actualFile = Nothing
    , failFirstTime = False
    }