3 import Control.Arrow (left)
4 import Control.Monad (Monad(..), sequence)
5 import Data.Either (Either(..))
6 import Data.Function (($), (.))
7 import Data.Functor ((<$>))
8 import Data.Semigroup (Semigroup(..))
9 import Data.String (String)
10 import System.FilePath (FilePath)
12 import Text.Show (Show(..))
13 import qualified Data.ByteString.Lazy as BSL
14 import qualified Data.List as List
15 import qualified Data.Text.Lazy as TL
16 import qualified Data.Text.Lazy.Encoding as TL
17 import qualified Text.Megaparsec as P
18 import qualified Data.TreeSeq.Strict as TS
21 import Test.Tasty.Golden
23 import Language.Symantic.XML (XMLs)
24 import qualified Language.Symantic.XML as XML
26 -- * Golden testing utilities
27 testGolden :: TestName -> TestName -> IO (Either String BSL.ByteString) -> TestTree
28 testGolden inputFile expectedExt =
29 goldenVsStringDiff inputFile diffGolden (inputFile <> expectedExt)
32 diffGolden :: FilePath -> FilePath -> [String]
33 diffGolden ref new = ["diff", "-u", ref, new]
35 unLeft :: Either String BSL.ByteString -> IO BSL.ByteString
37 Left err -> return $ TL.encodeUtf8 $ TL.pack err
40 readXML :: FilePath -> IO (Either String XMLs)
42 XML.readFile inputFile >>= \case
43 Left err -> return $ Left $ show err
45 return $ left P.parseErrorPretty $
46 XML.readXML inputFile input
48 goldensIO :: IO TestTree
50 testGroup "Golden" <$>
56 goldensXML :: IO TestTree
58 inputFiles <- List.sort <$> findByExtension [".xml"] "test/Golden"
59 return $ testGroup "XML"
60 [ testGolden inputFile ".ast" $
61 readXML inputFile >>= \ast ->
67 | inputFile <- inputFiles
70 goldensRNC :: IO TestTree
72 return $ testGroup "RNC"