module Language.Haskell.GhcMod.Test where

import Control.Applicative
import Data.List
import System.FilePath
import System.Directory
import Prelude

import Language.Haskell.GhcMod.Types
import Language.Haskell.GhcMod.Monad
import Language.Haskell.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 ""

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"