{-# 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 General.Web
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
    general_web_test
    input_haddock_test
    query_test
    action_server_test_
    item_test
    putStrLn ""

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

    unless disable_network_tests $ do
        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"
