Skip to content

Commit c88b28f

Browse files
committed
(#801) Add FuzzStat
1 parent c1a6729 commit c88b28f

File tree

1 file changed

+59
-5
lines changed

1 file changed

+59
-5
lines changed

src/FuzzyMain.hs

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,61 @@ import System.Random
1414
import Text.Printf
1515
import qualified Data.ByteString.Lazy as BS
1616
import HyperNerd.Parser
17+
import Data.Foldable
18+
19+
data FuzzStat = FuzzStat
20+
{ fsTextCount :: Int
21+
, fsMaxTextLen :: Int
22+
, fsMinTextLen :: Int
23+
, fsVarCount :: Int
24+
, fsFunCount :: Int
25+
, fsMaxFunArgsCount :: Int
26+
, fsMinFunArgsCount :: Int
27+
} deriving (Show, Eq)
28+
29+
instance Semigroup FuzzStat where
30+
s1 <> s2 =
31+
FuzzStat
32+
{ fsTextCount = fsTextCount s1 + fsTextCount s2
33+
, fsMaxTextLen = fsMaxTextLen s1 `max` fsMaxTextLen s2
34+
, fsMinTextLen = fsMinTextLen s1 `min` fsMinTextLen s2
35+
, fsVarCount = fsVarCount s1 + fsVarCount s2
36+
, fsFunCount = fsFunCount s1 + fsFunCount s2
37+
, fsMaxFunArgsCount = fsMaxFunArgsCount s1 `max` fsMaxFunArgsCount s2
38+
, fsMinFunArgsCount = fsMinFunArgsCount s1 `min` fsMinFunArgsCount s2
39+
}
40+
41+
instance Monoid FuzzStat where
42+
mempty =
43+
FuzzStat
44+
{ fsTextCount = 0
45+
, fsMaxTextLen = minBound
46+
, fsMinTextLen = maxBound
47+
, fsVarCount = 0
48+
, fsFunCount = 0
49+
, fsMaxFunArgsCount = minBound
50+
, fsMinFunArgsCount = maxBound
51+
}
52+
53+
statOfExprs :: [Expr] -> FuzzStat
54+
statOfExprs = foldMap statOfExpr
55+
56+
statOfExpr :: Expr -> FuzzStat
57+
statOfExpr (TextExpr text) =
58+
mempty
59+
{ fsTextCount = 1
60+
, fsMinTextLen = T.length text
61+
, fsMaxTextLen = T.length text
62+
}
63+
statOfExpr (VarExpr _) =
64+
mempty {fsVarCount = 1}
65+
statOfExpr (FunCallExpr _ args) =
66+
mempty
67+
{ fsFunCount = 1
68+
, fsMaxFunArgsCount = length args
69+
, fsMinFunArgsCount = length args
70+
} <>
71+
statOfExprs args
1772

1873
data FuzzParams = FuzzParams
1974
{ fpFuzzCount :: Int
@@ -127,21 +182,20 @@ randomExprs params = do
127182
f (normalizeExprs (es ++ es')) n
128183
where m = length es
129184

130-
fuzzIteration :: FuzzParams -> IO Bool
185+
fuzzIteration :: FuzzParams -> IO FuzzStat
131186
fuzzIteration params = do
132187
es <- randomExprs params
133188
let es' = runParser exprs $ unparseExprs es
134189
when (Right ("", es) /= es') $ do
135190
print es
136191
print es'
137192
error "Failed"
138-
return (Right ("", es) == es')
193+
return $ statOfExprs es
139194

140195
fuzz :: FuzzParams -> IO ()
141196
fuzz params = do
142-
report <- replicateM (fpFuzzCount params) (fuzzIteration params)
143-
printf "Failures: %d\n" $ length $ filter not report
144-
printf "Successes: %d\n" $ length $ filter id report
197+
stats <- replicateM (fpFuzzCount params) (fuzzIteration params)
198+
print $ fold stats
145199

146200
mainWithArgs :: [String] -> IO ()
147201
mainWithArgs ("genconf":configFilePath:_) = do

0 commit comments

Comments
 (0)