    {-# 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"