@@ -108,25 +108,32 @@ randomExpr params = do
108108 1 -> randomVarExpr params
109109 _ -> randomFunCallExpr params
110110
111- normalizeExprs :: [Expr ] -> [Expr ]
112- normalizeExprs [] = []
113- normalizeExprs (TextExpr t1: TextExpr t2: rest) =
114- normalizeExprs (TextExpr (t1 <> t2) : rest)
115- normalizeExprs (_: rest) = normalizeExprs rest
116-
117111randomExprs :: FuzzParams -> IO [Expr ]
118112randomExprs params = do
119- n <- randomRIO $ fpExprsRange params
120- replicateM n (randomExpr params)
113+ randomRIO (fpExprsRange params) >>= f []
114+ where
115+ normalizeExprs :: [Expr ] -> [Expr ]
116+ normalizeExprs [] = []
117+ normalizeExprs (TextExpr t1: TextExpr t2: rest) =
118+ normalizeExprs (TextExpr (t1 <> t2) : rest)
119+ normalizeExprs (x: rest) = x: normalizeExprs rest
120+
121+ f :: [Expr ] -> Int -> IO [Expr ]
122+ f es n
123+ | m >= n = return es
124+ | otherwise = do
125+ es' <- replicateM (n - m) (randomExpr params)
126+ f (normalizeExprs (es ++ es')) n
127+ where m = length es
121128
122129fuzzIteration :: FuzzParams -> IO Bool
123130fuzzIteration params = do
124- es <- normalizeExprs <$> randomExprs params
131+ es <- randomExprs params
125132 let es' = runParser exprs $ unparseExprs es
126133 when (Right (" " , es) /= es') $ do
127134 print es
128135 print es'
129- error " test "
136+ error " Failed "
130137 return (Right (" " , es) == es')
131138
132139fuzz :: FuzzParams -> IO ()
@@ -140,11 +147,17 @@ mainWithArgs ("genconf":configFilePath:_) = do
140147 saveFuzzParams defaultFuzzParams configFilePath
141148 printf " Generated default configuration at %s" configFilePath
142149mainWithArgs (" runconf" : fuzzParamsPath: _) = readFuzzParams fuzzParamsPath >>= fuzz
150+ mainWithArgs (" genexpr" : configFilePath: _) = do
151+ putStrLn " Generating expression:"
152+ params <- readFuzzParams configFilePath
153+ randomExprs params >>= print
154+
143155mainWithArgs _ =
144156 error
145157 " Usage: \n \
146158 \ Fuzz genconf <fuzz.json>\n \
147- \ Fuzz runconf <fuzz.json>"
159+ \ Fuzz runconf <fuzz.json>\n \
160+ \ Fuzz genexpr <fuzz.json>"
148161
149162main :: IO ()
150163main = getArgs >>= mainWithArgs
0 commit comments