packages feed

ede-0.3.4.0: test/Main.hs

{-# LANGUAGE OverloadedStrings #-}

-- Module      : Main
-- Copyright   : (c) 2013-2022 Brendan Hay <brendan.g.hay@gmail.com>
-- License     : This Source Code Form is subject to the terms of
--               the Mozilla Public License, v. 2.0.
--               A copy of the MPL can be found in the LICENSE file or
--               you can obtain it at http://mozilla.org/MPL/2.0/.
-- Maintainer  : Brendan Hay <brendan.g.hay@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)

module Main (main) where

import qualified Data.Aeson as Aeson
import qualified Data.Bifunctor as Bifunctor
import qualified Data.ByteString as ByteString
import qualified Data.ByteString.Lazy as ByteString.Lazy
import Data.Functor ((<&>))
import qualified Data.List as List
import qualified Data.Maybe as Maybe
import qualified Data.Text as Text
import qualified Data.Text.Lazy.Encoding as Text.Lazy.Encoding
import qualified Paths_ede as Paths
import qualified System.Directory as Directory
import System.FilePath ((-<.>), (</>))
import qualified System.FilePath as FilePath
import qualified Test.Tasty as Tasty
import qualified Test.Tasty.Golden as Tasty.Golden
import qualified Text.EDE as EDE

main :: IO ()
main = do
  resources <-
    Paths.getDataDir <&> (</> "test/resources")

  templates <-
    map (FilePath.combine resources) . filter (List.isSuffixOf ".ede")
      <$> Directory.listDirectory resources

  Tasty.defaultMain $
    Tasty.testGroup "ED-E" $
      map (test resources . FilePath.normalise) templates

test :: FilePath -> FilePath -> Tasty.TestTree
test dir path =
  Tasty.Golden.goldenVsStringDiff path diff (path -<.> ".golden") $ do
    (context, template) <-
      split <$> ByteString.readFile path

    result <-
      EDE.parseWith
        EDE.defaultSyntax
        (EDE.includeFile dir)
        (Text.pack path)
        template

    EDE.result
      (error . show)
      (pure . Text.Lazy.Encoding.encodeUtf8)
      (result >>= flip EDE.render context)
  where
    diff ref new =
      ["diff", "-u", ref, new]

    split =
      Bifunctor.bimap input (ByteString.drop 4)
        . ByteString.breakSubstring "---"

    input =
      Maybe.fromMaybe (error "Failed parsing JSON")
        . Aeson.decode'
        . ByteString.Lazy.fromStrict