diff --git a/Cabal/Cabal.cabal b/Cabal/Cabal.cabal index e101c86823a9a25a029a966cb352252aa4d16ffc..711f4dea636e0ca3bbf5dfcbb9ffdf943542c79c 100644 --- a/Cabal/Cabal.cabal +++ b/Cabal/Cabal.cabal @@ -80,6 +80,10 @@ extra-source-files: tests/PackageTests/DeterministicAr/Lib.hs tests/PackageTests/DeterministicAr/my.cabal tests/PackageTests/EmptyLib/empty/empty.cabal + tests/PackageTests/Haddock/CPP.hs + tests/PackageTests/Haddock/Literate.lhs + tests/PackageTests/Haddock/my.cabal + tests/PackageTests/Haddock/Simple.hs tests/PackageTests/OrderFlags/Foo.hs tests/PackageTests/OrderFlags/my.cabal tests/PackageTests/PathsModule/Executable/Main.hs @@ -261,6 +265,7 @@ test-suite package-tests PackageTests.CMain.Check PackageTests.DeterministicAr.Check PackageTests.EmptyLib.Check + PackageTests.Haddock.Check PackageTests.OrderFlags.Check PackageTests.PackageTester PackageTests.PathsModule.Executable.Check diff --git a/Cabal/tests/PackageTests.hs b/Cabal/tests/PackageTests.hs index 691dc1ec43a3ab6264a08604f3301246505a04cc..6449ae2f4f4d605e955bbab08dd002c2268aad4f 100644 --- a/Cabal/tests/PackageTests.hs +++ b/Cabal/tests/PackageTests.hs @@ -29,6 +29,7 @@ import PackageTests.TemplateHaskell.Check import PackageTests.CMain.Check import PackageTests.DeterministicAr.Check import PackageTests.EmptyLib.Check +import PackageTests.Haddock.Check import PackageTests.TestOptions.Check import PackageTests.TestStanza.Check import PackageTests.TestSuiteExeV10.Check @@ -37,7 +38,8 @@ import PackageTests.OrderFlags.Check import Distribution.Compat.Exception (catchIO) import Distribution.Simple.LocalBuildInfo (LocalBuildInfo(..)) import Distribution.Simple.Program.Types (programPath) -import Distribution.Simple.Program.Builtin (ghcProgram, ghcPkgProgram) +import Distribution.Simple.Program.Builtin (ghcProgram, ghcPkgProgram, + haddockProgram) import Distribution.Simple.Program.Db (requireProgram) import Distribution.Simple.Utils (cabalVersion, die, withFileContents) import Distribution.Text (display) @@ -95,6 +97,7 @@ tests version inplaceSpec ghcPath ghcPkgPath = (PackageTests.DeterministicAr.Check.suite ghcPath ghcPkgPath) , hunit "EmptyLib/emptyLib" (PackageTests.EmptyLib.Check.emptyLib ghcPath) + , hunit "Haddock" (PackageTests.Haddock.Check.suite ghcPath) , hunit "BuildTestSuiteDetailedV09" (PackageTests.BuildTestSuiteDetailedV09.Check.suite inplaceSpec ghcPath) , hunit "OrderFlags" @@ -142,10 +145,13 @@ main = do lbi <- getPersistBuildConfig_ ("dist" </> "setup-config") (ghc, _) <- requireProgram normal ghcProgram (withPrograms lbi) (ghcPkg, _) <- requireProgram normal ghcPkgProgram (withPrograms lbi) + (haddock, _) <- requireProgram normal haddockProgram (withPrograms lbi) let ghcPath = programPath ghc ghcPkgPath = programPath ghcPkg + haddockPath = programPath haddock putStrLn $ "Using ghc: " ++ ghcPath putStrLn $ "Using ghc-pkg: " ++ ghcPkgPath + putStrLn $ "Using haddock: " ++ haddockPath setCurrentDirectory "tests" -- Create a shared Setup executable to speed up Simple tests compileSetup "." ghcPath diff --git a/Cabal/tests/PackageTests/Haddock/CPP.hs b/Cabal/tests/PackageTests/Haddock/CPP.hs new file mode 100644 index 0000000000000000000000000000000000000000..a020353a91748a10cdc99722a5aa7012b020d918 --- /dev/null +++ b/Cabal/tests/PackageTests/Haddock/CPP.hs @@ -0,0 +1,9 @@ +{-# LANGUAGE CPP #-} + +module CPP where + +#define HIDING hiding +#define NEEDLES needles + +-- | For HIDING NEEDLES. +data Haystack = Haystack diff --git a/Cabal/tests/PackageTests/Haddock/Check.hs b/Cabal/tests/PackageTests/Haddock/Check.hs new file mode 100644 index 0000000000000000000000000000000000000000..cbfe522c0784d5aa87766c3f9aaa4bf55a27ac43 --- /dev/null +++ b/Cabal/tests/PackageTests/Haddock/Check.hs @@ -0,0 +1,38 @@ +module PackageTests.Haddock.Check (suite) where + +import Control.Monad (unless, when) +import Data.List (isInfixOf) + +import System.FilePath ((</>)) +import System.Directory (doesDirectoryExist, removeDirectoryRecursive) +import Test.HUnit (Assertion, Test (TestCase), assertFailure) + +import Distribution.Simple.Utils (withFileContents) +import PackageTests.PackageTester + (PackageSpec(..), assertHaddockSucceeded, cabal_haddock) + +this :: String +this = "Haddock" + +suite :: FilePath -> Test +suite ghcPath = TestCase $ do + let dir = "PackageTests" </> this + haddocksDir = dir </> "dist" </> "doc" </> "html" </> "Haddock" + spec = PackageSpec dir [] + + haddocksDirExists <- doesDirectoryExist haddocksDir + when haddocksDirExists (removeDirectoryRecursive haddocksDir) + hResult <- cabal_haddock spec [] ghcPath + assertHaddockSucceeded hResult + + let docFiles = map (haddocksDir </>) + ["CPP.html", "Literate.html", "Simple.html"] + mapM_ (assertFindInFile "For hiding needles.") docFiles + +assertFindInFile :: String -> FilePath -> Assertion +assertFindInFile needle path = + withFileContents path + (\contents -> + unless (needle `isInfixOf` contents) + (assertFailure ("expected: " ++ needle ++ "\n" ++ + " in file: " ++ path))) diff --git a/Cabal/tests/PackageTests/Haddock/Literate.lhs b/Cabal/tests/PackageTests/Haddock/Literate.lhs new file mode 100644 index 0000000000000000000000000000000000000000..8031db69b3dda6d6a34be5afa750e7ea1b318ad4 --- /dev/null +++ b/Cabal/tests/PackageTests/Haddock/Literate.lhs @@ -0,0 +1,4 @@ +> module Literate where + +> -- | For hiding needles. +> data Haystack = Haystack diff --git a/Cabal/tests/PackageTests/Haddock/Simple.hs b/Cabal/tests/PackageTests/Haddock/Simple.hs new file mode 100644 index 0000000000000000000000000000000000000000..df38c448c5ea2b6cacbdea57bf97dce784c24108 --- /dev/null +++ b/Cabal/tests/PackageTests/Haddock/Simple.hs @@ -0,0 +1,4 @@ +module Simple where + +-- | For hiding needles. +data Haystack = Haystack diff --git a/Cabal/tests/PackageTests/Haddock/my.cabal b/Cabal/tests/PackageTests/Haddock/my.cabal new file mode 100644 index 0000000000000000000000000000000000000000..63e9faa4a7ce876cdbadcbd8f74dd23bbffa8cbf --- /dev/null +++ b/Cabal/tests/PackageTests/Haddock/my.cabal @@ -0,0 +1,16 @@ +name: Haddock +version: 0.1 +license: BSD3 +author: Iain Nicol +stability: stable +category: PackageTests +build-type: Simple +Cabal-version: >= 1.2 + +description: + Check that Cabal successfully invokes Haddock. + +Library + exposed-modules: CPP, Literate, Simple + other-extensions: CPP + build-depends: base diff --git a/Cabal/tests/PackageTests/PackageTester.hs b/Cabal/tests/PackageTests/PackageTester.hs index dbac81cd18b953329441d9c5232c1abf875d07cc..a62cf18c499da16f511a42cf3be60e31da6ba109 100644 --- a/Cabal/tests/PackageTests/PackageTester.hs +++ b/Cabal/tests/PackageTests/PackageTester.hs @@ -10,6 +10,7 @@ module PackageTests.PackageTester -- * Running cabal commands , cabal_configure , cabal_build + , cabal_haddock , cabal_test , cabal_bench , cabal_install @@ -20,6 +21,7 @@ module PackageTests.PackageTester -- * Test helpers , assertBuildSucceeded , assertBuildFailed + , assertHaddockSucceeded , assertTestSucceeded , assertInstallSucceeded , assertOutputContains @@ -54,6 +56,7 @@ data PackageSpec = PackageSpec data Success = Failure | ConfigureSuccess | BuildSuccess + | HaddockSuccess | InstallSuccess | TestSuccess | BenchSuccess @@ -112,6 +115,22 @@ cabal_build spec ghcPath = do record spec res return res +cabal_haddock :: PackageSpec -> [String] -> FilePath -> IO Result +cabal_haddock spec extraArgs ghcPath = do + res <- doCabalHaddock spec extraArgs ghcPath + record spec res + return res + +doCabalHaddock :: PackageSpec -> [String] -> FilePath -> IO Result +doCabalHaddock spec extraArgs ghcPath = do + configResult <- doCabalConfigure spec ghcPath + if successful configResult + then do + res <- cabal spec ("haddock" : extraArgs) ghcPath + return $ recordRun res HaddockSuccess configResult + else + return configResult + unregister :: String -> FilePath -> IO () unregister libraryName ghcPkgPath = do res@(_, _, output) <- run Nothing ghcPkgPath ["unregister", "--user", libraryName] @@ -233,6 +252,12 @@ assertBuildFailed result = when (successful result) $ "expected: \'setup build\' should fail\n" ++ " output: " ++ outputText result +assertHaddockSucceeded :: Result -> Assertion +assertHaddockSucceeded result = unless (successful result) $ + assertFailure $ + "expected: \'setup haddock\' should succeed\n" ++ + " output: " ++ outputText result + assertTestSucceeded :: Result -> Assertion assertTestSucceeded result = unless (successful result) $ assertFailure $