-- | API for test providers
module Test.Tasty.Providers
  ( IsTest(..)
  , testPassed
  , testFailed
  , testFailedDetails
  , Result
  , Progress(..)
  , TestName
  , TestTree
  , singleTest
  )
  where

import Test.Tasty.Core
import Test.Tasty.Providers.ConsoleFormat (ResultDetailsPrinter, noResultDetails)

-- | Convert a test to a leaf of the 'TestTree'
singleTest :: IsTest t => TestName -> t -> TestTree
singleTest :: forall t. IsTest t => TestName -> t -> TestTree
singleTest = TestName -> t -> TestTree
forall t. IsTest t => TestName -> t -> TestTree
SingleTest

-- | 'Result' of a passed test
testPassed
  :: String -- ^ description (may be empty)
  -> Result
testPassed :: TestName -> Result
testPassed TestName
desc = Result
  { resultOutcome :: Outcome
resultOutcome = Outcome
Success
  , resultDescription :: TestName
resultDescription = TestName
desc
  , resultShortDescription :: TestName
resultShortDescription = TestName
"OK"
  , resultTime :: Time
resultTime = Time
0
  , resultDetailsPrinter :: ResultDetailsPrinter
resultDetailsPrinter = ResultDetailsPrinter
noResultDetails
  }

-- | 'Result' of a failed test
testFailed
  :: String -- ^ description
  -> Result
testFailed :: TestName -> Result
testFailed TestName
desc = Result
  { resultOutcome :: Outcome
resultOutcome = FailureReason -> Outcome
Failure FailureReason
TestFailed
  , resultDescription :: TestName
resultDescription = TestName
desc
  , resultShortDescription :: TestName
resultShortDescription = TestName
"FAIL"
  , resultTime :: Time
resultTime = Time
0
  , resultDetailsPrinter :: ResultDetailsPrinter
resultDetailsPrinter = ResultDetailsPrinter
noResultDetails
  }

-- | 'Result' of a failed test with custom details printer
--
-- @since 1.3.1
testFailedDetails
  :: String               -- ^ description
  -> ResultDetailsPrinter -- ^ details printer
  -> Result
testFailedDetails :: TestName -> ResultDetailsPrinter -> Result
testFailedDetails TestName
desc ResultDetailsPrinter
printer = (TestName -> Result
testFailed TestName
desc)
  { resultDetailsPrinter :: ResultDetailsPrinter
resultDetailsPrinter = ResultDetailsPrinter
printer }