Skip to content

Commit 326497a

Browse files
committed
Added generator tests
1 parent 10aac0f commit 326497a

File tree

7 files changed

+91
-32
lines changed

7 files changed

+91
-32
lines changed

bin/Main.hs

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,12 @@ module Main (main) where
44

55
import Codec.CBOR.Cuddle.CBOR.Gen (generateCBORTerm)
66
import Codec.CBOR.Cuddle.CBOR.Validator
7-
import Codec.CBOR.Cuddle.CDDL (
8-
CDDL (..),
9-
Name (..),
10-
TopLevel (..),
11-
XRule,
12-
XTerm,
13-
XXType2,
14-
fromRules,
15-
sortCDDL,
16-
)
7+
import Codec.CBOR.Cuddle.CDDL (Name (..), fromRules, sortCDDL)
178
import Codec.CBOR.Cuddle.CDDL.Postlude (appendPostlude)
189
import Codec.CBOR.Cuddle.CDDL.Resolve (
1910
fullResolveCDDL,
2011
)
21-
import Codec.CBOR.Cuddle.IndexMappable (IndexMappable (..))
12+
import Codec.CBOR.Cuddle.IndexMappable (IndexMappable (..), mapCDDLDropExt)
2213
import Codec.CBOR.Cuddle.Parser (pCDDL)
2314
import Codec.CBOR.Cuddle.Pretty (PrettyStage)
2415
import Codec.CBOR.FlatTerm (toFlatTerm)
@@ -186,15 +177,6 @@ main = do
186177

187178
run :: Opts -> IO ()
188179
run (Opts cmd cddlFile) = do
189-
let
190-
mapRule ::
191-
( IndexMappable XXType2 i j
192-
, IndexMappable XTerm i j
193-
, IndexMappable XRule i j
194-
) =>
195-
TopLevel i -> [TopLevel j]
196-
mapRule (TopLevelRule r) = [TopLevelRule $ mapIndex r]
197-
mapRule (XXTopLevel _) = []
198180
parseFromFile pCDDL cddlFile >>= \case
199181
Left err -> do
200182
putStrLnErr $ errorBundlePretty err
@@ -210,20 +192,20 @@ run (Opts cmd cddlFile) = do
210192
putDocW 80 . pretty $ mapIndex @_ @_ @PrettyStage defs
211193
Validate vOpts ->
212194
let
213-
CDDL r tls _
195+
cddl
214196
| vNoPrelude vOpts = res
215197
| otherwise = appendPostlude res
216198
in
217-
case fullResolveCDDL $ CDDL (mapIndex r) (foldMap mapRule tls) mempty of
199+
case fullResolveCDDL $ mapCDDLDropExt cddl of
218200
Left err -> putStrLnErr (show err) >> exitFailure
219201
Right _ -> exitSuccess
220202
(GenerateCBOR gOpts) ->
221203
let
222-
CDDL r tls _
204+
cddl
223205
| gNoPrelude gOpts = res
224206
| otherwise = appendPostlude res
225207
in
226-
case fullResolveCDDL $ CDDL (mapIndex r) (foldMap mapRule tls) mempty of
208+
case fullResolveCDDL $ mapCDDLDropExt cddl of
227209
Left err -> putStrLnErr (show err) >> exitFailure
228210
Right mt -> do
229211
stdGen <- getStdGen
@@ -237,11 +219,11 @@ run (Opts cmd cddlFile) = do
237219
AsPrettyCBOR -> putStrLn . prettyHexEnc $ encodeTerm term
238220
ValidateCBOR vcOpts ->
239221
let
240-
CDDL r tls _
222+
cddl
241223
| vcNoPrelude vcOpts = res
242224
| otherwise = res
243225
in
244-
case fullResolveCDDL $ CDDL (mapIndex r) (foldMap mapRule tls) mempty of
226+
case fullResolveCDDL $ mapCDDLDropExt cddl of
245227
Left err -> putStrLnErr (show err) >> exitFailure
246228
Right mt -> do
247229
cbor <- BSC.readFile (vcInput vcOpts)

cuddle.cabal

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ test-suite cuddle-test
136136
Paths_cuddle
137137
Test.Codec.CBOR.Cuddle.CDDL.Examples
138138
Test.Codec.CBOR.Cuddle.CDDL.Gen
139+
Test.Codec.CBOR.Cuddle.CDDL.GeneratorSpec
139140
Test.Codec.CBOR.Cuddle.CDDL.Parser
140141
Test.Codec.CBOR.Cuddle.CDDL.Pretty
141142
Test.Codec.CBOR.Cuddle.Huddle
@@ -148,13 +149,16 @@ test-suite cuddle-test
148149
QuickCheck >=2.14,
149150
base,
150151
bytestring,
152+
cborg,
153+
containers,
151154
cuddle,
152155
data-default-class,
153156
generic-random,
154157
hspec >=2.11,
155158
hspec-megaparsec >=2.2,
156159
megaparsec,
157160
prettyprinter,
161+
random,
158162
string-qq >=0.0.6,
159163
text,
160164
tree-diff,

src/Codec/CBOR/Cuddle/CDDL/CBORGenerator.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@ data WrappedTerm
2020
newtype CBORGenerator = CBORGenerator (forall g m. StatefulGen g m => g -> m WrappedTerm)
2121

2222
class HasGenerator a where
23-
generatorL :: Lens' a CBORGenerator
23+
generatorL :: Lens' a (Maybe CBORGenerator)

src/Codec/CBOR/Cuddle/Huddle.hs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ where
101101

102102
import Codec.CBOR.Cuddle.CDDL (CDDL, XRule)
103103
import Codec.CBOR.Cuddle.CDDL qualified as C
104-
import Codec.CBOR.Cuddle.CDDL.CBORGenerator (CBORGenerator, HasGenerator (..))
104+
import Codec.CBOR.Cuddle.CDDL.CBORGenerator (CBORGenerator (..), HasGenerator (..), WrappedTerm)
105105
import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
106106
import Codec.CBOR.Cuddle.Comments (Comment (..), HasComment (..))
107107
import Codec.CBOR.Cuddle.Comments qualified as C
@@ -125,6 +125,7 @@ import GHC.Exts (IsList (Item, fromList, toList))
125125
import GHC.Generics (Generic)
126126
import Optics.Core (lens, view, (%), (%~), (&), (^.))
127127
import Optics.Core qualified as L
128+
import System.Random.Stateful (StatefulGen)
128129
import Prelude hiding ((/))
129130

130131
type data HuddleStage
@@ -169,6 +170,9 @@ data Rule = Rule
169170
}
170171
deriving (Generic)
171172

173+
instance HasGenerator Rule where
174+
generatorL = #ruleExtra % #hxrGenerator
175+
172176
instance HasComment Rule where
173177
commentL = #ruleExtra % #hxrComment
174178

@@ -1307,5 +1311,5 @@ toCDDL' HuddleConfig {..} hdl =
13071311
gps =
13081312
C.GenericParam $ fmap (\(GRef t) -> C.Name t) (args gr)
13091313

1310-
withGenerator :: HasGenerator a => CBORGenerator -> a -> a
1311-
withGenerator = L.set generatorL
1314+
withGenerator :: HasGenerator a => (forall g m. StatefulGen g m => g -> m WrappedTerm) -> a -> a
1315+
withGenerator f = L.set generatorL (Just $ CBORGenerator f)

src/Codec/CBOR/Cuddle/IndexMappable.hs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,14 @@ import Codec.CBOR.Cuddle.CDDL.CTree (
3030
XTerm (..),
3131
XXType2 (..),
3232
)
33-
import Codec.CBOR.Cuddle.Huddle (HuddleStage, XCddl (..), XTerm (..), XXTopLevel (..), XXType2 (..))
33+
import Codec.CBOR.Cuddle.Huddle (
34+
HuddleStage,
35+
XCddl (..),
36+
XRule (..),
37+
XTerm (..),
38+
XXTopLevel (..),
39+
XXType2 (..),
40+
)
3441
import Codec.CBOR.Cuddle.Parser (
3542
ParserStage,
3643
XCddl (..),
@@ -247,6 +254,9 @@ instance IndexMappable XXType2 HuddleStage CTreePhase where
247254
instance IndexMappable XTerm HuddleStage CTreePhase where
248255
mapIndex _ = CTreeXTerm
249256

257+
instance IndexMappable XRule HuddleStage CTreePhase where
258+
mapIndex (HuddleXRule _ g) = CTreeXRule g
259+
250260
-- HuddleStage -> PrettyStage
251261

252262
instance IndexMappable XCddl HuddleStage PrettyStage where

test/Main.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Main (main) where
22

33
import System.IO (BufferMode (..), hSetBuffering, hSetEncoding, stdout, utf8)
44
import Test.Codec.CBOR.Cuddle.CDDL.Examples qualified as Examples
5+
import Test.Codec.CBOR.Cuddle.CDDL.GeneratorSpec qualified as Generator
56
import Test.Codec.CBOR.Cuddle.CDDL.Parser (parserSpec)
67
import Test.Codec.CBOR.Cuddle.Huddle (huddleSpec)
78
import Test.Hspec
@@ -18,6 +19,7 @@ main = do
1819
hSetBuffering stdout LineBuffering
1920
hSetEncoding stdout utf8
2021
hspecWith hspecConfig $ do
21-
describe "cddlParser" parserSpec
22+
describe "Parser" parserSpec
2223
describe "Huddle" huddleSpec
2324
describe "Examples" Examples.spec
25+
describe "Generator" Generator.spec
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
{-# LANGUAGE OverloadedLists #-}
2+
{-# LANGUAGE OverloadedStrings #-}
3+
4+
module Test.Codec.CBOR.Cuddle.CDDL.GeneratorSpec (spec) where
5+
6+
import Codec.CBOR.Cuddle.CBOR.Gen (generateCBORTerm)
7+
import Codec.CBOR.Cuddle.CDDL.CBORGenerator (WrappedTerm (..))
8+
import Codec.CBOR.Cuddle.CDDL.Resolve (fullResolveCDDL)
9+
import Codec.CBOR.Cuddle.Huddle (
10+
Huddle,
11+
HuddleItem (..),
12+
a,
13+
arr,
14+
collectFrom,
15+
toCDDL,
16+
withGenerator,
17+
(=:=),
18+
)
19+
import Codec.CBOR.Cuddle.Huddle qualified as H
20+
import Codec.CBOR.Cuddle.IndexMappable (mapCDDLDropExt)
21+
import Codec.CBOR.Term (Term)
22+
import Codec.CBOR.Term qualified as C
23+
import System.Random (newStdGen)
24+
import Test.Hspec (Expectation, Spec, describe, it, shouldBe)
25+
26+
foo :: H.Rule
27+
foo = withGenerator (\_ -> pure . S $ C.TString "bar") $ "foo" =:= arr [1, 2, 3]
28+
29+
simpleTermExample :: Huddle
30+
simpleTermExample =
31+
collectFrom
32+
[ HIRule foo
33+
]
34+
35+
refTermExample :: Huddle
36+
refTermExample =
37+
collectFrom
38+
[ HIRule foo
39+
, HIRule $ "bar" =:= arr [0, a foo]
40+
]
41+
42+
huddleShouldGenerate :: Huddle -> Term -> Expectation
43+
huddleShouldGenerate huddle term = do
44+
g <- newStdGen
45+
ct <- case fullResolveCDDL . mapCDDLDropExt $ toCDDL huddle of
46+
Right x -> pure x
47+
Left err -> fail $ "Failed to resolve CDDL: " <> show err
48+
generateCBORTerm ct "foo" g `shouldBe` term
49+
50+
spec :: Spec
51+
spec = do
52+
describe "Custom generators" $ do
53+
describe "Huddle" $ do
54+
it "If a term has a custom generator then it is used" $
55+
simpleTermExample `huddleShouldGenerate` C.TString "bar"
56+
it "Custom generator works when called via reference" $
57+
refTermExample `huddleShouldGenerate` C.TString "bar"

0 commit comments

Comments
 (0)