module Golden where import Control.Arrow (left) 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.FilePath (FilePath) import System.IO (IO) 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 qualified Text.Megaparsec as P import qualified Data.TreeSeq.Strict as TS import Test.Tasty import Test.Tasty.Golden import Language.Symantic.XML (XMLs) import qualified Language.Symantic.XML as XML -- * Golden testing utilities testGolden :: TestName -> TestName -> IO (Either String BSL.ByteString) -> TestTree testGolden inputFile expectedExt = goldenVsStringDiff inputFile diffGolden (inputFile <> 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 readXML :: FilePath -> IO (Either String XMLs) readXML inputFile = XML.readFile inputFile >>= \case Left err -> return $ Left $ show err Right input -> return $ left P.parseErrorPretty $ XML.readXML inputFile input goldensIO :: IO TestTree goldensIO = testGroup "Golden" <$> sequence [ goldensXML , goldensRNC ] goldensXML :: IO TestTree goldensXML = do inputFiles <- List.sort <$> findByExtension [".xml"] "test/Golden" return $ testGroup "XML" [ testGroup "Read" [ testGolden inputFile ".read" $ readXML inputFile >>= \ast -> return $ TL.encodeUtf8 . TL.pack . TS.prettyTrees <$> ast | inputFile <- inputFiles ] , testGroup "Write" [ testGolden inputFile ".write" $ readXML inputFile >>= \ast -> return $ TL.encodeUtf8 . XML.writeXML <$> ast | inputFile <- inputFiles ] ] goldensRNC :: IO TestTree goldensRNC = return $ testGroup "RNC" [ ]