Skip to content

Commit c1a12b3

Browse files
committed
(#801) Predictable normalization
1 parent 30d4027 commit c1a12b3

File tree

1 file changed

+24
-11
lines changed

1 file changed

+24
-11
lines changed

src/FuzzyMain.hs

Lines changed: 24 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
117111
randomExprs :: FuzzParams -> IO [Expr]
118112
randomExprs 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

122129
fuzzIteration :: FuzzParams -> IO Bool
123130
fuzzIteration 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

132139
fuzz :: FuzzParams -> IO ()
@@ -140,11 +147,17 @@ mainWithArgs ("genconf":configFilePath:_) = do
140147
saveFuzzParams defaultFuzzParams configFilePath
141148
printf "Generated default configuration at %s" configFilePath
142149
mainWithArgs ("runconf":fuzzParamsPath:_) = readFuzzParams fuzzParamsPath >>= fuzz
150+
mainWithArgs ("genexpr":configFilePath:_) = do
151+
putStrLn "Generating expression:"
152+
params <- readFuzzParams configFilePath
153+
randomExprs params >>= print
154+
143155
mainWithArgs _ =
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

149162
main :: IO ()
150163
main = getArgs >>= mainWithArgs

0 commit comments

Comments
 (0)