|
1 | 1 | module Test.LambdaBuffers.Compiler.Gen (genCompilerInput) where |
2 | 2 |
|
3 | 3 | import Control.Lens ((&), (.~), (^.)) |
4 | | -import Control.Monad.Reader (replicateM) |
| 4 | +import Data.Foldable (Foldable (toList)) |
5 | 5 | import Data.List qualified as List |
| 6 | +import Data.List.NonEmpty (NonEmpty ((:|))) |
6 | 7 | import Data.ProtoLens (Message (defMessage)) |
7 | 8 | import Data.Text (Text) |
8 | 9 | import Data.Text qualified as Text |
9 | 10 | import Data.Traversable (for) |
10 | | -import Proto.Compiler (ClassName, CompilerInput, ConstrName, Kind'KindRef (Kind'KIND_REF_TYPE), Module, ModuleName, ModuleNamePart, Sum, Sum'Constructor, Ty, TyAbs, TyArg, TyBody, TyDef, TyName, VarName) |
11 | | -import Proto.Compiler_Fields (argKind, argName, constrName, constructors, fields, kindRef, moduleName, modules, name, ntuple, parts, tyAbs, tyArgs, tyBody, tyName, tyVar, typeDefs, varName) |
| 11 | +import Proto.Compiler (ClassName, CompilerInput, ConstrName, Kind'KindRef (Kind'KIND_REF_TYPE), Module, ModuleName, ModuleNamePart, Sum, Sum'Constructor, Ty, TyAbs, TyArg, TyBody, TyDef, TyName, TyRef, VarName) |
| 12 | +import Proto.Compiler_Fields (argKind, argName, constrName, constructors, fields, kindRef, moduleName, modules, name, ntuple, parts, tyAbs, tyArgs, tyBody, tyName, tyRef, tyVar, typeDefs, varName) |
12 | 13 | import Proto.Compiler_Fields qualified as P |
13 | 14 | import Test.QuickCheck qualified as QC (Gen, chooseEnum, chooseInt, elements, oneof, vectorOf) |
14 | 15 |
|
15 | 16 | vecOf :: forall {a}. QC.Gen a -> Int -> QC.Gen [a] |
16 | | -vecOf g n = replicateM n g |
| 17 | +vecOf = flip QC.vectorOf |
17 | 18 |
|
18 | 19 | limit :: Int |
19 | | -limit = 10 |
| 20 | +limit = 4 |
20 | 21 |
|
21 | 22 | -- | Names |
22 | 23 | genAlphaNum :: QC.Gen Char |
@@ -73,27 +74,44 @@ genSum args = do |
73 | 74 | return $ defMessage & constructors .~ ctors |
74 | 75 |
|
75 | 76 | -- TODO(bladyjoker): Add TyRef, TyApp etc. |
76 | | -genTy :: [TyArg] -> QC.Gen Ty |
77 | | -genTy args = do |
78 | | - ar <- QC.elements args |
| 77 | +genTy :: [TyRef] -> [TyArg] -> QC.Gen Ty |
| 78 | +genTy (r : refs) (a : args) = QC.oneof [genTyVar (a :| args), genTyRef (r :| refs)] |
| 79 | +genTy [] (a : args) = QC.oneof [genTyVar (a :| args)] |
| 80 | +genTy (r : refs) [] = QC.oneof [genTyRef (r :| refs)] |
| 81 | +genTy _ _ = error "TODO(bladyjoker): Not yet implemented" |
| 82 | + |
| 83 | +genTyRef :: NonEmpty TyRef -> QC.Gen Ty |
| 84 | +genTyRef refs = do |
| 85 | + r <- QC.elements (toList refs) |
| 86 | + return $ defMessage & tyRef .~ r |
| 87 | + |
| 88 | +genTyVar :: NonEmpty TyArg -> QC.Gen Ty |
| 89 | +genTyVar args = do |
| 90 | + ar <- QC.elements (toList args) |
79 | 91 | return $ defMessage & tyVar . varName .~ (ar ^. argName) |
80 | 92 |
|
81 | 93 | genConstructor :: [TyArg] -> ConstrName -> QC.Gen Sum'Constructor |
82 | 94 | genConstructor args cn = do |
83 | | - tys <- QC.chooseInt (1, limit) >>= vecOf (genTy args) |
| 95 | + tys <- QC.chooseInt (1, limit) >>= vecOf (genTy mempty args) |
84 | 96 | return $ |
85 | 97 | defMessage |
86 | 98 | & constrName .~ cn |
87 | 99 | & P.product . ntuple . fields .~ tys |
88 | 100 |
|
89 | | --- TODO(bladyjoker): Add Opaque. |
90 | 101 | genTyBody :: [TyArg] -> QC.Gen TyBody |
91 | | -genTyBody args = do |
| 102 | +genTyBody args = QC.oneof [genTyBodyOpaque, genTyBodySum args] |
| 103 | + |
| 104 | +genTyBodySum :: [TyArg] -> QC.Gen TyBody |
| 105 | +genTyBodySum args = do |
92 | 106 | b <- genSum args |
93 | 107 | return $ defMessage & P.sum .~ b |
94 | 108 |
|
| 109 | +genTyBodyOpaque :: QC.Gen TyBody |
| 110 | +genTyBodyOpaque = return $ defMessage & P.opaque .~ defMessage |
| 111 | + |
95 | 112 | genTyAbs :: QC.Gen TyAbs |
96 | 113 | genTyAbs = do |
| 114 | + -- TODO(bladyjoker): Allow empty args |
97 | 115 | vns <- QC.chooseInt (1, limit) >>= vecOf genVarName |
98 | 116 | args <- for (List.nub vns) genTyArg |
99 | 117 | body <- genTyBody args |
|
0 commit comments