Add candidate artifact codec decoding

This commit is contained in:
2026-08-09 00:57:03 +00:00
parent ee600975f0
commit 557809f364
13 changed files with 198 additions and 1 deletions

View File

@@ -22,6 +22,7 @@ const (
var schemaAssets embed.FS
var _ contracts.ArtifactCodec[dnd.NPCRegistry] = (*Codec)(nil)
var _ contracts.CandidateArtifactCodec[dnd.NPCRegistry] = (*Codec)(nil)
type Codec struct{}

View File

@@ -112,6 +112,39 @@ func TestCodecCandidatePreservesInvalidTypedValues(t *testing.T) {
}
}
func TestCodecCandidateDecodeOwnsValues(t *testing.T) {
codec := New()
input := validList()
content, err := codec.EncodeCandidate(input)
if err != nil {
t.Fatal(err)
}
first, err := codec.DecodeCandidate(content)
if err != nil {
t.Fatal(err)
}
second, err := codec.DecodeCandidate(content)
if err != nil {
t.Fatal(err)
}
nameOffset := bytes.Index(content, []byte("Mira Thorn"))
if nameOffset < 0 {
t.Fatal("candidate JSON does not contain NPC name")
}
content[nameOffset] = 'X'
if first.NPCs[0].Name != "Mira Thorn" {
t.Fatal("DecodeCandidate() retained input bytes")
}
first.NPCs[0].Name = "changed"
first.NPCs[0].SourceRefs[0].SourceID = "changed"
if input.NPCs[0].Name != "Mira Thorn" || input.NPCs[0].SourceRefs[0].SourceID != "session-alpha" {
t.Fatal("DecodeCandidate() retained input values")
}
if second.NPCs[0].Name != "Mira Thorn" || second.NPCs[0].SourceRefs[0].SourceID != "session-alpha" {
t.Fatal("DecodeCandidate() returned aliased values")
}
}
func TestCodecRejectsEveryRequiredShapeBoundary(t *testing.T) {
base := validList().NPCs[0]
tests := []struct {