module Golden where import Control.Monad (Monad(..), sequence) import Data.Either (Either(..)) import Data.Function (($), (.)) import Data.Functor ((<$>)) import Data.Semigroup (Semigroup(..)) import Data.String (String) import System.IO (IO, FilePath) import Text.Show (Show(..)) import qualified Data.ByteString.Lazy as BSL import qualified Data.List as List import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TL import Test.Tasty import Test.Tasty.Golden import qualified Symantic.XML.RelaxNG as RelaxNG import qualified Symantic.Atom as Atom goldensIO :: IO TestTree goldensIO = testGroup "Golden" <$> sequence [ goldensAtom ] goldensAtom :: IO TestTree goldensAtom = do inputFiles <- List.sort <$> findByExtension [".xml"] "test/Golden" return $ testGroup "RelaxNG" [ testGroup "Validate" [ testGolden inputFile ".read" $ ((TL.encodeUtf8 . TL.pack . show) <$>) <$> RelaxNG.readWithRelaxNG Atom.format inputFile | inputFile <- inputFiles ] , testGroup "Compact" [ testGroup "Write" [ testGolden "test/Golden/atom" ".rnc" $ return $ Right $ TL.encodeUtf8 $ RelaxNG.writeRNC Atom.format ] ] ] -- * Golden testing utilities testGolden :: TestName -> TestName -> IO (Either String BSL.ByteString) -> TestTree testGolden testName expectedExt = goldenVsStringDiff testName diffGolden (testName <> expectedExt) . (>>= unLeft) diffGolden :: FilePath -> FilePath -> [String] diffGolden ref new = ["diff", "-u", ref, new] unLeft :: Either String BSL.ByteString -> IO BSL.ByteString unLeft = \case Left err -> return $ TL.encodeUtf8 $ TL.pack err Right a -> return a