@@ -14,6 +14,61 @@ import System.Random
1414import Text.Printf
1515import qualified Data.ByteString.Lazy as BS
1616import 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
1873data 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
131186fuzzIteration 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
140195fuzz :: FuzzParams -> IO ()
141196fuzz 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
146200mainWithArgs :: [String ] -> IO ()
147201mainWithArgs (" genconf" : configFilePath: _) = do
0 commit comments