tasty-quickcheck 0.11 → 0.11.1
raw patch · 4 files changed
+66/−33 lines, 4 filesdep +regex-tdfadep −pcre-lightdep ~QuickCheckdep ~basedep ~optparse-applicative
Dependencies added: regex-tdfa
Dependencies removed: pcre-light
Dependency ranges changed: QuickCheck, base, optparse-applicative, random, tasty
Files
- CHANGELOG.md +12/−0
- Test/Tasty/QuickCheck.hs +40/−4
- tasty-quickcheck.cabal +6/−14
- tests/test.hs +8/−15
CHANGELOG.md view
@@ -1,6 +1,18 @@ Changes ======= +Version 0.11.1+--------------++* Add timeouts for individual tests within a property+ ([#425](https://github.com/UnkindPartition/tasty/pull/425)).+* Define `showDefaultValue` for `QuickCheckTests`,+ `QuickCheckMaxSize` and `QuickCheckMaxRatio`+ ([#428](https://github.com/UnkindPartition/tasty/pull/428)).+* Print the number of QuickCheck shrinks in the progress message+ ([#431](https://github.com/UnkindPartition/tasty/pull/431)).+* Drop support for GHC 7.10.+ Version 0.11 --------------
Test/Tasty/QuickCheck.hs view
@@ -10,6 +10,7 @@ , QuickCheckMaxRatio(..) , QuickCheckVerbose(..) , QuickCheckMaxShrinks(..)+ , QuickCheckTimeout(..) -- * Re-export of Test.QuickCheck , module Test.QuickCheck -- * Internal@@ -20,7 +21,7 @@ , optionSetToArgs ) where -import Test.Tasty ( testGroup )+import Test.Tasty ( testGroup, Timeout(..) ) import Test.Tasty.Providers import Test.Tasty.Options import qualified Test.QuickCheck as QC@@ -118,8 +119,15 @@ newtype QuickCheckMaxShrinks = QuickCheckMaxShrinks Int deriving (Num, Ord, Eq, Real, Enum, Integral, Typeable) +-- | Timeout for individual tests within a property.+--+-- @since 0.11.1+newtype QuickCheckTimeout = QuickCheckTimeout Timeout+ deriving (Eq, Ord, Typeable)+ instance IsOption QuickCheckTests where defaultValue = 100+ showDefaultValue (QuickCheckTests n) = Just (show n) parseValue = -- We allow numeric underscores for readability; see -- https://github.com/UnkindPartition/tasty/issues/263@@ -149,6 +157,7 @@ instance IsOption QuickCheckMaxSize where defaultValue = fromIntegral defaultMaxSize+ showDefaultValue (QuickCheckMaxSize n) = Just (show n) parseValue = fmap QuickCheckMaxSize . safeRead optionName = return "quickcheck-max-size" optionHelp = return "Size of the biggest test cases quickcheck generates"@@ -156,6 +165,7 @@ instance IsOption QuickCheckMaxRatio where defaultValue = fromIntegral $ QC.maxDiscardRatio QC.stdArgs+ showDefaultValue (QuickCheckMaxRatio n) = Just (show n) parseValue = fmap QuickCheckMaxRatio . safeRead optionName = return "quickcheck-max-ratio" optionHelp = return "Maximum number of discared tests per successful test before giving up"@@ -175,6 +185,13 @@ optionHelp = return "Number of shrinks allowed before QuickCheck will fail a test" optionCLParser = mkOptionCLParser $ metavar "NUMBER" +instance IsOption QuickCheckTimeout where+ defaultValue = QuickCheckTimeout defaultValue+ parseValue = fmap QuickCheckTimeout . parseValue+ optionName = return "quickcheck-timeout"+ optionHelp = return "Timeout for individual tests within a QuickCheck property (suffixes: ms,s,m,h; default: s)"+ optionCLParser = mkOptionCLParser $ metavar "DURATION"+ -- | Convert tasty options into QuickCheck options. -- -- This is a low-level function that was originally added for tasty-hspec@@ -221,6 +238,7 @@ , Option (Proxy :: Proxy QuickCheckMaxRatio) , Option (Proxy :: Proxy QuickCheckVerbose) , Option (Proxy :: Proxy QuickCheckMaxShrinks)+ , Option (Proxy :: Proxy QuickCheckTimeout) ] run opts (QC prop) yieldProgress = do@@ -228,11 +246,16 @@ let QuickCheckShowReplay showReplay = lookupOption opts QuickCheckVerbose verbose = lookupOption opts+ QuickCheckTimeout timeout = lookupOption opts+ applyTimeout = case timeout of+ Timeout micros _+ | micros <= toInteger (maxBound :: Int) -> QC.within (fromInteger micros)+ _ -> id -- Quickcheck already catches exceptions, no need to do it here. r <- quickCheck yieldProgress args- (if verbose then QC.verbose prop else prop)+ (applyTimeout $ if verbose then QC.verbose prop else prop) qcOutput <- formatMessage $ QC.output r let qcOutputNl =@@ -260,8 +283,21 @@ = (.) (QC.quickCheckWithResult args) $ QCP.callback $ QCP.PostTest QCP.NotCounterexample- $ \QC.MkState {QC.maxSuccessTests, QC.numSuccessTests} _ ->- yieldProgress $ emptyProgress {progressPercent = fromIntegral numSuccessTests / fromIntegral maxSuccessTests}+ $ \st@QC.MkState {QC.maxSuccessTests, QC.numSuccessTests} _ ->+ yieldProgress $+ if QC.numTotTryShrinks st > 0 then+ emptyProgress {+ progressText = showShrinkCount st+ }+ else+ emptyProgress {+ progressPercent = fromIntegral numSuccessTests / fromIntegral maxSuccessTests+ }++-- Based on 'QuickCheck.Test.failureSummaryAndReason'.+showShrinkCount :: QC.State -> String+showShrinkCount st = show (QC.numSuccessShrinks st) ++ " shrink" ++ plural+ where plural = if QC.numSuccessShrinks st == 1 then "" else "s" successful :: QC.Result -> Bool successful r =
tasty-quickcheck.cabal view
@@ -1,8 +1,5 @@--- Initial tasty-quickcheck.cabal generated by cabal init. For further--- documentation, see http://haskell.org/cabal/users-guide/- name: tasty-quickcheck-version: 0.11+version: 0.11.1 synopsis: QuickCheck support for the Tasty test framework. description: QuickCheck support for the Tasty test framework. .@@ -10,7 +7,6 @@ license-file: LICENSE author: Roman Cheplyaka <roma@ro-che.info> maintainer: Roman Cheplyaka <roma@ro-che.info>--- copyright: homepage: https://github.com/UnkindPartition/tasty bug-reports: https://github.com/UnkindPartition/tasty/issues category: Testing@@ -25,16 +21,14 @@ library exposed-modules: Test.Tasty.QuickCheck- -- other-modules: other-extensions: GeneralizedNewtypeDeriving, DeriveDataTypeable- build-depends: base >= 4.8 && < 5,+ build-depends: base >= 4.9 && < 5, tagged < 0.9,- tasty >= 1.5 && < 1.6,+ tasty >= 1.5.1 && < 1.6, random < 1.3, QuickCheck >= 2.10 && < 2.16, optparse-applicative < 0.19 - -- hs-source-dirs: default-language: Haskell2010 default-extensions: CPP ghc-options: -Wall@@ -50,12 +44,10 @@ main-is: test.hs build-depends:- base >= 4.7 && < 5- , tasty >= 1.5+ base+ , regex-tdfa >= 1.3 && < 1.4+ , tasty , tasty-quickcheck , tasty-hunit- , pcre-light , QuickCheck ghc-options: -Wall- if (!impl(ghc >= 8.0) || os(windows))- buildable: False
tests/test.hs view
@@ -7,10 +7,9 @@ import Test.Tasty.Runners as Tasty import Test.Tasty.QuickCheck import Test.Tasty.HUnit-import Data.Maybe import Test.QuickCheck.Random (QCGen)-import Text.Regex.PCRE.Light.Char8 import Text.Printf+import qualified Text.Regex.TDFA as Regex (=~), (!~) :: String -- ^ text@@ -21,20 +20,11 @@ msg = printf "Expected /%s/, got %s" regexStr (show text) -- NB show above the intentional -- to add quotes around the string and -- escape newlines etc.- in assertBool msg $ match' text regexStr+ in assertBool msg $ text Regex.=~ regexStr text !~ regexStr = let msg = printf "Did not expect /%s/, got %s" regexStr (show text)- in assertBool msg $ not $ match' text regexStr---- note: the order of arguments is reversed relative to match from--- pcre-light, but consistent with =~ and !~-match' :: String -> String -> Bool-match' text regexStr =- let- regex = compile regexStr []- in- isJust $ match regex text []+ in assertBool msg $ not $ text Regex.=~ regexStr main :: IO () main =@@ -110,8 +100,11 @@ resultDescription =~ "Use .* to reproduce" -- Run the test suite manually and check that progress does not go beyond 100%- , testProperty "Percent Complete" $ withMaxSuccess 1000 $ \(_ :: Int) -> ioProperty $ threadDelay 10000-+ , testProperty "Percent Complete" $+ withMaxSuccess 1000 $ \(_ :: Int) -> ioProperty $ threadDelay 10000+ , testProperty "Number of shrinks" $+ expectFailure $ withMaxSize 1000 $ \(Large (x :: Int)) ->+ ioProperty $ threadDelay 100000 >> pure (x <= 100) ] run' :: Testable p => p -> IO Result