never executed always true always false
1 module Conjure.ParserFuzz (tests) where
2
3 import Conjure.Language.AST.ASTParser (parseProgram, runASTParser)
4 import Conjure.Language.AST.Reformer (flattenSeq)
5 import Conjure.Language.Lexer (reformList, runLexer)
6 import Conjure.Prelude
7 import Data.Algorithm.Diff (getGroupedDiff)
8 import Data.Algorithm.DiffOutput (ppDiff)
9 import Data.ByteString.Char8 (hPutStrLn, pack)
10 import Data.Text qualified as T (pack, unpack)
11 import Data.Text.Lazy qualified as L
12 import GHC.IO.Handle.FD (stderr)
13 import Shelly (run, shelly, silently)
14 import Test.Tasty (TestTree, testGroup)
15 import Test.Tasty.HUnit (assertFailure, testCaseSteps)
16
17 tests :: IO TestTree
18 tests = do
19 allFiles <- shelly $ silently $ run "git" ["ls-tree", "--full-tree", "--name-only", "-r", "HEAD"]
20 let allFileList = lines $ T.unpack allFiles
21 let testCases = testFile <$> allFileList
22 return (testGroup "parse_fuzz" testCases)
23
24 testFile :: FilePath -> TestTree
25 testFile fp = testCaseSteps (map (\ch -> if ch == '/' then '.' else ch) fp) $ \step -> do
26 fd <- readFileIfExists fp
27 step "lexing"
28 let usableFileData = concat (take 1000 . lines $ fromMaybe [] fd)
29 let fText = T.pack usableFileData
30 case runLexer fText (Just fp) of
31 Left _le -> assertFailure $ "Lexer failed in:" ++ fp
32 Right ets -> do
33 step "parsing"
34 case runASTParser parseProgram ets of
35 Left _pe -> assertFailure $ "Parser failed in:" ++ fp
36 Right pt -> do
37 step "round tripping"
38 let roundTrip = L.unpack $ reformList $ flattenSeq pt
39 unless (roundTrip == usableFileData) $ do
40 let diff = getGroupedDiff (lines roundTrip) (lines usableFileData)
41 Data.ByteString.Char8.hPutStrLn stderr $ Data.ByteString.Char8.pack $ "===DIFF: " ++ fp
42 Data.ByteString.Char8.hPutStrLn stderr $ Data.ByteString.Char8.pack $ ppDiff diff
43 Data.ByteString.Char8.hPutStrLn stderr "===------------"
44 assertFailure $ "Failed to rebuild :" ++ fp