{-# LANGUAGE CPP #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TupleSections #-} -- | Use "runhaskell Setup.hs test" or "cabal test" to run these tests. module Main where import Language.Haskell.GHC.ExactPrint.Utils ( showGhc ) -- import qualified FastString as GHC -- import qualified GHC as GHC -- import qualified Data.Generics as SYB -- import qualified GHC.SYB.Utils as SYB import Control.Monad import System.Directory import System.FilePath import System.IO import System.Exit import Data.List import System.IO.Silently import Test.Common import Test.Transform import Test.HUnit -- import Debug.Trace -- --------------------------------------------------------------------- data GHCVersion = GHC710 | GHC8 deriving (Eq, Ord, Show) ghcVersion :: GHCVersion ghcVersion = #if __GLASGOW_HASKELL__ >= 711 GHC8 #else GHC710 #endif -- | Directories to automatically find roundtrip tests testDirs :: [FilePath] testDirs = case ghcVersion of GHC710 -> ["ghc710-only","ghc710"] GHC8 -> ["ghc710", "ghc8"] -- --------------------------------------------------------------------- main :: IO () main = hSilence [stderr] $ do print ghcVersion tests <- mkTests cnts <- fst <$> runTestText (putTextToHandle stdout True) tests putStrLn $ show cnts if errors cnts > 0 || failures cnts > 0 then exitFailure else return () -- exitSuccess transform :: IO () transform = hSilence [stderr] $ do cnts <- fst <$> runTestText (putTextToHandle stdout True) transformTests putStrLn $ show cnts if errors cnts > 0 || failures cnts > 0 then exitFailure else return () -- exitSuccess -- --------------------------------------------------------------------- findTests :: IO Test findTests = testList "Round-trip tests" <$> mapM findTestsDir testDirs listTests :: IO () listTests = do let ftd dir = do let fp = testPrefix dir fs <- getDirectoryContents fp let testFiles = sort $ filter (".hs" `isSuffixOf`) fs return (zip [0::Integer ..] testFiles) files <- mapM ftd testDirs putStrLn $ "round trip tests:" ++ show (zip testDirs files) findTestsDir :: FilePath -> IO Test findTestsDir dir = do let fp = testPrefix dir fs <- getDirectoryContents fp let testFiles = sort $ filter (".hs" `isSuffixOf`) fs return $ testList dir (map (mkParserTest dir) testFiles) mkTests :: IO Test mkTests = do -- listTests roundTripTests <- findTests return $ TestList [internalTests,roundTripTests, transformTests, failingTests] -- Tests that will fail until https://phabricator.haskell.org/D907 lands in a -- future GHC failingTests :: Test failingTests = testList "Failing tests" [ -- Tests requiring future GHC modifications mkTestModBad "InfixOperator.hs" #if __GLASGOW_HASKELL__ > 710 , mkTestModBad "overloadedlabelsrun04.hs" #else , mkTestModBad "UnicodeSyntax.hs" , mkTestModBad "UnicodeRules.hs" , mkTestModBad "Deprecation.hs" , mkTestModBad "MultiLineWarningPragma.hs" #endif ] mkParserTest :: FilePath -> FilePath -> Test mkParserTest dir fp = let basename = testPrefix dir fp writeFailure = writeFile (basename <.> "out") writeHsPP = writeFile (basename <.> "hspp") writeIncons s = writeFile (basename <.> "incons") (showGhc s) in TestCase (do r <- either (\(ParseFailure _ s) -> error (s ++ basename)) id <$> roundTripTest basename writeFailure (debugTxt r) forM_ (inconsistent r) writeIncons forM_ (cppStatus r) writeHsPP assertBool fp (status r == Success)) -- --------------------------------------------------------------------- formatTT :: ([([Char], Bool)], [([Char], Bool)]) -> IO () formatTT (ts, fs) = do when (not . null $ tail ts) (do putStrLn "Pass" mapM_ (putStrLn . fst) (tail ts) ) when (not . null $ fs) (do putStrLn "Fail" mapM_ (putStrLn . fst) fs) tt' :: IO (Counts,Int) tt' = runTestText (putTextToHandle stdout True) $ TestList [ -- mkParserTest "ghc710" "Unicode.hs" -- , mkParserTest "ghc8" "BundleExport.hs" -- , mkParserTest "ghc8" "ExportSyntax.hs" -- , mkParserTest "ghc8" "T10689a.hs" -- , mkParserTest "ghc8" "Test10313.hs" -- , mkParserTest "ghc8" "Test11018.hs" -- , mkParserTest "ghc8" "determ004.hs" -- , mkParserTest "ghc8" "export-class.hs" -- , mkParserTest "ghc8" "export-syntax.hs" -- , mkParserTest "ghc8" "export-type.hs" -- , mkParserTest "ghc8" "overloadedlabelsrun04.hs" -- mkParserTest "ghc710" "RdrNames.hs" mkParserTest "ghc710" "Process1.hs" -- mkParserTest "ghc8" "T10620.hs" -- mkParserTest "ghc8" "Vta1.hs" -- , mkParserTest "ghc8" "Vta2.hs" -- , mkParserTest "failing" "Deprecation.hs" -- , mkParserTest "failing" "MultiLineWarningPragma.hs" -- , mkParserTest "failing" "UnicodeRules.hs" -- , mkParserTest "failing" "UnicodeSyntax.hs" ] testsTT :: Test testsTT = TestList [ mkParserTest "ghc710" "Cpp.hs" , mkParserTest "ghc710" "DroppedDoSpace.hs" ] tt :: IO () -- tt = hSilence [stderr] $ do tt = do cnts <- fst <$> runTestText (putTextToHandle stdout True) testsTT putStrLn $ show cnts if errors cnts > 0 || failures cnts > 0 then exitFailure else return () -- exitSuccess -- --------------------------------------------------------------------- ii :: IO () ii = do cnts <- fst <$> runTestText (putTextToHandle stdout True) internalTests putStrLn $ show cnts if errors cnts > 0 || failures cnts > 0 then exitFailure else return () -- exitSuccess internalTests :: Test internalTests = testList "Internal tests" [ -- testCleanupOneLine ] {- testCleanupOneLine :: Test testCleanupOneLine = do let makeCase n = (show n ,(T.replicate n " ") <> "\t|" <> T.replicate n " " <> "\t" ,(T.replicate 8 " " <> "|")) mkTest n = TestCase $ assertEqual name outp (cleanupOneLine inp) where (name,inp,outp) = makeCase n testList "cleanupOneLine" $ map mkTest [1..7] -} -- --------------------------------------------------------------------- pwd :: IO FilePath pwd = getCurrentDirectory cd :: FilePath -> IO () cd = setCurrentDirectory