packages feed

sydtest 0.8.0.1 → 0.9.0.0

raw patch · 14 files changed

+203/−48 lines, 14 files

Files

CHANGELOG.md view
@@ -1,5 +1,11 @@ # Changelog +## [0.9.0.0] - 2022-04-13++### Added++* Optional type-safe progress reporting for property tests.+ ## [0.8.0.1] - 2022-02-11  ### Changed
LICENSE.md view
@@ -1,37 +1,49 @@-Sydtest License+# Sydtest License  Copyright (c) 2020-2022 Tom Sydney Kerckhove +## Anyone+ **Anyone** can use this software to test your software under the following license:  -Permissions:+### Permissions:+ * The licensed software may be distributed. * The licensed software may be modified. * The licensed software may be used to test the software under test. -Conditions:+### Conditions:+ * _The software under test is not used for commercial purposes._+  **OR**+  _The software under test is open-source software licensed according to an [OSI-approved Open Source license](https://opensource.org/licenses)._ * Any modifications to the licensed software must be made public under the same license with the same copyright holder. * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -Limitations:+### Limitations:+ * The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. * In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.  -+## Contributors and Sponsors  **Contributors listed in [CONTRIBUTORS](./CONTRIBUTORS) or [GitHub sponsors of NorfairKing](https://github.com/sponsors/NorfairKing)** can use this software to test their software under the following conditions: -Permissions: Any+### Permissions -Conditions:+Any++### Conditions+ * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. -Limitations:+### Limitations+ * The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. * In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. +## Other arrangements  **You can [contact me](https://cs-syd.eu/contact) for other arrangements (like a permanent license) on a case-to-case basis.**
src/Test/Syd/Def/Around.hs view
@@ -186,10 +186,11 @@         let modifyVal ::               forall x.               HContains x outer =>-              (((HList x -> newInner -> IO ()) -> IO ()) -> IO TestRunResult) ->+              (ProgressReporter -> ((HList x -> newInner -> IO ()) -> IO ()) -> IO TestRunResult) ->+              ProgressReporter ->               ((HList x -> oldInner -> IO ()) -> IO ()) ->               IO TestRunResult-            modifyVal takeSupplyXC supplyXD =+            modifyVal takeSupplyXC progressReporter supplyXD =               let supplyXC :: (HList x -> newInner -> IO ()) -> IO ()                   supplyXC takeXC =                     let takeXD :: HList x -> oldInner -> IO ()@@ -197,7 +198,7 @@                           let takeAC _ c = takeXC x c                            in func takeAC (getElem x) d                      in supplyXD takeXD-               in takeSupplyXC supplyXC+               in takeSupplyXC progressReporter supplyXC              -- For this function to work recursively, the first parameter of the input and the output types must be the same             modifyTree ::
src/Test/Syd/Def/Specify.hs view
@@ -175,10 +175,11 @@   sets <- asks testDefEnvTestRunSettings   let testDef =         TDef-          { testDefVal = \supplyArgs ->+          { testDefVal = \progressReporter supplyArgs ->               runTest                 t                 sets+                progressReporter                 ( \func -> supplyArgs (\_ arg2 -> func () arg2)                 ),             testDefCallStack = callStack@@ -276,10 +277,11 @@   sets <- asks testDefEnvTestRunSettings   let testDef =         TDef-          { testDefVal = \supplyArgs ->+          { testDefVal = \progressReporter supplyArgs ->               runTest                 t                 sets+                progressReporter                 (\func -> supplyArgs $ \(HCons outerArgs _) innerArg -> func innerArg outerArgs),             testDefCallStack = callStack           }@@ -374,10 +376,11 @@   sets <- asks testDefEnvTestRunSettings   let testDef =         TDef-          { testDefVal = \supplyArgs ->+          { testDefVal = \progressReporter supplyArgs ->               runTest                 t                 sets+                progressReporter                 (\func -> supplyArgs $ \(HCons outerArgs _) innerArg -> func outerArgs innerArg),             testDefCallStack = callStack           }@@ -442,10 +445,11 @@   sets <- asks testDefEnvTestRunSettings   let testDef =         TDef-          { testDefVal = \supplyArgs ->+          { testDefVal = \progressReporter supplyArgs ->               runTest                 t                 sets+                progressReporter                 (\func -> supplyArgs func),             testDefCallStack = callStack           }
src/Test/Syd/OptParse.hs view
@@ -21,6 +21,7 @@ import qualified Options.Applicative.Help as OptParse (string) import Path import Path.IO+import System.Exit import Test.Syd.Run import Text.Colour @@ -68,6 +69,8 @@     settingIterations :: Iterations,     -- | Whether to fail when any flakiness is detected     settingFailOnFlaky :: !Bool,+    -- | How to report progress+    settingReportProgress :: !ReportProgress,     -- | Debug mode     settingDebug :: !Bool   }@@ -91,6 +94,7 @@           settingFailFast = False,           settingIterations = OneIteration,           settingFailOnFlaky = False,+          settingReportProgress = ReportNoProgress,           settingDebug = False         } @@ -119,7 +123,7 @@     ByCapabilities   | -- | A given number of threads     Asynchronous !Word-  deriving (Show, Eq, Generic)+  deriving (Show, Read, Eq, Generic)  data Iterations   = -- | Run the test suite once, the default@@ -128,22 +132,48 @@     Iterations !Word   | -- | Run the test suite over and over, until we can find some flakiness     Continuous-  deriving (Show, Eq, Generic)+  deriving (Show, Read, Eq, Generic) +data ReportProgress+  = -- | Don't report any progress, the default+    ReportNoProgress+  | -- | Report progress+    ReportProgress+  deriving (Show, Read, Eq, Generic)+ -- | Combine everything to 'Settings' combineToSettings :: Flags -> Environment -> Maybe Configuration -> IO Settings combineToSettings Flags {..} Environment {..} mConf = do   let d func = func defaultSettings   let debugMode = fromMaybe (d settingDebug) $ flagDebug <|> envDebug <|> mc configDebug+  let threads =+        fromMaybe (if debugMode then Synchronous else d settingThreads) $+          flagThreads <|> envThreads <|> mc configThreads+  setReportProgress <-+    case flagReportProgress <|> envReportProgress <|> mc configReportProgress of+      Nothing ->+        pure $+          if threads == Synchronous+            then+              if debugMode+                then ReportProgress+                else d settingReportProgress+            else d settingReportProgress+      Just progress ->+        if progress+          then+            if threads /= Synchronous+              then die "Reporting progress in asynchronous runners is not supported. You can use --synchronous or --debug to use a synchronous runner."+              else pure ReportProgress+          else pure ReportNoProgress+   pure     Settings       { settingSeed = fromMaybe (d settingSeed) $ flagSeed <|> envSeed <|> mc configSeed,         settingRandomiseExecutionOrder =           fromMaybe (if debugMode then False else d settingRandomiseExecutionOrder) $             flagRandomiseExecutionOrder <|> envRandomiseExecutionOrder <|> mc configRandomiseExecutionOrder,-        settingThreads =-          fromMaybe (if debugMode then Synchronous else d settingThreads) $-            flagThreads <|> envThreads <|> mc configThreads,+        settingThreads = threads,         settingMaxSuccess = fromMaybe (d settingMaxSuccess) $ flagMaxSuccess <|> envMaxSuccess <|> mc configMaxSuccess,         settingMaxSize = fromMaybe (d settingMaxSize) $ flagMaxSize <|> envMaxSize <|> mc configMaxSize,         settingMaxDiscard = fromMaybe (d settingMaxDiscard) $ flagMaxDiscard <|> envMaxDiscard <|> mc configMaxDiscard,@@ -158,6 +188,7 @@             (flagFailFast <|> envFailFast <|> mc configFailFast),         settingIterations = fromMaybe (d settingIterations) $ flagIterations <|> envIterations <|> mc configIterations,         settingFailOnFlaky = fromMaybe (d settingFailOnFlaky) $ flagFailOnFlaky <|> envFailOnFlaky <|> mc configFailOnFlaky,+        settingReportProgress = setReportProgress,         settingDebug = debugMode       }   where@@ -185,6 +216,7 @@     configFailFast :: !(Maybe Bool),     configIterations :: !(Maybe Iterations),     configFailOnFlaky :: !(Maybe Bool),+    configReportProgress :: !(Maybe Bool),     configDebug :: !(Maybe Bool)   }   deriving (Show, Eq, Generic)@@ -214,6 +246,7 @@         <*> optionalField "fail-fast" "Whether to stop executing upon the first test failure" .= configFailFast         <*> optionalField "iterations" "How many iterations to use to look diagnose flakiness" .= configIterations         <*> optionalField "fail-on-flaky" "Whether to fail when any flakiness is detected" .= configFailOnFlaky+        <*> optionalField "progress" "How to report progres" .= configReportProgress         <*> optionalField "debug" "Turn on debug-mode. This implies randomise-execution-order: false, parallelism: 1 and fail-fast: true" .= configDebug  instance HasCodec Threads where@@ -277,6 +310,7 @@     envFailFast :: !(Maybe Bool),     envIterations :: !(Maybe Iterations),     envFailOnFlaky :: !(Maybe Bool),+    envReportProgress :: !(Maybe Bool),     envDebug :: !(Maybe Bool)   }   deriving (Show, Eq, Generic)@@ -299,6 +333,7 @@       envFailFast = Nothing,       envIterations = Nothing,       envFailOnFlaky = Nothing,+      envReportProgress = Nothing,       envDebug = Nothing     } @@ -329,6 +364,7 @@         <*> Env.var (fmap Just . Env.auto) "FAIL_FAST" (Env.def Nothing <> Env.help "Whether to stop executing upon the first test failure")         <*> Env.var (fmap Just . (Env.auto >=> parseIterations)) "ITERATIONS" (Env.def Nothing <> Env.help "How many iterations to use to look diagnose flakiness")         <*> Env.var (fmap Just . Env.auto) "FAIL_ON_FLAKY" (Env.def Nothing <> Env.help "Whether to fail when flakiness is detected")+        <*> Env.var (fmap Just . Env.auto) "PROGRESS" (Env.def Nothing <> Env.help "Report progress as tests run")         <*> Env.var (fmap Just . Env.auto) "DEBUG" (Env.def Nothing <> Env.help "Turn on debug mode. This implies RANDOMISE_EXECUTION_ORDER=False, PARALLELISM=1 and FAIL_FAST=True.")   where     parseThreads :: Word -> Either e Threads@@ -394,6 +430,7 @@     flagFailFast :: !(Maybe Bool),     flagIterations :: !(Maybe Iterations),     flagFailOnFlaky :: !(Maybe Bool),+    flagReportProgress :: !(Maybe Bool),     flagDebug :: !(Maybe Bool)   }   deriving (Show, Eq, Generic)@@ -416,6 +453,7 @@       flagFailFast = Nothing,       flagIterations = Nothing,       flagFailOnFlaky = Nothing,+      flagReportProgress = Nothing,       flagDebug = Nothing     } @@ -539,7 +577,8 @@             )       )     <*> doubleSwitch ["fail-on-flaky"] (help "Fail when any flakiness is detected")-    <*> doubleSwitch ["debug"] (help "Turn on debug mode. This implies --no-randomise-execution-order, --synchronous and --fail-fast.")+    <*> doubleSwitch ["progress"] (help "Report progress")+    <*> doubleSwitch ["debug"] (help "Turn on debug mode. This implies --no-randomise-execution-order, --synchronous, --progress and --fail-fast.")  seedSettingFlags :: OptParse.Parser (Maybe SeedSetting) seedSettingFlags =
src/Test/Syd/Output.hs view
@@ -19,6 +19,7 @@ import Data.Maybe import Data.Text (Text) import qualified Data.Text as T+import Data.Word import GHC.Stack import Safe import Test.QuickCheck.IO ()@@ -162,25 +163,16 @@  outputSpecifyLines :: Int -> Int -> Text -> TDef (Timed TestRunResult) -> [[Chunk]] outputSpecifyLines level treeWidth specifyText (TDef (Timed TestRunResult {..} executionTime) _) =-  let t = fromIntegral executionTime / 1_000_000 :: Double -- milliseconds-      executionTimeText = T.pack (printf "%10.2f ms" t)-      withTimingColour =-        if-            | t < 10 -> fore green-            | t < 100 -> fore yellow-            | t < 1000 -> fore orange-            | t < 10000 -> fore red-            | otherwise -> fore darkRed--      withStatusColour = fore (statusColour testRunResultStatus)+  let withStatusColour = fore (statusColour testRunResultStatus)       pad = (chunk (T.pack (replicate paddingSize ' ')) :)+      timeChunk = timeChunkFor executionTime    in filter         (not . null)         $ concat           [ [ [ withStatusColour $ chunk (statusCheckMark testRunResultStatus),                 withStatusColour $ chunk specifyText,-                spacingChunk level specifyText executionTimeText treeWidth,-                withTimingColour $ chunk executionTimeText+                spacingChunk level specifyText (chunkText timeChunk) treeWidth,+                timeChunk               ]             ],             map pad $ retriesChunks testRunResultStatus testRunResultRetries testRunResultFlakinessMessage,@@ -199,6 +191,26 @@             map pad $ tablesChunks testRunResultTables,             [pad $ outputGoldenCase gc | gc <- maybeToList testRunResultGoldenCase]           ]++exampleNrChunk :: Word -> Word -> Chunk+exampleNrChunk total current =+  let digits :: Word+      digits = max 2 $ succ $ floor $ logBase 10 $ (fromIntegral :: Word -> Double) total+      formatStr = "%" <> show digits <> "d"+   in chunk $ T.pack $ printf formatStr current++timeChunkFor :: Word64 -> Chunk+timeChunkFor executionTime =+  let t = fromIntegral executionTime / 1_000_000 :: Double -- milliseconds+      executionTimeText = T.pack (printf "%10.2f ms" t)+      withTimingColour =+        if+            | t < 10 -> fore green+            | t < 100 -> fore yellow+            | t < 1000 -> fore orange+            | t < 10000 -> fore red+            | otherwise -> fore darkRed+   in withTimingColour $ chunk executionTimeText  retriesChunks :: TestStatus -> Maybe Int -> Maybe String -> [[Chunk]] retriesChunks status mRetries mMessage = case mRetries of
src/Test/Syd/Run.hs view
@@ -14,6 +14,7 @@  import Autodocodec import Control.Concurrent+import Control.Concurrent.STM import Control.Exception import Control.Monad.IO.Class import Control.Monad.Reader@@ -43,6 +44,7 @@   runTest ::     e ->     TestRunSettings ->+    ProgressReporter ->     ((Arg1 e -> Arg2 e -> IO ()) -> IO ()) ->     IO TestRunResult @@ -64,14 +66,18 @@ runPureTestWithArg ::   (outerArgs -> innerArg -> Bool) ->   TestRunSettings ->+  ProgressReporter ->   ((outerArgs -> innerArg -> IO ()) -> IO ()) ->   IO TestRunResult-runPureTestWithArg computeBool TestRunSettings {} wrapper = do+runPureTestWithArg computeBool TestRunSettings {} progressReporter wrapper = do+  let report = reportProgress progressReporter   let testRunResultNumTests = Nothing   let testRunResultRetries = Nothing+  report ProgressTestStarting   resultBool <-     applyWrapper2 wrapper $       \outerArgs innerArg -> evaluate (computeBool outerArgs innerArg)+  report ProgressTestDone   let (testRunResultStatus, testRunResultException) = case resultBool of         Left ex -> (TestFailed, Just ex)         Right bool -> (if bool then TestPassed else TestFailed, Nothing)@@ -129,15 +135,22 @@ runIOTestWithArg ::   (outerArgs -> innerArg -> IO ()) ->   TestRunSettings ->+  ProgressReporter ->   ((outerArgs -> innerArg -> IO ()) -> IO ()) ->   IO TestRunResult-runIOTestWithArg func TestRunSettings {} wrapper = do+runIOTestWithArg func TestRunSettings {} progressReporter wrapper = do+  let report = reportProgress progressReporter+   let testRunResultNumTests = Nothing   let testRunResultRetries = Nothing++  report ProgressTestStarting   result <- liftIO $     applyWrapper2 wrapper $       \outerArgs innerArg ->         func outerArgs innerArg >>= evaluate+  report ProgressTestDone+   let (testRunResultStatus, testRunResultException) = case result of         Left ex -> (TestFailed, Just ex)         Right () -> (TestPassed, Nothing)@@ -180,13 +193,31 @@     }  runPropertyTestWithArg ::+  forall outerArgs innerArg.   (outerArgs -> innerArg -> Property) ->   TestRunSettings ->+  ProgressReporter ->   ((outerArgs -> innerArg -> IO ()) -> IO ()) ->   IO TestRunResult-runPropertyTestWithArg p trs wrapper = do+runPropertyTestWithArg p trs progressReporter wrapper = do+  let report = reportProgress progressReporter   let qcargs = makeQuickCheckArgs trs-  qcr <- quickCheckWithResult qcargs (aroundProperty wrapper p)++  exampleCounter <- newTVarIO 1+  let totalExamples = (fromIntegral :: Int -> Word) (maxSuccess qcargs)+  let wrapperWithProgress :: (outerArgs -> innerArg -> IO ()) -> IO ()+      wrapperWithProgress func = wrapper $ \outers inner -> do+        exampleNr <- readTVarIO exampleCounter+        report $ ProgressExampleStarting totalExamples exampleNr+        timedResult <- timeItT $ func outers inner+        report $ ProgressExampleDone totalExamples exampleNr $ timedTime timedResult+        atomically $ modifyTVar' exampleCounter succ+        pure $ timedValue timedResult++  report ProgressTestStarting+  qcr <- quickCheckWithResult qcargs (aroundProperty wrapperWithProgress p)+  report ProgressTestDone+   let testRunResultGoldenCase = Nothing   let testRunResultNumTests = Just $ fromIntegral $ numTests qcr   let testRunResultRetries = Nothing@@ -308,9 +339,10 @@ runGoldenTestWithArg ::   (outerArgs -> innerArg -> IO (GoldenTest a)) ->   TestRunSettings ->+  ProgressReporter ->   ((outerArgs -> innerArg -> IO ()) -> IO ()) ->   IO TestRunResult-runGoldenTestWithArg createGolden TestRunSettings {..} wrapper = do+runGoldenTestWithArg createGolden TestRunSettings {..} _ wrapper = do   errOrTrip <- applyWrapper2 wrapper $ \outerArgs innerArgs -> do     GoldenTest {..} <- createGolden outerArgs innerArgs     mGolden <- goldenTestRead@@ -440,6 +472,31 @@   | GoldenStarted   | GoldenReset   deriving (Show, Eq, Typeable, Generic)++type ProgressReporter = Progress -> IO ()++noProgressReporter :: ProgressReporter+noProgressReporter _ = pure ()++reportProgress :: ProgressReporter -> Progress -> IO ()+reportProgress = id++data Progress+  = ProgressTestStarting+  | ProgressExampleStarting+      !Word+      -- ^ Total examples+      !Word+      -- ^ Example number+  | ProgressExampleDone+      !Word+      -- ^ Total examples+      !Word+      -- ^ Example number+      !Word64+      -- ^ Time it took+  | ProgressTestDone+  deriving (Show, Eq, Generic)  -- | Time an action and return the result as well as how long it took in seconds. --
src/Test/Syd/Runner/Asynchronous.hs view
@@ -71,7 +71,7 @@           mDone <- tryReadMVar failFastVar           case mDone of             Nothing -> do-              let runNow = timeItT $ runSingleTestWithFlakinessMode a td fm+              let runNow = timeItT $ runSingleTestWithFlakinessMode noProgressReporter a td fm               -- Wait before spawning a thread so that we don't spawn too many threads               let quantity = case p of                     -- When the test wants to be executed sequentially, we take n locks because we must make sure that
src/Test/Syd/Runner/Synchronous.hs view
@@ -36,7 +36,7 @@     goTree :: forall a. FlakinessMode -> HList a -> TestTree a () -> IO (Next ResultTree)     goTree fm hl = \case       DefSpecifyNode t td () -> do-        result <- timeItT $ runSingleTestWithFlakinessMode hl td fm+        result <- timeItT $ runSingleTestWithFlakinessMode noProgressReporter hl td fm         let td' = td {testDefVal = result}         let r = failFastNext (settingFailFast settings) td'         pure $ SpecifyNode t <$> r@@ -82,7 +82,27 @@       goTree :: Int -> FlakinessMode -> HList a -> TestTree a () -> IO (Next ResultTree)       goTree level fm hl = \case         DefSpecifyNode t td () -> do-          result <- timeItT $ runSingleTestWithFlakinessMode hl td fm+          let progressReporter :: Progress -> IO ()+              progressReporter =+                outputLine . pad (succ (succ level)) . \case+                  ProgressTestStarting ->+                    [ fore cyan "Test starting: ",+                      fore yellow $ chunk t+                    ]+                  ProgressExampleStarting totalExamples exampleNr ->+                    [ fore cyan "Example starting:  ",+                      fore yellow $ exampleNrChunk totalExamples exampleNr+                    ]+                  ProgressExampleDone totalExamples exampleNr executionTime ->+                    [ fore cyan "Example done:      ",+                      fore yellow $ exampleNrChunk totalExamples exampleNr,+                      timeChunkFor executionTime+                    ]+                  ProgressTestDone ->+                    [ fore cyan "Test done: ",+                      fore yellow $ chunk t+                    ]+          result <- timeItT $ runSingleTestWithFlakinessMode progressReporter hl td fm           let td' = td {testDefVal = result}           mapM_ (outputLine . pad level) $ outputSpecifyLines level treeWidth t td'           let r = failFastNext (settingFailFast settings) td'@@ -119,8 +139,8 @@    pure resultForest -runSingleTestWithFlakinessMode :: forall a t. HList a -> TDef (((HList a -> () -> t) -> t) -> IO TestRunResult) -> FlakinessMode -> IO TestRunResult-runSingleTestWithFlakinessMode l td = \case+runSingleTestWithFlakinessMode :: forall a t. ProgressReporter -> HList a -> TDef (ProgressReporter -> ((HList a -> () -> t) -> t) -> IO TestRunResult) -> FlakinessMode -> IO TestRunResult+runSingleTestWithFlakinessMode progressReporter l td = \case   MayNotBeFlaky -> runFunc   MayBeFlakyUpTo retries mMsg -> updateFlakinessMessage <$> go retries     where@@ -145,4 +165,5 @@                     Just r -> Just (succ r)               }   where-    runFunc = testDefVal td (\f -> f l ())+    runFunc :: IO TestRunResult+    runFunc = testDefVal td progressReporter (\f -> f l ())
src/Test/Syd/SpecDef.hs view
@@ -59,7 +59,7 @@     -- | The description of the test     Text ->     -- | How the test can be run given a function that provides the resources-    TDef (((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult) ->+    TDef (ProgressReporter -> ((HList outers -> inner -> IO ()) -> IO ()) -> IO TestRunResult) ->     extra ->     SpecDefTree outers inner extra   -- | Define a pending test
sydtest.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack  name:           sydtest-version:        0.8.0.1+version:        0.9.0.0 synopsis:       A modern testing framework for Haskell with good defaults and advanced testing features. description:    A modern testing framework for Haskell with good defaults and advanced testing features. Sydtest aims to make the common easy and the hard possible. See https://github.com/NorfairKing/sydtest#readme for more information. category:       Testing@@ -84,6 +84,7 @@     , safe     , safe-coloured-text     , split+    , stm     , text     , yaml   if os(windows)
test/Test/Syd/OptParseSpec.hs view
@@ -25,6 +25,7 @@               { settingThreads = Synchronous,                 settingRandomiseExecutionOrder = False,                 settingFailFast = True,+                settingReportProgress = ReportProgress,                 settingDebug = True               }       combineToSettings flags environment mConf `shouldReturn` settings
test/Test/Syd/TimingSpec.hs view
@@ -25,7 +25,7 @@     threadDelay 100_000   it "takes at least 100 milliseconds (property) " $     property $ \() -> do-      threadDelay 1_000+      threadDelay 10_000  {-# NOINLINE take10ms #-} take10ms :: IO ()
test_resources/defaultSettings-show.golden view
@@ -13,5 +13,6 @@   , settingFailFast = False   , settingIterations = OneIteration   , settingFailOnFlaky = False+  , settingReportProgress = ReportNoProgress   , settingDebug = False   }