content: {-# LANGUAGE CPP #-}
  
  module GhcMod.Exe.Test where
  
  import Control.Applicative
  import Data.List
  import System.FilePath
  import System.Directory
  import Prelude
  
  import GhcMod.Types
  import GhcMod.Monad
  import GhcMod.DynFlags
  
  import GHC
  import GHC.Exception
  import OccName
  
  test :: IOish m
        => FilePath -> GhcModT m String
  test f = runGmlT' [Left f] (fmap setHscInterpreted . deferErrors) $ do
      mg <- getModuleGraph
      root <- cradleRootDir <$> cradle
      f' <- makeRelative root <$> liftIO (canonicalizePath f)
      let Just ms = find ((==Just f') . ml_hs_file . ms_location) mg
          mdl = ms_mod ms
          mn = moduleName mdl
  
      Just mi <- getModuleInfo mdl
      let exs = map (occNameString . getOccName) $ modInfoExports mi
          cqs = filter ("prop_" `isPrefixOf`) exs
  
      setContext [ IIDecl $ simpleImportDecl mn
                 , IIDecl $ simpleImportDecl $ mkModuleName "Test.QuickCheck"
                 ]
  
      _res <- mapM runTest cqs
  
      return ""
  
  #if __GLASGOW_HASKELL__ >= 802
  runTest :: GhcMonad m => String -> m (Maybe SomeException)
  runTest fn = do
    res <- execStmt ("quickCheck " ++ fn) execOptions
    return $ case res of
      ExecComplete (Right _) _ -> Nothing
      ExecComplete (Left se) _ -> Just se
      _                        -> error "runTest"
  #else
  runTest :: GhcMonad m => String -> m (Maybe SomeException)
  runTest fn = do
    res <- runStmt ("quickCheck " ++ fn) RunToCompletion
    return $ case res of
      RunOk [] -> Nothing
      RunException se -> Just se
      _ -> error "runTest"
  #endif
  