{-# LANGUAGE LambdaCase, MonoLocalBinds #-}
module Main where
import Test.Tasty (TestTree, testGroup, defaultMain)
import Test.Tasty.HUnit
import GHC hiding (loadModule, ParsedModule)
import GHC.Paths ( libdir )
import System.FilePath
import System.IO
import Language.Haskell.Tools.PrettyPrint (prettyPrint)
import Language.Haskell.Tools.Refactor
main :: IO ()
main = defaultMain nightlyTests
nightlyTests :: TestTree
nightlyTests
= testGroup "all tests" [ testGroup "reprint tests" (map makeReprintTest languageTests)
, testGroup "CppHs tests" $ map makeCpphsTest cppHsTests
, testGroup "instance-control tests" $ map makeInstanceControlTest instanceControlTests
]
makeReprintTest :: String -> TestTree
makeReprintTest mod = testCase mod (checkCorrectlyPrinted rootDir mod)
makeCpphsTest :: String -> TestTree
makeCpphsTest mod = testCase mod (checkCorrectlyPrinted (rootDir </> "CppHs") mod)
makeInstanceControlTest :: String -> TestTree
makeInstanceControlTest mod = testCase mod (checkCorrectlyPrinted (rootDir </> "InstanceControl") mod)
checkCorrectlyPrinted :: String -> String -> IO ()
checkCorrectlyPrinted workingDir moduleName
= do -- need to use binary or line endings will be translated
expectedHandle <- openBinaryFile (workingDir </> map (\case '.' -> pathSeparator; c -> c) moduleName ++ ".hs") ReadMode
expected <- hGetContents expectedHandle
actual <- runGhc (Just libdir) $ do
parsed <- loadModule workingDir moduleName
prettyPrint <$> parseTyped parsed
assertEqual "The original and the transformed source differ" expected actual
rootDir = "examples"
cppHsTests =
[ "Language.Preprocessor.Cpphs"
, "Language.Preprocessor.Unlit"
, "Language.Preprocessor.Cpphs.CppIfdef"
, "Language.Preprocessor.Cpphs.HashDefine"
, "Language.Preprocessor.Cpphs.MacroPass"
, "Language.Preprocessor.Cpphs.Options"
, "Language.Preprocessor.Cpphs.Position"
, "Language.Preprocessor.Cpphs.ReadFirst"
, "Language.Preprocessor.Cpphs.RunCpphs"
, "Language.Preprocessor.Cpphs.SymTab"
, "Language.Preprocessor.Cpphs.Tokenise"
]
instanceControlTests =
[ "Control.Instances.Test"
, "Control.Instances.Morph"
, "Control.Instances.ShortestPath"
, "Control.Instances.TypeLevelPrelude"
]
languageTests =
[ "CPP.JustEnabled"
, "CPP.ConditionalCode"
, "Decl.AmbiguousFields"
, "Decl.AnnPragma"
, "Decl.ClassInfix"
, "Decl.ClosedTypeFamily"
, "Decl.CompletePragma"
, "Decl.CtorOp"
, "Decl.DataFamily"
, "Decl.DataType"
, "Decl.DataInstanceGADT"
, "Decl.DataTypeDerivings"
, "Decl.DefaultDecl"
, "Decl.FunBind"
, "Decl.FunctionalDeps"
, "Decl.FunGuards"
, "Decl.GADT"
, "Decl.GadtConWithCtx"
, "Decl.InfixAssertion"
, "Decl.InfixInstances"
, "Decl.InfixPatSyn"
, "Decl.InjectiveTypeFamily"
, "Decl.InlinePragma"
, "Decl.InstanceFamily"
, "Decl.InstanceOverlaps"
, "Decl.InstanceSpec"
, "Decl.LocalBindings"
, "Decl.LocalBindingInDo"
, "Decl.LocalFixity"
, "Decl.MinimalPragma"
, "Decl.MultipleFixity"
, "Decl.MultipleSigs"
, "Decl.OperatorBind"
, "Decl.OperatorDecl"
, "Decl.ParamDataType"
, "Decl.PatternBind"
, "Decl.PatternSynonym"
, "Decl.RecordPatternSynonyms"
, "Decl.RecordType"
, "Decl.RewriteRule"
, "Decl.SpecializePragma"
, "Decl.StandaloneDeriving"
, "Decl.TypeClass"
, "Decl.TypeClassMinimal"
, "Decl.TypeFamily"
, "Decl.TypeFamilyKindSig"
, "Decl.TypeInstance"
, "Decl.TypeRole"
, "Decl.TypeSynonym"
, "Decl.ValBind"
, "Decl.ViewPatternSynonym"
, "Expr.ArrowNotation"
, "Expr.Case"
, "Expr.DoNotation"
, "Expr.GeneralizedListComp"
, "Expr.EmptyCase"
, "Expr.FunSection"
, "Expr.If"
, "Expr.LambdaCase"
, "Expr.ListComp"
, "Expr.MultiwayIf"
, "Expr.Negate"
, "Expr.Operator"
, "Expr.ParenName"
, "Expr.ParListComp"
, "Expr.PatternAndDo"
, "Expr.RecordPuns"
, "Expr.RecordWildcards"
, "Expr.RecursiveDo"
, "Expr.Sections"
, "Expr.SemicolonDo"
, "Expr.StaticPtr"
, "Expr.TupleSections"
, "Expr.UnboxedSum"
, "Module.Simple"
, "Module.GhcOptionsPragma"
, "Module.Export"
, "Module.ExportSubs"
, "Module.ExportModifiers"
, "Module.NamespaceExport"
, "Module.Import"
, "Module.ImportOp"
, "Module.LangPragmas"
, "Module.PatternImport"
, "Pattern.Backtick"
, "Pattern.Constructor"
-- , "Pattern.ImplicitParams"
, "Pattern.Infix"
, "Pattern.NestedWildcard"
, "Pattern.NPlusK"
, "Pattern.OperatorPattern"
, "Pattern.Record"
, "Pattern.UnboxedSum"
, "Type.Bang"
, "Type.Builtin"
, "Type.Ctx"
, "Type.ExplicitTypeApplication"
, "Type.Forall"
, "Type.Primitives"
, "Type.TupleAssert"
, "Type.TypeOperators"
, "Type.Unpack"
, "Type.Wildcard"
, "TH.Brackets"
, "TH.QuasiQuote.Define"
, "TH.QuasiQuote.Use"
, "TH.Splice.Define"
, "TH.Splice.Use"
, "TH.CrossDef"
, "TH.ClassUse"
, "TH.Splice.UseImported"
, "TH.Splice.UseQual"
, "TH.Splice.UseQualMulti"
, "TH.LocalDefinition"
, "TH.MultiImport"
, "TH.NestedSplices"
, "TH.Quoted"
, "TH.WithWildcards"
, "TH.DoubleSplice"
, "TH.GADTFields"
, "CommentHandling.CommentTypes"
, "CommentHandling.BlockComments"
, "CommentHandling.Crosslinking"
, "CommentHandling.FunctionArgs"
]