{-# LANGUAGE NoImplicitPrelude #-}
module Golden (goldenTests) where

import           Control.Applicative        (pure, (*>))
import           Control.Category           ((.))
import           Control.Monad              ((>=>))

import           System.Exit                (exitFailure)
import           System.FilePath            (FilePath, takeBaseName)
import           System.IO                  (IO, print)

import Data.Semigroup ((<>))
import           Data.Either                (either)
import           Data.Function              (($))

import           Data.ByteString.Lazy       (ByteString, readFile, toStrict)

import           Data.Attoparsec.ByteString (parseOnly)

import           Test.Tasty                 (TestTree, testGroup)
import           Test.Tasty.Golden          (findByExtension, goldenVsString)

import qualified Waargonaut.Decode          as D
import qualified Waargonaut.Encode          as E

import qualified Prettier.NestedObjs as WaargP

readAndEncodeFile :: FilePath -> IO ByteString
readAndEncodeFile = readFile
  >=> D.decodeFromByteString parseOnly D.json . toStrict
  >=> either (\err -> print err *> exitFailure) pure
  >=> E.simpleEncodeByteString E.json

goldenTests :: IO TestTree
goldenTests = do
  fs <- findByExtension [".golden"] "test/json-data/goldens"
  pure . testGroup "Golden Tests" $
    [ goldenVsString (takeBaseName input) input (readAndEncodeFile input)
    | input <- fs
    ] <>
    [ WaargP.testGoldenPrettyNested
    ]