Centralize D&D candidate JSON codecs
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package candidatejson
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
type testCandidate struct {
|
||||
Items []string `json:"items"`
|
||||
}
|
||||
|
||||
func TestCandidateJSON(t *testing.T) {
|
||||
input := testCandidate{Items: []string{"one", "two"}}
|
||||
content, err := EncodeCandidate("test candidate", input)
|
||||
if err != nil {
|
||||
t.Fatalf("EncodeCandidate() error = %v", err)
|
||||
}
|
||||
if !json.Valid(content) {
|
||||
t.Fatalf("EncodeCandidate() = %q, want JSON", content)
|
||||
}
|
||||
for _, test := range []struct {
|
||||
name string
|
||||
content []byte
|
||||
want testCandidate
|
||||
wantErr string
|
||||
}{
|
||||
{name: "typed round trip", content: content, want: input},
|
||||
{name: "unknown field", content: []byte(`{"items":[],"unexpected":true}`), wantErr: "unknown field"},
|
||||
{name: "malformed JSON", content: []byte(`{"items":`), wantErr: "decode test candidate"},
|
||||
{name: "trailing value", content: []byte(`{"items":[]} {}`), wantErr: "multiple JSON values"},
|
||||
} {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
got, err := DecodeCandidate[testCandidate]("test candidate", test.content)
|
||||
if test.wantErr != "" {
|
||||
if err == nil || !strings.Contains(err.Error(), test.wantErr) {
|
||||
t.Fatalf("DecodeCandidate() error = %v, want %q", err, test.wantErr)
|
||||
}
|
||||
return
|
||||
}
|
||||
if err != nil || !reflect.DeepEqual(got, test.want) {
|
||||
t.Fatalf("DecodeCandidate() = %#v, %v; want %#v", got, err, test.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user