1 {-# LANGUAGE OverloadedStrings #-}
2 {-# LANGUAGE TypeApplications #-}
3 module Golden.Splice.Utils where
5 -- Build_symantic_parser is auto-generated by Setup.hs
6 import Build_symantic_parser (ghcPath, ghcFlags, rootDir)
7 import Control.Applicative (Applicative(..))
8 import Data.Foldable (asum)
9 import Data.Function (($), (.), const)
10 import Data.Functor ((<$>), (<$))
11 import Data.List (cycle, zipWith)
12 import Data.Maybe (Maybe(..))
13 import Data.Semigroup (Semigroup(..))
14 import Data.String (String, IsString(..))
15 import Data.Text (Text)
16 import System.FilePath (FilePath, (</>), (<.>), (-<.>))
17 import System.IO (IO, IOMode(..), openFile)
18 import System.Process (CreateProcess(..), StdStream(..), createProcess, proc, waitForProcess, callCommand)
19 import Test.Tasty (TestTree)
20 import Test.Tasty.Golden (goldenVsFileDiff)
21 import qualified Turtle
29 , "-dsuppress-uniques"
31 , "-fprint-explicit-kinds"
33 --, "-i" <>rootDir</>"test"
34 --, "-XConstraintKinds"
36 --, "-XDefaultSignatures"
38 , "-XFlexibleContexts"
39 , "-XFlexibleInstances"
42 --, "-XKindSignatures"
44 , "-XMultiParamTypeClasses"
48 , "-XScopedTypeVariables"
49 --, "-XStandaloneDeriving"
50 --, "-XStandaloneKindSignatures"
52 , "-XTypeApplications"
56 --, "-XUndecidableInstances"
59 testSplice :: FilePath -> TestTree
60 testSplice spliceFile =
61 goldenVsFileDiff spliceFile goldenDiff
62 (rootDir</>spliceFile-<.>"expected"<.>"txt")
64 h <- openFile actualFile WriteMode
65 (_, _, _, pid) <- createProcess
66 (proc ghcPath (spliceFile : ghcOpts))
67 { std_out = UseHandle h
68 , std_err = UseHandle h
69 , cwd = Just rootDir }
70 _ <- waitForProcess pid
71 normalizeSplice actualFile
73 actualFile = rootDir</>spliceFile-<.>"actual"<.>"hs"
75 normalizeSplice :: FilePath -> IO ()
76 normalizeSplice = Turtle.inplace pat . fromString
78 pat :: Turtle.Pattern Text
80 [ "(0,0)-(0,0)" <$ numPair <* "-" <* numPair
81 , ":0:0:" <$ ":" <* d <* ":" <* d <* "-" <* d
82 , ":0:0" <$ ":" <* d <* ":" <* d
83 , fromString @Text . numPeriod <$> Turtle.lowerBounded 10 Turtle.digit
84 , fromString @Text . ('%' <$) <$> Turtle.lowerBounded 10 punctSym
85 -- Remove pretty-printed references to the symantic-parser package
86 -- (e.g., turn `symantic-parser-2.4.1:Sing` into `Sing`)
87 -- to make the output more stable.
88 , "" <$ "symantic-parser-" <* verNum <* ":"
90 verNum = d `Turtle.sepBy` Turtle.char '.'
91 numPair = () <$ "(" <* d <* "," <* d <* ")"
92 punctSym = Turtle.oneOf "!#$%&*+./>"
93 numPeriod = zipWith const (cycle "0123456789876543210")
94 d = Turtle.some Turtle.digit
97 cleanFiles = callCommand $ "rm -f " <> rootDir </> "test/Golden/Splice/*/*.{actual.hs,hi,o}"