1 {-# LANGUAGE DataKinds #-} -- For using P.viewGrammar
2 {-# LANGUAGE FlexibleContexts #-} -- For using P.Grammar Char
3 {-# LANGUAGE Rank2Types #-}
4 {-# LANGUAGE TypeApplications #-}
5 module Golden.Parser where
7 import Control.Monad (Monad(..))
8 import Data.Either (Either(..))
9 import Data.Function (($))
10 import Data.Functor ((<$>))
12 import Data.Semigroup (Semigroup(..))
13 import Data.String (IsString(..))
14 import Data.Text.IO (readFile)
15 import System.FilePath ((<.>), (</>), dropExtensions, takeBaseName)
16 import System.IO.Unsafe (unsafePerformIO)
17 import System.IO (print)
19 import Test.Tasty.Golden
20 import Text.Show (Show(..))
21 import qualified Control.Exception as IO
22 import qualified Data.List as List
23 import qualified System.Directory as IO
24 import qualified System.IO.Error as IO
30 goldens = testGroup "Parser" $
31 (\f -> List.zipWith f parsers [1::Int ..]) $ \(P p) g ->
32 -- Collect the existing files: test/Golden/Parser/G*.input.txt
33 let parserDir = "test/Golden/Parser/G"<>show g in
35 ((parserDir </>) <$>) $
37 List.filter (List.isSuffixOf ".input.txt") $
40 (IO.listDirectory parserDir)
42 if IO.isDoesNotExistError exn
46 testGroup ("G"<>show g) $ (<$> inputs) $ \inp ->
47 goldenVsStringDiff (takeBaseName (dropExtensions inp)) goldenDiff
48 (dropExtensions inp<.>"expected.txt") $ do