sydtest 0.15.1.1 → 0.15.1.2
raw patch · 49 files changed
+50/−2487 lines, 49 filesdep −sydtestPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependencies removed: sydtest
API changes (from Hackage documentation)
- Test.Syd: [DefAroundAllNode] :: ((outer -> IO ()) -> IO ()) -> SpecDefForest (outer : otherOuters) inner extra -> SpecDefTree otherOuters inner extra
+ Test.Syd: [DefAroundAllNode] :: ((outer -> IO ()) -> IO ()) -> SpecDefForest (outer ': otherOuters) inner extra -> SpecDefTree otherOuters inner extra
- Test.Syd: [DefAroundAllWithNode] :: ((newOuter -> IO ()) -> oldOuter -> IO ()) -> SpecDefForest (newOuter : (oldOuter : otherOuters)) inner extra -> SpecDefTree (oldOuter : otherOuters) inner extra
+ Test.Syd: [DefAroundAllWithNode] :: ((newOuter -> IO ()) -> oldOuter -> IO ()) -> SpecDefForest (newOuter ': (oldOuter ': otherOuters)) inner extra -> SpecDefTree (oldOuter ': otherOuters) inner extra
- Test.Syd: [DefBeforeAllNode] :: IO outer -> SpecDefForest (outer : otherOuters) inner extra -> SpecDefTree otherOuters inner extra
+ Test.Syd: [DefBeforeAllNode] :: IO outer -> SpecDefForest (outer ': otherOuters) inner extra -> SpecDefTree otherOuters inner extra
- Test.Syd: [DefBeforeAllWithNode] :: (oldOuter -> IO newOuter) -> SpecDefForest (newOuter : (oldOuter : otherOuters)) inner extra -> SpecDefTree (oldOuter : otherOuters) inner extra
+ Test.Syd: [DefBeforeAllWithNode] :: (oldOuter -> IO newOuter) -> SpecDefForest (newOuter ': (oldOuter ': otherOuters)) inner extra -> SpecDefTree (oldOuter ': otherOuters) inner extra
- Test.Syd: afterAll :: (outer -> IO ()) -> TestDefM (outer : otherOuters) inner result -> TestDefM (outer : otherOuters) inner result
+ Test.Syd: afterAll :: (outer -> IO ()) -> TestDefM (outer ': otherOuters) inner result -> TestDefM (outer ': otherOuters) inner result
- Test.Syd: aroundAll :: ((outer -> IO ()) -> IO ()) -> TestDefM (outer : otherOuters) inner result -> TestDefM otherOuters inner result
+ Test.Syd: aroundAll :: ((outer -> IO ()) -> IO ()) -> TestDefM (outer ': otherOuters) inner result -> TestDefM otherOuters inner result
- Test.Syd: aroundAllWith :: forall newOuter oldOuter otherOuters inner result. ((newOuter -> IO ()) -> oldOuter -> IO ()) -> TestDefM (newOuter : (oldOuter : otherOuters)) inner result -> TestDefM (oldOuter : otherOuters) inner result
+ Test.Syd: aroundAllWith :: forall newOuter oldOuter otherOuters inner result. ((newOuter -> IO ()) -> oldOuter -> IO ()) -> TestDefM (newOuter ': (oldOuter ': otherOuters)) inner result -> TestDefM (oldOuter ': otherOuters) inner result
- Test.Syd: beforeAll :: IO outer -> TestDefM (outer : otherOuters) inner result -> TestDefM otherOuters inner result
+ Test.Syd: beforeAll :: IO outer -> TestDefM (outer ': otherOuters) inner result -> TestDefM otherOuters inner result
- Test.Syd: beforeAllWith :: (previousOuter -> IO newOuter) -> TestDefM (newOuter : (previousOuter : otherOuters)) inner result -> TestDefM (previousOuter : otherOuters) inner result
+ Test.Syd: beforeAllWith :: (previousOuter -> IO newOuter) -> TestDefM (newOuter ': (previousOuter ': otherOuters)) inner result -> TestDefM (previousOuter ': otherOuters) inner result
- Test.Syd: itWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: itWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: itWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: itWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: setupAroundAllWith :: (oldOuter -> SetupFunc newOuter) -> TestDefM (newOuter : (oldOuter : outers)) inner result -> TestDefM (oldOuter : outers) inner result
+ Test.Syd: setupAroundAllWith :: (oldOuter -> SetupFunc newOuter) -> TestDefM (newOuter ': (oldOuter ': outers)) inner result -> TestDefM (oldOuter ': outers) inner result
- Test.Syd: specifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: specifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: specifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: specifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: xitWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: xitWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: xitWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: xitWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: xspecifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: xspecifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd: xspecifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd: xspecifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.AroundAll: afterAll :: (outer -> IO ()) -> TestDefM (outer : otherOuters) inner result -> TestDefM (outer : otherOuters) inner result
+ Test.Syd.Def.AroundAll: afterAll :: (outer -> IO ()) -> TestDefM (outer ': otherOuters) inner result -> TestDefM (outer ': otherOuters) inner result
- Test.Syd.Def.AroundAll: aroundAll :: ((outer -> IO ()) -> IO ()) -> TestDefM (outer : otherOuters) inner result -> TestDefM otherOuters inner result
+ Test.Syd.Def.AroundAll: aroundAll :: ((outer -> IO ()) -> IO ()) -> TestDefM (outer ': otherOuters) inner result -> TestDefM otherOuters inner result
- Test.Syd.Def.AroundAll: aroundAllWith :: forall newOuter oldOuter otherOuters inner result. ((newOuter -> IO ()) -> oldOuter -> IO ()) -> TestDefM (newOuter : (oldOuter : otherOuters)) inner result -> TestDefM (oldOuter : otherOuters) inner result
+ Test.Syd.Def.AroundAll: aroundAllWith :: forall newOuter oldOuter otherOuters inner result. ((newOuter -> IO ()) -> oldOuter -> IO ()) -> TestDefM (newOuter ': (oldOuter ': otherOuters)) inner result -> TestDefM (oldOuter ': otherOuters) inner result
- Test.Syd.Def.AroundAll: beforeAll :: IO outer -> TestDefM (outer : otherOuters) inner result -> TestDefM otherOuters inner result
+ Test.Syd.Def.AroundAll: beforeAll :: IO outer -> TestDefM (outer ': otherOuters) inner result -> TestDefM otherOuters inner result
- Test.Syd.Def.AroundAll: beforeAllWith :: (previousOuter -> IO newOuter) -> TestDefM (newOuter : (previousOuter : otherOuters)) inner result -> TestDefM (previousOuter : otherOuters) inner result
+ Test.Syd.Def.AroundAll: beforeAllWith :: (previousOuter -> IO newOuter) -> TestDefM (newOuter ': (previousOuter ': otherOuters)) inner result -> TestDefM (previousOuter ': otherOuters) inner result
- Test.Syd.Def.SetupFunc: setupAroundAllWith :: (oldOuter -> SetupFunc newOuter) -> TestDefM (newOuter : (oldOuter : outers)) inner result -> TestDefM (oldOuter : outers) inner result
+ Test.Syd.Def.SetupFunc: setupAroundAllWith :: (oldOuter -> SetupFunc newOuter) -> TestDefM (newOuter ': (oldOuter ': outers)) inner result -> TestDefM (oldOuter ': outers) inner result
- Test.Syd.Def.Specify: itWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: itWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: itWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: itWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: specifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: specifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: specifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: specifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: xitWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: xitWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: xitWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: xitWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: xspecifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: xspecifyWithBoth :: (HasCallStack, IsTest test, Arg1 test ~ outer, Arg2 test ~ inner) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.Def.Specify: xspecifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer : otherOuters) inner ()
+ Test.Syd.Def.Specify: xspecifyWithOuter :: (HasCallStack, IsTest test, Arg1 test ~ inner, Arg2 test ~ outer) => String -> test -> TestDefM (outer ': otherOuters) inner ()
- Test.Syd.HList: [HCons] :: e -> HList l -> HList (e : l)
+ Test.Syd.HList: [HCons] :: e -> HList l -> HList (e ': l)
- Test.Syd.OptParse: manyOptional :: Mod OptionFields [Text] -> Parser [Text]
+ Test.Syd.OptParse: manyOptional :: Mod OptionFields Text -> Parser [Text]
- Test.Syd.SpecDef: [DefAroundAllNode] :: ((outer -> IO ()) -> IO ()) -> SpecDefForest (outer : otherOuters) inner extra -> SpecDefTree otherOuters inner extra
+ Test.Syd.SpecDef: [DefAroundAllNode] :: ((outer -> IO ()) -> IO ()) -> SpecDefForest (outer ': otherOuters) inner extra -> SpecDefTree otherOuters inner extra
- Test.Syd.SpecDef: [DefAroundAllWithNode] :: ((newOuter -> IO ()) -> oldOuter -> IO ()) -> SpecDefForest (newOuter : (oldOuter : otherOuters)) inner extra -> SpecDefTree (oldOuter : otherOuters) inner extra
+ Test.Syd.SpecDef: [DefAroundAllWithNode] :: ((newOuter -> IO ()) -> oldOuter -> IO ()) -> SpecDefForest (newOuter ': (oldOuter ': otherOuters)) inner extra -> SpecDefTree (oldOuter ': otherOuters) inner extra
- Test.Syd.SpecDef: [DefBeforeAllNode] :: IO outer -> SpecDefForest (outer : otherOuters) inner extra -> SpecDefTree otherOuters inner extra
+ Test.Syd.SpecDef: [DefBeforeAllNode] :: IO outer -> SpecDefForest (outer ': otherOuters) inner extra -> SpecDefTree otherOuters inner extra
- Test.Syd.SpecDef: [DefBeforeAllWithNode] :: (oldOuter -> IO newOuter) -> SpecDefForest (newOuter : (oldOuter : otherOuters)) inner extra -> SpecDefTree (oldOuter : otherOuters) inner extra
+ Test.Syd.SpecDef: [DefBeforeAllWithNode] :: (oldOuter -> IO newOuter) -> SpecDefForest (newOuter ': (oldOuter ': otherOuters)) inner extra -> SpecDefTree (oldOuter ': otherOuters) inner extra
Files
- CHANGELOG.md +4/−0
- CONTRIBUTORS +1/−0
- LICENSE.md +1/−1
- multi-discover-test/Bar/BarSpec.hs +0/−12
- multi-discover-test/Bar/Spec.hs +0/−1
- multi-discover-test/Baz/Qux/QuxSpec.hs +0/−8
- multi-discover-test/Baz/Qux/Spec.hs +0/−1
- multi-discover-test/DoNotDiscover/FooSpec.hs +0/−11
- multi-discover-test/Foo/FooSpec.hs +0/−9
- multi-discover-test/Foo/Spec.hs +0/−1
- multi-discover-test/Main.hs +0/−12
- output-test/Main.hs +0/−58
- output-test/Spec.hs +0/−350
- src/Test/Syd/Def/Around.hs +5/−6
- src/Test/Syd/Def/Golden.hs +2/−2
- src/Test/Syd/Def/SetupFunc.hs +1/−1
- src/Test/Syd/Def/Specify.hs +3/−3
- src/Test/Syd/Expectation.hs +3/−3
- src/Test/Syd/HList.hs +1/−1
- src/Test/Syd/OptParse.hs +2/−3
- src/Test/Syd/Output.hs +5/−5
- src/Test/Syd/Run.hs +10/−10
- src/Test/Syd/Runner/Wrappers.hs +4/−4
- src/Test/Syd/SpecDef.hs +5/−5
- sydtest.cabal +3/−92
- test/Spec.hs +0/−1
- test/Test/Syd/AroundAllSpec.hs +0/−145
- test/Test/Syd/AroundCombinationSpec.hs +0/−44
- test/Test/Syd/AroundSpec.hs +0/−133
- test/Test/Syd/DescriptionsSpec.hs +0/−14
- test/Test/Syd/DiffSpec.hs +0/−290
- test/Test/Syd/ExpectationSpec.hs +0/−13
- test/Test/Syd/FootgunSpec.hs +0/−50
- test/Test/Syd/GoldenSpec.hs +0/−31
- test/Test/Syd/OptParseSpec.hs +0/−32
- test/Test/Syd/PathSpec.hs +0/−28
- test/Test/Syd/ScenarioSpec.hs +0/−16
- test/Test/Syd/SequentialSpec.hs +0/−19
- test/Test/Syd/Specify/AllOuterSpec.hs +0/−29
- test/Test/Syd/SpecifySpec.hs +0/−40
- test/Test/Syd/TimingSpec.hs +0/−38
- test_resources/defaultSettings-show.golden +0/−20
- test_resources/even/2 +0/−1
- test_resources/even/4 +0/−1
- test_resources/even/odd/3 +0/−1
- test_resources/odd/3 +0/−1
- test_resources/odd/deep/5 +0/−1
- test_resources/output-test.txt +0/−930
- test_resources/output.golden +0/−10
CHANGELOG.md view
@@ -1,5 +1,9 @@ # Changelog +## [0.15.1.2] - 2024-07-18++* Fix parsing filter flags so it becomes easy to select tests with spaces in their description+ ## [0.15.1.1] - 2023-10-04 * Compatibility with `optparse-applicative > 0.18`.
CONTRIBUTORS view
@@ -3,3 +3,4 @@ mrcjkb L7R7 TheOddler+Nova In Silico
LICENSE.md view
@@ -1,6 +1,6 @@ # Sydtest License -Copyright (c) 2020-2022 Tom Sydney Kerckhove+Copyright (c) 2020-2024 Tom Sydney Kerckhove ## Anyone
− multi-discover-test/Bar/BarSpec.hs
@@ -1,12 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TypeOperators #-}--module Bar.BarSpec where--import Test.Syd--spec :: TestDef (String : otherOuters) ()-spec = do- describe "can access outer resource" $- itWithOuter "bar is bar" $- \s -> s `shouldBe` "bar"
− multi-discover-test/Bar/Spec.hs
@@ -1,1 +0,0 @@-{-# OPTIONS_GHC -F -pgmF sydtest-discover -optF --no-main #-}
− multi-discover-test/Baz/Qux/QuxSpec.hs
@@ -1,8 +0,0 @@-module Baz.Qux.QuxSpec where--import Test.Syd--spec :: Spec-spec = do- describe "several nesting levels" $- it "works" True
− multi-discover-test/Baz/Qux/Spec.hs
@@ -1,1 +0,0 @@-{-# OPTIONS_GHC -F -pgmF sydtest-discover -optF --no-main #-}
− multi-discover-test/DoNotDiscover/FooSpec.hs
@@ -1,11 +0,0 @@-{-# LANGUAGE TypeApplications #-}--module DoNotDiscover.FooSpec where--import Test.Syd--spec :: Spec-spec = do- describe "do not discover" $- it "always fails" $- expectationFailure @() "This test fails because sydtest-discover isn't working properly. This spec should not be discovered"
− multi-discover-test/Foo/FooSpec.hs
@@ -1,9 +0,0 @@-module Foo.FooSpec where--import Test.Syd--spec :: Spec-spec = do- describe "plain test" $- it "simple example" $- 2 + 3 == (5 :: Int)
− multi-discover-test/Foo/Spec.hs
@@ -1,1 +0,0 @@-{-# OPTIONS_GHC -F -pgmF sydtest-discover -optF --no-main #-}
− multi-discover-test/Main.hs
@@ -1,12 +0,0 @@-module Main where--import qualified Bar.Spec as Bar-import qualified Baz.Qux.QuxSpec as Qux-import qualified Foo.Spec as Foo-import Test.Syd--main :: IO ()-main = sydTest $ do- Foo.spec- beforeAll (pure "bar") Bar.spec- Qux.spec
− output-test/Main.hs
@@ -1,58 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -fno-warn-missing-fields -fno-warn-missing-methods -fno-warn-partial-fields -fno-warn-incomplete-uni-patterns -fno-warn-incomplete-record-updates #-}--module Main where--import qualified Data.Text.Encoding as TE-import qualified Data.Text.Lazy as LT-import qualified Data.Text.Lazy.Builder as TLB-import Spec (spec)-import Test.Syd-import Test.Syd.OptParse-import Text.Colour--main :: IO ()-main = do- settings <- getSettings- testForest <- execTestDefM settings spec-- putStrLn "Synchronous, non-interleaved"- rf1 <- timeItT 0 $ runSpecForestSynchronously settings testForest- printOutputSpecForest settings rf1-- putStrLn "Synchronous, interleaved"- _ <- runSpecForestInterleavedWithOutputSynchronously settings testForest-- putStrLn "Asynchronous, non-interleaved"- rf2 <- timeItT 0 $ runSpecForestAsynchronously settings 8 testForest- printOutputSpecForest settings rf2-- putStrLn "Asynchronous, interleaved"- _ <- runSpecForestInterleavedWithOutputAsynchronously settings 8 testForest-- putStrLn "Golden test of output"- sydTest $- describe "Golden Output" $- it "renders output in the same way as before" $- goldenByteStringFile "test_resources/output-test.txt" $ do- testForestInOrder <- execTestDefM settings $ doNotRandomiseExecutionOrder spec- rf <- timeItT 0 $ runSpecForestSynchronously settings testForestInOrder- let eraseTimed :: Timed a -> Timed a- eraseTimed t =- t- { timedBegin = 0,- timedEnd = 0,- timedWorker = 0- }-- erasedTimedInResultForest :: ResultForest -> ResultForest- erasedTimedInResultForest = fmap (fmap (fmap eraseTimed))- eraseTiming :: Timed ResultForest -> Timed ResultForest- eraseTiming = fmap erasedTimedInResultForest . eraseTimed- pure- $ TE.encodeUtf8- . LT.toStrict- . TLB.toLazyText- . renderResultReport defaultSettings With24BitColours- $ eraseTiming rf
− output-test/Spec.hs
@@ -1,350 +0,0 @@-{-# LANGUAGE NumericUnderscores #-}-{-# LANGUAGE OverloadedStrings #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# OPTIONS_GHC -fno-warn-missing-fields -fno-warn-missing-methods -fno-warn-partial-fields -fno-warn-incomplete-uni-patterns -fno-warn-incomplete-record-updates -fno-warn-overlapping-patterns #-}--module Spec where--import Control.Concurrent-import Control.Concurrent.STM-import Control.Exception-import Control.Monad-import Data.ByteString (ByteString)-import Data.List-import Data.Text (Text)-import qualified Data.Text.Lazy as LT-import qualified Data.Text.Lazy.Builder as TLB-import System.Exit-import System.Random (randomRIO)-import Test.QuickCheck-import Test.Syd-import Test.Syd.OptParse-import Text.Colour--data DangerousRecord = Cons1 {field :: String} | Cons2--class ToUnit a where- toUnit :: a -> ()--instance ToUnit Int -- No implementation on purpose--spec :: Spec-spec = do- it "Passes" (pure () :: IO ())- describe "error" $ do- it "Pure error" (pure (error "foobar") :: IO ())- it "Impure error" (error "foobar" :: IO ())- describe "undefined" $ do- it "Pure undefined" (pure undefined :: IO ())- it "Impure undefined" (undefined :: IO ())- it "Exit code" $ do- exitWith $ ExitFailure 1 :: IO ()- describe "exceptions" $ do- let exceptionTest :: String -> a -> Spec- exceptionTest s a = describe s $ do- it "fails in IO, as the result" (pure (seq a ()) :: IO ())- it "fails in IO, as the action" (seq a (pure ()) :: IO ())- it "fails in pure code" $ seq a True- it "Record construction error" (throw $ RecConError "test" :: IO ())- exceptionTest "Record construction error" $ let c = Cons1 {} in field c- it "Record selection error" (throw $ RecSelError "test" :: IO ())- exceptionTest "Record selection error" $ let c = Cons2 in field c- it "Record update error" (throw $ RecUpdError "test" :: IO ())- exceptionTest "Record update error" $ let c = Cons2 in c {field = "this will throw"}- it "Pattern matching error" (throw $ PatternMatchFail "test" :: IO ())- exceptionTest "Pattern matching error" $ let Cons1 s = Cons2 in s- it "ArithException" (throw Underflow :: IO ())- exceptionTest "Pattern matching error" $ 1 `div` (0 :: Int)- it "NoMethodError" (throw (NoMethodError "test") :: IO ())- exceptionTest "Pattern matching error" $ toUnit (5 :: Int)- describe "Printing" $ do- it "print" $ print 'a'- it "putStrLn" $ putStrLn "hi"- modifyMaxSuccess (`div` 10) $- modifyMaxSize (`div` 1) $- modifyMaxShrinks (const 1) $- modifyMaxDiscardRatio (const 1) $- describe "Property tests" $ do- describe "pure" $ do- it "reversing a list twice is the same as reversing it once" $- property $- \ls -> reverse (reverse ls) == (ls :: [Int])- it "should fail to show that sorting does nothing" $- property $- \ls -> sort ls == (ls :: [Int])- it "should work with custom generators too" $ forAll arbitrary $ \b -> b || True- describe "impure" $ do- it "reversing a list twice is the same as reversing it once" $- property $- \ls -> reverse (reverse ls) `shouldBe` (ls :: [Int])- it "should fail to show that sorting does nothing" $- property $- \ls -> sort ls `shouldBe` (ls :: [Int])- it "should work with custom generators too" $ forAll arbitrary $ \b -> (b || True) `shouldBe` True- describe "Long running tests" $- forM_ [1 :: Int .. 10] $- \i ->- it (concat ["takes a while (", show i, ")"]) $- threadDelay 100_000- describe "Diff" $ do- it "shows nice multi-line diffs" $- ("foo", replicate 7 "quux", "bar") `shouldBe` (("foofoo", replicate 6 "quux", "baz") :: (String, [String], String))- it "shows nice multi-line diffs" $- ("foo", [], "bar") `shouldBe` (("foofoo", replicate 6 "quux", "baz") :: (String, [String], String))- describe "assertions" $ do- it "shouldBe" $ 3 `shouldBe` (4 :: Int)- it "shouldNotBe" $ 3 `shouldNotBe` (3 :: Int)- it "shouldSatisfy" $ (3 :: Int) `shouldSatisfy` even- it "shouldNotSatisfy" $ (3 :: Int) `shouldNotSatisfy` odd- it "shouldSatisfyNamed" $ shouldSatisfyNamed (3 :: Int) "even" even- it "shouldNotSatisfyNamed" $ shouldNotSatisfyNamed (3 :: Int) "odd" odd- pending "pending test"- describe "Golden" $ do- it "does not fail the suite when an exception happens while reading" $- GoldenTest- { goldenTestRead = die "test",- goldenTestProduce = pure (),- goldenTestWrite = \() -> do- pure (),- goldenTestCompare = \() () -> Nothing- }- it "does not fail the suite when an exception happens while producing" $- GoldenTest- { goldenTestRead = pure Nothing,- goldenTestProduce = die "test",- goldenTestWrite = \() -> do- pure (),- goldenTestCompare = \() () -> Nothing- }- it "does not fail the suite when an exception happens while writing" $- GoldenTest- { goldenTestRead = pure Nothing,- goldenTestProduce = pure (),- goldenTestWrite = \() -> die "test",- goldenTestCompare = \() () -> Nothing- }- it "does not fail the suite when an exception happens while checking for equality" $- GoldenTest- { goldenTestRead = pure (Just ()),- goldenTestProduce = pure (),- goldenTestWrite = \() -> pure (),- goldenTestCompare = \actual expected -> case 1 `div` (0 :: Int) of- 1 -> Nothing- _ ->- if actual == expected- then Nothing- else Just $ NotEqualButShouldHaveBeenEqual (show actual) (show expected)- }-- describe "outputResultForest" $ do- it "outputs the same as last time" $ do- pureGoldenTextFile- "test_resources/output.golden"- (LT.toStrict $ TLB.toLazyText $ renderResultReport defaultSettings With24BitColours (Timed {timedValue = [], timedBegin = 0, timedEnd = 0, timedWorker = 0}))-- doNotRandomiseExecutionOrder $- describe "Around" $ do- describe "before" $ do- before (void (throwIO (userError "test"))) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "before_" $ do- before_ (throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "after" $ do- after (\_ -> throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "after_" $ do- after_ (throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "around" $ do- around (\_ -> throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "around_" $ do- around_ (\_ -> throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "aroundWith" $ do- aroundWith (\_ () -> throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- describe "aroundWith'" $ do- aroundWith' (\_ () () -> throwIO (userError "test")) $- it "does not kill the test suite" $ \() ->- pure () :: IO ()-- it "expectationFailure" (expectationFailure "fails" :: IO ())-- describe "String" $ do- it "compares strings" $ ("foo\nbar\tquux " :: String) `shouldBe` "foq\nbaz\tqex"- it "compares strings" $ ("foo\nbar\tquux " :: String) `stringShouldBe` "foq\nbaz\tqex"- it "compares texts" $ ("foo\nbar\tquux " :: Text) `shouldBe` "foq\nbaz\tqex"- it "compares texts" $ ("foo\nbar\tquux " :: Text) `textShouldBe` "foq\nbaz\tqex"- it "compares bytestrings" $ ("foo\nbar\tquux " :: ByteString) `shouldBe` "foq\nbaz\tqex"-- describe "Context" $ do- it "shows a nice context" $ context "Context" $ True `shouldBe` False- it "shows a nice context multiple levels deep" $- context "Context1" $- context "Context2" $- context "Context3" $- True `shouldBe` False- it "shows a context when an exception is thrown as well" $- context "context" (undefined :: IO ())-- modifyMaxSize (`div` 10) $- describe "Property" $ do- describe "0 tests run" $ modifyMaxSuccess (const 0) $ it "shows a red '0 tests' when no tests are run" $ property $ \b -> b `shouldBe` False- describe "generated values" $- it "shows many generated values too" $- property $ \i ->- property $ \j ->- property $ \k ->- property $ \l ->- property $ \m ->- i + j + k + l + m `shouldBe` m + l + k + j + i + (1 :: Int)- let magnitude :: Int -> Int- magnitude = max 0 . (ceiling :: Double -> Int) . logBase 10 . fromIntegral- describe "labels" $ do- it "shows the labels in use on success" $- property $ \xs ->- label ("length of input is " ++ show (length xs)) $- reverse (reverse xs) `shouldBe` (xs :: [Int])- it "shows the labels in use on success" $- property $ \xs ->- label ("length of input is " ++ show (length xs)) $- label ("magnitude (digits) of sum of input is " ++ show (magnitude (sum xs))) $- reverse (reverse xs) `shouldBe` (xs :: [Int])- it "shows the labels in use on failure" $- property $ \xs ->- label ("length of input is " ++ show (length xs)) $- label ("magnitude (digits) of sum of input is " ++ show (magnitude (sum xs))) $- reverse (reverse xs) `shouldBe` (0 : xs :: [Int])-- describe "classes" $ do- it "shows the classes in use on success" $- forAll (sort <$> arbitrary) $ \xs ->- classify (length xs > 1) "non-trivial" $- sort xs `shouldBe` (xs :: [Int])- it "shows the classes in use on success" $- forAll (sort <$> arbitrary) $ \xs ->- classify (null xs) "empty" $- classify (length xs == 1) "single element" $- classify (length xs > 1) "non-trivial" $- sort xs `shouldBe` (xs :: [Int])- it "shows the classes in use on failure" $- forAll (sort <$> arbitrary) $ \xs ->- classify (null xs) "empty" $- classify (length xs == 1) "single element" $- classify (length xs > 1) "non-trivial" $- sort xs `shouldBe` (0 : xs :: [Int])-- describe "tables" $ do- it "shows the tables in use on success" $- forAll (sort <$> arbitrary) $ \xs ->- tabulate "List elements" (map show xs) $- sort xs `shouldBe` (xs :: [Int])-- modifyMaxSize (const 30) $ -- Bigger than the 20 below- modifyMaxShrinks (const 30) $ -- Definitely not zero- describe "Shrinking" $ do- var <- liftIO newEmptyMVar- let withVar func = do- putMVar var ()- r <- func- takeMVar var- pure r- around_ withVar $- it "can grab the mvar during shrinking" $- forAllShrink (sized $ \n -> pure n) shrink $ \i -> do- () <- readMVar var- i `shouldSatisfy` (< 20)-- describe "Retries" $ do- withoutRetries $- it "does not retry if the test is configured withoutRetries" False- withRetries 5 $- it "Retries this five times" False-- describe "Flakiness" $ do- potentiallyFlaky $ do- it "Allows flakiness on True eventhough there is none (should succeed)" True- it "Allows flakiness on False eventhough there is none (should fail)" False- potentiallyFlakyWith "We're on it!" $ do- var <- liftIO $ newTVarIO (0 :: Int)- it "allows this intentionally flaky test with the default number of retries" $ do- atomically $ modifyTVar' var succ- i <- readTVarIO var- i `shouldBe` 2- notFlaky $ do- var <- liftIO $ newTVarIO (0 :: Int)- it "Does not allow flakiness if flakiness is not allowed even if retries happen" $ do- atomically $ modifyTVar' var succ- i <- readTVarIO var- i `shouldBe` 2- flaky 5 $ it "Allows flakiness in this boolean five times (should fail with 5 retries)" False- flakyWith 4 "We're on it!" $ do- var <- liftIO $ newTVarIO (0 :: Int)- it "allows this intentionally flaky test with up to four retries" $ do- atomically $ modifyTVar' var succ- i <- readTVarIO var- i `shouldBe` 2-- describe "xdescribe" $ do- xdescribe "two pending tests below here" $ do- it "one" False- it "two" True- xdescribe "four pending tests below here" $ do- it "one" False- it "two" True- describe "wat" $ do- it "three" False- it "four" True-- describe "callstack" $ do- it "it" False- specify "specify" False- prop "prop" False- describe "describe" $ do- it "describe-it" False- specify "describe-specify" False-- describe "expectations" $ do- expectFailing $ do- it "considered passing" False- expectPassing $ it "considered passing" True- expectPassing $ do- it "considered failing" False- expectFailing $ it "considered failing" True-- describe "combinators" $ do- let somePropertyCombinator :: Gen Int -> (Int -> Int) -> Property- somePropertyCombinator gen func =- forAll gen $ \i ->- even (func i)- it "should fail" $ somePropertyCombinator arbitrary (* 3)- it "should pass" $ somePropertyCombinator arbitrary (* 4)- it "should not crash (undefined value)" $ somePropertyCombinator arbitrary undefined- it "should not crash (undefined generator)" $ somePropertyCombinator undefined (* 2)-- let someTestSuiteCombinator i =- it "should be even" $ even (i :: Int)- someTestSuiteCombinator 1- someTestSuiteCombinator 2- someTestSuiteCombinator undefined-- describe "randomness" $- it "always outputs the same pseudorandomness" $ do- i <- randomRIO (1, 100)- i `shouldBe` (2 :: Int)
src/Test/Syd/Def/Around.hs view
@@ -4,7 +4,6 @@ {-# LANGUAGE GADTs #-} {-# LANGUAGE IncoherentInstances #-} {-# LANGUAGE LambdaCase #-}-{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE TypeFamilies #-} @@ -60,7 +59,7 @@ -- Note that this function turns off shrinking. -- See https://github.com/nick8325/quickcheck/issues/331 beforeWith' ::- HContains outers outer =>+ (HContains outers outer) => (outer -> oldInner -> IO newInner) -> TestDefM outers newInner result -> TestDefM outers oldInner result@@ -169,7 +168,7 @@ -- See https://github.com/nick8325/quickcheck/issues/331 aroundWith' :: forall newInner oldInner outer result (outers :: [Type]).- HContains outers outer =>+ (HContains outers outer) => -- | The function that provides the new inner resource using the old resource. -- It can also use and modify the outer resource ((outer -> newInner -> IO ()) -> (outer -> oldInner -> IO ())) ->@@ -185,7 +184,7 @@ -- d: oldInner let modifyVal :: forall x.- HContains x outer =>+ (HContains x outer) => (ProgressReporter -> ((HList x -> newInner -> IO ()) -> IO ()) -> IO TestRunResult) -> ProgressReporter -> ((HList x -> oldInner -> IO ()) -> IO ()) ->@@ -202,7 +201,7 @@ -- For this function to work recursively, the first parameter of the input and the output types must be the same modifyTree ::- forall x extra. HContains x outer => SpecDefTree x newInner extra -> SpecDefTree x oldInner extra+ forall x extra. (HContains x outer) => SpecDefTree x newInner extra -> SpecDefTree x oldInner extra modifyTree = \case DefDescribeNode t sdf -> DefDescribeNode t $ modifyForest sdf DefPendingNode t mr -> DefPendingNode t mr@@ -221,7 +220,7 @@ DefExpectationNode f sdf -> DefExpectationNode f $ modifyForest sdf modifyForest :: forall x extra.- HContains x outer =>+ (HContains x outer) => SpecDefForest x newInner extra -> SpecDefForest x oldInner extra modifyForest = map modifyTree
src/Test/Syd/Def/Golden.hs view
@@ -140,11 +140,11 @@ } -- | Test that the show instance has not changed for the given value.-goldenShowInstance :: Show a => FilePath -> a -> GoldenTest String+goldenShowInstance :: (Show a) => FilePath -> a -> GoldenTest String goldenShowInstance fp a = pureGoldenStringFile fp (show a) -- | Test that the show instance has not changed for the given value, via `ppShow`.-goldenPrettyShowInstance :: Show a => FilePath -> a -> GoldenTest String+goldenPrettyShowInstance :: (Show a) => FilePath -> a -> GoldenTest String goldenPrettyShowInstance fp a = pureGoldenStringFile fp (ppShow a) -- | The golden test context for adding context to a golden test assertion:
src/Test/Syd/Def/SetupFunc.hs view
@@ -83,7 +83,7 @@ -- | Use 'aroundWith'' with a 'SetupFunc' setupAroundWith' ::- HContains outers outer =>+ (HContains outers outer) => (outer -> oldInner -> SetupFunc newInner) -> TestDefM outers newInner result -> TestDefM outers oldInner result
src/Test/Syd/Def/Specify.hs view
@@ -134,7 +134,7 @@ -- This test sets up a temporary directory as an inner resource, and makes it available to each test in the group below. -- -- > let setUpTempDir func = withSystemTempDir $ \tempDir -> func tempDir--- > in around setUpTempDir describe "readFile and writeFile" $+-- > in around setUpTempDir $ describe "readFile and writeFile" $ -- > it "reads back what it wrote for this example" $ \tempDir -> do -- > let cts = "hello world" -- > let fp = tempDir </> "test.txt"@@ -155,7 +155,7 @@ -- ===== IO property test -- -- > let setUpTempDir func = withSystemTempDir $ \tempDir -> func tempDir--- > in around setUpTempDir describe "readFile and writeFile" $+-- > in around setUpTempDir $ describe "readFile and writeFile" $ -- > it "reads back what it wrote for this example" $ \tempDir -> -- > property $ \cts -> do -- > let fp = tempDir </> "test.txt"@@ -492,7 +492,7 @@ -- | Convenience function for backwards compatibility with @hspec@ -- -- > prop s p = it s $ property p-prop :: Testable prop => String -> prop -> Spec+prop :: (Testable prop) => String -> prop -> Spec prop s p = withFrozenCallStack $ it s $ property p -- | Declare a test that has not been written yet.
src/Test/Syd/Expectation.hs view
@@ -99,14 +99,14 @@ -- -- Note that using function could mess up the colours in your terminal if the Texts contain ANSI codes. -- In that case you may want to `show` your values first or use `shouldBe` instead.-stringShouldBe :: HasCallStack => String -> String -> IO ()+stringShouldBe :: (HasCallStack) => String -> String -> IO () stringShouldBe actual expected = unless (actual == expected) $ throwIO $ stringsNotEqualButShouldHaveBeenEqual actual expected -- | Assert that two 'Text's are equal according to `==`. -- -- Note that using function could mess up the colours in your terminal if the Texts contain ANSI codes. -- In that case you may want to `show` your values first or use `shouldBe` instead.-textShouldBe :: HasCallStack => Text -> Text -> IO ()+textShouldBe :: (HasCallStack) => Text -> Text -> IO () textShouldBe actual expected = unless (actual == expected) $ throwIO $ textsNotEqualButShouldHaveBeenEqual actual expected -- | An assertion that says two 'String's should have been equal according to `==`.@@ -131,7 +131,7 @@ -- -- Note that this is mostly backward compatible, but it has return type 'a' instead of '()' because execution will not continue beyond this function. -- In this way it is not entirely backward compatible with hspec because now there could be an ambiguous type error.-expectationFailure :: HasCallStack => String -> IO a+expectationFailure :: (HasCallStack) => String -> IO a expectationFailure = throwIO . ExpectationFailed -- | Annotate a given action with a context, for contextual assertions
src/Test/Syd/HList.hs view
@@ -29,5 +29,5 @@ instance HContains (a ': l) a where getElem (HCons a _) = a -instance HContains l a => HContains (b ': l) a where+instance (HContains l a) => HContains (b ': l) a where getElem (HCons _ hl) = getElem hl
src/Test/Syd/OptParse.hs view
@@ -11,7 +11,6 @@ import Autodocodec.Yaml import Control.Applicative import Control.Monad-import Data.Functor ((<&>)) import Data.Maybe import Data.String import Data.Text (Text)@@ -666,8 +665,8 @@ <*> doubleSwitch ["debug"] (help "Turn on debug mode. This implies --no-randomise-execution-order, --synchronous, --progress and --fail-fast.") <*> doubleSwitch ["profile"] (help "Turn on profiling mode.") -manyOptional :: OptParse.Mod OptionFields [Text] -> OptParse.Parser [Text]-manyOptional modifier = mconcat <$> many (option (str <&> T.words) modifier)+manyOptional :: OptParse.Mod OptionFields Text -> OptParse.Parser [Text]+manyOptional modifier = many (option str modifier) seedSettingFlags :: OptParse.Parser (Maybe SeedSetting) seedSettingFlags =
src/Test/Syd/Output.hs view
@@ -208,11 +208,11 @@ executionTimeText = T.pack (printf "%10.2f ms" t) withTimingColour = if- | t < 10 -> fore green- | t < 100 -> fore yellow- | t < 1_000 -> fore orange- | t < 10_000 -> fore red- | otherwise -> fore darkRed+ | t < 10 -> fore green+ | t < 100 -> fore yellow+ | t < 1_000 -> fore orange+ | t < 10_000 -> fore red+ | otherwise -> fore darkRed in withTimingColour $ chunk executionTimeText retriesChunks :: TestRunReport -> [[Chunk]]
src/Test/Syd/Run.hs view
@@ -468,14 +468,14 @@ -- 'SomeException', so that we can unwrap it. -- (For some unknown reason, that doesn't work otherwise.) data Contextual- = forall e. Exception e => Contextual !e !String+ = forall e. (Exception e) => Contextual !e !String instance Show Contextual where showsPrec d (Contextual e s) = showParen (d > 10) $ showString "Contextual " . showsPrec 11 (displayException e) . showString " " . showsPrec 11 s instance Exception Contextual -addContextToException :: Exception e => e -> String -> Contextual+addContextToException :: (Exception e) => e -> String -> Contextual addContextToException e = Contextual e data GoldenCase@@ -495,17 +495,17 @@ data Progress = ProgressTestStarting | ProgressExampleStarting+ -- Total examples !Word- -- ^ Total examples+ -- Example number !Word- -- ^ Example number | ProgressExampleDone+ -- Total examples !Word- -- ^ Total examples+ -- Example number !Word- -- ^ Example number+ -- Time it took !Word64- -- ^ Time it took | ProgressTestDone deriving (Show, Eq, Generic) @@ -515,7 +515,7 @@ -- That means that any waiting, like with 'threadDelay' would not be counted. -- -- Note that this does not evaluate the result, on purpose.-timeItT :: MonadIO m => Int -> m a -> m (Timed a)+timeItT :: (MonadIO m) => Int -> m a -> m (Timed a) timeItT worker func = do (r, (begin, end)) <- timeItBeginEnd func pure@@ -526,12 +526,12 @@ timedEnd = end } -timeItDuration :: MonadIO m => m a -> m (a, Word64)+timeItDuration :: (MonadIO m) => m a -> m (a, Word64) timeItDuration func = do (r, (begin, end)) <- timeItBeginEnd func pure (r, end - begin) -timeItBeginEnd :: MonadIO m => m a -> m (a, (Word64, Word64))+timeItBeginEnd :: (MonadIO m) => m a -> m (a, (Word64, Word64)) timeItBeginEnd func = do begin <- liftIO getMonotonicTimeNSec r <- func
src/Test/Syd/Runner/Wrappers.hs view
@@ -26,7 +26,7 @@ else Continue td applySimpleWrapper ::- MonadIO m =>+ (MonadIO m) => ((a -> m ()) -> (b -> m ())) -> (a -> m r) -> (b -> m r)@@ -41,7 +41,7 @@ liftIO $ readMVar var applySimpleWrapper' ::- MonadIO m =>+ (MonadIO m) => ((a -> m ()) -> m ()) -> (a -> m r) -> m r@@ -56,7 +56,7 @@ liftIO $ readMVar var applySimpleWrapper'' ::- MonadIO m =>+ (MonadIO m) => (m () -> m ()) -> m r -> m r@@ -69,7 +69,7 @@ liftIO $ readMVar var applySimpleWrapper2 ::- MonadIO m =>+ (MonadIO m) => ((a -> b -> m ()) -> (c -> d -> m ())) -> (a -> b -> m r) -> (c -> d -> m r)
src/Test/Syd/SpecDef.hs view
@@ -166,7 +166,7 @@ DefExpectationNode p sdf -> DefExpectationNode p $ goF sdf instance Foldable (SpecDefTree a c) where- foldMap :: forall e m. Monoid m => (e -> m) -> SpecDefTree a c e -> m+ foldMap :: forall e m. (Monoid m) => (e -> m) -> SpecDefTree a c e -> m foldMap f = let goF :: forall x y. SpecDefForest x y e -> m goF = foldMap (foldMap f)@@ -188,7 +188,7 @@ DefExpectationNode _ sdf -> goF sdf instance Traversable (SpecDefTree a c) where- traverse :: forall u w f. Applicative f => (u -> f w) -> SpecDefTree a c u -> f (SpecDefTree a c w)+ traverse :: forall u w f. (Applicative f) => (u -> f w) -> SpecDefTree a c u -> f (SpecDefTree a c w) traverse f = let goF :: forall x y. SpecDefForest x y u -> f (SpecDefForest x y w) goF = traverse (traverse f)@@ -247,12 +247,12 @@ DefFlakinessNode func sdf -> DefFlakinessNode func <$> goForest dl sdf DefExpectationNode func sdf -> DefExpectationNode func <$> goForest dl sdf -randomiseTestForest :: MonadRandom m => SpecDefForest outers inner result -> m (SpecDefForest outers inner result)+randomiseTestForest :: (MonadRandom m) => SpecDefForest outers inner result -> m (SpecDefForest outers inner result) randomiseTestForest = goForest where- goForest :: MonadRandom m => SpecDefForest a b c -> m (SpecDefForest a b c)+ goForest :: (MonadRandom m) => SpecDefForest a b c -> m (SpecDefForest a b c) goForest = traverse goTree >=> shuffleM- goTree :: MonadRandom m => SpecDefTree a b c -> m (SpecDefTree a b c)+ goTree :: (MonadRandom m) => SpecDefTree a b c -> m (SpecDefTree a b c) goTree = \case DefSpecifyNode t td e -> pure $ DefSpecifyNode t td e DefPendingNode t mr -> pure $ DefPendingNode t mr
sydtest.cabal view
@@ -1,11 +1,11 @@ cabal-version: 1.12 --- This file has been generated from package.yaml by hpack version 0.35.2.+-- This file has been generated from package.yaml by hpack version 0.36.0. -- -- see: https://github.com/sol/hpack name: sydtest-version: 0.15.1.1+version: 0.15.1.2 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@@ -13,7 +13,7 @@ bug-reports: https://github.com/NorfairKing/sydtest/issues author: Tom Sydney Kerckhove maintainer: syd@cs-syd.eu-copyright: Copyright (c) 2020-2023 Tom Sydney Kerckhove+copyright: Copyright (c) 2020-2024 Tom Sydney Kerckhove license: OtherLicense license-file: LICENSE.md build-type: Simple@@ -21,14 +21,6 @@ LICENSE.md CHANGELOG.md CONTRIBUTORS- test_resources/defaultSettings-show.golden- test_resources/even/2- test_resources/even/4- test_resources/even/odd/3- test_resources/odd/3- test_resources/odd/deep/5- test_resources/output-test.txt- test_resources/output.golden source-repository head type: git@@ -100,84 +92,3 @@ else build-depends: safe-coloured-text-terminfo--test-suite sydtest-multi-discover-test- type: exitcode-stdio-1.0- main-is: Main.hs- other-modules:- Bar.BarSpec- Bar.Spec- Baz.Qux.QuxSpec- Baz.Qux.Spec- DoNotDiscover.FooSpec- Foo.FooSpec- Foo.Spec- Paths_sydtest- hs-source-dirs:- multi-discover-test- ghc-options: -threaded -rtsopts -with-rtsopts=-N- build-tool-depends:- sydtest-discover:sydtest-discover- build-depends:- base >=4.7 && <5- , sydtest- default-language: Haskell2010--test-suite sydtest-output-test- type: exitcode-stdio-1.0- main-is: Main.hs- other-modules:- Spec- Paths_sydtest- hs-source-dirs:- output-test- ghc-options: -threaded -rtsopts -with-rtsopts=-N- build-depends:- QuickCheck- , base >=4.7 && <5- , bytestring- , random- , safe-coloured-text- , stm- , sydtest- , text- default-language: Haskell2010--test-suite sydtest-test- type: exitcode-stdio-1.0- main-is: Spec.hs- other-modules:- Test.Syd.AroundAllSpec- Test.Syd.AroundCombinationSpec- Test.Syd.AroundSpec- Test.Syd.DescriptionsSpec- Test.Syd.DiffSpec- Test.Syd.ExpectationSpec- Test.Syd.FootgunSpec- Test.Syd.GoldenSpec- Test.Syd.OptParseSpec- Test.Syd.PathSpec- Test.Syd.ScenarioSpec- Test.Syd.SequentialSpec- Test.Syd.Specify.AllOuterSpec- Test.Syd.SpecifySpec- Test.Syd.TimingSpec- Paths_sydtest- hs-source-dirs:- test- ghc-options: -threaded -rtsopts -with-rtsopts=-N- build-tool-depends:- sydtest-discover:sydtest-discover- build-depends:- QuickCheck- , base >=4.7 && <5- , bytestring- , fast-myers-diff- , path- , path-io- , safe-coloured-text- , stm- , sydtest- , text- , vector- default-language: Haskell2010
− test/Spec.hs
@@ -1,1 +0,0 @@-{-# OPTIONS_GHC -F -pgmF sydtest-discover #-}
− test/Test/Syd/AroundAllSpec.hs
@@ -1,145 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE TypeFamilies #-}--module Test.Syd.AroundAllSpec (spec) where--import Control.Concurrent.STM-import Control.Monad.IO.Class-import Test.Syd--spec :: Spec-spec = sequential $ do- describe "beforeAll" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- beforeAll readAndIncrement $ do- let t :: Int -> IO ()- t i = i `shouldBe` 1- itWithOuter "reads 1" t- itWithOuter "reads 1" t-- describe "beforeAll_" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- beforeAll_ increment $ do- let t :: IO ()- t = do- i <- readTVarIO var- i `shouldBe` 1- it "reads 1" t- it "reads 1" t-- describe "beforeAllWith" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- let incrementBeforeAndAfterWith :: Int -> IO Int- incrementBeforeAndAfterWith j = do- i <- readAndIncrement- increment- pure (i + j)- beforeAll readAndIncrement $ do- beforeAllWith incrementBeforeAndAfterWith $ do- let t :: Int -> IO ()- t i = i `shouldBe` 3- itWithOuter "reads 3" t- itWithOuter "reads 3" t-- describe "afterAll" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- addExtra :: Int -> IO ()- addExtra i = atomically $ modifyTVar var (+ i)- beforeAll readAndIncrement $- afterAll addExtra $ do- let t :: Int -> IO ()- t i = i `shouldBe` 1- itWithOuter "reads 1" t- itWithOuter "reads 1" t-- describe "afterAll'" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- addExtra :: HList '[Int] -> IO ()- addExtra (HCons i HNil) = atomically $ modifyTVar var (+ i)- beforeAll readAndIncrement $- afterAll' addExtra $ do- let t :: Int -> IO ()- t i = i `shouldBe` 1- itWithOuter "reads 1" t- itWithOuter "reads 1" t-- describe "afterAll_" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- afterAll_ increment $ do- let t :: IO ()- t = do- i <- readTVarIO var- i `shouldBe` 0- it "reads 0" t- it "reads 0" t-- describe "aroundAll" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- let incrementBeforeAndAfter :: (Int -> IO ()) -> IO ()- incrementBeforeAndAfter func = do- i <- readAndIncrement- func i- increment- aroundAll incrementBeforeAndAfter $ do- let t :: Int -> IO ()- t i = i `shouldBe` 1- itWithOuter "reads 1" t- itWithOuter "reads 1" t-- describe "aroundAll_" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- let incrementBeforeAndAfter :: IO () -> IO ()- incrementBeforeAndAfter func = do- increment- func- increment- aroundAll_ incrementBeforeAndAfter $ do- let t :: IO ()- t = do- i <- readTVarIO var- i `shouldBe` 1- it "reads 1" t- it "reads 1" t-- describe "aroundAllWith" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- let incrementBeforeAndAfter :: (Int -> IO ()) -> IO ()- incrementBeforeAndAfter func = do- i <- readAndIncrement- func i- increment- let incrementBeforeAndAfterWith :: (Int -> IO ()) -> Int -> IO ()- incrementBeforeAndAfterWith func j = do- i <- readAndIncrement- func (i + j)- increment- aroundAll incrementBeforeAndAfter $- aroundAllWith incrementBeforeAndAfterWith $ do- let t :: Int -> IO ()- t i = i `shouldBe` 3- itWithOuter "reads correctly" t- itWithOuter "reads correctly" t
− test/Test/Syd/AroundCombinationSpec.hs
@@ -1,44 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}--module Test.Syd.AroundCombinationSpec (spec) where--import Control.Concurrent.STM-import Control.Monad.IO.Class-import Test.Syd--spec :: Spec-spec = sequential $- doNotRandomiseExecutionOrder $ do- describe "aroundAll + aroundAllWith + around + aroundWith'" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let readAndIncrement :: IO Int- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- let increment :: IO ()- increment = atomically $ modifyTVar var (+ 1)- let incrementAround :: (Int -> IO ()) -> IO ()- incrementAround func = do- i <- readAndIncrement- func i- increment- let incrementAroundWith :: (Int -> IO ()) -> Int -> IO ()- incrementAroundWith func j = do- i <- readAndIncrement- func (i + j)- increment- let incrementAroundWith2 :: (Int -> Int -> IO ()) -> Int -> Int -> IO ()- incrementAroundWith2 func j k = do- i <- readAndIncrement- func (i + j) k- increment- aroundAll incrementAround $- aroundAllWith incrementAroundWith $- around incrementAround $- aroundWith' incrementAroundWith2 $ do- itWithBoth "reads correctly" $- \i k ->- (i, k) `shouldBe` (3, 3)- itWithBoth "reads correctly" $- \i k ->- (i, k) `shouldBe` (3, 7)
− test/Test/Syd/AroundSpec.hs
@@ -1,133 +0,0 @@-module Test.Syd.AroundSpec (spec) where--import Control.Concurrent.STM-import Control.Monad.IO.Class-import Test.Syd--spec :: Spec-spec = sequential . doNotRandomiseExecutionOrder $ do- describe "before" $ do- var <- liftIO $ newTVarIO (1 :: Int)- let readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- before readAndIncrement $ do- it "reads 2" $ \i ->- i `shouldBe` 2- it "reads 4" $ \i ->- i `shouldBe` 3- it "reads 6" $ \i ->- i `shouldBe` 4-- describe "before_" $ do- var <- liftIO $ newTVarIO (1 :: Int)- let increment = atomically $ modifyTVar var succ- before_ increment $ do- it "reads 2" $ do- i <- readTVarIO var- i `shouldBe` 2- it "reads 4" $ do- i <- readTVarIO var- i `shouldBe` 3- it "reads 6" $ do- i <- readTVarIO var- i `shouldBe` 4-- describe "after" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let increment = atomically $ modifyTVar var succ- after (\() -> increment) $ do- it "reads 0" $ do- i <- readTVarIO var- i `shouldBe` 0- it "reads 2" $ do- i <- readTVarIO var- i `shouldBe` 1- it "reads 4" $ do- i <- readTVarIO var- i `shouldBe` 2-- describe "after_" $ do- var <- liftIO $ newTVarIO (0 :: Int)- let increment = atomically $ modifyTVar var succ- after_ increment $ do- it "reads 0" $ do- putStrLn "reads 0"- i <- readTVarIO var- i `shouldBe` 0- it "reads 2" $ do- putStrLn "reads 2"- i <- readTVarIO var- i `shouldBe` 1- it "reads 4" $ do- putStrLn "reads 4"- i <- readTVarIO var- i `shouldBe` 2-- describe "around" $ do- var <- liftIO $ newTVarIO (1 :: Int)- let increment = atomically $ modifyTVar var succ- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- aroundFunc :: (Int -> IO ()) -> IO ()- aroundFunc intFunc = do- i <- readAndIncrement- intFunc i- increment- around aroundFunc $ do- it "reads 2" $ \i ->- i `shouldBe` 2- it "reads 4" $ \i ->- i `shouldBe` 4- it "reads 6" $ \i ->- i `shouldBe` 6-- describe "around_" $ do- var <- liftIO $ newTVarIO (1 :: Int)- let increment = atomically $ modifyTVar var succ- aroundFunc_ :: IO () -> IO ()- aroundFunc_ func = do- increment- func- increment- around_ aroundFunc_ $ do- it "reads 2" $ do- i <- readTVarIO var- i `shouldBe` 2- it "reads 4" $ do- i <- readTVarIO var- i `shouldBe` 4- it "reads 6" $ do- i <- readTVarIO var- i `shouldBe` 6-- describe "aroundWith" $ do- var <- liftIO $ newTVarIO (1 :: Int)- let increment = atomically $ modifyTVar var succ- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- aroundWithFunc :: (Int -> IO ()) -> () -> IO ()- aroundWithFunc intFunc () = do- i <- readAndIncrement- intFunc i- increment- aroundWith aroundWithFunc $ do- it "reads 2" $ \i ->- i `shouldBe` 2- it "reads 4" $ \i ->- i `shouldBe` 4- it "reads 6" $ \i ->- i `shouldBe` 6-- describe "aroundWith'" $ do- var <- liftIO $ newTVarIO (1 :: Int)- let increment = atomically $ modifyTVar var succ- readAndIncrement = atomically $ stateTVar var $ \i -> (i + 1, i + 1)- aroundWithFunc :: (() -> Int -> IO ()) -> () -> () -> IO ()- aroundWithFunc intFunc () () = do- i <- readAndIncrement- intFunc () i- increment- aroundWith' aroundWithFunc $ do- it "reads 2" $ \i ->- i `shouldBe` 2- it "reads 4" $ \i ->- i `shouldBe` 4- it "reads 6" $ \i ->- i `shouldBe` 6
− test/Test/Syd/DescriptionsSpec.hs
@@ -1,14 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Test.Syd.DescriptionsSpec (spec) where--import Test.Syd--spec :: Spec-spec =- describe "foo" $- describe "bar" $- describe "quux" $ do- descs <- getTestDescriptionPath- it "gets the right descriptions" $- descs `shouldBe` ["quux", "bar", "foo", "Test.Syd.DescriptionsSpec"]
− test/Test/Syd/DiffSpec.hs
@@ -1,290 +0,0 @@-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE LambdaCase #-}-{-# LANGUAGE OverloadedLists #-}-{-# LANGUAGE OverloadedStrings #-}-{-# OPTIONS_GHC -Wno-orphans #-}--module Test.Syd.DiffSpec (spec) where--import Control.Monad-import Data.String-import qualified Data.Text as T-import Data.Vector (Vector)-import qualified Data.Vector as V-import Myers.Diff-import Test.Syd---- Just for this test-instance IsString (Vector Char) where- fromString = V.fromList--spec :: Spec-spec = do- describe "getEditScript" $ do- let exampleSpec :: Vector Char -> Vector Char -> Vector Edit -> Spec- exampleSpec old new expected =- it- ( unwords- [ "works for",- show old,- show new,- show expected- ]- )- $ do- let actual = getEditScript old new- when (actual /= expected) $- expectationFailure $- unlines- [ unwords ["actual:", show actual],- unwords ["expected:", show expected]- ]-- exampleSpec "" "" []- exampleSpec "a" "a" []- exampleSpec "a" "b" [Delete 0 1, Insert 1 0 1]- exampleSpec "ab" "ac" [Delete 1 1, Insert 2 1 1]- exampleSpec "b" "aba" [Insert 0 0 1, Insert 1 2 1]- exampleSpec "abc" "acb" [Delete 1 1, Insert 3 2 1]- exampleSpec "aaa" "aba" [Delete 0 1, Insert 2 1 1]- exampleSpec "foofoo" "foo" [Delete 1 1, Delete 3 1, Delete 5 1]- exampleSpec "foo" "foofoo" [Insert 1 1 1, Insert 2 3 1, Insert 3 5 1]-- describe "computeDiffFromEditScript" $ do- let exampleSpec :: Vector Char -> Vector Char -> Vector Edit -> Vector (Diff Char) -> Spec- exampleSpec old new editScript expected =- it- ( unwords- [ "works for",- show old,- show new,- show editScript,- show expected- ]- )- $ do- let actual = computeDiffFromEditScript old new editScript- when (actual /= expected) $- expectationFailure $- unlines- [ unwords ["actual:", show actual],- unwords ["expected:", show expected]- ]-- exampleSpec "" "" [] []- exampleSpec "a" "a" [] [Both 'a' 'a']- exampleSpec "a" "b" [Delete 0 1, Insert 1 0 1] [First 'a', Second 'b']- exampleSpec "ab" "ac" [Delete 1 1, Insert 2 1 1] [Both 'a' 'a', First 'b', Second 'c']- exampleSpec "b" "aba" [Insert 0 0 1, Insert 1 2 1] [Second 'a', Both 'b' 'b', Second 'a']- exampleSpec "abc" "acb" [Delete 1 1, Insert 3 2 1] [Both 'a' 'a', First 'b', Both 'c' 'c', Second 'b']- exampleSpec "aaa" "aba" [Delete 0 1, Insert 2 1 1] [First 'a', Both 'a' 'a', Second 'b', Both 'a' 'a']- exampleSpec "foofoo" "foo" [Delete 1 1, Delete 3 1, Delete 5 1] [Both 'f' 'f', First 'o', Both 'o' 'o', First 'f', Both 'o' 'o', First 'o']- exampleSpec "foo" "foofoo" [Insert 1 1 1, Insert 2 3 1, Insert 3 5 1] [Both 'f' 'f', Second 'o', Both 'o' 'o', Second 'f', Both 'o' 'o', Second 'o']-- describe "getVectorDiff" $ do- let exampleSpec :: Vector Char -> Vector Char -> Vector (Diff Char) -> Spec- exampleSpec old new expected =- it- ( unwords- [ "works for",- show old,- show new,- show expected- ]- )- $ do- let actual = getVectorDiff old new- when (actual /= expected) $- expectationFailure $- unlines- [ unwords ["actual:", show actual],- unwords ["expected:", show expected]- ]- exampleSpec "" "" []- exampleSpec "a" "a" [Both 'a' 'a']- exampleSpec "a" "b" [First 'a', Second 'b']- exampleSpec "ab" "ac" [Both 'a' 'a', First 'b', Second 'c']- exampleSpec "aaa" "aba" [First 'a', Both 'a' 'a', Second 'b', Both 'a' 'a']- exampleSpec "abgdef" "gh" [First 'a', First 'b', Both 'g' 'g', First 'd', First 'e', Second 'h', First 'f']- exampleSpec "foofoo" "foo" [Both 'f' 'f', First 'o', Both 'o' 'o', First 'f', Both 'o' 'o', First 'o']-- prop "says that any list is entirely different from the empty list (left)" $ \ls ->- let v = V.fromList (ls :: String)- in getVectorDiff v "" `shouldBe` V.map First v-- prop "says that any list is entirely different from the empty list (right)" $ \ls ->- let v = V.fromList (ls :: String)- in getVectorDiff "" v `shouldBe` V.map Second v-- prop "does not find diffs in identical strings" $ \ls ->- let v = V.fromList (ls :: String)- in getVectorDiff v v `shouldBe` V.map (\a -> Both a a) v-- prop "only puts equal characters in 'Both'" $ \(ls1, ls2) ->- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- diff = getVectorDiff v1 v2- valid = \case- First _ -> True- Second _ -> True- Both a b -> a == b- in all valid diff-- let rebuildFirst :: Vector (PolyDiff a b) -> Vector a- rebuildFirst = V.mapMaybe $ \case- First a -> Just a- Second _ -> Nothing- Both a _ -> Just a- prop "lets you rebuild the old vector" $ \(ls1, ls2) -> do- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- rebuildFirst (getVectorDiff v1 v2) `shouldBe` v1-- let rebuildSecond :: Vector (PolyDiff a b) -> Vector b- rebuildSecond = V.mapMaybe $ \case- First _ -> Nothing- Second b -> Just b- Both _ b -> Just b- prop "lets you rebuild the new vector" $ \(ls1, ls2) -> do- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- rebuildSecond (getVectorDiff v1 v2) `shouldBe` v2-- let unrollGroupedDiff :: Vector (PolyDiff (Vector a) (Vector b)) -> Vector (PolyDiff a b)- unrollGroupedDiff = foldMap unrollPolyDiff-- -- Not performant, only for testing- unrollPolyDiff :: PolyDiff (Vector a) (Vector b) -> Vector (PolyDiff a b)- unrollPolyDiff = \case- First va -> V.map First va- Second vb -> V.map Second vb- Both va vb -> V.zipWith Both va vb-- prop "is the same thing as getGroupedVectorDiff, but unrolled (unroll grouped)" $ \(ls1, ls2) ->- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- grouped = getGroupedVectorDiff v1 v2- individual = getVectorDiff v1 v2- in unrollGroupedDiff grouped `shouldBe` individual-- describe "getGroupedVectorDiff" $ do- prop "says that any list is entirely different from the empty list (left)" $ \ls ->- let v = V.fromList (ls :: String)- in getGroupedVectorDiff v "" `shouldBe` (if V.null v then V.empty else V.singleton (First v))-- prop "says that any list is entirely different from the empty list (right)" $ \ls ->- let v = V.fromList (ls :: String)- in getGroupedVectorDiff "" v `shouldBe` (if V.null v then V.empty else V.singleton (Second v))-- prop "does not find diffs in identical strings" $ \ls ->- let v = V.fromList (ls :: String)- in getGroupedVectorDiff v v `shouldBe` (if V.null v then V.empty else V.singleton (Both v v))-- prop "only puts equal vectors in 'Both'" $ \(ls1, ls2) ->- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- diff = getGroupedVectorDiff v1 v2- valid = \case- First _ -> True- Second _ -> True- Both a b -> a == b- in all valid diff-- let rebuildFirst :: Vector (PolyDiff (Vector a) (Vector b)) -> Vector a- rebuildFirst =- V.concat- . V.toList- . V.mapMaybe- ( \case- First a -> Just a- Second _ -> Nothing- Both a _ -> Just a- )- prop "lets you rebuild the old vector" $ \(ls1, ls2) -> do- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- rebuildFirst (getGroupedVectorDiff v1 v2) `shouldBe` v1-- let rebuildSecond :: Vector (PolyDiff (Vector a) (Vector b)) -> Vector b- rebuildSecond =- V.concat- . V.toList- . V.mapMaybe- ( \case- First _ -> Nothing- Second b -> Just b- Both _ b -> Just b- )- prop "lets you rebuild the new vector" $ \(ls1, ls2) -> do- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- rebuildSecond (getGroupedVectorDiff v1 v2) `shouldBe` v2-- -- Not performant, only for testing.- let rollupUngroupedDiff :: Vector (PolyDiff a b) -> Vector (PolyDiff (Vector a) (Vector b))- rollupUngroupedDiff = V.fromList . go . V.toList- where- go = \case- [] -> []- (d : ds) -> case d of- First _ ->- let (fs, rest) = goFirsts (d : ds)- in First (V.fromList fs) : go rest- Second _ ->- let (ss, rest) = goSeconds (d : ds)- in Second (V.fromList ss) : go rest- Both _ _ ->- let (bs, rest) = goBoths (d : ds)- in Both (V.fromList (map fst bs)) (V.fromList (map snd bs)) : go rest- goFirsts = \case- (First a : ds) ->- let (fs, rest) = goFirsts ds- in (a : fs, rest)- rest -> ([], rest)- goSeconds = \case- (Second a : ds) ->- let (fs, rest) = goSeconds ds- in (a : fs, rest)- rest -> ([], rest)- goBoths = \case- (Both a b : ds) ->- let (fs, rest) = goBoths ds- in ((a, b) : fs, rest)- rest -> ([], rest)-- let squishGroupedDiff :: Vector (PolyDiff (Vector a) (Vector b)) -> Vector (PolyDiff (Vector a) (Vector b))- squishGroupedDiff = V.fromList . go . V.toList- where- go = \case- [] -> []- [pd] -> [pd]- (First a : First b : rest) -> go (First (a <> b) : rest)- (Second a : Second b : rest) -> go (Second (a <> b) : rest)- (Both a b : Both c d : rest) -> go (Both (a <> c) (b <> d) : rest)- (d : rest) -> d : go rest- prop "is the same thing as getVectorDiff, but rolled up and squished (rollup individual)" $ \(ls1, ls2) ->- let v1 = V.fromList (ls1 :: String)- v2 = V.fromList (ls2 :: String)- grouped = getGroupedVectorDiff v1 v2- individual = getVectorDiff v1 v2- in squishGroupedDiff grouped `shouldBe` rollupUngroupedDiff individual-- describe "getStringDiff" $ do- it "can output a large diff quickly enough if there is no diff" $- let s = replicate 10000 'a'- in length (getStringDiff s s) `shouldBe` 10000-- it "can output a large diff quickly enough if it's only diff" $- length (getStringDiff (replicate 10000 'a') "b") `shouldBe` 10001-- describe "getTextDiff" $ do- it "can output a large diff quickly enough if there is no diff" $- let s = T.pack $ replicate 10000 'a'- in length (getTextDiff s s) `shouldBe` 1-- it "can output a large diff quickly enough if it's only diff" $- length (getTextDiff (T.pack (replicate 10000 'a')) "b") `shouldBe` 15-- describe "outputEqualityAssertionFailed" $ do- it "can output a large diff quickly enough" $- length (outputEqualityAssertionFailed (replicate 10000 'a') "b") `shouldBe` 3
− test/Test/Syd/ExpectationSpec.hs
@@ -1,13 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}--module Test.Syd.ExpectationSpec (spec) where--import Test.Syd--spec :: Spec-spec = do- expectFailing $ do- it "marks this as passing, because it fails" False- expectPassing $ it "marks this as passing" True
− test/Test/Syd/FootgunSpec.hs
@@ -1,50 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}--module Test.Syd.FootgunSpec (spec) where--import Test.Syd--spec :: Spec-spec = do- aroundTwice- aroundDon't- aroundAllTwice- aroundAllDon't--aroundDon't :: Spec-aroundDon't = do- -- -- This causes sydtest-test: thread blocked indefinitely in an MVar operation- -- let don'tDo :: IO () -> IO ()- -- don'tDo _ = pure ()- -- around_ don'tDo $ do- -- it "should pass" True- pure ()--aroundTwice :: Spec-aroundTwice = do- -- -- This causes sydtest-test: thread blocked indefinitely in an MVar operation- -- let doTwice :: IO () -> IO ()- -- doTwice f = f >> f- -- around_ doTwice $ do- -- it "should pass" True- pure ()--aroundAllDon't :: Spec-aroundAllDon't = do- -- -- This causes sydtest-test: thread blocked indefinitely in an MVar operation- -- let don'tDo :: IO () -> IO ()- -- don'tDo _ = pure ()- -- aroundAll_ don'tDo $ do- -- it "should pass" True- pure ()--aroundAllTwice :: Spec-aroundAllTwice = do- -- -- This 'just works' but takes longer.- -- let doTwice :: IO () -> IO ()- -- doTwice f = f >> f- -- aroundAll_ doTwice $ do- -- it "should pass" True- pure ()
− test/Test/Syd/GoldenSpec.hs
@@ -1,31 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Test.Syd.GoldenSpec (spec) where--import qualified Data.Text.Lazy as LT-import qualified Data.Text.Lazy.Builder as LTB-import Test.Syd-import Test.Syd.OptParse-import Text.Colour--spec :: Spec-spec = do- describe "outputResultForest" $ do- it "outputs the same as last time" $ do- pureGoldenTextFile- "test_resources/output.golden"- ( LT.toStrict $- LTB.toLazyText $- renderResultReport- defaultSettings- With24BitColours- ( Timed- { timedValue = [],- timedWorker = 0,- timedBegin = 0,- timedEnd = 0- }- )- )- describe "defaultSettings" $ do- it "is the same thing as last time" $ goldenPrettyShowInstance "test_resources/defaultSettings-show.golden" defaultSettings
− test/Test/Syd/OptParseSpec.hs
@@ -1,32 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Test.Syd.OptParseSpec (spec) where--import Test.Syd-import Test.Syd.OptParse--spec :: Spec-spec = do- describe "combineToSettings" $ do- it "works for this default settinsg example" $- do- let flags = defaultFlags- environment = defaultEnvironment- mConf = Nothing- settings = defaultSettings- combineToSettings flags environment mConf `shouldReturn` settings-- it "works for this debug example" $ do- let flags = defaultFlags {flagDebug = Just True}- environment = defaultEnvironment- mConf = Nothing- settings =- defaultSettings- { settingThreads = Synchronous,- settingRandomiseExecutionOrder = False,- settingFailFast = True,- settingReportProgress = ReportProgress,- settingRetries = 0,- settingDebug = True- }- combineToSettings flags environment mConf `shouldReturn` settings
− test/Test/Syd/PathSpec.hs
@@ -1,28 +0,0 @@-{-# LANGUAGE OverloadedStrings #-}--module Test.Syd.PathSpec (spec) where--import qualified Data.ByteString as SB-import Path-import Path.IO-import Test.Syd-import Test.Syd.Path--spec :: Spec-spec = do- describe "tempDirSpec" $- tempDirSpec "sydtest-path" $ do- it "can write a file to a temporary dir and read it" $ \tdir -> do- tempFile <- resolveFile tdir "tempfile.dat"- SB.writeFile (fromAbsFile tempFile) "hello"- contents <- SB.readFile (fromAbsFile tempFile)- contents `shouldBe` "hello"- describe "clean state" $- doNotRandomiseExecutionOrder $ do- it "can write a file to a temporary dir" $ \tdir -> do- tempFile <- resolveFile tdir "tempfile.dat"- SB.writeFile (fromAbsFile tempFile) "hello"- it "cannot read a file that hasn't been written" $ \tdir -> do- tempFile <- resolveFile tdir "tempfile.dat"- contents <- forgivingAbsence $ SB.readFile (fromAbsFile tempFile)- contents `shouldBe` Nothing
− test/Test/Syd/ScenarioSpec.hs
@@ -1,16 +0,0 @@-module Test.Syd.ScenarioSpec (spec) where--import Test.Syd--spec :: Spec-spec = do- scenarioDir "test_resources/even" $ \rf ->- it "contains an even number" $ do- s <- readFile rf- n <- readIO s- (n :: Int) `shouldSatisfy` even- scenarioDirRecur "test_resources/odd" $ \rf ->- it "contains an odd number" $ do- s <- readFile rf- n <- readIO s- (n :: Int) `shouldSatisfy` odd
− test/Test/Syd/SequentialSpec.hs
@@ -1,19 +0,0 @@-module Test.Syd.SequentialSpec (spec) where--import Control.Concurrent.MVar-import Control.Monad-import Control.Monad.IO.Class-import Test.Syd--spec :: Spec-spec = sequential . doNotRandomiseExecutionOrder $ do- var <- liftIO $ newMVar ()- let times = 10000- let codeThatMustBeRunAlone = do- replicateM_ times $ do- gotIt <- tryTakeMVar var- case gotIt of- Nothing -> expectationFailure "Couldn't get the mvar, this means that the 'sequential' above is broken."- Just () -> putMVar var ()- it "does not happen at same time as the other test (A)" codeThatMustBeRunAlone- it "does not happen at same time as the other test (B)" codeThatMustBeRunAlone
− test/Test/Syd/Specify/AllOuterSpec.hs
@@ -1,29 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE GADTs #-}-{-# LANGUAGE ScopedTypeVariables #-}--module Test.Syd.Specify.AllOuterSpec (spec) where--import Test.QuickCheck-import Test.Syd--spec :: Spec-spec = sequential $ do- describe "boolean" $ do- beforeAll (pure (1 :: Int)) $- beforeAll (pure (2 :: Int)) $- itWithAll "boolean function (all)" $- \(HCons i (HCons j HNil) :: HList '[Int, Int]) () -> even i && odd j-- describe "IO action" $ do- beforeAll (pure (1 :: Int)) $ do- beforeAll (pure (2 :: Int)) $- itWithAll "IO action function (all)" $- \(HCons i (HCons j HNil) :: HList '[Int, Int]) () -> (i, j) `shouldBe` (2, 1)-- describe "property test" $ do- beforeAll (pure (1 :: Int)) $ do- beforeAll (pure (2 :: Int)) $- itWithAll "property test function (all)" $- \(HCons i (HCons j HNil) :: HList '[Int, Int]) () ->- property $ \k -> i * j * k `shouldBe` 1 * 2 * k
− test/Test/Syd/SpecifySpec.hs
@@ -1,40 +0,0 @@-module Test.Syd.SpecifySpec (spec) where--import Test.QuickCheck-import Test.Syd--spec :: Spec-spec = sequential $ do- describe "boolean" $ do- it "boolean" True- before (pure (2 :: Int)) $- it "boolean function (inner)" $- \i -> even i- beforeAll (pure (2 :: Int)) $ do- itWithOuter "boolean function (one outer)" $ \i -> even i- itWithBoth "boolean function (both inner and outer)" $ \i () -> even i-- describe "IO action" $ do- it "IO action" True- before (pure (2 :: Int)) $- it "IO action function (inner)" $- \i -> i `shouldBe` 2- beforeAll (pure (1 :: Int)) $ do- itWithOuter "IO action function (one outer)" $ \i -> i `shouldBe` 1- itWithBoth "IO action function (both inner and outer)" $ \i () -> i `shouldBe` 1-- describe "property test" $ do- it "property test" $ property $ \j -> j `shouldBe` (j :: Int)- before (pure (2 :: Int)) $- it "property test function (inner)" $ \i ->- property $ \j ->- i * j `shouldBe` 2 * (j :: Int)- beforeAll (pure (1 :: Int)) $ do- itWithOuter "property test function (one outer)" $ \i -> property $ \j ->- i * j `shouldBe` 1 * j- itWithBoth "property test function (both inner and outer)" $ \i () -> property $ \j ->- i * j `shouldBe` 1 * j-- describe "pending tests" $ do- pending "this is a pending test"- pendingWith "this is another pending test" "with this reason"
− test/Test/Syd/TimingSpec.hs
@@ -1,38 +0,0 @@-{-# LANGUAGE DataKinds #-}-{-# LANGUAGE NumericUnderscores #-}-{-# LANGUAGE ScopedTypeVariables #-}-{-# LANGUAGE TypeFamilies #-}--module Test.Syd.TimingSpec (spec) where--import Control.Concurrent-import System.IO.Unsafe-import Test.QuickCheck-import Test.Syd--spec :: Spec-spec = doNotRandomiseExecutionOrder $ do- it "takes at least 10 milliseconds (pure)" $- unsafePerformIO take10ms `seq`- True- it "takes at least 10 milliseconds (IO)" $ do- threadDelay 10_000- it "takes at least 10 milliseconds (property) " $- property $ \() -> do- threadDelay 100- it "takes at least 100 milliseconds (pure)" $- unsafePerformIO take100ms `seq`- True- it "takes at least 100 milliseconds (IO)" $ do- threadDelay 100_000- it "takes at least 100 milliseconds (property) " $- property $ \() -> do- threadDelay 10_000--{-# NOINLINE take10ms #-}-take10ms :: IO ()-take10ms = threadDelay 10_000--{-# NOINLINE take100ms #-}-take100ms :: IO ()-take100ms = threadDelay 100_000
− test_resources/defaultSettings-show.golden
@@ -1,20 +0,0 @@-Settings- { settingSeed = FixedSeed 42- , settingRandomiseExecutionOrder = True- , settingThreads = ByCapabilities- , settingMaxSuccess = 100- , settingMaxSize = 100- , settingMaxDiscard = 10- , settingMaxShrinks = 100- , settingGoldenStart = False- , settingGoldenReset = False- , settingColour = Nothing- , settingFilters = []- , settingFailFast = False- , settingIterations = OneIteration- , settingRetries = 3- , settingFailOnFlaky = False- , settingReportProgress = ReportNoProgress- , settingDebug = False- , settingProfile = False- }
− test_resources/even/2
@@ -1,1 +0,0 @@-2
− test_resources/even/4
@@ -1,1 +0,0 @@-4
− test_resources/even/odd/3
@@ -1,1 +0,0 @@-3
− test_resources/odd/3
@@ -1,1 +0,0 @@-3
− test_resources/odd/deep/5
@@ -1,1 +0,0 @@-5
− test_resources/output-test.txt
@@ -1,930 +0,0 @@-[34mTests:[m--[32m✓ [m[32mPasses[m [32m 0.00 ms[m-[33merror[m- [31m✗ [m[31mPure error[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mImpure error[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mundefined[m- [31m✗ [m[31mPure undefined[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mImpure undefined[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[31m✗ [m[31mExit code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mexceptions[m- [31m✗ [m[31mRecord construction error[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mRecord construction error[m- [31m✗ [m[31mfails in IO, as the result[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in IO, as the action[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in pure code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mRecord selection error[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mRecord selection error[m- [31m✗ [m[31mfails in IO, as the result[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in IO, as the action[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in pure code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mRecord update error[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mRecord update error[m- [31m✗ [m[31mfails in IO, as the result[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in IO, as the action[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in pure code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mPattern matching error[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mPattern matching error[m- [31m✗ [m[31mfails in IO, as the result[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in IO, as the action[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in pure code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mArithException[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mPattern matching error[m- [31m✗ [m[31mfails in IO, as the result[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in IO, as the action[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in pure code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mNoMethodError[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mPattern matching error[m- [31m✗ [m[31mfails in IO, as the result[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in IO, as the action[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mfails in pure code[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mPrinting[m- [32m✓ [m[32mprint[m [32m 0.00 ms[m- [32m✓ [m[32mputStrLn[m [32m 0.00 ms[m-[33mProperty tests[m- [33mpure[m- [32m✓ [m[32mreversing a list twice is the same as reversing it once[m [32m 0.00 ms[m- passed for all of [32m10[m inputs.- [31m✗ [m[31mshould fail to show that sorting does nothing[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [32m✓ [m[32mshould work with custom generators too[m [32m 0.00 ms[m- passed for all of [32m10[m inputs.- [33mimpure[m- [32m✓ [m[32mreversing a list twice is the same as reversing it once[m [32m 0.00 ms[m- passed for all of [32m10[m inputs.- [31m✗ [m[31mshould fail to show that sorting does nothing[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [32m✓ [m[32mshould work with custom generators too[m [32m 0.00 ms[m- passed for all of [32m10[m inputs.-[33mLong running tests[m- [32m✓ [m[32mtakes a while (1)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (2)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (3)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (4)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (5)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (6)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (7)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (8)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (9)[m [32m 0.00 ms[m- [32m✓ [m[32mtakes a while (10)[m [32m 0.00 ms[m-[33mDiff[m- [31m✗ [m[31mshows nice multi-line diffs[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshows nice multi-line diffs[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33massertions[m- [31m✗ [m[31mshouldBe[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshouldNotBe[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshouldSatisfy[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshouldNotSatisfy[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshouldSatisfyNamed[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshouldNotSatisfyNamed[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[35mpending test[m-[33mGolden[m- [31m✗ [m[31mdoes not fail the suite when an exception happens while reading[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mdoes not fail the suite when an exception happens while producing[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31mGolden output not found[m- [31m✗ [m[31mdoes not fail the suite when an exception happens while writing[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31mGolden output not found[m- [31m✗ [m[31mdoes not fail the suite when an exception happens while checking for equality[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33moutputResultForest[m- [32m✓ [m[32moutputs the same as last time[m [32m 0.00 ms[m-[33mAround[m- [33mbefore[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mbefore_[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mafter[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mafter_[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33maround[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33maround_[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33maroundWith[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33maroundWith'[m- [31m✗ [m[31mdoes not kill the test suite[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[31m✗ [m[31mexpectationFailure[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mString[m- [31m✗ [m[31mcompares strings[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mcompares strings[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mcompares texts[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mcompares texts[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mcompares bytestrings[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mContext[m- [31m✗ [m[31mshows a nice context[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshows a nice context multiple levels deep[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshows a context when an exception is thrown as well[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mProperty[m- [33m0 tests run[m- [32m✓ [m[32mshows a red '0 tests' when no tests are run[m [32m 0.00 ms[m- passed for all of [31m0[m inputs.- [33mgenerated values[m- [31m✗ [m[31mshows many generated values too[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mlabels[m- [32m✓ [m[32mshows the labels in use on success[m [32m 0.00 ms[m- passed for all of [32m100[m inputs.- Labels- 31.00% "length of input is 0"- 21.00% "length of input is 1"- 13.00% "length of input is 2"- 8.00% "length of input is 3"- 6.00% "length of input is 4"- 10.00% "length of input is 5"- 6.00% "length of input is 6"- 4.00% "length of input is 7"- 1.00% "length of input is 8"- [32m✓ [m[32mshows the labels in use on success[m [32m 0.00 ms[m- passed for all of [32m100[m inputs.- Labels- 31.00% "length of input is 0", "magnitude (digits) of sum of input is 0"- 13.00% "length of input is 1", "magnitude (digits) of sum of input is 0"- 8.00% "length of input is 1", "magnitude (digits) of sum of input is 1"- 5.00% "length of input is 2", "magnitude (digits) of sum of input is 0"- 7.00% "length of input is 2", "magnitude (digits) of sum of input is 1"- 1.00% "length of input is 2", "magnitude (digits) of sum of input is 2"- 4.00% "length of input is 3", "magnitude (digits) of sum of input is 0"- 3.00% "length of input is 3", "magnitude (digits) of sum of input is 1"- 1.00% "length of input is 3", "magnitude (digits) of sum of input is 2"- 5.00% "length of input is 4", "magnitude (digits) of sum of input is 0"- 1.00% "length of input is 4", "magnitude (digits) of sum of input is 2"- 7.00% "length of input is 5", "magnitude (digits) of sum of input is 0"- 3.00% "length of input is 5", "magnitude (digits) of sum of input is 2"- 5.00% "length of input is 6", "magnitude (digits) of sum of input is 0"- 1.00% "length of input is 6", "magnitude (digits) of sum of input is 2"- 2.00% "length of input is 7", "magnitude (digits) of sum of input is 0"- 2.00% "length of input is 7", "magnitude (digits) of sum of input is 1"- 1.00% "length of input is 8", "magnitude (digits) of sum of input is 0"- [31m✗ [m[31mshows the labels in use on failure[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- Labels- 100.00% "length of input is 0", "magnitude (digits) of sum of input is 0"- [33mclasses[m- [32m✓ [m[32mshows the classes in use on success[m [32m 0.00 ms[m- passed for all of [32m100[m inputs.- Classes- 100.00% non-trivial- [32m✓ [m[32mshows the classes in use on success[m [32m 0.00 ms[m- passed for all of [32m100[m inputs.- Classes- 31.00% empty- 48.00% non-trivial- 21.00% single element- [31m✗ [m[31mshows the classes in use on failure[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- Classes- 100.00% empty- [33mtables[m- [32m✓ [m[32mshows the tables in use on success[m [32m 0.00 ms[m- passed for all of [32m100[m inputs.- - List elements- 10.14% -1- 6.45% -2- 7.37% -3- 7.83% -4- 5.07% -5- 4.61% -6- 5.99% -7- 1.38% -8- 0.46% -9- 7.37% 0- 6.91% 1- 6.45% 2- 6.45% 3- 6.45% 4- 4.61% 5- 4.61% 6- 4.61% 7- 1.84% 8- 1.38% 9-[33mShrinking[m- [31m✗ [m[31mcan grab the mvar during shrinking[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mRetries[m- [31m✗ [m[31mdoes not retry if the test is configured withoutRetries[m [32m 0.00 ms[m- [31m✗ [m[31mRetries this five times[m [32m 0.00 ms[m- Retries: 5 (does not look flaky)-[33mFlakiness[m- [32m✓ [m[32mAllows flakiness on True eventhough there is none (should succeed)[m [32m 0.00 ms[m- [31m✗ [m[31mAllows flakiness on False eventhough there is none (should fail)[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [32m✓ [m[32mallows this intentionally flaky test with the default number of retries[m [32m 0.00 ms[m- Retries: 2[31m !!! FLAKY !!![m- [35mWe're on it![m- [31m✗ [m[31mDoes not allow flakiness if flakiness is not allowed even if retries happen[m [32m 0.00 ms[m- Retries: 2[31m !!! FLAKY !!![m- [31m✗ [m[31mAllows flakiness in this boolean five times (should fail with 5 retries)[m [32m 0.00 ms[m- Retries: 5 (does not look flaky)- [32m✓ [m[32mallows this intentionally flaky test with up to four retries[m [32m 0.00 ms[m- Retries: 2[31m !!! FLAKY !!![m- [35mWe're on it![m-[33mxdescribe[m- [33mtwo pending tests below here[m- [35mone[m- [35mtwo[m- [33mfour pending tests below here[m- [35mone[m- [35mtwo[m- [33mwat[m- [35mthree[m- [35mfour[m-[33mcallstack[m- [31m✗ [m[31mit[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mspecify[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mprop[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [33mdescribe[m- [31m✗ [m[31mdescribe-it[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mdescribe-specify[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mexpectations[m- [32m✓ [m[32mconsidered passing[m [32m 0.00 ms[m- [32m✓ [m[32mconsidered passing[m [32m 0.00 ms[m- [31m✗ [m[31mconsidered failing[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mconsidered failing[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mcombinators[m- [31m✗ [m[31mshould fail[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [32m✓ [m[32mshould pass[m [32m 0.00 ms[m- passed for all of [32m100[m inputs.- [31m✗ [m[31mshould not crash (undefined value)[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshould not crash (undefined generator)[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [31m✗ [m[31mshould be even[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)- [32m✓ [m[32mshould be even[m [32m 0.00 ms[m- [31m✗ [m[31mshould be even[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)-[33mrandomness[m- [31m✗ [m[31malways outputs the same pseudorandomness[m [32m 0.00 ms[m- Retries: 3 (does not look flaky)---[34mFailures:[m-- [36m output-test/Spec.hs:35[m- [31m✗ [m[31m1 [m[31merror.Pure error[m- Retries: 3 (does not look flaky)- foobar- CallStack (from HasCallStack):- error, called at output-test/Spec.hs:35:28 in main:Spec- - [36m output-test/Spec.hs:36[m- [31m✗ [m[31m2 [m[31merror.Impure error[m- Retries: 3 (does not look flaky)- foobar- CallStack (from HasCallStack):- error, called at output-test/Spec.hs:36:24 in main:Spec- - [36m output-test/Spec.hs:38[m- [31m✗ [m[31m3 [m[31mundefined.Pure undefined[m- Retries: 3 (does not look flaky)- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:38:31 in main:Spec- - [36m output-test/Spec.hs:39[m- [31m✗ [m[31m4 [m[31mundefined.Impure undefined[m- Retries: 3 (does not look flaky)- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:39:28 in main:Spec- - [36m output-test/Spec.hs:40[m- [31m✗ [m[31m5 [m[31mExit code[m- Retries: 3 (does not look flaky)- ExitFailure 1- - [36m output-test/Spec.hs:48[m- [31m✗ [m[31m6 [m[31mexceptions.Record construction error[m- Retries: 3 (does not look flaky)- test- - [36m output-test/Spec.hs:45[m- [31m✗ [m[31m7 [m[31mexceptions.Record construction error.fails in IO, as the result[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:49:57-64: Missing field in record construction field- - [36m output-test/Spec.hs:46[m- [31m✗ [m[31m8 [m[31mexceptions.Record construction error.fails in IO, as the action[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:49:57-64: Missing field in record construction field- - [36m output-test/Spec.hs:47[m- [31m✗ [m[31m9 [m[31mexceptions.Record construction error.fails in pure code[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:49:57-64: Missing field in record construction field- - [36m output-test/Spec.hs:50[m- [31m✗ [m[31m10 [m[31mexceptions.Record selection error[m- Retries: 3 (does not look flaky)- test- - [36m output-test/Spec.hs:45[m- [31m✗ [m[31m11 [m[31mexceptions.Record selection error.fails in IO, as the result[m- Retries: 3 (does not look flaky)- No match in record selector field- - [36m output-test/Spec.hs:46[m- [31m✗ [m[31m12 [m[31mexceptions.Record selection error.fails in IO, as the action[m- Retries: 3 (does not look flaky)- No match in record selector field- - [36m output-test/Spec.hs:47[m- [31m✗ [m[31m13 [m[31mexceptions.Record selection error.fails in pure code[m- Retries: 3 (does not look flaky)- No match in record selector field- - [36m output-test/Spec.hs:52[m- [31m✗ [m[31m14 [m[31mexceptions.Record update error[m- Retries: 3 (does not look flaky)- test- - [36m output-test/Spec.hs:45[m- [31m✗ [m[31m15 [m[31mexceptions.Record update error.fails in IO, as the result[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:53:60-88: Non-exhaustive patterns in record update- - [36m output-test/Spec.hs:46[m- [31m✗ [m[31m16 [m[31mexceptions.Record update error.fails in IO, as the action[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:53:60-88: Non-exhaustive patterns in record update- - [36m output-test/Spec.hs:47[m- [31m✗ [m[31m17 [m[31mexceptions.Record update error.fails in pure code[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:53:60-88: Non-exhaustive patterns in record update- - [36m output-test/Spec.hs:54[m- [31m✗ [m[31m18 [m[31mexceptions.Pattern matching error[m- Retries: 3 (does not look flaky)- test- - [36m output-test/Spec.hs:45[m- [31m✗ [m[31m19 [m[31mexceptions.Pattern matching error.fails in IO, as the result[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:55:50-64: Non-exhaustive patterns in Cons1 s- - [36m output-test/Spec.hs:46[m- [31m✗ [m[31m20 [m[31mexceptions.Pattern matching error.fails in IO, as the action[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:55:50-64: Non-exhaustive patterns in Cons1 s- - [36m output-test/Spec.hs:47[m- [31m✗ [m[31m21 [m[31mexceptions.Pattern matching error.fails in pure code[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:55:50-64: Non-exhaustive patterns in Cons1 s- - [36m output-test/Spec.hs:56[m- [31m✗ [m[31m22 [m[31mexceptions.ArithException[m- Retries: 3 (does not look flaky)- arithmetic underflow- - [36m output-test/Spec.hs:45[m- [31m✗ [m[31m23 [m[31mexceptions.Pattern matching error.fails in IO, as the result[m- Retries: 3 (does not look flaky)- divide by zero- - [36m output-test/Spec.hs:46[m- [31m✗ [m[31m24 [m[31mexceptions.Pattern matching error.fails in IO, as the action[m- Retries: 3 (does not look flaky)- divide by zero- - [36m output-test/Spec.hs:47[m- [31m✗ [m[31m25 [m[31mexceptions.Pattern matching error.fails in pure code[m- Retries: 3 (does not look flaky)- divide by zero- - [36m output-test/Spec.hs:58[m- [31m✗ [m[31m26 [m[31mexceptions.NoMethodError[m- Retries: 3 (does not look flaky)- test- - [36m output-test/Spec.hs:45[m- [31m✗ [m[31m27 [m[31mexceptions.Pattern matching error.fails in IO, as the result[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:29:10-19: No instance nor default method for class operation toUnit- - [36m output-test/Spec.hs:46[m- [31m✗ [m[31m28 [m[31mexceptions.Pattern matching error.fails in IO, as the action[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:29:10-19: No instance nor default method for class operation toUnit- - [36m output-test/Spec.hs:47[m- [31m✗ [m[31m29 [m[31mexceptions.Pattern matching error.fails in pure code[m- Retries: 3 (does not look flaky)- output-test/Spec.hs:29:10-19: No instance nor default method for class operation toUnit- - [36m output-test/Spec.hs:72[m- [31m✗ [m[31m30 [m[31mProperty tests.pure.should fail to show that sorting does nothing[m- Retries: 3 (does not look flaky)- Failed after 3 tests- Generated: [33m[-5,3,11,-3,-13,0,19,-10,15,-13,1,-12,10,-18,-3,-2,6,-9,-6][m- - [36m output-test/Spec.hs:80[m- [31m✗ [m[31m31 [m[31mProperty tests.impure.should fail to show that sorting does nothing[m- Retries: 3 (does not look flaky)- Failed after 3 tests- Generated: [33m[-5,3,11,-3,-13,0,19,-10,15,-13,1,-12,10,-18,-3,-2,6,-9,-6][m- Expected these values to be equal:- [34mActual: [m- [ -[31m1[m[31m8[m- , [31m-[m1[31m3[m- , -[31m1[m3- , -1[31m2[m- , [31m-1[m0- , [31m-[m9- , -[31m6[m- , [31m-[m5- , -3- , [31m-[m[31m3[m- , -2- , 0- , 1- , 3- , [31m6[m- , [31m1[m[31m0[m- , [31m11[m- [31m, 1[m[31m5[m- , [31m1[m[31m9[m- ]- [34mExpected: [m- [ -[32m5[m[42m[m- [42m[m[32m, [m[32m3[m- , 1[32m1[m- , -3- , -1[32m3[m- , 0- , [32m1[m9- , -[32m1[m[32m0[m- , [32m1[m5- , -[32m1[m3- , [32m1[m- , -[32m1[m2- , [32m1[m0- , [32m-[m1[32m8[m- , [32m-[m3- , [32m-[m[32m2[m- , [32m6[m- , [32m-[m[32m9[m- , [32m-6[m- ]- [34mInline diff: [m- [ -[32m5[m[42m[m- [42m[m[32m, [m[31m1[m[32m3[m[31m8[m- , [31m-[m1[32m1[m[31m3[m- , -[31m1[m3- , -1[32m3[m[31m2[m- , [31m-1[m0- , [31m-[m[32m1[m9- , -[32m1[m[31m6[m[32m0[m- , [32m1[m[31m-[m5- , -[32m1[m3- , [31m-[m[31m3[m[32m1[m- , -[32m1[m2- , [32m1[m0- , [32m-[m1[32m8[m- , [32m-[m3- , [32m-[m[31m6[m[32m2[m- , [31m1[m[31m0[m[32m6[m- , [32m-[m[31m11[m- [31m, 1[m[31m5[m[32m9[m- , [31m1[m[32m-6[m[31m9[m- ]- - [36m output-test/Spec.hs:90[m- [31m✗ [m[31m32 [m[31mDiff.shows nice multi-line diffs[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m- ( "foo"- , [[41m [m[31m"qu[m[31mux[m[31m"[m [31m,[m[41m [m"quux" , "quux" , "quux" , "quux" , "quux" , "quux" ]- , "ba[31mr[m"- )- [34mExpected: [m- ( "[32mf[m[32mo[m[32mo[mfoo"- , [ "quux" , "quux" , "quux" , "quux" , "quux" , "quux" ]- , "ba[32mz[m"- )- [34mInline diff: [m- ( "[32mf[m[32mo[m[32mo[mfoo"- , [[41m [m[31m"qu[m[31mux[m[31m"[m [31m,[m[41m [m"quux" , "quux" , "quux" , "quux" , "quux" , "quux" ]- , "ba[32mz[m[31mr[m"- )- - [36m output-test/Spec.hs:92[m- [31m✗ [m[31m33 [m[31mDiff.shows nice multi-line diffs[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m( "foo"[41m [m, [[31m][m , "ba[31mr[m"[41m [m)- [34mExpected: [m- ( "[32mf[m[32mo[m[32mo[mfoo"[42m[m- [42m[m, [[32m "[m[32mquux" , [m[32m"quux" , "quux" [m[32m, "quux" , "quux[m[32m" , "quu[m[32mx"[m [32m][m- [32m[m, "ba[32mz[m"[42m[m- [42m[m)- [34mInline diff: [m- ( "[32mf[m[32mo[m[32mo[mfoo"[41m [m[42m[m- [42m[m, [[31m][m[32m "[m[32mquux" , [m[32m"quux" , "quux" [m[32m, "quux" , "quux[m[32m" , "quu[m[32mx"[m [32m][m- [32m[m, "ba[31mr[m[32mz[m"[41m [m[42m[m- [42m[m)- - [36m output-test/Spec.hs:95[m- [31m✗ [m[31m34 [m[31massertions.shouldBe[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m[31m3[m- [34mExpected: [m[32m4[m- - [36m output-test/Spec.hs:96[m- [31m✗ [m[31m35 [m[31massertions.shouldNotBe[m- Retries: 3 (does not look flaky)- Did not expect equality of the values but both were:- 3- - [36m output-test/Spec.hs:97[m- [31m✗ [m[31m36 [m[31massertions.shouldSatisfy[m- Retries: 3 (does not look flaky)- Predicate failed, but should have succeeded, on this value:- 3- - [36m output-test/Spec.hs:98[m- [31m✗ [m[31m37 [m[31massertions.shouldNotSatisfy[m- Retries: 3 (does not look flaky)- Predicate succeeded, but should have failed, on this value:- 3- - [36m output-test/Spec.hs:99[m- [31m✗ [m[31m38 [m[31massertions.shouldSatisfyNamed[m- Retries: 3 (does not look flaky)- Predicate failed, but should have succeeded, on this value:- 3- Predicate: even- - [36m output-test/Spec.hs:100[m- [31m✗ [m[31m39 [m[31massertions.shouldNotSatisfyNamed[m- Retries: 3 (does not look flaky)- Predicate succeeded, but should have failed, on this value:- 3- Predicate: odd- - [36m output-test/Spec.hs:103[m- [31m✗ [m[31m40 [m[31mGolden.does not fail the suite when an exception happens while reading[m- Retries: 3 (does not look flaky)- ExitFailure 1- - [36m output-test/Spec.hs:111[m- [31m✗ [m[31m41 [m[31mGolden.does not fail the suite when an exception happens while producing[m- Retries: 3 (does not look flaky)- [31mGolden output not found[m- - [36m output-test/Spec.hs:119[m- [31m✗ [m[31m42 [m[31mGolden.does not fail the suite when an exception happens while writing[m- Retries: 3 (does not look flaky)- [31mGolden output not found[m- - [36m output-test/Spec.hs:126[m- [31m✗ [m[31m43 [m[31mGolden.does not fail the suite when an exception happens while checking for equality[m- Retries: 3 (does not look flaky)- divide by zero- - [36m output-test/Spec.hs:149[m- [31m✗ [m[31m44 [m[31mAround.before.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:154[m- [31m✗ [m[31m45 [m[31mAround.before_.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:159[m- [31m✗ [m[31m46 [m[31mAround.after.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:164[m- [31m✗ [m[31m47 [m[31mAround.after_.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:169[m- [31m✗ [m[31m48 [m[31mAround.around.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:174[m- [31m✗ [m[31m49 [m[31mAround.around_.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:179[m- [31m✗ [m[31m50 [m[31mAround.aroundWith.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:184[m- [31m✗ [m[31m51 [m[31mAround.aroundWith'.does not kill the test suite[m- Retries: 3 (does not look flaky)- user error (test)- - [36m output-test/Spec.hs:187[m- [31m✗ [m[31m52 [m[31mexpectationFailure[m- Retries: 3 (does not look flaky)- fails- - [36m output-test/Spec.hs:190[m- [31m✗ [m[31m53 [m[31mString.compares strings[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m"f[31mo[mo\nba[31mr[m\tq[31muu[mx[41m [m"- [34mExpected: [m"fo[32mq[m\nba[32mz[m\tq[32me[mx"- - [36m output-test/Spec.hs:191[m- [31m✗ [m[31m54 [m[31mString.compares strings[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m- f[31mo[mo- ba[31mr[m q[31muu[mx[41m [m- [34mExpected: [m- fo[32mq[m- ba[32mz[m q[32me[mx- [34mInline diff: [m- f[31mo[mo[32mq[m- ba[31mr[m[32mz[m q[31muu[m[32me[mx[41m [m- - [36m output-test/Spec.hs:192[m- [31m✗ [m[31m55 [m[31mString.compares texts[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m"f[31mo[mo\nba[31mr[m\tq[31muu[mx[41m [m"- [34mExpected: [m"fo[32mq[m\nba[32mz[m\tq[32me[mx"- - [36m output-test/Spec.hs:193[m- [31m✗ [m[31m56 [m[31mString.compares texts[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m- f[31mo[mo- ba[31mr[m q[31muu[mx[41m [m- [34mExpected: [m- fo[32mq[m- ba[32mz[m q[32me[mx- [34mInline diff: [m- f[31mo[mo[32mq[m- ba[31mr[m[32mz[m q[31muu[m[32me[mx[41m [m- - [36m output-test/Spec.hs:194[m- [31m✗ [m[31m57 [m[31mString.compares bytestrings[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m"f[31mo[mo\nba[31mr[m\tq[31muu[mx[41m [m"- [34mExpected: [m"fo[32mq[m\nba[32mz[m\tq[32me[mx"- - [36m output-test/Spec.hs:197[m- [31m✗ [m[31m58 [m[31mContext.shows a nice context[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m[31mTr[m[31mu[me- [34mExpected: [m[32mFals[me- Context- - [36m output-test/Spec.hs:198[m- [31m✗ [m[31m59 [m[31mContext.shows a nice context multiple levels deep[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m[31mTr[m[31mu[me- [34mExpected: [m[32mFals[me- Context3- Context2- Context1- - [36m output-test/Spec.hs:203[m- [31m✗ [m[31m60 [m[31mContext.shows a context when an exception is thrown as well[m- Retries: 3 (does not look flaky)- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:204:26 in main:Spec- context- - [36m output-test/Spec.hs:210[m- [31m✗ [m[31m61 [m[31mProperty.generated values.shows many generated values too[m- Retries: 3 (does not look flaky)- Failed after 1 tests- Generated: [33m0[m- Generated: [33m0[m- Generated: [33m0[m- Generated: [33m0[m- Generated: [33m0[m- Expected these values to be equal:- [34mActual: [m[31m0[m- [34mExpected: [m[32m1[m- - [36m output-test/Spec.hs:229[m- [31m✗ [m[31m62 [m[31mProperty.labels.shows the labels in use on failure[m- Retries: 3 (does not look flaky)- Failed after 1 tests- Generated: [33m[][m- Labels: "length of input is 0", "magnitude (digits) of sum of input is 0"- Expected these values to be equal:- [34mActual: [m[]- [34mExpected: [m[[42m [m[32m0[m[42m [m]- - [36m output-test/Spec.hs:246[m- [31m✗ [m[31m63 [m[31mProperty.classes.shows the classes in use on failure[m- Retries: 3 (does not look flaky)- Failed after 1 tests- Generated: [33m[][m- Class: empty- Expected these values to be equal:- [34mActual: [m[]- [34mExpected: [m[[42m [m[32m0[m[42m [m]- - [36m output-test/Spec.hs:269[m- [31m✗ [m[31m64 [m[31mShrinking.can grab the mvar during shrinking[m- Retries: 3 (does not look flaky)- Failed after 21 tests- Generated: [33m20[m- Predicate failed, but should have succeeded, on this value:- 20- - [36m output-test/Spec.hs:276[m- [31m✗ [m[31m65 [m[31mRetries.does not retry if the test is configured withoutRetries[m- - [36m output-test/Spec.hs:278[m- [31m✗ [m[31m66 [m[31mRetries.Retries this five times[m- Retries: 5 (does not look flaky)- - [36m output-test/Spec.hs:283[m- [31m✗ [m[31m67 [m[31mFlakiness.Allows flakiness on False eventhough there is none (should fail)[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:292[m- [31m✗ [m[31m68 [m[31mFlakiness.Does not allow flakiness if flakiness is not allowed even if retries happen[m- Retries: 2[31m !!! FLAKY !!![m- Expected these values to be equal:- [34mActual: [m[31m1[m- [34mExpected: [m[32m2[m- - [36m output-test/Spec.hs:296[m- [31m✗ [m[31m69 [m[31mFlakiness.Allows flakiness in this boolean five times (should fail with 5 retries)[m- Retries: 5 (does not look flaky)- - [36m output-test/Spec.hs:316[m- [31m✗ [m[31m70 [m[31mcallstack.it[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:317[m- [31m✗ [m[31m71 [m[31mcallstack.specify[m- Retries: 3 (does not look flaky)- - [36m Unknown location[m- [31m✗ [m[31m72 [m[31mcallstack.prop[m- Retries: 3 (does not look flaky)- Failed after 1 tests- - [36m output-test/Spec.hs:320[m- [31m✗ [m[31m73 [m[31mcallstack.describe.describe-it[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:321[m- [31m✗ [m[31m74 [m[31mcallstack.describe.describe-specify[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:328[m- [31m✗ [m[31m75 [m[31mexpectations.considered failing[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:329[m- [31m✗ [m[31m76 [m[31mexpectations.considered failing[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:336[m- [31m✗ [m[31m77 [m[31mcombinators.should fail[m- Retries: 3 (does not look flaky)- Failed after 2 tests- Generated: [33m-1[m- - [36m output-test/Spec.hs:338[m- [31m✗ [m[31m78 [m[31mcombinators.should not crash (undefined value)[m- Retries: 3 (does not look flaky)- Failed after 1 tests- Generated: [33m0[m- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:338:80 in main:Spec- - [36m output-test/Spec.hs:339[m- [31m✗ [m[31m79 [m[31mcombinators.should not crash (undefined generator)[m- Retries: 3 (does not look flaky)- Failed after 1 tests- Generated: [33mException thrown while showing test case:- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:339:74 in main:Spec-[m- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:339:74 in main:Spec- - [36m output-test/Spec.hs:342[m- [31m✗ [m[31m80 [m[31mcombinators.should be even[m- Retries: 3 (does not look flaky)- - [36m output-test/Spec.hs:342[m- [31m✗ [m[31m81 [m[31mcombinators.should be even[m- Retries: 3 (does not look flaky)- Prelude.undefined- CallStack (from HasCallStack):- error, called at libraries/base/GHC/Err.hs:74:14 in base:GHC.Err- undefined, called at output-test/Spec.hs:345:29 in main:Spec- - [36m output-test/Spec.hs:348[m- [31m✗ [m[31m82 [m[31mrandomness.always outputs the same pseudorandomness[m- Retries: 3 (does not look flaky)- Expected these values to be equal:- [34mActual: [m[31m4[m[31m9[m- [34mExpected: [m[32m2[m- -- Examples: [32m984[m- Passed: [32m31[m- Failed: [31m82[m- Flaky: [31m3[m- Pending: [35m7[m- Sum of test runtimes:[33m 0.00 seconds[m- Test suite took: [33m 0.00 seconds[m-
− test_resources/output.golden
@@ -1,10 +0,0 @@-[34mTests:[m----- Passed: [32m0[m- Failed: [32m0[m- Sum of test runtimes:[33m 0.00 seconds[m- Test suite took: [33m 0.00 seconds[m-