@@ -6,6 +6,8 @@ module Test.Codec.CBOR.Cuddle.CDDL.Validator (
66 spec ,
77 expectValid ,
88 expectInvalid ,
9+ genAndValidateCddl ,
10+ genAndValidateRule ,
911) where
1012
1113import Codec.CBOR.Cuddle.CBOR.Gen (generateFromName )
@@ -24,7 +26,7 @@ import Codec.CBOR.Cuddle.CDDL.CBORGenerator (CustomValidatorResult (..))
2426import Codec.CBOR.Cuddle.CDDL.CTree (CTreeRoot (.. ))
2527import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
2628import Codec.CBOR.Cuddle.CDDL.Postlude (appendPostlude )
27- import Codec.CBOR.Cuddle.CDDL.Resolve (fullResolveCDDL )
29+ import Codec.CBOR.Cuddle.CDDL.Resolve (MonoReferenced , fullResolveCDDL )
2830import Codec.CBOR.Cuddle.Huddle (
2931 Huddle ,
3032 HuddleItem (.. ),
@@ -90,31 +92,42 @@ import Test.QuickCheck (
9092 )
9193import Text.Megaparsec (runParser )
9294
95+ -- | Test that a specific rule in a resolved CDDL generates valid values
96+ genAndValidateRule :: String -> Name -> CTreeRoot MonoReferenced -> Spec
97+ genAndValidateRule description name resolvedCddl =
98+ prop description $ do
99+ cborTerm <- runAntiGen $ generateFromName (mapIndex resolvedCddl) name
100+ let
101+ generatedCbor = toStrictByteString $ encodeTerm cborTerm
102+ res = validateCBOR generatedCbor name (mapIndex resolvedCddl)
103+ extraInfo =
104+ unlines
105+ [ " CBOR term:"
106+ , prettyHexEnc $ encodeTerm cborTerm
107+ ]
108+ pure . counterexample extraInfo $ expectValid res
109+
110+ -- | Test that all rules in a resolved CDDL generate valid values
111+ genAndValidateCddl :: String -> CTreeRoot MonoReferenced -> Spec
112+ genAndValidateCddl description resolvedCddl@ (CTreeRoot m) = do
113+ let
114+ isRule CTree. Group {} = False
115+ isRule _ = True
116+ describe description $ do
117+ forM_ (Map. keys $ Map. filter isRule m) $ \ name@ (Name n) ->
118+ genAndValidateRule (T. unpack n) name resolvedCddl
119+
93120genAndValidateFromFile :: FilePath -> Spec
94121genAndValidateFromFile path = do
95122 contents <- runIO $ T. readFile =<< getDataFileName path
96123 let
97124 cddl = fromRight (error " Failed to parse CDDL" ) $ runParser pCDDL path contents
98125 resolverError x =
99126 error $ " Failed to resolve the CDDL from file " <> show path <> " :\n " <> show x
100- resolvedCddl@ ( CTreeRoot m) =
127+ resolvedCddl =
101128 either resolverError id . fullResolveCDDL . appendPostlude $
102129 mapCDDLDropExt cddl
103- isRule CTree. Group {} = False
104- isRule _ = True
105- describe path $ do
106- forM_ (Map. keys $ Map. filter isRule m) $ \ name@ (Name n) ->
107- prop (T. unpack n) $ do
108- cborTerm <- runAntiGen $ generateFromName (mapIndex resolvedCddl) name
109- let
110- generatedCbor = toStrictByteString $ encodeTerm cborTerm
111- res = validateCBOR generatedCbor name (mapIndex resolvedCddl)
112- extraInfo =
113- unlines
114- [ " CBOR term:"
115- , prettyHexEnc $ encodeTerm cborTerm
116- ]
117- pure . counterexample extraInfo $ expectValid res
130+ genAndValidateCddl path resolvedCddl
118131
119132genInfiniteUniqueList :: Ord a => Gen a -> Gen [a ]
120133genInfiniteUniqueList = fmap nubOrd . infiniteListOf
0 commit comments