reflex-dom/test/reflex-dom-reexports.hs
Alexandre Esteves bdba57d3e5
Fix typo
2020-05-12 11:45:14 +01:00

73 lines
3.2 KiB
Haskell

-- This tests that reflex-dom re-exports all of reflex-dom-core's modules.
-- Without this test they easily drift.
module Main where
import Control.Monad (when)
import Data.List (intercalate)
import Data.Maybe (fromMaybe, isNothing, mapMaybe)
import qualified Data.Set as Set
import Distribution.Types.PackageName (mkPackageName)
import Distribution.Compiler (CompilerFlavor (GHC))
import Distribution.ModuleName (ModuleName, components)
import Distribution.PackageDescription.Parsec (parseGenericPackageDescription)
import qualified Distribution.Parsec.Common as Dist
import Distribution.Parsec.ParseResult (runParseResult)
import qualified Distribution.System as Dist
import Distribution.Types.BuildInfo (buildable, defaultExtensions, defaultLanguage, hsSourceDirs, options)
import Distribution.Types.CondTree (simplifyCondTree)
import Distribution.Types.GenericPackageDescription (ConfVar (Arch, Impl, OS), condLibrary)
import Distribution.Types.Library (exposedModules, libBuildInfo, reexportedModules)
import Distribution.Types.ModuleReexport (ModuleReexport, moduleReexportOriginalName, moduleReexportOriginalPackage)
import Distribution.Utils.Generic (toUTF8BS, readUTF8File)
import System.Environment (getArgs)
import qualified System.Info
main :: IO ()
main = do
[reflexDomFile, reflexDomCoreFile] <- getArgs
(_, reflexDomReexports) <- parseCabalExports reflexDomFile
(reflexDomCoreExports', _) <- parseCabalExports reflexDomCoreFile
let
reflexDomCoreExports = Set.fromList reflexDomCoreExports'
reflexDomCorePackageName = mkPackageName "reflex-dom-core"
reflexDomReexportsFromCore
= Set.fromList
$ mapMaybe (\x -> if let origPackage = moduleReexportOriginalPackage x
in isNothing origPackage || origPackage == Just reflexDomCorePackageName
then Just $ moduleReexportOriginalName x
else Nothing
)
reflexDomReexports
when (reflexDomCoreExports /= reflexDomReexportsFromCore) $ do
error $ intercalate "\n\t"
$ "reflex-dom does not re-export the following modules from reflex-dom-core:"
: map
(intercalate "." . components)
(Set.toAscList $ reflexDomCoreExports `Set.difference` reflexDomReexportsFromCore)
putStrLn "Test passed."
parseCabalExports :: FilePath -> IO ([ModuleName], [ModuleReexport])
parseCabalExports file = do
contents <- readUTF8File file
let
(warnings, result) = runParseResult $ parseGenericPackageDescription $ toUTF8BS contents
osConfVar = case System.Info.os of
"linux" -> Just Dist.Linux
"darwin" -> Just Dist.OSX
_ -> error "Unrecognized System.Info.os"
archConfVar = Just Dist.X86_64
evalConfVar v = Right $ case v of
OS osVar -> Just osVar == osConfVar
Arch archVar -> Just archVar == archConfVar
Impl GHC _ -> True
_ -> False
pure $ case condLibrary <$> result of
Right (Just condLib) ->
let (_, lib) = simplifyCondTree evalConfVar condLib
in (exposedModules lib, reexportedModules lib)
Right Nothing -> error $ "Haskell package has no library component: " <> file
Left (_, errors) -> error $ "Failed to parse " <> file <> ":\n" <> unlines (map show errors)