module Golden where -- import qualified System.FilePath as Path -- import qualified Text.Blaze.Utils as Blaze import Control.Monad (Monad(..)) import Data.Either (Either(..)) import Data.Function (($), (.)) import Data.Functor ((<$>)) import Data.Semigroup (Semigroup(..)) import Data.String (String) import System.IO (IO) import Text.Show (Show(..)) import qualified Data.ByteString.Lazy as BS import qualified Data.List as List import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TL import qualified Data.TreeSeq.Strict as TreeSeq import qualified Text.Blaze.Html.Renderer.Utf8 as Blaze import Test.Tasty import Test.Tasty.Golden import qualified Language.TCT as TCT import qualified Language.TCT.Debug as TCT import qualified Language.TCT.Write.HTML5 as TCT.Write.HTML5 import qualified Language.TCT.Write.Plain as TCT.Write.Plain import qualified Language.TCT.Write.XML as TCT.Write.XML diff :: String -> String -> [String] diff ref new = ["diff", "-u", ref, new] readAST :: String -> IO (Either TCT.ErrorRead TCT.Roots) readAST inputFile = do inp <- BS.readFile inputFile return $ TCT.readTrees inputFile $ TL.decodeUtf8 inp unLeft :: Show err => Either err BS.ByteString -> IO BS.ByteString unLeft = \case Left err -> return $ TL.encodeUtf8 $ TL.pack $ show err Right a -> return a goldensIO :: IO TestTree goldensIO = do inputFiles <- List.sort <$> findByExtension [".tct"] "test/Golden" return $ testGroup "TCT" [ testGroup "AST" [ goldenVsStringDiff inputFile diff (inputFile <> ".ast") $ (>>= unLeft) $ readAST inputFile >>= \ast -> return $ TL.encodeUtf8 . TL.pack . TCT.runPretty 0 <$> ast | inputFile <- inputFiles ] , testGroup "Plain" [ goldenVsStringDiff inputFile diff inputFile $ (>>= unLeft) $ readAST inputFile >>= \ast -> return $ TL.encodeUtf8 . (<> TL.singleton '\n') . TCT.Write.Plain.document <$> ast | inputFile <- inputFiles ] , testGroup "HTML5" [ goldenVsStringDiff inputFile diff (inputFile <> ".html5") $ (>>= unLeft) $ readAST inputFile >>= \ast -> return $ Blaze.renderHtml . TCT.Write.HTML5.document <$> ast | inputFile <- inputFiles ] , testGroup "XML" [ goldenVsStringDiff inputFile diff (inputFile <> ".xml") $ (>>= unLeft) $ readAST inputFile >>= \ast -> return $ TL.encodeUtf8 . TL.pack . show . TreeSeq.Pretty . TCT.Write.XML.document <$> ast | inputFile <- inputFiles ] ]