Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ghc-tasty for openSUSE:Factory checked in at 2026-06-10 16:07:04 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-tasty (Old) and /work/SRC/openSUSE:Factory/.ghc-tasty.new.2375 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-tasty" Wed Jun 10 16:07:04 2026 rev:17 rq:1358446 version:1.5.4 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-tasty/ghc-tasty.changes 2025-06-04 20:30:02.264673249 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-tasty.new.2375/ghc-tasty.changes 2026-06-10 16:11:00.053094584 +0200 @@ -1,0 +2,9 @@ +Wed Mar 25 20:04:10 UTC 2026 - Peter Simons <[email protected]> + +- Update tasty to version 1.5.4. + Upstream has edited the change log file since the last release in + a non-trivial way, i.e. they did more than just add a new entry + at the top. You can review the file at: + http://hackage.haskell.org/package/tasty-1.5.4/src/CHANGELOG.md + +------------------------------------------------------------------- Old: ---- tasty-1.5.3.tar.gz tasty.cabal New: ---- tasty-1.5.4.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-tasty.spec ++++++ --- /var/tmp/diff_new_pack.Ei8ivh/_old 2026-06-10 16:11:02.261186089 +0200 +++ /var/tmp/diff_new_pack.Ei8ivh/_new 2026-06-10 16:11:02.261186089 +0200 @@ -1,7 +1,7 @@ # # spec file for package ghc-tasty # -# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2026 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,13 +19,12 @@ %global pkg_name tasty %global pkgver %{pkg_name}-%{version} Name: ghc-%{pkg_name} -Version: 1.5.3 +Version: 1.5.4 Release: 0 Summary: Modern and extensible testing framework License: MIT URL: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz -Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/2.cabal#/%{pkg_name}.cabal BuildRequires: ghc-Cabal-devel BuildRequires: ghc-ansi-terminal-devel BuildRequires: ghc-ansi-terminal-prof @@ -79,7 +78,6 @@ %prep %autosetup -n %{pkg_name}-%{version} -cp -p %{SOURCE1} %{pkg_name}.cabal %build %ghc_lib_build ++++++ tasty-1.5.3.tar.gz -> tasty-1.5.4.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/CHANGELOG.md new/tasty-1.5.4/CHANGELOG.md --- old/tasty-1.5.3/CHANGELOG.md 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/CHANGELOG.md 2001-09-09 03:46:40.000000000 +0200 @@ -1,6 +1,26 @@ Changes ======= +Version 1.5.4 +-------------- + +_2025-03-31_ + +* Fix display of `HasCallStack` backtraces when a test throws an error + ([#472](https://github.com/UnkindPartition/tasty/pull/472)). +* Introduce `dependentTestGroup` and `inOrderTestGroup`, + deprecate `sequentialTestGroup` + ([#448](https://github.com/UnkindPartition/tasty/pull/448)). +* Add `instance IsTest t => IsTest (ContT () IO t)` + ([#466](https://github.com/UnkindPartition/tasty/pull/466)). +* Limit maximum line length in console reporter + ([#451](https://github.com/UnkindPartition/tasty/pull/451)). +* Make `-j` to entail `+RTS -N` automatically + ([#457](https://github.com/UnkindPartition/tasty/pull/457)). +* Do not depend on `unbounded-delays` on `ppc64le` and `loongarch64` + ([#460](https://github.com/UnkindPartition/tasty/pull/460), + [#465](https://github.com/UnkindPartition/tasty/pull/465)). + Version 1.5.3 -------------- @@ -521,7 +541,7 @@ * Better handling of exceptions that arise during resource creation or disposal * Expose the `AppMonoid` wrapper -* Add `askOption` and `inludingOptions` +* Add `askOption` and `includingOptions` Version 0.5.2.1 --------------- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Control/Concurrent/Async.hs new/tasty-1.5.4/Control/Concurrent/Async.hs --- old/tasty-1.5.3/Control/Concurrent/Async.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Control/Concurrent/Async.hs 2001-09-09 03:46:40.000000000 +0200 @@ -36,7 +36,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -} -{-# LANGUAGE DeriveDataTypeable, MagicHash, UnboxedTuples #-} +{-# LANGUAGE CPP, MagicHash, UnboxedTuples #-} module Control.Concurrent.Async ( async, withAsync, wait, asyncThreadId, cancel, concurrently @@ -44,14 +44,40 @@ import Control.Concurrent.STM import Control.Exception + ( BlockedIndefinitelyOnMVar(..) + , BlockedIndefinitelyOnSTM(..) + , Exception + , SomeException + , asyncExceptionFromException + , asyncExceptionToException + , catch + , fromException + , onException + , toException + , try + ) import Control.Concurrent import Control.Monad import Data.IORef -import Data.Typeable import GHC.Conc (ThreadId(..)) import GHC.Exts import GHC.IO hiding (onException) +#if MIN_VERSION_base(4,21,0) +import Control.Exception (ExceptionWithContext, tryWithContext, catchNoPropagate, rethrowIO) +#else +type ExceptionWithContext x = x + +catchNoPropagate :: IO a -> (ExceptionWithContext SomeException -> IO a) -> IO a +catchNoPropagate = catchAll + +tryWithContext :: IO a -> IO (Either (ExceptionWithContext SomeException) a) +tryWithContext = try + +rethrowIO :: ExceptionWithContext SomeException -> IO a +rethrowIO = throwIO +#endif + -- | An asynchronous action spawned by 'async' or 'withAsync'. -- Asynchronous actions are executed in a separate thread, and -- operations are provided for waiting for asynchronous actions to @@ -59,9 +85,9 @@ -- data Async a = Async { asyncThreadId :: {-# UNPACK #-} !ThreadId - -- ^ Returns the 'ThreadId' of the thread running - -- the given 'Async'. - , _asyncWait :: STM (Either SomeException a) + -- ^ Returns the t'ThreadId' of the thread running + -- the given t'Async'. + , _asyncWait :: STM (Either (ExceptionWithContext SomeException) a) } -- | Spawn an asynchronous action in a separate thread. @@ -103,11 +129,11 @@ withAsyncUsing doFork = \action inner -> do var <- newEmptyTMVarIO mask $ \restore -> do - t <- doFork $ try (restore action) >>= atomically . putTMVar var + t <- doFork $ tryWithContext (restore action) >>= atomically . putTMVar var let a = Async t (readTMVar var) - r <- restore (inner a) `catchAll` \e -> do + r <- restore (inner a) `catchNoPropagate` \e -> do uninterruptibleCancel a - throwIO e + rethrowIO (e :: ExceptionWithContext SomeException) uninterruptibleCancel a return r @@ -131,7 +157,7 @@ -- > waitCatch = atomically . waitCatchSTM -- {-# INLINE waitCatch #-} -waitCatch :: Async a -> IO (Either SomeException a) +waitCatch :: Async a -> IO (Either (ExceptionWithContext SomeException) a) waitCatch = tryAgain . atomically . waitCatchSTM where -- See: https://github.com/simonmar/async/issues/14 @@ -147,16 +173,16 @@ -- | A version of 'waitCatch' that can be used inside an STM transaction. -- {-# INLINE waitCatchSTM #-} -waitCatchSTM :: Async a -> STM (Either SomeException a) +waitCatchSTM :: Async a -> STM (Either (ExceptionWithContext SomeException) a) waitCatchSTM (Async _ w) = w -- | Cancel an asynchronous action by throwing the @AsyncCancelled@ --- exception to it, and waiting for the `Async` thread to quit. --- Has no effect if the 'Async' has already completed. +-- exception to it, and waiting for the t'Async' thread to quit. +-- Has no effect if the t'Async' has already completed. -- -- > cancel a = throwTo (asyncThreadId a) AsyncCancelled <* waitCatch a -- --- Note that 'cancel' will not terminate until the thread the 'Async' +-- Note that 'cancel' will not terminate until the thread the t'Async' -- refers to has terminated. This means that 'cancel' will block for -- as long said thread blocks when receiving an asynchronous exception. -- @@ -172,13 +198,11 @@ -- | The exception thrown by `cancel` to terminate a thread. data AsyncCancelled = AsyncCancelled - deriving (Show, Eq, Typeable) + deriving (Show, Eq) instance Exception AsyncCancelled where -#if __GLASGOW_HASKELL__ >= 708 fromException = asyncExceptionFromException toException = asyncExceptionToException -#endif -- | Cancel an asynchronous action -- diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/README.md new/tasty-1.5.4/README.md --- old/tasty-1.5.3/README.md 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/README.md 2001-09-09 03:46:40.000000000 +0200 @@ -236,7 +236,7 @@ --quickcheck-max-size NUMBER Size of the biggest test cases quickcheck generates --quickcheck-max-ratio NUMBER - Maximum number of discared tests per successful test + Maximum number of discarded tests per successful test before giving up --quickcheck-verbose Show the generated test cases --quickcheck-shrinks NUMBER @@ -703,14 +703,14 @@ If this parallelism is not desirable, you can declare *dependencies* between tests, so that one test will not start until certain other tests finish. -Dependencies are declared using the `after` or `sequentialTestGroup` combinator: +Dependencies are declared using the `after` or `dependentTestGroup` combinator: * `after AllFinish "pattern" my_tests` will execute the test tree `my_tests` only after all tests that match the pattern finish. * `after AllSucceed "pattern" my_tests` will execute the test tree `my_tests` only after all tests that match the pattern finish **and** only if they all succeed. If at least one dependency fails, then `my_tests` will be skipped. -* `sequentialTestGroup groupName dependencyType [tree1, tree2, ..]` will execute all tests +* `dependentTestGroup groupName dependencyType [tree1, tree2, ..]` will execute all tests in `tree1` first, after which it will execute all tests in `tree2`, and so forth. Like `after`, `dependencyType` can either be set to `AllFinish` or `AllSucceed`. @@ -723,7 +723,7 @@ -> TestTree -- ^ the subtree that depends on other tests -> TestTree -- ^ the subtree annotated with dependency information -sequentialTestGroup +dependentTestGroup :: TestName -- ^ name of the group -> DependencyType -- ^ whether to run the tests even if some of the dependencies fail -> [TestTree] -- ^ trees to execute sequentially @@ -792,7 +792,7 @@ test tree, searching for the next test to execute may also have an overhead quadratic in the number of tests. -Use `sequentialTestGroup` to mitigate these problems. +Use `dependentTestGroup` to mitigate these problems. ## FAQ @@ -829,6 +829,22 @@ [Known Issues](https://github.com/git-for-windows/build-extra/blob/main/ReleaseNotes.md#known-issues). +## Migration from `test-framework` + +`tasty` architecture is quite similar to `test-framework`, so a few mechanical changes are usually enough to migrate: + +* Replace packages in `build-depends`: + * `test-framework` -> `tasty`, + * `test-framework-hunit` -> `tasty-hunit`, + * `test-framework-quickcheck2` -> `tasty-quickcheck`. +* Replace module imports: + * `Test.Framework` -> `Test.Tasty`, + * `Test.Framework.Providers.HUnit` -> `Test.Tasty.HUnit`, + * `Test.Framework.Providers.QuickCheck2` -> `Test.Tasty.QuickCheck`. +* Replace in type signatures: + * `Test` -> `TestTree`. +* Replace `defaultMain tests` with `defaultMain (testGroup "All" tests)`. + ## Press Blog posts and other publications related to tasty. If you wrote or just found diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/CmdLine.hs new/tasty-1.5.4/Test/Tasty/CmdLine.hs --- old/tasty-1.5.3/Test/Tasty/CmdLine.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/CmdLine.hs 2001-09-09 03:46:40.000000000 +0200 @@ -8,7 +8,6 @@ ) where import Control.Arrow -import Control.Monad import Data.Maybe import Data.Proxy import Data.Typeable (typeRep) @@ -16,7 +15,6 @@ import Options.Applicative.Common (evalParser) import qualified Options.Applicative.Types as Applicative (Option(..)) import Options.Applicative.Types (Parser(..), OptProperties(..)) -import Prelude -- Silence AMP and FTP import warnings import System.Exit import System.IO #if !MIN_VERSION_base(4,11,0) @@ -156,9 +154,7 @@ mapM_ (hPutStrLn stderr) warnings cmdlineOpts <- execParser $ info (helper <*> parser) - ( fullDesc <> - header "Mmm... tasty test suite" - ) + (header "Mmm... tasty test suite") envOpts <- suiteEnvOptions ins tree return $ envOpts <> cmdlineOpts diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Core.hs new/tasty-1.5.4/Test/Tasty/Core.hs --- old/tasty-1.5.3/Test/Tasty/Core.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Core.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,8 +1,11 @@ -- | Core types and definitions {-# LANGUAGE DeriveGeneric #-} {-# LANGUAGE ExistentialQuantification #-} +{-# LANGUAGE FlexibleInstances #-} +{-# LANGUAGE ImplicitParams #-} {-# LANGUAGE LambdaCase #-} {-# LANGUAGE RankNTypes #-} +{-# LANGUAGE TypeApplications #-} module Test.Tasty.Core ( FailureReason(..) , Outcome(..) @@ -18,9 +21,12 @@ , ResourceError(..) , DependencyType(..) , ExecutionMode(..) + , Parallel(..) , TestTree(..) , testGroup , sequentialTestGroup + , dependentTestGroup + , inOrderTestGroup , after , after_ , TreeFold(..) @@ -28,11 +34,15 @@ , foldTestTree , foldTestTree0 , treeOptions + , testFailed ) where import Control.Exception +import Control.Monad.Trans.Cont (ContT(..)) +import Data.Coerce (coerce) import qualified Data.Map as Map import Data.Bifunctor (Bifunctor(second, bimap)) +import Data.IORef (newIORef, readIORef, atomicModifyIORef') import Data.List (mapAccumR) import Data.Monoid (Any (getAny, Any)) import Data.Sequence ((|>)) @@ -48,6 +58,10 @@ import Text.Printf import Text.Read (readMaybe) +#if MIN_VERSION_base(4,21,0) && !MIN_VERSION_base(4,22,0) +import Control.Exception.Context +#endif + -- | If a test failed, 'FailureReason' describes why. -- -- @since 0.8 @@ -156,16 +170,28 @@ Success -> True Failure {} -> False --- | Shortcut for creating a 'Result' that indicates exception +-- | Shortcut for creating a t'Result' that indicates exception exceptionResult :: SomeException -> Result exceptionResult e = Result { resultOutcome = Failure $ TestThrewException e - , resultDescription = "Exception: " ++ displayException e + , resultDescription = "Exception: " ++ displayException' e , resultShortDescription = "FAIL" , resultTime = 0 , resultDetailsPrinter = noResultDetails } +displayException' :: SomeException -> String +#if MIN_VERSION_base(4,22,0) +displayException' = displayExceptionWithInfo +#elif MIN_VERSION_base(4,21,0) +displayException' (SomeException e) = + displayException e ++ case displayExceptionContext ?exceptionContext of + "" -> "" + dc -> "\n\n" ++ dc +#else +displayException' = displayException +#endif + -- | Test progress information. -- -- This may be used by a runner to provide some feedback to the user while @@ -201,7 +227,7 @@ -- | Run the test -- -- This method should cleanly catch any exceptions in the code to test, and - -- return them as part of the 'Result', see 'FailureReason' for an + -- return them as part of the t'Result', see 'FailureReason' for an -- explanation. It is ok for 'run' to raise an exception if there is a -- problem with the test suite code itself (for example, if a file that -- should contain example data or expected output is not found). @@ -214,12 +240,43 @@ -- | The list of options that affect execution of tests of this type testOptions :: Tagged t [OptionDescription] +-- | @since 1.5.4 +instance IsTest t => IsTest (ContT () IO t) where + testOptions = coerce (testOptions @t) + run opts (ContT k) yieldProgress = do + resRef <- newIORef Nothing + let runInIORef :: t -> IO () + runInIORef t = do + res <- run opts t yieldProgress + let err = testFailed "Continuation was called multiple times" + atomicModifyIORef' resRef $ \prev -> + (Just $ maybe res (const err) prev, ()) + k runInIORef + maybeRes <- readIORef resRef + pure $ case maybeRes of + Nothing -> testFailed "Continuation was not called" + Just r -> r + +-- | t'Result' of a failed test. +-- +-- @since 0.8 +testFailed + :: String -- ^ description + -> Result +testFailed desc = Result + { resultOutcome = Failure TestFailed + , resultDescription = desc + , resultShortDescription = "FAIL" + , resultTime = 0 + , resultDetailsPrinter = noResultDetails + } + -- | The name of a test or a group of tests. -- -- @since 0.1 type TestName = String --- | 'ResourceSpec' describes how to acquire a resource (the first field) +-- | t'ResourceSpec' describes how to acquire a resource (the first field) -- and how to release it (the second field). -- -- @since 0.6 @@ -230,7 +287,6 @@ = NotRunningTests | UnexpectedState String String | UseOutsideOfTest - deriving Typeable instance Show ResourceError where show NotRunningTests = @@ -264,19 +320,26 @@ -- | Determines mode of execution of a 'TestGroup' data ExecutionMode - = Sequential DependencyType - -- ^ Execute tests one after another - | Parallel - -- ^ Execute tests in parallel + = Dependent DependencyType + -- ^ Test have dependencies + | Independent Parallel + -- ^ Test have no dependencies + deriving (Show, Read) + +data Parallel + = Parallel + -- ^ Tests can be run in parallel + | NonParallel + -- ^ Tests should not be parallelized deriving (Show, Read) -- | Determines mode of execution of a 'TestGroup'. Note that this option is -- not exposed as a command line argument. instance IsOption ExecutionMode where - defaultValue = Parallel + defaultValue = Independent Parallel parseValue = readMaybe optionName = Tagged "execution-mode" - optionHelp = Tagged "Whether to execute tests sequentially or in parallel" + optionHelp = Tagged "Whether tests have dependencies or not" optionCLParser = mkOptionCLParser internal -- | The main data structure defining a test suite. @@ -316,19 +379,67 @@ -- @since 1.2 -- | Create a named group of test cases or other groups. Tests are executed in --- parallel. For sequential execution, see 'sequentialTestGroup'. +-- parallel. For sequential execution, see 'dependentTestGroup'. -- -- @since 0.1 testGroup :: TestName -> [TestTree] -> TestTree testGroup = TestGroup --- | Create a named group of test cases or other groups. Tests are executed in --- order. For parallel execution, see 'testGroup'. +{-# DEPRECATED sequentialTestGroup "Use dependentTestGroup instead" #-} +-- | Legacy name for 'dependentTestGroup'. +-- +-- @since 1.5 sequentialTestGroup :: TestName -> DependencyType -> [TestTree] -> TestTree -sequentialTestGroup nm depType = setSequential . TestGroup nm . map setParallel +sequentialTestGroup = dependentTestGroup + +-- | Create a named group of test cases or other groups. Tests are executed in +-- order and each test is considered a dependency of the next one. +-- If filtering by t'TestPattern' (@--pattern@) is in action, +-- any test matching the pattern also shields earlier tests from filtering out, +-- even if they themselves do not match the pattern. +-- +-- For parallel execution, see 'testGroup'. For ordered test execution, but +-- with default filtering behavior, see 'inOrderTestGroup'. +-- +-- Note that this is will only work when used with the default 'Test.Tasty.Ingredients.TestManager'. +-- If you use another manager, like @tasty-rerun@ for instance, sequentiality +-- might possibly be ignored. +-- +-- @since 1.5.4 +dependentTestGroup + :: TestName + -- ^ name of the group + -> DependencyType + -- ^ whether to run subsequent tests even if earlier ones have failed + -> [TestTree] + -- ^ tests to execute sequentially + -> TestTree +dependentTestGroup nm depType = setDependent . TestGroup nm . map setParallel + where + setParallel = PlusTestOptions (setOption $ Independent Parallel) + setDependent = PlusTestOptions (setOption (Dependent depType)) + + +-- | Create a named group of test cases that will be played sequentially, +-- in the exact order provided. Similarly to 'testGroup' +-- and in contrast to 'dependentTestGroup', +-- filtering by t'TestPattern' is applied uniformly. +-- +-- Note that this is will only work when used with the default 'Test.Tasty.Ingredients.TestManager'. +-- If you use another manager, like @tasty-rerun@ for instance, the fact that +-- these tests should be run in the given order might possibly be ignored. +-- +-- @since 1.5.4 +inOrderTestGroup + :: TestName + -- ^ name of the group + -> [TestTree] + -- ^ tests to execute sequentially + -> TestTree +inOrderTestGroup nm = setSequential . TestGroup nm . map setParallel where - setParallel = PlusTestOptions (setOption Parallel) - setSequential = PlusTestOptions (setOption (Sequential depType)) + setParallel = PlusTestOptions (setOption $ Independent Parallel) + setSequential = PlusTestOptions (setOption (Independent NonParallel)) -- | Like 'after', but accepts the pattern as a syntax tree instead -- of a string. Useful for generating a test tree programmatically. @@ -408,7 +519,7 @@ -- -- Instead of constructing fresh records, build upon `trivialFold` -- instead. This way your code won't break when new nodes/fields are --- indroduced. +-- introduced. -- -- @since 0.7 data TreeFold b = TreeFold @@ -450,7 +561,7 @@ -- a user's filter. This is used to force dependencies of a test to run. For -- example, if test @A@ depends on test @B@ and test @A@ is selected to run, test -- @B@ will be forced to match. Note that this only applies to dependencies --- specified using 'sequentialTestGroup'. +-- specified using 'dependentTestGroup'. type ForceTestMatch = Any -- | Fold a test tree into a single value. @@ -504,7 +615,7 @@ AnnWithResource opts res0 tree -> fResource opts res0 $ \res -> go (tree res) AnnAfter opts deptype dep tree -> fAfter opts deptype dep (go tree) --- | 'TestTree' with arbitrary annotations, e. g., evaluated 'OptionSet'. +-- | 'TestTree' with arbitrary annotations, e. g., evaluated t'OptionSet'. data AnnTestTree ann = AnnEmptyTestTree -- ^ Just an empty test tree (e. g., when everything has been filtered out). @@ -581,15 +692,15 @@ AnnTestGroup (opts, _) name trees -> case lookupOption opts of - Parallel -> + Dependent _ -> + second + (mkGroup opts name) + (mapAccumR go forceMatch trees) + Independent _ -> bimap mconcat (mkGroup opts name) (unzip (map (go forceMatch) trees)) - Sequential _ -> - second - (mkGroup opts name) - (mapAccumR go forceMatch trees) AnnWithResource (opts, _) res0 tree -> ( fst (go forceMatch (tree (throwIO NotRunningTests))) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Ingredients/ConsoleReporter.hs new/tasty-1.5.4/Test/Tasty/Ingredients/ConsoleReporter.hs --- old/tasty-1.5.3/Test/Tasty/Ingredients/ConsoleReporter.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Ingredients/ConsoleReporter.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ -- vim:fdm=marker -{-# LANGUAGE BangPatterns, ImplicitParams, MultiParamTypeClasses, DeriveDataTypeable, FlexibleContexts, CApiFFI, NamedFieldPuns #-} +{-# LANGUAGE BangPatterns, ImplicitParams, MultiParamTypeClasses, FlexibleContexts, CApiFFI, NamedFieldPuns #-} -- | Console reporter ingredient. -- -- @since 0.11.3 @@ -66,6 +66,7 @@ #if !MIN_VERSION_base(4,11,0) import Data.Foldable (foldMap) #endif +import System.IO.Unsafe -------------------------------------------------- -- TestOutput base definitions @@ -124,7 +125,28 @@ type Level = Int --- | Build the 'TestOutput' for a 'TestTree' and 'OptionSet'. The @colors@ +-- TODO before the next major release: +-- refactor this as an argument to 'buildTestOutput' +-- to avoid unsafePerformIO. +-- (We cannot add another argument to 'buildTestOutput' +-- in the middle of tasty-1.5 series, because it is exported) +terminalWidth :: Maybe Int +terminalWidth = unsafePerformIO $ do + isTerminalStdin <- hIsTerminalDevice stdin + if isTerminalStdin + then fmap (fmap snd) getTerminalSize + else pure Nothing +{-# NOINLINE terminalWidth #-} + +-- | How wide could 'resultShortDescription' be (in non-extreme scenarios)? +-- Think of something like "OK", "FAIL (12.34s)", "TIMEOUT (100.00s)". +-- +-- The field is freeform and test providers can put an arbitrarily long data, +-- so we just settle for a reasonable (over)approximation. +approxMaxResultShortDescriptionWidth :: Int +approxMaxResultShortDescriptionWidth = 20 + +-- | Build the 'TestOutput' for a 'TestTree' and t'OptionSet'. The @colors@ -- ImplicitParam controls whether the output is colored. -- -- @since 0.11.3 @@ -132,7 +154,10 @@ buildTestOutput opts tree = let -- Do not retain the reference to the tree more than necessary - !alignment = computeAlignment opts tree + !rawAlignment = computeAlignment opts tree + !alignment = case terminalWidth of + Nothing -> rawAlignment + Just width -> min (width - approxMaxResultShortDescriptionWidth) rawAlignment MinDurationToReport{minDurationMicros} = lookupOption opts @@ -251,7 +276,7 @@ :: Monoid b => (String -> IO () -> IO Result -> (Result -> IO ()) -> b) -- ^ Eliminator for test cases. The @IO ()@ prints the testname. The - -- @IO Result@ blocks until the test is finished, returning it's 'Result'. + -- @IO Result@ blocks until the test is finished, returning it's t'Result'. -- The @Result -> IO ()@ function prints the formatted output. -> (String -> IO () -> b -> b) -- ^ Eliminator for test groups. The @IO ()@ prints the test group's name. @@ -395,7 +420,7 @@ mappend = (Sem.<>) #endif --- | @computeStatistics@ computes a summary 'Statistics' for +-- | @computeStatistics@ computes a summary t'Statistics' for -- a given state of the 'StatusMap'. -- Useful in combination with 'printStatistics'. -- @@ -597,7 +622,7 @@ -- -- @since 0.8 newtype Quiet = Quiet Bool - deriving (Eq, Ord, Typeable) + deriving (Eq, Ord) instance IsOption Quiet where defaultValue = Quiet False parseValue = fmap Quiet . safeReadBool @@ -612,7 +637,7 @@ -- -- @since 0.8 newtype HideSuccesses = HideSuccesses Bool - deriving (Eq, Ord, Typeable) + deriving (Eq, Ord) instance IsOption HideSuccesses where defaultValue = HideSuccesses False parseValue = fmap HideSuccesses . safeReadBool @@ -625,7 +650,7 @@ -- -- @since 1.5 newtype MinDurationToReport = MinDurationToReport { minDurationMicros :: Integer } - deriving (Eq, Ord, Typeable) + deriving (Eq, Ord) instance IsOption MinDurationToReport where defaultValue = MinDurationToReport 10000 parseValue = fmap MinDurationToReport . parseDuration @@ -644,7 +669,7 @@ = Never | Always | Auto -- ^ Only if stdout is an ANSI color supporting terminal - deriving (Eq, Ord, Typeable) + deriving (Eq, Ord) -- | Control color output instance IsOption UseColor where @@ -672,7 +697,6 @@ -- -- @since 1.3 newtype AnsiTricks = AnsiTricks { getAnsiTricks :: Bool } - deriving Typeable instance IsOption AnsiTricks where defaultValue = AnsiTricks True @@ -821,7 +845,7 @@ -- line or console detection. -- -- Can be used by providers that wish to provider specific result details printing, --- while re-using the tasty formats and coloring logic. +-- while reusing the tasty formats and coloring logic. -- -- @since 1.3.1 withConsoleFormat :: (?colors :: Bool) => ConsoleFormatPrinter diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Ingredients/ListTests.hs new/tasty-1.5.4/Test/Tasty/Ingredients/ListTests.hs --- old/tasty-1.5.3/Test/Tasty/Ingredients/ListTests.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Ingredients/ListTests.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ -- | Ingredient for listing test names -{-# LANGUAGE CPP, GeneralizedNewtypeDeriving, DeriveDataTypeable #-} +{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-} module Test.Tasty.Ingredients.ListTests ( ListTests(..) , testsNames @@ -7,7 +7,6 @@ ) where import Data.Proxy -import Data.Typeable import Options.Applicative import Test.Tasty.Core @@ -19,7 +18,7 @@ -- -- @since 0.4 newtype ListTests = ListTests Bool - deriving (Eq, Ord, Typeable) + deriving (Eq, Ord) instance IsOption ListTests where defaultValue = ListTests False parseValue = fmap ListTests . safeReadBool diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Ingredients.hs new/tasty-1.5.4/Test/Tasty/Ingredients.hs --- old/tasty-1.5.3/Test/Tasty/Ingredients.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Ingredients.hs 2001-09-09 03:46:40.000000000 +0200 @@ -36,7 +36,7 @@ -- which options it cares about, so that those options are presented to -- the user if the ingredient is included in the test suite. -- --- An ingredient can choose, typically based on the 'OptionSet', whether to +-- An ingredient can choose, typically based on the t'OptionSet', whether to -- run. That's what the 'Maybe' is for. The first ingredient that agreed to -- run does its work, and the remaining ingredients are ignored. Thus, the -- order in which you arrange the ingredients may matter. @@ -87,7 +87,7 @@ -- | Try to run an 'Ingredient'. -- --- If the ingredient refuses to run (usually based on the 'OptionSet'), +-- If the ingredient refuses to run (usually based on the t'OptionSet'), -- the function returns 'Nothing'. -- -- For a 'TestReporter', this function automatically starts running the @@ -117,7 +117,7 @@ -- -- Note that this isn't the same as simply pattern-matching on -- 'Ingredient'. E.g. options for a 'TestReporter' automatically include --- 'NumThreads'. +-- t'NumThreads'. -- -- @since 0.4 ingredientOptions :: Ingredient -> [OptionDescription] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Options/Core.hs new/tasty-1.5.4/Test/Tasty/Options/Core.hs --- old/tasty-1.5.3/Test/Tasty/Options/Core.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Options/Core.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ -- | Core options, i.e. the options used by tasty itself -{-# LANGUAGE CPP, DeriveDataTypeable, GeneralizedNewtypeDeriving #-} +{-# LANGUAGE CPP, GeneralizedNewtypeDeriving #-} {-# OPTIONS_GHC -fno-warn-type-defaults #-} -- for (^) module Test.Tasty.Options.Core ( NumThreads(..) @@ -14,13 +14,14 @@ import Control.Monad (mfilter) import Data.Proxy -import Data.Typeable import Data.Fixed import Options.Applicative hiding (str) import GHC.Conc #if !MIN_VERSION_base(4,11,0) import Data.Monoid #endif +import Control.Concurrent +import System.IO.Unsafe import Test.Tasty.Options import Test.Tasty.Patterns @@ -36,14 +37,15 @@ -- -- @since 0.1 newtype NumThreads = NumThreads { getNumThreads :: Int } - deriving (Eq, Ord, Num, Typeable) + deriving (Eq, Ord, Num) instance IsOption NumThreads where - defaultValue = NumThreads numCapabilities + defaultValue = unsafePerformIO $ NumThreads <$> + if rtsSupportsBoundThreads then getNumProcessors else pure 1 parseValue = mfilter onlyPositive . fmap NumThreads . safeRead optionName = return "num-threads" optionHelp = return "Number of threads to use for tests execution" optionCLParser = mkOptionCLParser (short 'j' <> metavar "NUMBER") - showDefaultValue _ = Just "# of cores/capabilities" + showDefaultValue _ = Just "Number of cores when using threaded RTS, 1 for non-threaded" -- | Filtering function to prevent non-positive number of threads onlyPositive :: NumThreads -> Bool @@ -60,15 +62,14 @@ | NoTimeout deriving ( Eq - -- ^ Auto-derived instance, just to allow storing in a 'Map' and such. + -- ^ Auto-derived instance, just to allow storing in a 'Data.Map.Map' and such. -- -- @since 1.5.1 , Ord - -- ^ Auto-derived instance, just to allow storing in a 'Map' and such. + -- ^ Auto-derived instance, just to allow storing in a 'Data.Map.Map' and such. -- -- @since 1.5.1 , Show - , Typeable ) instance IsOption Timeout where @@ -99,7 +100,7 @@ _ -> Nothing _ -> Nothing --- | A shortcut for creating 'Timeout' values. +-- | A shortcut for creating v'Timeout' values. -- -- @since 0.8 mkTimeout @@ -116,7 +117,7 @@ -- -- @since 1.5 newtype HideProgress = HideProgress { getHideProgress :: Bool } - deriving (Eq, Ord, Typeable) + deriving (Eq, Ord) instance IsOption HideProgress where defaultValue = HideProgress False parseValue = fmap HideProgress . safeReadBool @@ -126,7 +127,7 @@ -- | The list of all core options, i.e. the options not specific to any -- provider or ingredient, but to tasty itself. Currently contains --- 'TestPattern' and 'Timeout'. +-- t'TestPattern', t'Timeout' and t'HideProgress'. -- -- @since 0.1 coreOptions :: [OptionDescription] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Options/Env.hs new/tasty-1.5.4/Test/Tasty/Options/Env.hs --- old/tasty-1.5.3/Test/Tasty/Options/Env.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Options/Env.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ -- | Get options from the environment -{-# LANGUAGE DeriveDataTypeable, ScopedTypeVariables #-} +{-# LANGUAGE ScopedTypeVariables #-} module Test.Tasty.Options.Env (getEnvOptions, suiteEnvOptions) where import Test.Tasty.Options @@ -8,14 +8,10 @@ import Test.Tasty.Runners.Reducers import System.Environment -import Data.Foldable import Data.Tagged import Data.Proxy import Data.Char -import Data.Typeable import Control.Exception -import Control.Applicative -import Prelude -- Silence AMP and FTP import warnings import Text.Printf data EnvOptionException @@ -23,7 +19,6 @@ String -- option name String -- variable name String -- value - deriving (Typeable) instance Show EnvOptionException where show (BadOption optName varName value) = diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Options.hs new/tasty-1.5.4/Test/Tasty/Options.hs --- old/tasty-1.5.3/Test/Tasty/Options.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Options.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE ScopedTypeVariables, DeriveDataTypeable, +{-# LANGUAGE ScopedTypeVariables, ExistentialQuantification, GADTs, FlexibleInstances, UndecidableInstances, TypeOperators #-} @@ -135,7 +135,7 @@ changeOption :: forall v . IsOption v => (v -> v) -> OptionSet -> OptionSet changeOption f s = setOption (f $ lookupOption s) s --- | Create a singleton 'OptionSet'. +-- | Create a singleton t'OptionSet'. -- -- @since 0.8 singleOption :: IsOption v => v -> OptionSet diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Parallel.hs new/tasty-1.5.4/Test/Tasty/Parallel.hs --- old/tasty-1.5.3/Test/Tasty/Parallel.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Parallel.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,4 @@ -- | A helper module which takes care of parallelism -{-# LANGUAGE DeriveDataTypeable #-} module Test.Tasty.Parallel (ActionStatus(..), Action(..), runInParallel) where import Control.Monad @@ -8,7 +7,7 @@ import Control.Concurrent.STM import Foreign.StablePtr --- | What to do about an 'Action'? +-- | What to do about an t'Action'? data ActionStatus = ActionReady -- ^ the action is ready to be executed @@ -42,6 +41,12 @@ -- actions themselves. Any exceptions that reach this function or its -- threads are by definition unexpected. runInParallel nthreads actions = do + -- When linked with threaded RTS, ensure we have enough Capabilities + -- so that all Haskell worker threads can truly run in parallel. + when rtsSupportsBoundThreads $ do + ncap <- getNumCapabilities + when (ncap < nthreads) $ setNumCapabilities nthreads + callingThread <- myThreadId -- Don't let the main thread be garbage-collected diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Patterns/Eval.hs new/tasty-1.5.4/Test/Tasty/Patterns/Eval.hs --- old/tasty-1.5.3/Test/Tasty/Patterns/Eval.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Patterns/Eval.hs 2001-09-09 03:46:40.000000000 +0200 @@ -12,10 +12,6 @@ import Data.Maybe import Data.Char import Test.Tasty.Patterns.Types -#if !MIN_VERSION_base(4,9,0) -import Control.Applicative -import Data.Traversable -#endif -- | @since 1.2 type Path = Seq.Seq String diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Patterns/Parser.hs new/tasty-1.5.4/Test/Tasty/Patterns/Parser.hs --- old/tasty-1.5.3/Test/Tasty/Patterns/Parser.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Patterns/Parser.hs 2001-09-09 03:46:40.000000000 +0200 @@ -25,7 +25,7 @@ type Token = ReadP --- | A separate 'Parser' data type ensures that we don't forget to skip +-- | A separate t'Parser' data type ensures that we don't forget to skip -- spaces. -- -- @since 1.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Patterns.hs new/tasty-1.5.4/Test/Tasty/Patterns.hs --- old/tasty-1.5.3/Test/Tasty/Patterns.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Patterns.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,6 +1,6 @@ -- | Test patterns -{-# LANGUAGE CPP, DeriveDataTypeable, TypeApplications #-} +{-# LANGUAGE CPP, TypeApplications #-} module Test.Tasty.Patterns ( TestPattern(..) @@ -21,7 +21,6 @@ import Data.Coerce (coerce) import Data.List.NonEmpty (nonEmpty) import Data.Maybe (catMaybes) -import Data.Typeable import Options.Applicative hiding (Success) #if !MIN_VERSION_base(4,11,0) import Data.Monoid @@ -33,8 +32,7 @@ TestPattern (Maybe Expr) deriving - ( Typeable - , Show -- ^ @since 1.1 + ( Show -- ^ @since 1.1 , Eq -- ^ @since 1.1 ) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Providers/ConsoleFormat.hs new/tasty-1.5.4/Test/Tasty/Providers/ConsoleFormat.hs --- old/tasty-1.5.3/Test/Tasty/Providers/ConsoleFormat.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Providers/ConsoleFormat.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,5 +1,5 @@ -- | This module can be used by providers to perform colorful/formatted --- output and possibly re-use tasty's own output formats. +-- output and possibly reuse tasty's own output formats. -- -- @since 1.3.1 module Test.Tasty.Providers.ConsoleFormat @@ -68,13 +68,13 @@ infoFailFormat :: ConsoleFormat infoFailFormat = ConsoleFormat NormalIntensity Dull Red --- | Format used to display sucesses +-- | Format used to display successes -- -- @since 1.3.1 okFormat :: ConsoleFormat okFormat = ConsoleFormat NormalIntensity Dull Green --- | Format used to display additional information on sucesses +-- | Format used to display additional information on successes -- -- @since 1.3.1 infoOkFormat :: ConsoleFormat diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Providers.hs new/tasty-1.5.4/Test/Tasty/Providers.hs --- old/tasty-1.5.3/Test/Tasty/Providers.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Providers.hs 2001-09-09 03:46:40.000000000 +0200 @@ -23,7 +23,7 @@ singleTest :: IsTest t => TestName -> t -> TestTree singleTest = SingleTest --- | 'Result' of a passed test. +-- | t'Result' of a passed test. -- -- @since 0.8 testPassed @@ -37,21 +37,7 @@ , resultDetailsPrinter = noResultDetails } --- | 'Result' of a failed test. --- --- @since 0.8 -testFailed - :: String -- ^ description - -> Result -testFailed desc = Result - { resultOutcome = Failure TestFailed - , resultDescription = desc - , resultShortDescription = "FAIL" - , resultTime = 0 - , resultDetailsPrinter = noResultDetails - } - --- | 'Result' of a failed test with custom details printer +-- | t'Result' of a failed test with custom details printer -- -- @since 1.3.1 testFailedDetails diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Run.hs new/tasty-1.5.4/Test/Tasty/Run.hs --- old/tasty-1.5.3/Test/Tasty/Run.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Run.hs 2001-09-09 03:46:40.000000000 +0200 @@ -1,6 +1,6 @@ -- | Running tests {-# LANGUAGE ScopedTypeVariables, ExistentialQuantification, RankNTypes, - FlexibleContexts, CPP, DeriveDataTypeable, LambdaCase, + FlexibleContexts, CPP, LambdaCase, RecordWildCards, NamedFieldPuns #-} module Test.Tasty.Run ( Status(..) @@ -18,7 +18,6 @@ import Data.List (intercalate) import Data.Graph (SCC(..), stronglyConnComp) import Data.Sequence (Seq, (|>), (<|), (><)) -import Data.Typeable import Control.Monad (forever, guard, join, liftM) import Control.Monad.IO.Class (liftIO) import Control.Monad.Trans.Reader (ReaderT(..), local, ask) @@ -27,11 +26,9 @@ import Control.Concurrent.STM import Control.Concurrent.Async import Control.Exception as E -import Control.Applicative import Control.Arrow import Data.Monoid (First(..)) import GHC.Conc (labelThread) -import Prelude -- Silence AMP and FTP import warnings #if MIN_VERSION_base(4,18,0) import Data.Traversable (mapAccumM) @@ -137,7 +134,7 @@ timed $ applyTimeout timeoutOpt $ do r <- wait asy -- Not only wait for the result to be returned, but make sure to - -- evalute it inside applyTimeout; see #280. + -- evaluate it inside applyTimeout; see #280. evaluate $ resultOutcome r `seq` forceElements (resultDescription r) `seq` @@ -249,7 +246,6 @@ -- A finishes. Field lists detected cycles. -- -- @since 1.5 - deriving (Typeable) instance Show DependencyException where show (DependencyLoop css) = "Test dependencies have cycles:\n" ++ showCycles css @@ -282,7 +278,7 @@ data Dependency = Dependency DependencyType DependencySpec deriving (Eq, Show) --- | Is given 'Dependency' a dependency that was introduced with 'After'? +-- | Is given t'Dependency' a dependency that was introduced with 'After'? isPatternDependency :: Dependency -> Bool isPatternDependency (Dependency _ (PatternDep {})) = True isPatternDependency _ = False @@ -291,7 +287,7 @@ -- The mapAccumM function behaves like a combination of mapM and mapAccumL that -- traverses the structure while evaluating the actions and passing an accumulating -- parameter from left to right. It returns a final value of this accumulator --- together with the new structure. The accummulator is often used for caching the +-- together with the new structure. The accumulator is often used for caching the -- intermediate results of a computation. mapAccumM :: Monad m => (acc -> x -> m (acc, y)) -> acc -> [x] -> m (acc, [y]) mapAccumM _ acc [] = return (acc, []) @@ -304,7 +300,7 @@ -- | An action with meta information data TestAction act = TestAction { testAction :: act - -- ^ Some action, typically 'UnresolvedAction', 'ResolvedAction', or 'Action'. + -- ^ Some action, typically 'UnresolvedAction', 'ResolvedAction', or t'Action'. , testPath :: Path -- ^ Path pointing to this action (a series of group names + a test name) , testDeps :: Seq Dependency @@ -325,8 +321,8 @@ type Size = Int -- | Simplified version of 'TestTree' that only includes the tests to be run (as --- a 'TestAction') and the resources needed to run them (as 'Initializer's and --- 'Finalizer's). +-- a t'TestAction') and the resources needed to run them (as t'Initializer's and +-- t'Finalizer's). data TestActionTree act = TResource Initializer Finalizer (TestActionTree act) | TGroup Size [TestActionTree act] @@ -419,10 +415,13 @@ foldGroup opts name trees = fmap tGroup $ local (first (|> name)) $ case lookupOption opts of - Parallel -> - sequence trees - Sequential depType -> - snd <$> mapAccumM (goSeqGroup depType) mempty trees + Independent Parallel -> sequence trees + Independent NonParallel -> foldSequential AllFinish trees + Dependent depType -> foldSequential depType trees + + foldSequential :: DependencyType -> [Tr] -> ReaderT (Path, Seq Dependency) IO [TestActionTree UnresolvedAction] + foldSequential depType = + fmap snd . mapAccumM (goSeqGroup depType) mempty -- * Utility functions collectTests :: TestActionTree act -> [TestAction act] @@ -577,7 +576,7 @@ FailedToCreate {} -> return $ return Nothing Destroyed -> return $ return Nothing --- While tasty allows to configure 'OptionSet' at any level of test tree, +-- While tasty allows to configure t'OptionSet' at any level of test tree, -- it often has any effect only on options of test providers (class IsTest). -- But test runners and reporters typically only look into the OptionSet -- they were given as an argument. This is not unreasonable: e. g., if an option @@ -586,9 +585,9 @@ -- a global option, without passing it via command line. -- -- 'applyTopLevelPlusTestOptions' allows for a compromise: unwrap top-level --- 'PlusTestOptions' from the 'TestTree' and apply them to the 'OptionSet' +-- 'PlusTestOptions' from the 'TestTree' and apply them to the t'OptionSet' -- from command line. This way a user can wrap their tests in --- 'adjustOption' / 'localOption' forcing, for instance, 'NumThreads' to 1. +-- 'adjustOption' / 'localOption' forcing, for instance, t'NumThreads' to 1. -- -- This function is not publicly exposed. applyTopLevelPlusTestOptions @@ -607,7 +606,7 @@ -- -- Once the callback returns, stop running the tests. -- --- The number of test running threads is determined by the 'NumThreads' +-- The number of test running threads is determined by the t'NumThreads' -- option. -- -- @since 0.10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Runners/Reducers.hs new/tasty-1.5.4/Test/Tasty/Runners/Reducers.hs --- old/tasty-1.5.3/Test/Tasty/Runners/Reducers.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Runners/Reducers.hs 2001-09-09 03:46:40.000000000 +0200 @@ -41,8 +41,8 @@ module Test.Tasty.Runners.Reducers where +import Prelude hiding (Applicative(..)) import Control.Applicative -import Prelude -- Silence AMP import warnings import qualified Data.Semigroup as Sem -- | Monoid generated by '*>'. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty/Runners/Utils.hs new/tasty-1.5.4/Test/Tasty/Runners/Utils.hs --- old/tasty-1.5.3/Test/Tasty/Runners/Utils.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty/Runners/Utils.hs 2001-09-09 03:46:40.000000000 +0200 @@ -4,11 +4,8 @@ module Test.Tasty.Runners.Utils where import Control.Exception -import Control.Applicative import Control.Concurrent (mkWeakThreadId, myThreadId) import Control.Monad (forM_) -import Data.Typeable (Typeable) -import Prelude -- Silence AMP import warnings import Text.Printf import Foreign.C (CInt) @@ -66,7 +63,7 @@ -- from https://ro-che.info/articles/2014-07-30-bracket -- | Install signal handlers so that e.g. the cursor is restored if the test --- suite is killed by SIGTERM. Upon a signal, a 'SignalException' will be +-- suite is killed by SIGTERM. Upon a signal, a t'SignalException' will be -- thrown to the thread that has executed this action. -- -- This function is called automatically from the @defaultMain*@ family of @@ -102,7 +99,7 @@ -- -- @since 1.2.1 newtype SignalException = SignalException CInt - deriving (Show, Typeable) + deriving (Show) instance Exception SignalException -- | Measure the time taken by an 'IO' action to run. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/Test/Tasty.hs new/tasty-1.5.4/Test/Tasty.hs --- old/tasty-1.5.3/Test/Tasty.hs 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/Test/Tasty.hs 2001-09-09 03:46:40.000000000 +0200 @@ -33,7 +33,9 @@ TestName , TestTree , testGroup + , dependentTestGroup , sequentialTestGroup + , inOrderTestGroup -- * Running tests , defaultMain , defaultMainWithIngredients diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/tasty-1.5.3/tasty.cabal new/tasty-1.5.4/tasty.cabal --- old/tasty-1.5.3/tasty.cabal 2001-09-09 03:46:40.000000000 +0200 +++ new/tasty-1.5.4/tasty.cabal 2001-09-09 03:46:40.000000000 +0200 @@ -1,6 +1,6 @@ cabal-version: >=1.10 name: tasty -version: 1.5.3 +version: 1.5.4 synopsis: Modern and extensible testing framework description: Tasty is a modern testing framework for Haskell. It lets you combine your unit tests, golden @@ -29,12 +29,12 @@ library exposed-modules: - Test.Tasty, - Test.Tasty.Options, - Test.Tasty.Providers, - Test.Tasty.Providers.ConsoleFormat, + Test.Tasty + Test.Tasty.Options + Test.Tasty.Providers + Test.Tasty.Providers.ConsoleFormat Test.Tasty.Runners - Test.Tasty.Ingredients, + Test.Tasty.Ingredients Test.Tasty.Ingredients.Basic Test.Tasty.Ingredients.ConsoleReporter @@ -45,36 +45,33 @@ Test.Tasty.Patterns.Eval other-modules: Control.Concurrent.Async - Test.Tasty.Parallel, - Test.Tasty.Core, - Test.Tasty.Options.Core, - Test.Tasty.Options.Env, - Test.Tasty.Patterns, - Test.Tasty.Patterns.Expr, - Test.Tasty.Run, - Test.Tasty.Runners.Reducers, - Test.Tasty.Runners.Utils, - Test.Tasty.CmdLine, + Test.Tasty.Parallel + Test.Tasty.Core + Test.Tasty.Options.Core + Test.Tasty.Options.Env + Test.Tasty.Patterns + Test.Tasty.Patterns.Expr + Test.Tasty.Run + Test.Tasty.Runners.Reducers + Test.Tasty.Runners.Utils + Test.Tasty.CmdLine Test.Tasty.Ingredients.ListTests Test.Tasty.Ingredients.IncludingOptions build-depends: base >= 4.9 && < 5, stm >= 2.3 && < 2.6, - containers >= 0.5.8 && < 0.8, + containers >= 0.5.8 && < 0.9, transformers >= 0.5 && < 0.7, tagged >= 0.5 && < 0.9, - optparse-applicative >= 0.14 && < 0.19, + optparse-applicative >= 0.14 && < 0.20, ansi-terminal >= 0.9 && < 1.2 -- No reason to depend on unbounded-delays on 64-bit architecture - if(!arch(x86_64) && !arch(aarch64) && !arch(ppc64) && !arch(s390x) && !arch(riscv64)) + if(!arch(x86_64) && !arch(aarch64) && !arch(ppc64le) && !arch(ppc64) && !arch(s390x) && !arch(riscv64) && !arch(loongarch64)) build-depends: unbounded-delays >= 0.1 && < 0.2 - if(!impl(ghc >= 8.0)) - build-depends: semigroups < 0.21 - if(!impl(ghc >= 8.4)) build-depends: time >= 1.4 && < 1.13 @@ -85,7 +82,7 @@ -- hs-source-dirs: default-language: Haskell2010 - default-extensions: CPP, ScopedTypeVariables, DeriveDataTypeable + default-extensions: CPP, ScopedTypeVariables ghc-options: -Wall -Wno-incomplete-uni-patterns
