{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TupleSections #-} {-# LANGUAGE CPP #-} -- | 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 = "ghc710" : ["ghc8" | ghcVersion >= 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 findTestsDir :: FilePath -> IO Test findTestsDir dir = do let fp = testPrefix dir fs <- getDirectoryContents fp let testFiles = filter (".hs" `isSuffixOf`) fs return $ testList dir (map (mkParserTest dir) testFiles) mkTests :: IO Test mkTests = do roundTripTests <- findTests return $ TestList [roundTripTests, transformTests, failingTests] -- Tests that will fail until https://phabricator.haskell.org/D907 lands in a -- future GHC failingTests :: Test failingTests = testList "Failing tests" [ -- Require current master #10313 / Phab:D907 mkTestModBad "Deprecation.hs" , mkTestModBad "MultiLineWarningPragma.hs" , mkTestModBad "UnicodeRules.hs" -- Tests requiring future GHC modifications , mkTestModBad "UnicodeSyntax.hs" , mkTestModBad "InfixOperator.hs" ] 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 [ -- , mkTestModChange changeLayoutLet2 "LayoutLet2.hs" -- , mkTestModChange changeLayoutLet3 "LayoutLet3.hs" -- , mkTestModChange changeLayoutLet3 "LayoutLet4.hs" -- , mkTestModChange changeRename1 "Rename1.hs" -- , mkTestModChange changeRename2 "Rename2.hs" -- , mkTestModChange changeLayoutIn1 "LayoutIn1.hs" -- , mkTestModChange changeLayoutIn3 "LayoutIn3.hs" -- , mkTestModChange changeLayoutIn3 "LayoutIn3a.hs" -- , mkTestModChange changeLayoutIn3 "LayoutIn3b.hs" -- , mkTestModChange changeLayoutIn4 "LayoutIn4.hs" -- , mkTestModChange changeLocToName "LocToName.hs" -- , mkTestModChange changeLetIn1 "LetIn1.hs" -- , mkTestModChange changeWhereIn4 "WhereIn4.hs" -- , mkTestModChange changeAddDecl "AddDecl.hs" mkTestModChange changeLocalDecls "LocalDecls.hs" -- , mkTestModChange changeLocalDecls2 "LocalDecls2.hs" -- , mkTestModChange changeWhereIn3a "WhereIn3a.hs" , mkTestModChange changeRenameCase1 "RenameCase1.hs" , mkTestModChange changeRenameCase2 "RenameCase2.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 pwd :: IO FilePath pwd = getCurrentDirectory cd :: FilePath -> IO () cd = setCurrentDirectory