content: module Main (main) where
  
  import Prelude ()
  
  import Game.LambdaHack.Core.Prelude
  
  import qualified Data.Text as T
  import           Options.Applicative
  import           System.IO.Unsafe (unsafePerformIO)
  import           Test.Tasty
  import           Test.Tasty.HUnit
  
  import           Game.LambdaHack.Client.UI.UIOptions
  import           Game.LambdaHack.Client.UI.UIOptionsParse
  import           Game.LambdaHack.Common.ClientOptions
  import qualified Game.LambdaHack.Content.RuleKind as RK
  import           Game.LambdaHack.Server
  
  import qualified Content.RuleKind
  import           TieKnot
  
  import ActorStateUnitTests
  import CommonMUnitTests
  import HandleHelperMUnitTests
  import HandleHumanLocalMUnitTests
  import InventoryMUnitTests
  import ItemDescriptionUnitTests
  import ItemKindUnitTests
  import ItemRevUnitTests
  import LevelUnitTests
  import MonadClientUIUnitTests
  import ReqFailureUnitTests
  import SessionUIUnitTests
  
  main :: IO ()
  main = defaultMain tests
  
  tests :: TestTree
  tests = testGroup "Tests" [ actorStateUnitTests
                            , commonMUnitTests
                            , handleHelperMUnitTests
                            , handleHumanLocalMUnitTests
                            , inventoryMUnitTests
                            , itemDescriptionUnitTests
                            , itemKindUnitTests
                            , itemRevUnitTests
                            , levelUnitTests
                            , reqFailureUnitTests
                            , macroTests
                            , monadClientUIUnitTests
                            , integrationTests
                            ]
  
  integrationTests :: TestTree
  integrationTests = testGroup "integrationTests" $
    [ testCase "Null frontend; 5 frames" $ do
        let seed = "SMGen 131 141"
            args = words "--dbgMsgSer --logPriority 4 --newGame 1 --noAnim --maxFps 100000 --frontendNull --benchmark --stopAfterFrames 5 --automateAll --keepAutomated --gameMode crawl"
                   ++ [ "--setDungeonRng", seed, "--setMainRng", seed]
        serverOptions <- handleParseResult $ execParserPure defaultPrefs serverOptionsPI args
        tieKnot serverOptions
    ]
  #ifndef USE_BROWSER
    ++
    let corule = RK.makeData Content.RuleKind.standardRules
        uiOptions = unsafePerformIO $ mkUIOptions corule defClientOptions
        testFontset :: Int -> String -> TestTree
        testFontset n fontsetName =
          testCase ("SDL frontend; init only; " ++ fontsetName ++ " fontset") $ do
            -- This test only works when run from the same directory that
            -- the .cabal file is in. And this is what Debian needs, so OK.
            -- The hacky log priority 0 tells SDL frontend to init
            -- and quit at once, for testing on CIs without graphics access.
            let seed = "SMGen " ++ show (13 + 2 * n) ++ " " ++ show (15 + 4 * n)
                args2 = words "--dbgMsgSer --logPriority 0 --newGame 3 --maxFps 100000 --benchmark --stopAfterFrames 5 --automateAll --keepAutomated --gameMode battle"
                        ++ [ "--setDungeonRng", seed, "--setMainRng", seed
                           , "--fontset", fontsetName ]
            serverOptions2 <- handleParseResult $ execParserPure defaultPrefs serverOptionsPI args2
            tieKnot serverOptions2
    in zipWith testFontset [0..] $ map (T.unpack . fst) $ uFontsets uiOptions
  #endif
  