{-# LANGUAGE TupleSections, RecordWildCards, ScopedTypeVariables #-}

module Action.Test(actionTest) where

import Query
import Action.CmdLine
import Action.Search
import Action.Server
import Action.Generate
import General.Util
import Input.Item
import Input.Haddock
import System.IO.Extra

import Control.Monad
import Output.Items
import Control.DeepSeq
import Control.Exception


actionTest :: CmdLine -> IO ()
actionTest Test{..} = withBuffering stdout NoBuffering $ withTempFile $ \sample -> do
    putStrLn "Code tests"
    general_util_test
    input_haddock_test
    query_test
    action_server_test_
    putStrLn ""

    putStrLn "Sample database tests"
    actionGenerate defaultGenerate{database=sample, local_=["misc/sample-data"]}
    action_search_test True sample
    action_server_test True sample
    putStrLn ""

    putStrLn "Haskell.org database tests"
    action_search_test False database
    action_server_test False database

    when deep $ withSearch database $ \store -> do
        putStrLn "Deep tests"
        let xs = map targetItem $ listItems store
        evaluate $ rnf xs
        putStrLn $ "Loaded " ++ show (length xs) ++ " items"