@@ -17,56 +17,58 @@ import Data.Text (Text)
1717import Data.Text qualified as Text
1818import Data.Traversable (for )
1919import GHC.Enum qualified as Int
20+ import Hedgehog qualified as H
21+ import Hedgehog.Gen qualified as H
22+ import Hedgehog.Range qualified as H
2023import Proto.Compiler (ClassName , CompilerInput , ConstrName , Kind , Kind'KindRef (Kind'KIND_REF_TYPE ), Module , ModuleName , ModuleNamePart , SourceInfo , Sum , Sum'Constructor , Ty , TyAbs , TyArg , TyBody , TyDef , TyName , VarName )
2124import Proto.Compiler_Fields (argKind , argName , column , constrName , constructors , fields , file , foreignTyRef , kindArrow , kindRef , left , localTyRef , moduleName , modules , name , ntuple , parts , posFrom , posTo , right , row , sourceInfo , tyAbs , tyApp , tyArgs , tyBody , tyFunc , tyName , tyRef , tyVar , typeDefs , varName )
2225import Proto.Compiler_Fields qualified as P
23- import Test.LambdaBuffers.Compiler.Gen.Utils (distribute , indexBy , nesetOf , setOf , vecOf )
24- import Test.QuickCheck qualified as QC (arbitraryPrintableChar )
25- import Test.QuickCheck.Gen qualified as QC
26+ import Test.LambdaBuffers.Compiler.Gen.Utils (distribute , indexBy )
27+ import Test.Tasty.Hedgehog ()
2628
2729-- | Upper bound on various generators
2830limit :: Int
2931limit = 5
3032
3133-- | Names
32- genAlphaNum :: QC . Gen Char
33- genAlphaNum = QC. oneof [ QC. chooseEnum ( ' a ' , ' z ' ), QC. chooseEnum ( ' A ' , ' Z ' ), QC. chooseEnum ( ' 0 ' , ' 9 ' )]
34+ genAlphaNum :: H . Gen Char
35+ genAlphaNum = H. alphaNum
3436
35- genUpperCamelCase :: Int -> QC . Gen Text
36- genUpperCamelCase len = do
37- h <- QC. chooseEnum ( ' A ' , ' Z ' )
38- t <- QC. vectorOf len genAlphaNum
37+ genUpperCamelCase :: H . Gen Text
38+ genUpperCamelCase = do
39+ h <- H. upper
40+ t <- H. list ( H. linear 1 limit) genAlphaNum
3941 return $ Text. pack $ h : t
4042
41- genModuleNamePart :: QC . Gen ModuleNamePart
43+ genModuleNamePart :: H . Gen ModuleNamePart
4244genModuleNamePart = do
43- mnp <- genUpperCamelCase 10
45+ mnp <- genUpperCamelCase
4446 return $ defMessage & name .~ mnp
4547
46- genModuleName :: QC . Gen ModuleName
48+ genModuleName :: H . Gen ModuleName
4749genModuleName = do
48- ps <- QC. chooseInt ( 1 , limit) >>= vecOf genModuleNamePart
50+ ps <- H. list ( H. linear 1 limit) genModuleNamePart
4951 return $ defMessage & parts .~ ps
5052
51- genTyName :: QC . Gen TyName
53+ genTyName :: H . Gen TyName
5254genTyName = do
53- n <- genUpperCamelCase 10
55+ n <- genUpperCamelCase
5456 return $ defMessage & name .~ n
5557
56- _genClassName :: QC . Gen ClassName
58+ _genClassName :: H . Gen ClassName
5759_genClassName = do
58- n <- genUpperCamelCase 10
60+ n <- genUpperCamelCase
5961 return $ defMessage & name .~ n
6062
61- genConstrName :: QC . Gen ConstrName
63+ genConstrName :: H . Gen ConstrName
6264genConstrName = do
63- n <- genUpperCamelCase 10
65+ n <- genUpperCamelCase
6466 return $ defMessage & name .~ n
6567
66- genVarName :: QC . Gen VarName
68+ genVarName :: H . Gen VarName
6769genVarName = do
68- h <- QC. chooseEnum ( ' a ' , ' z ' )
69- t <- QC. vectorOf 4 ( QC. chooseEnum ( ' a ' , ' z ' ))
70+ h <- H. lower
71+ t <- H. list ( H. linear 1 4 ) H. lower
7072 return $ defMessage & name .~ Text. pack (h : t)
7173
7274starKind :: Kind
@@ -80,33 +82,33 @@ kindOf tyabs = case tyabs ^. tyArgs of
8082 & kindArrow . left .~ (a ^. argKind)
8183 & kindArrow . right .~ kindOf (tyabs & tyArgs .~ args)
8284
83- genTyArg :: VarName -> QC . Gen TyArg
85+ genTyArg :: VarName -> H . Gen TyArg
8486genTyArg vn = do
8587 return $
8688 defMessage
8789 & argName .~ vn
8890 & argKind .~ starKind -- TODO(bladyjoker): Gen arbitrary kinds.
8991
90- genSum :: TyDefs -> Set TyArg -> NESet ConstrName -> QC . Gen Sum
92+ genSum :: TyDefs -> Set TyArg -> NESet ConstrName -> H . Gen Sum
9193genSum tydefs args ctorNs = do
9294 let (ctorN :| ctorNs') = NESet. toList ctorNs
93- ctorNs'' <- QC. sublistOf (toList ctorNs')
95+ ctorNs'' <- H. subsequence ctorNs'
9496 ctors <- for (ctorN :| ctorNs'') (genConstructor tydefs args)
9597 return $ defMessage & constructors .~ toList ctors
9698
97- genTy :: Kind -> TyDefs -> Set TyArg -> QC . Gen Ty
99+ genTy :: Kind -> TyDefs -> Set TyArg -> H . Gen Ty
98100genTy kind tydefs tyargs =
99- QC. oneof $
101+ H. choice $
100102 NESet. withNonEmpty [] (genTyVar kind) tyargs
101103 <> genTyRef kind tydefs
102104 <> genTyApp kind tydefs tyargs
103105
104- genTyRef :: Kind -> TyDefs -> [QC . Gen Ty ]
106+ genTyRef :: Kind -> TyDefs -> [H . Gen Ty ]
105107genTyRef kind tydefs = case [tyd | tyd <- Map. toList tydefs, kindOf (snd tyd ^. tyAbs) == kind] of
106108 [] -> []
107109 tyds ->
108110 [ do
109- tydef <- QC. elements tyds
111+ tydef <- H. element tyds
110112 case fst tydef of
111113 Left (mn, tyn) ->
112114 return $
@@ -116,16 +118,16 @@ genTyRef kind tydefs = case [tyd | tyd <- Map.toList tydefs, kindOf (snd tyd ^.
116118 Right tyn -> return $ defMessage & tyRef . localTyRef . tyName .~ tyn
117119 ]
118120
119- genTyVar :: Kind -> NESet TyArg -> [QC . Gen Ty ]
121+ genTyVar :: Kind -> NESet TyArg -> [H . Gen Ty ]
120122genTyVar kind args = case [tyarg | tyarg <- toList args, tyarg ^. argKind == kind] of
121123 [] -> []
122124 tyargs ->
123125 [ do
124- tyarg <- QC. elements tyargs
126+ tyarg <- H. element tyargs
125127 return $ defMessage & tyVar . varName .~ (tyarg ^. argName)
126128 ]
127129
128- genTyApp :: Kind -> TyDefs -> Set TyArg -> [QC . Gen Ty ]
130+ genTyApp :: Kind -> TyDefs -> Set TyArg -> [H . Gen Ty ]
129131genTyApp kind tydefs args =
130132 let kindFunc =
131133 defMessage
@@ -143,36 +145,36 @@ genTyApp kind tydefs args =
143145 & tyApp . tyArgs .~ [tyarg] -- TODO(bladyjoker): Generate list arguments
144146 ]
145147
146- genConstructor :: TyDefs -> Set TyArg -> ConstrName -> QC . Gen Sum'Constructor
148+ genConstructor :: TyDefs -> Set TyArg -> ConstrName -> H . Gen Sum'Constructor
147149genConstructor tydefs args cn = do
148- tys <- QC. chooseInt ( 0 , limit) >>= vecOf (genTy starKind tydefs args)
150+ tys <- H. list ( H. linear 0 limit) (genTy starKind tydefs args)
149151 return $
150152 defMessage
151153 & constrName .~ cn
152154 & P. product . ntuple . fields .~ tys
153155
154- genTyBodySum :: TyDefs -> Set TyArg -> NESet ConstrName -> QC . Gen TyBody
156+ genTyBodySum :: TyDefs -> Set TyArg -> NESet ConstrName -> H . Gen TyBody
155157genTyBodySum tydefs args ctors = do
156158 b <- genSum tydefs args ctors
157159 return $ defMessage & P. sum .~ b
158160
159- genTyBodyOpaque :: QC . Gen TyBody
161+ genTyBodyOpaque :: H . Gen TyBody
160162genTyBodyOpaque = return $ defMessage & P. opaque .~ defMessage
161163
162- genTyBody :: TyDefs -> Set TyArg -> NESet ConstrName -> QC . Gen TyBody
164+ genTyBody :: TyDefs -> Set TyArg -> NESet ConstrName -> H . Gen TyBody
163165genTyBody tydefs args ctorNs =
164- QC. oneof $
166+ H. choice $
165167 [ genTyBodyOpaque
166168 ]
167169 -- Gen TyBody'Sum only if there's some TyDefs and TyArgs available
168170 <> [genTyBodySum tydefs args ctorNs | not (tydefs == mempty && args == mempty )]
169171
170- genTyAbs :: TyDefs -> NESet ConstrName -> QC . Gen TyAbs
172+ genTyAbs :: TyDefs -> NESet ConstrName -> H . Gen TyAbs
171173genTyAbs tydefs ctorNs = do
172174 vns <-
173175 if tydefs == mempty
174176 then return mempty
175- else QC. chooseInt ( 0 , limit) >>= setOf genVarName
177+ else H. set ( H. linear 0 limit) genVarName
176178 args <- for (Set. toList vns) genTyArg
177179 body <- genTyBody tydefs (Set. fromList args) ctorNs
178180 return $
@@ -182,18 +184,18 @@ genTyAbs tydefs ctorNs = do
182184
183185type TyDefs = Map (Either (ModuleName , TyName ) TyName ) TyDef
184186
185- genTyDef :: TyDefs -> TyName -> NESet ConstrName -> QC . Gen TyDef
187+ genTyDef :: TyDefs -> TyName -> NESet ConstrName -> H . Gen TyDef
186188genTyDef tydefs tyn ctors = do
187189 tyabs <- genTyAbs tydefs ctors
188190 withSourceInfo $
189191 defMessage
190192 & tyName .~ tyn
191193 & tyAbs .~ tyabs
192194
193- genModule :: Map ModuleName Module -> ModuleName -> QC . Gen Module
195+ genModule :: Map ModuleName Module -> ModuleName -> H . Gen Module
194196genModule availableMods mn = do
195- tyNs <- QC. chooseInt ( 0 , limit) >>= nesetOf genTyName
196- ctorNs <- QC. chooseInt ( length tyNs, length tyNs * limit) >>= nesetOf genConstrName
197+ tyNs <- NESet. fromList <$> H. nonEmpty ( H. linear 0 limit) genTyName
198+ ctorNs <- H. set ( H. linear ( length tyNs) ( length tyNs * limit)) genConstrName
197199 tyNsWithCtorNs <- Map. map NESet. fromList <$> distribute (toList ctorNs) (NESet. toSet tyNs)
198200 let foreignTyDefs = collectTyDefs availableMods
199201 tydefs <-
@@ -216,9 +218,9 @@ genModule availableMods mn = do
216218 (\ (m, tydef) -> Left (m ^. moduleName, tydef ^. tyName))
217219 [(m, tydef) | m <- toList mods, tydef <- m ^. typeDefs]
218220
219- genCompilerInput :: QC . Gen CompilerInput
221+ genCompilerInput :: H . Gen CompilerInput
220222genCompilerInput = do
221- mns <- QC. chooseInt ( 0 , limit) >>= setOf genModuleName
223+ mns <- H. set ( H. linear 0 limit) genModuleName
222224 ms <-
223225 foldM
224226 ( \ availableMods mn -> do
@@ -230,10 +232,10 @@ genCompilerInput = do
230232 return $ defMessage & modules .~ toList ms
231233
232234-- | Utils
233- withSourceInfo :: HasField a " sourceInfo" SourceInfo => a -> QC . Gen a
235+ withSourceInfo :: HasField a " sourceInfo" SourceInfo => a -> H . Gen a
234236withSourceInfo msg = do
235- f <- Text. pack <$> vecOf QC. arbitraryPrintableChar 10
236- i <- QC. chooseInt ( 0 , Int. maxBound )
237+ f <- Text. pack <$> H. list ( H. linear 1 10 ) H. unicodeAll
238+ i <- H. int ( H. linear 0 Int. maxBound )
237239 let pos =
238240 defMessage
239241 & row .~ fromIntegral i
0 commit comments