5 | import Control.Monad.Identity
6 | import Control.Monad.Writer
11 | import public Hedgehog
15 | trimDeep : List String -> List String
16 | trimDeep = filter (not . null) . map trim
18 | annotateSeedIfNeeded : List String -> PropertyT ()
19 | annotateSeedIfNeeded outs = do
20 | let seeds = filter (isInfixOf "rawStdGen") outs
21 | for_ seeds $
footnote . delay
24 | (checkPrefixOnly : Bool)
25 | -> (actual, expected : List String)
27 | containsEach _ [] (_::_) = False
28 | containsEach checkPrefixOnly (_::_) [] = checkPrefixOnly
29 | containsEach _ [] [] = True
30 | containsEach checkPrefixOnly (o::os) (i::is) =
31 | (i `isInfixOf` o) && containsEach checkPrefixOnly os is
34 | (checkPrefixOnly : Bool)
35 | -> (expected : String)
36 | -> (forall m. HasTerminal m => Monad m => m ())
38 | doCheck checkPrefixOnly expected checker = do
39 | let actual = trimDeep $
(>>= lines) $
execWriter $
checker @{StdoutOnly}
40 | annotateSeedIfNeeded actual
41 | diff actual (containsEach checkPrefixOnly) (trimDeep $
lines expected)
50 | recheckGivenOutput :
51 | {default False checkPrefixOnly : Bool}
52 | -> (expected : String)
53 | -> (prop : Property)
57 | recheckGivenOutput expected prop sz sd = property $
58 | doCheck checkPrefixOnly expected $
recheck sz sd prop
68 | {default False checkPrefixOnly : Bool}
69 | -> (expected : String)
70 | -> (prop : Property)
72 | checkGivenOutput expected prop = property $
do
73 | initSeed <- forAll anyBits64
74 | doCheck checkPrefixOnly expected $
75 | ignore $
check @{ConstSeed $
mkStdGen initSeed} prop