Skip to content

Add more decision points#154

Open
Soupstraw wants to merge 10 commits intomasterfrom
jj/more-decision-points
Open

Add more decision points#154
Soupstraw wants to merge 10 commits intomasterfrom
jj/more-decision-points

Conversation

@Soupstraw
Copy link
Contributor

@Soupstraw Soupstraw commented Mar 5, 2026

This PR adds AntiGen decision points to prelude term generators, so that when zapped, the type of the will change to something completely different.

Because of #155, this will sometimes produce valid values after zapping, since the zapped term might get overwritten by nubOrdBy. This was actually an issue before, but there were no tests to actually catch that.

related #150

@Soupstraw Soupstraw changed the title WIP Add more decision points Mar 5, 2026
@Soupstraw Soupstraw marked this pull request as ready for review March 6, 2026 10:11
@Soupstraw Soupstraw force-pushed the jj/more-decision-points branch 2 times, most recently from 4e192e2 to 6d67dbc Compare March 9, 2026 12:36
@Soupstraw Soupstraw requested review from Copilot and lehins March 9, 2026 12:36
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR adds AntiGen decision points to the CDDL prelude term generators in the cuddle library, so that when "zapped" (fault-injected), the primitive type will change to a completely different type, producing more effective negative test cases. The PR also refactors genForCTree to add withAnnotation calls for better debugging output, adds positive generator tests, and upgrades the antigen dependency from 0.3.x to 0.4.x.

Changes:

  • Refactored genPostlude to use a two-phase approach: faultyPTerm selects the type (with fault injection to swap types when zapped), then genPTerm generates a value for that type
  • Added withAnnotation calls throughout genForCTree for better tracing/debugging of generator decisions
  • Added positive generator tests (genAndValidateHuddle) and extracted reusable test helpers (genAndValidateRule, genAndValidateCddl) from Validator.hs

Reviewed changes

Copilot reviewed 6 out of 8 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/Codec/CBOR/Cuddle/CBOR/Gen.hs Refactored genPostlude with type-level fault injection, added withAnnotation throughout genForCTree, generalized genTerm/genSized signatures to MonadGen
src/Codec/CBOR/Cuddle/CDDL/CTree.hs Added Enum, Bounded, and Arbitrary deriving/instance to PTerm
test/Test/Codec/CBOR/Cuddle/CDDL/GeneratorSpec.hs Added positive generator tests, updated expectZapInvalidates to use zapAntiGenResult for better diagnostics, disabled optionalMapExample test with xdescribe
test/Test/Codec/CBOR/Cuddle/CDDL/Validator.hs Extracted genAndValidateRule and genAndValidateCddl as reusable helpers, refactored genAndValidateFromFile to use them
test/Test/Codec/CBOR/Cuddle/CDDL/Examples/Huddle.hs Changed optionalMapExample key range from 0..10 to 1..10
cuddle.cabal Updated antigen to ^>=0.4, added generic-random dependency
stack.yaml Updated antigen hash for version 0.4.0.0
flake.lock Updated hackage.nix lock

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Soupstraw Soupstraw force-pushed the jj/more-decision-points branch 3 times, most recently from b3de922 to 06ef588 Compare March 13, 2026 13:15
Soupstraw and others added 10 commits March 18, 2026 12:02
Extract genAndValidateRule and genAndValidateCddl from genAndValidateFromFile
to enable reuse for testing Huddle schemas. Add "Generated value validates"
tests that verify generated CBOR values pass validation.

This exposes a bug in optionalMapExample where the generator cannot reliably
produce 10 unique keys from a 10-element range (1..10), causing most generated
maps to have fewer than the required 10 entries.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The generator cannot reliably produce unique keys for maps where the
key range size equals the required entry count. This will be addressed
in a separate PR.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Generator: PTUInt and PTNInt now have decision points that generate
  out-of-bounds values when zapped (wrong sign or exceeding 64-bit range)
- Validator: PTUInt now checks 0 <= i <= 2^64-1 (was just i >= 0)
- Validator: PTNInt now checks -2^64 <= i <= -1 (was just i <= 0)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
genFaultyHalf generates invalid half-precision values:
- NaN, +Inf, -Inf (special values)
- Values outside half range (±65504)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
NaN and Infinity are valid per CBOR/CDDL spec (IEEE 754), so they
should be generated in the normal case. The faulty generator now
only produces values outside the half-precision range (±65504).

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Out-of-range float values become Infinity when encoded as float16,
and Infinity is valid per IEEE 754/CBOR spec. The decision point
was not producing actually invalid values.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@Soupstraw Soupstraw force-pushed the jj/more-decision-points branch from 06ef588 to c79f237 Compare March 18, 2026 10:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants