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