content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE CPP #-}
  
  module Main where
  
  import Control.Concurrent
  import Control.Monad.IO.Class
  import GHC.Stack
  import Test.Sandwich
  import Test.Sandwich.Formatters.Print
  import Test.Sandwich.Formatters.Slack
  import Test.Sandwich.Formatters.TerminalUI
  
  
  simple :: TopSpec
  simple = parallel $ do
    it "does the thing 1" sleepThenSucceed
    it "does the thing 2" sleepThenSucceed
    it "does the thing 3" deepSleepThenFail
    describe "should happen sequentially" $ do
      it "sequential 1" sleepThenSucceed
      it "sequential 2" sleepThenFail
      it "sequential 3" sleepThenSucceed
    it "does the thing 4" deepSleepThenFail
    it "does the thing 5" sleepThenSucceed
    it "does the thing 6" sleepThenSucceed
  
  
  slackFormatter = defaultSlackFormatter {
    slackFormatterSlackConfig = SlackConfig ""
    , slackFormatterTopMessage = Just "Top message"
    , slackFormatterChannel = "test-channel"
  
    , slackFormatterMaxFailures = Just 2
    , slackFormatterMaxFailureReasonLines = Just 1
    , slackFormatterMaxCallStackLines = Just 3
  
    , slackFormatterVisibilityThreshold = Just 50
    }
  
  main :: IO ()
  main = runSandwich options simple
    where
      options = defaultOptions {
        optionsTestArtifactsDirectory = defaultTestArtifactsDirectory
        , optionsFormatters = [SomeFormatter defaultTerminalUIFormatter, SomeFormatter slackFormatter]
        }
  
  -- * Util
  
  sleepThenSucceed :: (HasCallStack) => ExampleM context ()
  sleepThenSucceed = do
    -- liftIO $ threadDelay (2 * 10^1)
    liftIO $ threadDelay (2 * 10^5)
    -- liftIO $ threadDelay (1 * 10^6)
    -- liftIO $ threadDelay (3 * 10^6)
  
  sleepThenFail :: (HasCallStack) => ExampleM context ()
  sleepThenFail = do
    -- liftIO $ threadDelay (2 * 10^1)
    liftIO $ threadDelay (2 * 10^5)
    -- liftIO $ threadDelay (1 * 10^6)
    -- liftIO $ threadDelay (3 * 10^6)
    2 `shouldBe` 3
  
  
  deepSleepThenFail :: (HasCallStack) => ExampleM context ()
  deepSleepThenFail = deepSleepThenFail2
  
  deepSleepThenFail2 :: (HasCallStack) => ExampleM context ()
  deepSleepThenFail2 = deepSleepThenFail3
  
  deepSleepThenFail3 :: (HasCallStack) => ExampleM context ()
  deepSleepThenFail3 = sleepThenFail
  