packages feed

dhall-docs-0.0.1: tasty/Main.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell   #-}
{-# OPTIONS_GHC -Wno-unused-imports #-}

module Main (main) where

import Data.Map.Strict (Map)
import Data.Text       (Text)
import Dhall.Docs.Core
import Path            (Dir, File, Path, Rel, (</>))
import Test.Tasty      (TestTree)

import qualified Control.Monad
import qualified Data.Map.Strict               as Map
import qualified Data.Text
import qualified Data.Text.IO                  as Text.IO
import qualified GHC.IO.Encoding
import qualified Path
import qualified Path.IO
import qualified Test.Tasty
import qualified Test.Tasty.Silver             as Silver
import qualified Test.Tasty.Silver.Interactive as Silver
import qualified Text.PrettyPrint              as Pretty
import qualified Text.XML.HaXml.Html.Parse     as HaXml
import qualified Text.XML.HaXml.Pretty         as HaXml

main :: IO ()
main = do
    GHC.IO.Encoding.setLocaleEncoding GHC.IO.Encoding.utf8

    input <- getPackageContents
    let GeneratedDocs _ docs = generateDocsPure "test-package" input
    let docsMap = Map.fromList docs
    Silver.defaultMain $ testTree docsMap

getDirContents :: Path Rel Dir -> IO [(Path Rel File, Text)]
getDirContents dataDir = do
    files <- snd <$> Path.IO.listDirRecurRel dataDir
    Control.Monad.forM files $ \file -> do
        contents <- Text.IO.readFile $ Path.fromRelFile $ dataDir </> file
        return (file, contents)

goldenDir :: Path Rel Dir
goldenDir = $(Path.mkRelDir "./tasty/data/golden")

getPackageContents :: IO [(Path Rel File, Text)]
getPackageContents = getDirContents $(Path.mkRelDir "./tasty/data/package")

testTree :: Map (Path Rel File) Text -> TestTree
testTree docsMap =
    Test.Tasty.testGroup "dhall-docs"
        $ map makeTest $ Map.assocs docsMap
  where
    makeTest :: (Path Rel File, Text) -> TestTree
    makeTest (testFile, text) =
        Silver.goldenVsAction testName goldenFilePath action converter
      where
        goldenFilePath = Path.fromRelFile $ goldenDir </> testFile
        testName = Path.fromRelFile testFile
        action = return prettyHtmlDoc
        converter = Data.Text.pack

        prettyHtmlDoc = Pretty.render
            $ HaXml.document
            $ HaXml.htmlParse testName (Data.Text.unpack text)