hspec-api 2.10.0 → 2.11.0
raw patch · 10 files changed
+503/−62 lines, 10 filesdep +transformersdep ~hspec-corePVP ok
version bump matches the API change (PVP)
Dependencies added: transformers
Dependency ranges changed: hspec-core
API changes (from Hackage documentation)
+ Test.Hspec.Api.Format.V1: instance GHC.Show.Show Test.Hspec.Api.Format.V1.Event
+ Test.Hspec.Api.Format.V2: ColorizedReason :: String -> FailureReason
+ Test.Hspec.Api.Format.V2: Done :: [(Path, Item)] -> Event
+ Test.Hspec.Api.Format.V2: Error :: Maybe String -> SomeException -> FailureReason
+ Test.Hspec.Api.Format.V2: ExpectedButGot :: Maybe String -> String -> String -> FailureReason
+ Test.Hspec.Api.Format.V2: Failure :: Maybe Location -> FailureReason -> Result
+ Test.Hspec.Api.Format.V2: FormatConfig :: Bool -> Bool -> Bool -> Bool -> Maybe Int -> Maybe (String -> String -> IO ()) -> Maybe (String -> String -> (String, String)) -> Bool -> Bool -> Bool -> Integer -> Int -> FormatConfig
+ Test.Hspec.Api.Format.V2: GroupDone :: Path -> Event
+ Test.Hspec.Api.Format.V2: GroupStarted :: Path -> Event
+ Test.Hspec.Api.Format.V2: Item :: Maybe Location -> Seconds -> String -> Result -> Item
+ Test.Hspec.Api.Format.V2: ItemDone :: Path -> Item -> Event
+ Test.Hspec.Api.Format.V2: ItemStarted :: Path -> Event
+ Test.Hspec.Api.Format.V2: Location :: FilePath -> Int -> Int -> Location
+ Test.Hspec.Api.Format.V2: NoReason :: FailureReason
+ Test.Hspec.Api.Format.V2: Pending :: Maybe Location -> Maybe String -> Result
+ Test.Hspec.Api.Format.V2: Progress :: Path -> Progress -> Event
+ Test.Hspec.Api.Format.V2: Reason :: String -> FailureReason
+ Test.Hspec.Api.Format.V2: Seconds :: Double -> Seconds
+ Test.Hspec.Api.Format.V2: Started :: Event
+ Test.Hspec.Api.Format.V2: Success :: Result
+ Test.Hspec.Api.Format.V2: [formatConfigDiffContext] :: FormatConfig -> Maybe Int
+ Test.Hspec.Api.Format.V2: [formatConfigExpectedTotalCount] :: FormatConfig -> Int
+ Test.Hspec.Api.Format.V2: [formatConfigExternalDiff] :: FormatConfig -> Maybe (String -> String -> IO ())
+ Test.Hspec.Api.Format.V2: [formatConfigHtmlOutput] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigOutputUnicode] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigPrettyPrintFunction] :: FormatConfig -> Maybe (String -> String -> (String, String))
+ Test.Hspec.Api.Format.V2: [formatConfigPrintCpuTime] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigPrintTimes] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigReportProgress] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigUseColor] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigUseDiff] :: FormatConfig -> Bool
+ Test.Hspec.Api.Format.V2: [formatConfigUsedSeed] :: FormatConfig -> Integer
+ Test.Hspec.Api.Format.V2: [itemDuration] :: Item -> Seconds
+ Test.Hspec.Api.Format.V2: [itemInfo] :: Item -> String
+ Test.Hspec.Api.Format.V2: [itemLocation] :: Item -> Maybe Location
+ Test.Hspec.Api.Format.V2: [itemResult] :: Item -> Result
+ Test.Hspec.Api.Format.V2: [locationColumn] :: Location -> Int
+ Test.Hspec.Api.Format.V2: [locationFile] :: Location -> FilePath
+ Test.Hspec.Api.Format.V2: [locationLine] :: Location -> Int
+ Test.Hspec.Api.Format.V2: data Config
+ Test.Hspec.Api.Format.V2: data Event
+ Test.Hspec.Api.Format.V2: data FailureReason
+ Test.Hspec.Api.Format.V2: data FormatConfig
+ Test.Hspec.Api.Format.V2: data Item
+ Test.Hspec.Api.Format.V2: data Location
+ Test.Hspec.Api.Format.V2: data Result
+ Test.Hspec.Api.Format.V2: liftFormatter :: (String, FormatConfig -> IO Format) -> (String, FormatConfig -> IO Format)
+ Test.Hspec.Api.Format.V2: modifyConfig :: (Config -> Config) -> SpecWith a
+ Test.Hspec.Api.Format.V2: monadic :: MonadIO m => (m () -> IO ()) -> (Event -> m ()) -> IO Format
+ Test.Hspec.Api.Format.V2: newtype Seconds
+ Test.Hspec.Api.Format.V2: registerFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config
+ Test.Hspec.Api.Format.V2: type Format = Event -> IO ()
+ Test.Hspec.Api.Format.V2: type Path = ([String], String)
+ Test.Hspec.Api.Format.V2: type Progress = (Int, Int)
+ Test.Hspec.Api.Format.V2: type SpecWith a = SpecM a ()
+ Test.Hspec.Api.Format.V2: useFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config
+ Test.Hspec.Api.Formatters.V3: ColorizedReason :: String -> FailureReason
+ Test.Hspec.Api.Formatters.V3: Error :: Maybe String -> SomeException -> FailureReason
+ Test.Hspec.Api.Formatters.V3: ExpectedButGot :: Maybe String -> String -> String -> FailureReason
+ Test.Hspec.Api.Formatters.V3: Failure :: Maybe Location -> FailureReason -> Result
+ Test.Hspec.Api.Formatters.V3: FailureRecord :: Maybe Location -> Path -> FailureReason -> FailureRecord
+ Test.Hspec.Api.Formatters.V3: Formatter :: FormatM () -> (Path -> FormatM ()) -> (Path -> FormatM ()) -> (Path -> Progress -> FormatM ()) -> (Path -> FormatM ()) -> (Path -> Item -> FormatM ()) -> FormatM () -> Formatter
+ Test.Hspec.Api.Formatters.V3: Item :: Maybe Location -> Seconds -> String -> Result -> Item
+ Test.Hspec.Api.Formatters.V3: Location :: FilePath -> Int -> Int -> Location
+ Test.Hspec.Api.Formatters.V3: NoReason :: FailureReason
+ Test.Hspec.Api.Formatters.V3: Pending :: Maybe Location -> Maybe String -> Result
+ Test.Hspec.Api.Formatters.V3: Reason :: String -> FailureReason
+ Test.Hspec.Api.Formatters.V3: Seconds :: Double -> Seconds
+ Test.Hspec.Api.Formatters.V3: Success :: Result
+ Test.Hspec.Api.Formatters.V3: [failureRecordLocation] :: FailureRecord -> Maybe Location
+ Test.Hspec.Api.Formatters.V3: [failureRecordMessage] :: FailureRecord -> FailureReason
+ Test.Hspec.Api.Formatters.V3: [failureRecordPath] :: FailureRecord -> Path
+ Test.Hspec.Api.Formatters.V3: [formatterDone] :: Formatter -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterGroupDone] :: Formatter -> Path -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterGroupStarted] :: Formatter -> Path -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterItemDone] :: Formatter -> Path -> Item -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterItemStarted] :: Formatter -> Path -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterProgress] :: Formatter -> Path -> Progress -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [formatterStarted] :: Formatter -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: [itemDuration] :: Item -> Seconds
+ Test.Hspec.Api.Formatters.V3: [itemInfo] :: Item -> String
+ Test.Hspec.Api.Formatters.V3: [itemLocation] :: Item -> Maybe Location
+ Test.Hspec.Api.Formatters.V3: [itemResult] :: Item -> Result
+ Test.Hspec.Api.Formatters.V3: [locationColumn] :: Location -> Int
+ Test.Hspec.Api.Formatters.V3: [locationFile] :: Location -> FilePath
+ Test.Hspec.Api.Formatters.V3: [locationLine] :: Location -> Int
+ Test.Hspec.Api.Formatters.V3: checks :: Formatter
+ Test.Hspec.Api.Formatters.V3: data Config
+ Test.Hspec.Api.Formatters.V3: data FailureReason
+ Test.Hspec.Api.Formatters.V3: data FailureRecord
+ Test.Hspec.Api.Formatters.V3: data FormatM a
+ Test.Hspec.Api.Formatters.V3: data Formatter
+ Test.Hspec.Api.Formatters.V3: data Item
+ Test.Hspec.Api.Formatters.V3: data Location
+ Test.Hspec.Api.Formatters.V3: data Result
+ Test.Hspec.Api.Formatters.V3: diffContext :: FormatM (Maybe Int)
+ Test.Hspec.Api.Formatters.V3: externalDiffAction :: FormatM (Maybe (String -> String -> IO ()))
+ Test.Hspec.Api.Formatters.V3: extraChunk :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: failed_examples :: Formatter
+ Test.Hspec.Api.Formatters.V3: formatException :: SomeException -> String
+ Test.Hspec.Api.Formatters.V3: formatLocation :: Location -> String
+ Test.Hspec.Api.Formatters.V3: formatterToFormat :: Formatter -> FormatConfig -> IO Format
+ Test.Hspec.Api.Formatters.V3: getCPUTime :: FormatM (Maybe Seconds)
+ Test.Hspec.Api.Formatters.V3: getExpectedTotalCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getFailCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getFailMessages :: FormatM [FailureRecord]
+ Test.Hspec.Api.Formatters.V3: getPendingCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getRealTime :: FormatM Seconds
+ Test.Hspec.Api.Formatters.V3: getSuccessCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: getTotalCount :: FormatM Int
+ Test.Hspec.Api.Formatters.V3: missingChunk :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: modifyConfig :: (Config -> Config) -> SpecWith a
+ Test.Hspec.Api.Formatters.V3: newtype Seconds
+ Test.Hspec.Api.Formatters.V3: outputUnicode :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: prettyPrint :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: prettyPrintFunction :: FormatM (Maybe (String -> String -> (String, String)))
+ Test.Hspec.Api.Formatters.V3: printTimes :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: progress :: Formatter
+ Test.Hspec.Api.Formatters.V3: registerFormatter :: (String, Formatter) -> Config -> Config
+ Test.Hspec.Api.Formatters.V3: silent :: Formatter
+ Test.Hspec.Api.Formatters.V3: specdoc :: Formatter
+ Test.Hspec.Api.Formatters.V3: type Path = ([String], String)
+ Test.Hspec.Api.Formatters.V3: type Progress = (Int, Int)
+ Test.Hspec.Api.Formatters.V3: type SpecWith a = SpecM a ()
+ Test.Hspec.Api.Formatters.V3: useDiff :: FormatM Bool
+ Test.Hspec.Api.Formatters.V3: useFormatter :: (String, Formatter) -> Config -> Config
+ Test.Hspec.Api.Formatters.V3: usedSeed :: FormatM Integer
+ Test.Hspec.Api.Formatters.V3: withFailColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: withInfoColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: withPendingColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: withSuccessColor :: FormatM a -> FormatM a
+ Test.Hspec.Api.Formatters.V3: write :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: writeLine :: String -> FormatM ()
+ Test.Hspec.Api.Formatters.V3: writeTransient :: String -> FormatM ()
Files
- hspec-api.cabal +12/−4
- src/Test/Hspec/Api/Format/V1.hs +81/−35
- src/Test/Hspec/Api/Format/V1/Internal.hs +69/−0
- src/Test/Hspec/Api/Format/V2.hs +83/−0
- src/Test/Hspec/Api/Formatters/V1.hs +2/−2
- src/Test/Hspec/Api/Formatters/V2.hs +98/−21
- src/Test/Hspec/Api/Formatters/V3.hs +115/−0
- test/Test/Hspec/Api/Format/V2Spec.hs +22/−0
- test/Test/Hspec/Api/Formatters/V3Spec.hs +20/−0
- version.yaml +1/−0
hspec-api.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: hspec-api-version: 2.10.0+version: 2.11.0 synopsis: A Testing Framework for Haskell description: This package provides a stable API that can be used to extend Hspec's functionality. category: Testing@@ -17,6 +17,8 @@ license: MIT license-file: LICENSE build-type: Simple+extra-source-files:+ version.yaml source-repository head type: git@@ -26,16 +28,19 @@ library exposed-modules: Test.Hspec.Api.Format.V1+ Test.Hspec.Api.Format.V2 Test.Hspec.Api.Formatters.V1 Test.Hspec.Api.Formatters.V2+ Test.Hspec.Api.Formatters.V3 other-modules:- Paths_hspec_api+ Test.Hspec.Api.Format.V1.Internal hs-source-dirs: src ghc-options: -Wall build-depends: base ==4.*- , hspec-core >=2.10.0 && <2.11+ , hspec-core ==2.11.0+ , transformers default-language: Haskell2010 test-suite spec@@ -43,8 +48,10 @@ main-is: Spec.hs other-modules: Test.Hspec.Api.Format.V1Spec+ Test.Hspec.Api.Format.V2Spec Test.Hspec.Api.Formatters.V1Spec Test.Hspec.Api.Formatters.V2Spec+ Test.Hspec.Api.Formatters.V3Spec Paths_hspec_api hs-source-dirs: test@@ -55,5 +62,6 @@ base ==4.* , hspec ==2.* , hspec-api- , hspec-core >=2.10.0 && <2.11+ , hspec-core ==2.11.0+ , transformers default-language: Haskell2010
src/Test/Hspec/Api/Format/V1.hs view
@@ -1,5 +1,5 @@-{-# LANGUAGE CPP #-} {-# LANGUAGE ViewPatterns #-}+{-# LANGUAGE LambdaCase #-} -- | -- Stability: stable module Test.Hspec.Api.Format.V1 (@@ -26,31 +26,43 @@ , modifyConfig ) where -import Test.Hspec.Core.Runner (Config(..))-import Test.Hspec.Core.Spec (modifyConfig, SpecWith)-import Test.Hspec.Core.Format hiding (FormatConfig(..)) import qualified Test.Hspec.Core.Format as Latest+import qualified Test.Hspec.Api.Format.V2 as V2+import Test.Hspec.Api.Format.V2 hiding (+ registerFormatter+ , useFormatter+ , liftFormatter+ , FormatConfig(..)+ , Item(..)+ , FailureReason(..)+ , Result(..)+ , Event(..)+ , Format+ , monadic+ ) +import Control.Monad.IO.Class+import Test.Hspec.Api.Format.V1.Internal+ -- | -- Make a formatter available for use with @--format@. registerFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config-registerFormatter = registerFormatter_ . liftFormatter+registerFormatter = V2.registerFormatter . liftFormatterToV2 -- | -- Make a formatter available for use with @--format@ and use it by default. useFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config-useFormatter (liftFormatter -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }---- copy of Test.Hspec.Core.Runner.registerFormatter-registerFormatter_ :: (String, Latest.FormatConfig -> IO Latest.Format) -> Config -> Config-registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }+useFormatter = V2.useFormatter . liftFormatterToV2 -- | Make a formatter compatible with types from "Test.Hspec.Core.Format".-liftFormatter :: (String, FormatConfig -> IO Format) -> (String, Latest.FormatConfig -> IO Format)-liftFormatter = fmap liftFormat+liftFormatter :: (String, FormatConfig -> IO Format) -> (String, Latest.FormatConfig -> IO Latest.Format)+liftFormatter = V2.liftFormatter . liftFormatterToV2++liftFormatterToV2 :: (String, FormatConfig -> IO Format) -> (String, V2.FormatConfig -> IO V2.Format)+liftFormatterToV2 = fmap lift where- liftFormat :: (FormatConfig -> IO Format) -> Latest.FormatConfig -> IO Format- liftFormat format = format . liftFormatConfig+ lift :: (FormatConfig -> IO Format) -> V2.FormatConfig -> IO V2.Format+ lift format = fmap liftFormat . format . unliftFormatConfig data FormatConfig = FormatConfig { formatConfigUseColor :: Bool@@ -68,26 +80,60 @@ , formatConfigExpectedTotalCount :: Int } -liftFormatConfig :: Latest.FormatConfig -> FormatConfig-liftFormatConfig config = FormatConfig {- formatConfigUseColor = Latest.formatConfigUseColor config-, formatConfigReportProgress = Latest.formatConfigReportProgress config-, formatConfigOutputUnicode = Latest.formatConfigOutputUnicode config-, formatConfigUseDiff = Latest.formatConfigUseDiff config+unliftFormatConfig :: V2.FormatConfig -> FormatConfig+unliftFormatConfig config = FormatConfig {+ formatConfigUseColor = V2.formatConfigUseColor config+, formatConfigReportProgress = V2.formatConfigReportProgress config+, formatConfigOutputUnicode = V2.formatConfigOutputUnicode config+, formatConfigUseDiff = V2.formatConfigUseDiff config+, formatConfigDiffContext = V2.formatConfigDiffContext config+, formatConfigExternalDiff = V2.formatConfigExternalDiff config+, formatConfigPrettyPrint = maybe False (const True) $ V2.formatConfigPrettyPrintFunction config+, formatConfigPrettyPrintFunction = V2.formatConfigPrettyPrintFunction config+, formatConfigPrintTimes = V2.formatConfigPrintTimes config+, formatConfigHtmlOutput = V2.formatConfigHtmlOutput config+, formatConfigPrintCpuTime = V2.formatConfigPrintCpuTime config+, formatConfigUsedSeed = V2.formatConfigUsedSeed config+, formatConfigExpectedTotalCount = V2.formatConfigExpectedTotalCount config+} -#if MIN_VERSION_hspec_core(2,10,6)-, formatConfigDiffContext = Latest.formatConfigDiffContext config-, formatConfigExternalDiff = Latest.formatConfigExternalDiff config-#else-, formatConfigDiffContext = Nothing-, formatConfigExternalDiff = Nothing-#endif+type Format = Event -> IO () -, formatConfigPrettyPrint = Latest.formatConfigPrettyPrint config-, formatConfigPrettyPrintFunction = Latest.formatConfigPrettyPrintFunction config-, formatConfigPrintTimes = Latest.formatConfigPrintTimes config-, formatConfigHtmlOutput = Latest.formatConfigHtmlOutput config-, formatConfigPrintCpuTime = Latest.formatConfigPrintCpuTime config-, formatConfigUsedSeed = Latest.formatConfigUsedSeed config-, formatConfigExpectedTotalCount = Latest.formatConfigExpectedTotalCount config-}+liftFormat :: Format -> V2.Format+liftFormat format event = format (unliftEvent event)++unliftFormat :: V2.Format -> Format+unliftFormat format event = format (liftEvent event)++data Event =+ Started+ | GroupStarted Path+ | GroupDone Path+ | Progress Path Progress+ | ItemStarted Path+ | ItemDone Path Item+ | Done [(Path, Item)]+ deriving Show++liftEvent :: Event -> V2.Event+liftEvent = \ case+ Started -> V2.Started+ GroupStarted path -> V2.GroupStarted path+ GroupDone path -> V2.GroupDone path+ Progress path progress -> V2.Progress path progress+ ItemStarted path -> V2.ItemStarted path+ ItemDone path item -> V2.ItemDone path (liftItem item)+ Done result -> V2.Done (map (fmap liftItem) result)++unliftEvent :: V2.Event -> Event+unliftEvent = \ case+ V2.Started -> Started+ V2.GroupStarted path -> GroupStarted path+ V2.GroupDone path -> GroupDone path+ V2.Progress path progress -> Progress path progress+ V2.ItemStarted path -> ItemStarted path+ V2.ItemDone path item -> ItemDone path (unliftItem item)+ V2.Done result -> Done (map (fmap unliftItem) result)++monadic :: MonadIO m => (m () -> IO ()) -> (Event -> m ()) -> IO Format+monadic run format = unliftFormat <$> V2.monadic run (format . unliftEvent)
+ src/Test/Hspec/Api/Format/V1/Internal.hs view
@@ -0,0 +1,69 @@+{-# OPTIONS_GHC -fno-warn-deprecations #-}+{-# LANGUAGE LambdaCase #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE NamedFieldPuns #-}+module Test.Hspec.Api.Format.V1.Internal (+ FailureReason(..)+, module Test.Hspec.Api.Format.V1.Internal+) where++import Test.Hspec.Core.Util (stripAnsi)+import Test.Hspec.Core.Formatters.V1 (FailureReason(..))+import qualified Test.Hspec.Api.Format.V2 as V2+import Test.Hspec.Api.Format.V2 hiding (Item(..), Result(..), FailureReason(..))++data Item = Item {+ itemLocation :: Maybe Location+, itemDuration :: Seconds+, itemInfo :: String+, itemResult :: Result+} deriving Show++data Result =+ Success+ | Pending (Maybe Location) (Maybe String)+ | Failure (Maybe Location) FailureReason+ deriving Show++liftItem :: Item -> V2.Item+liftItem Item{..} = V2.Item {+ itemLocation+, itemDuration+, itemInfo+, itemResult = liftResult itemResult+}++unliftItem :: V2.Item -> Item+unliftItem V2.Item{..} = Item {+ itemLocation+, itemDuration+, itemInfo+, itemResult = unliftResult itemResult+}++liftResult :: Result -> V2.Result+liftResult = \ case+ Success -> V2.Success+ Pending loc reason -> V2.Pending loc reason+ Failure loc reason -> V2.Failure loc (liftFailureReson reason)++unliftResult :: V2.Result -> Result+unliftResult = \ case+ V2.Success -> Success+ V2.Pending loc reason -> Pending loc reason+ V2.Failure loc reason -> Failure loc (unliftFailureReason reason)++liftFailureReson :: FailureReason -> V2.FailureReason+liftFailureReson = \ case+ NoReason -> V2.NoReason+ Reason reason -> V2.Reason reason+ ExpectedButGot preface expected actual -> V2.ExpectedButGot preface expected actual+ Error info e -> V2.Error info e++unliftFailureReason :: V2.FailureReason -> FailureReason+unliftFailureReason = \ case+ V2.NoReason -> NoReason+ V2.Reason reason -> Reason reason+ V2.ColorizedReason reason -> Reason (stripAnsi reason)+ V2.ExpectedButGot preface expected actual -> ExpectedButGot preface expected actual+ V2.Error info e -> Error info e
+ src/Test/Hspec/Api/Format/V2.hs view
@@ -0,0 +1,83 @@+{-# LANGUAGE ViewPatterns #-}+-- |+-- Stability: stable+module Test.Hspec.Api.Format.V2 (+ Format+, FormatConfig(..)+, Event(..)+, Progress+, Path+, Location(..)+, Seconds(..)+, Item(..)+, Result(..)+, FailureReason(..)+, monadic++-- * Register a formatter+, registerFormatter+, useFormatter+, liftFormatter++-- * Re-exports+, SpecWith+, Config+, modifyConfig+) where++import Test.Hspec.Core.Runner (Config(..))+import Test.Hspec.Core.Spec (modifyConfig, SpecWith)+import Test.Hspec.Core.Format hiding (FormatConfig(..))+import qualified Test.Hspec.Core.Format as Latest++-- |+-- Make a formatter available for use with @--format@.+registerFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config+registerFormatter = registerFormatter_ . liftFormatter++-- |+-- Make a formatter available for use with @--format@ and use it by default.+useFormatter :: (String, FormatConfig -> IO Format) -> Config -> Config+useFormatter (liftFormatter -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }++-- copy of Test.Hspec.Core.Runner.registerFormatter+registerFormatter_ :: (String, Latest.FormatConfig -> IO Latest.Format) -> Config -> Config+registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }++-- | Make a formatter compatible with types from "Test.Hspec.Core.Format".+liftFormatter :: (String, FormatConfig -> IO Format) -> (String, Latest.FormatConfig -> IO Format)+liftFormatter = fmap liftFormat+ where+ liftFormat :: (FormatConfig -> IO Format) -> Latest.FormatConfig -> IO Format+ liftFormat format = format . unliftFormatConfig++data FormatConfig = FormatConfig {+ formatConfigUseColor :: Bool+, formatConfigReportProgress :: Bool+, formatConfigOutputUnicode :: Bool+, formatConfigUseDiff :: Bool+, formatConfigDiffContext :: Maybe Int+, formatConfigExternalDiff :: Maybe (String -> String -> IO ())+, formatConfigPrettyPrintFunction :: Maybe (String -> String -> (String, String))+, formatConfigPrintTimes :: Bool+, formatConfigHtmlOutput :: Bool+, formatConfigPrintCpuTime :: Bool+, formatConfigUsedSeed :: Integer+, formatConfigExpectedTotalCount :: Int+}++unliftFormatConfig :: Latest.FormatConfig -> FormatConfig+unliftFormatConfig config = FormatConfig {+ formatConfigUseColor = Latest.formatConfigUseColor config+, formatConfigReportProgress = Latest.formatConfigReportProgress config+, formatConfigOutputUnicode = Latest.formatConfigOutputUnicode config+, formatConfigUseDiff = Latest.formatConfigUseDiff config+, formatConfigDiffContext = Latest.formatConfigDiffContext config+, formatConfigExternalDiff = Latest.formatConfigExternalDiff config+, formatConfigPrettyPrintFunction = Latest.formatConfigPrettyPrintFunction config+, formatConfigPrintTimes = Latest.formatConfigPrintTimes config+, formatConfigHtmlOutput = Latest.formatConfigHtmlOutput config+, formatConfigPrintCpuTime = Latest.formatConfigPrintCpuTime config+, formatConfigUsedSeed = Latest.formatConfigUsedSeed config+, formatConfigExpectedTotalCount = Latest.formatConfigExpectedTotalCount config+}
src/Test/Hspec/Api/Formatters/V1.hs view
@@ -1,4 +1,4 @@-{-# LANGUAGE CPP #-}+{-# OPTIONS_GHC -fno-warn-deprecations #-} {-# LANGUAGE ViewPatterns #-} -- | -- Stability: deprecated@@ -85,7 +85,7 @@ import Test.Hspec.Core.Formatters.V1 import Test.Hspec.Core.Runner (Config(..))-import Test.Hspec.Core.Format+import Test.Hspec.Core.Format hiding (FailureReason(..)) import Test.Hspec.Core.Spec (modifyConfig, SpecWith) -- |
src/Test/Hspec/Api/Formatters/V2.hs view
@@ -1,5 +1,6 @@-{-# LANGUAGE CPP #-}-{-# LANGUAGE ViewPatterns #-}+{-# OPTIONS_GHC -fno-warn-deprecations #-}+{-# LANGUAGE RecordWildCards #-}+{-# LANGUAGE NamedFieldPuns #-} -- | -- Stability: stable --@@ -96,34 +97,110 @@ , modifyConfig ) where -import Test.Hspec.Core.Formatters.V2-import Test.Hspec.Core.Runner (Config(..))-import Test.Hspec.Core.Format-import Test.Hspec.Core.Spec (modifyConfig, SpecWith)+import Test.Hspec.Core.Format (FormatConfig, Format)+import Test.Hspec.Core.Formatters.V1 (FailureRecord(..))+import Test.Hspec.Api.Format.V1.Internal+import qualified Test.Hspec.Api.Formatters.V3 as V3+import Test.Hspec.Api.Formatters.V3 hiding (+ registerFormatter+ , useFormatter+ , formatterToFormat -#if !MIN_VERSION_hspec_core(2,10,6)-diffContext :: FormatM (Maybe Int)-diffContext = return Nothing+ , silent+ , checks+ , specdoc+ , progress+ , failed_examples -externalDiffAction :: FormatM (Maybe (String -> String -> IO ()))-externalDiffAction = return Nothing-#endif+ , Formatter(..)+ , Item(..)+ , Result(..)+ , FailureReason(..) + , FailureRecord(..)+ , getFailMessages+ )+ -- | -- Make a formatter available for use with @--format@. registerFormatter :: (String, Formatter) -> Config -> Config-registerFormatter formatter = registerFormatter_ (fmap formatterToFormat formatter)+registerFormatter formatter = V3.registerFormatter (fmap liftFormatter formatter) -- | -- Make a formatter available for use with @--format@ and use it by default. useFormatter :: (String, Formatter) -> Config -> Config-useFormatter (fmap formatterToFormat -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }+useFormatter formatter = V3.useFormatter (liftFormatter <$> formatter) --- copy of Test.Hspec.Core.Runner.registerFormatter-registerFormatter_ :: (String, FormatConfig -> IO Format) -> Config -> Config-registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }+formatterToFormat :: Formatter -> FormatConfig -> IO Format+formatterToFormat = V3.formatterToFormat . liftFormatter -#if !MIN_VERSION_hspec_core(2,9,2)-prettyPrint :: FormatM Bool-prettyPrint = return True-#endif+silent :: Formatter+silent = unliftFormatter V3.silent++checks :: Formatter+checks = unliftFormatter V3.checks++specdoc :: Formatter+specdoc = unliftFormatter V3.specdoc++progress :: Formatter+progress = unliftFormatter V3.progress++failed_examples :: Formatter+failed_examples = unliftFormatter V3.failed_examples++data Formatter = Formatter {+-- | evaluated before a test run+ formatterStarted :: FormatM ()++-- | evaluated before each spec group+, formatterGroupStarted :: Path -> FormatM ()++-- | evaluated after each spec group+, formatterGroupDone :: Path -> FormatM ()++-- | used to notify the progress of the currently evaluated example+, formatterProgress :: Path -> Progress -> FormatM ()++-- | evaluated before each spec item+, formatterItemStarted :: Path -> FormatM ()++-- | evaluated after each spec item+, formatterItemDone :: Path -> Item -> FormatM ()++-- | evaluated after a test run+, formatterDone :: FormatM ()+}++-- | Get the list of accumulated failure messages.+getFailMessages :: FormatM [FailureRecord]+getFailMessages = map unliftFailureRecord <$> V3.getFailMessages++liftFormatter :: Formatter -> V3.Formatter+liftFormatter Formatter{..} = V3.Formatter{+ formatterStarted+, formatterGroupStarted+, formatterGroupDone+, formatterProgress+, formatterItemStarted+, formatterItemDone = \ path -> formatterItemDone path . unliftItem+, formatterDone+}++unliftFormatter :: V3.Formatter -> Formatter+unliftFormatter V3.Formatter{..} = Formatter{+ formatterStarted+, formatterGroupStarted+, formatterGroupDone+, formatterProgress+, formatterItemStarted+, formatterItemDone = \ path -> formatterItemDone path . liftItem+, formatterDone+}++unliftFailureRecord :: V3.FailureRecord -> FailureRecord+unliftFailureRecord V3.FailureRecord{..} = FailureRecord {+ failureRecordLocation+, failureRecordPath+, failureRecordMessage = unliftFailureReason failureRecordMessage+}
+ src/Test/Hspec/Api/Formatters/V3.hs view
@@ -0,0 +1,115 @@+{-# LANGUAGE ViewPatterns #-}+-- |+-- Stability: stable+--+-- This module contains formatters that can be used with `hspecWith`:+--+-- @+-- import Test.Hspec+-- import Test.Hspec.Api.Formatters.V1+--+-- main :: IO ()+-- main = hspecWith (useFormatter ("my-formatter", formatter) defaultConfig) spec+--+-- formatter :: Formatter+-- formatter = ...+--+-- spec :: Spec+-- spec = ...+-- @+module Test.Hspec.Api.Formatters.V3 (++-- * Register a formatter+ registerFormatter+, useFormatter+, formatterToFormat++-- * Formatters+, silent+, checks+, specdoc+, progress+, failed_examples++-- * Implementing a custom Formatter+-- |+-- A formatter is a set of actions. Each action is evaluated when a certain+-- situation is encountered during a test run.+--+-- Actions live in the `FormatM` monad. It provides access to the runner state+-- and primitives for appending to the generated report.+, Formatter (..)+, Path+, Progress+, Location(..)+, Item(..)+, Result(..)+, FailureReason (..)+, FormatM++-- ** Accessing the runner state+, getSuccessCount+, getPendingCount+, getFailCount+, getTotalCount+, getExpectedTotalCount++, FailureRecord (..)+, getFailMessages+, usedSeed++, printTimes++, Seconds(..)+, getCPUTime+, getRealTime++-- ** Appending to the generated report+, write+, writeLine+, writeTransient++-- ** Dealing with colors+, withInfoColor+, withSuccessColor+, withPendingColor+, withFailColor++, outputUnicode++, useDiff+, diffContext+, externalDiffAction+, prettyPrint+, prettyPrintFunction+, extraChunk+, missingChunk++-- ** Helpers+, formatLocation+, formatException++-- * Re-exports+, SpecWith+, Config+, modifyConfig+) where++import Test.Hspec.Core.Formatters.V2+import Test.Hspec.Core.Runner (Config(..))+import Test.Hspec.Core.Format (FormatConfig, Format)+import Test.Hspec.Core.Spec (modifyConfig, SpecWith)++-- |+-- Make a formatter available for use with @--format@.+registerFormatter :: (String, Formatter) -> Config -> Config+registerFormatter formatter = registerFormatter_ (fmap formatterToFormat formatter)++-- |+-- Make a formatter available for use with @--format@ and use it by default.+useFormatter :: (String, Formatter) -> Config -> Config+useFormatter (fmap formatterToFormat -> formatter@(_, format)) config = (registerFormatter_ formatter config) { configFormat = Just format }++-- copy of Test.Hspec.Core.Runner.registerFormatter+registerFormatter_ :: (String, FormatConfig -> IO Format) -> Config -> Config+registerFormatter_ formatter config = config { configAvailableFormatters = formatter : configAvailableFormatters config }
+ test/Test/Hspec/Api/Format/V2Spec.hs view
@@ -0,0 +1,22 @@+module Test.Hspec.Api.Format.V2Spec (spec) where++import Test.Hspec+import Test.Hspec.Runner++import Data.IORef++import Test.Hspec.Api.Format.V2++spec :: Spec+spec = do+ describe "useFormatter" $ do+ it "sets a formatter to be used with a given config" $ do+ ref <- newIORef "NAY!"+ let+ formatter :: Format+ formatter event = case event of+ ItemDone {} -> writeIORef ref "YAY!"+ _ -> return ()++ hspecWith (useFormatter ("my-formatter", \ _ -> return formatter) defaultConfig) $ it "" True+ readIORef ref `shouldReturn` "YAY!"
+ test/Test/Hspec/Api/Formatters/V3Spec.hs view
@@ -0,0 +1,20 @@+module Test.Hspec.Api.Formatters.V3Spec (spec) where++import Test.Hspec+import Test.Hspec.Runner++import Data.IORef+import Control.Monad.IO.Class++import Test.Hspec.Api.Formatters.V3++spec :: Spec+spec = do+ describe "useFormatter" $ do+ it "sets a formatter to be used with a given config" $ do+ ref <- newIORef "NAY!"+ let+ formatter :: Formatter+ formatter = silent { formatterItemStarted = \ _ -> liftIO $ writeIORef ref "YAY!" }+ hspecWith (useFormatter ("my-formatter", formatter) defaultConfig) $ it "" True+ readIORef ref `shouldReturn` "YAY!"
+ version.yaml view
@@ -0,0 +1,1 @@+&version 2.11.0