generic: generalise json check

This code is shared for all json checks.

Signed-off-by: Yonah <contrib@gensokyo.uk>
This commit is contained in:
Yonah 2025-09-17 06:32:57 +09:00
parent 821e46d405
commit 2f34599823
Signed by: yonah
SSH Key Fingerprint: SHA256:vnQvK8+XXH9Tbni2AV1a/8qdVK/zPcXw52GM0ruQvwA
2 changed files with 31 additions and 31 deletions

View File

@ -1,10 +1,7 @@
package monstersirenfetch_test package monstersirenfetch_test
import ( import (
"bytes"
_ "embed" _ "embed"
"encoding/json"
"reflect"
"testing" "testing"
. "git.gensokyo.uk/yonah/monstersirenfetch" . "git.gensokyo.uk/yonah/monstersirenfetch"
@ -14,7 +11,7 @@ import (
var albumsJSON []byte var albumsJSON []byte
func TestAlbums(t *testing.T) { func TestAlbums(t *testing.T) {
want := Albums{Code: 0, Msg: "", Data: []Album{ checkJSONRoundTrip(t, Albums{Code: 0, Msg: "", Data: []Album{
{CID: 2444, Name: "无忧梦呓OST", CoverURL: "https://web.hycdn.cn/siren/pic/20250905/2039eb5cf7f7d3a951d5f653c6d33f64.jpg", Artists: []string{"塞壬唱片-MSR"}}, {CID: 2444, Name: "无忧梦呓OST", CoverURL: "https://web.hycdn.cn/siren/pic/20250905/2039eb5cf7f7d3a951d5f653c6d33f64.jpg", Artists: []string{"塞壬唱片-MSR"}},
{CID: 5192, Name: "焰烬曙明OST", CoverURL: "https://web.hycdn.cn/siren/pic/20250905/6e32685dcc113791d9e90c14e18634c6.jpg", Artists: []string{"塞壬唱片-MSR"}}, {CID: 5192, Name: "焰烬曙明OST", CoverURL: "https://web.hycdn.cn/siren/pic/20250905/6e32685dcc113791d9e90c14e18634c6.jpg", Artists: []string{"塞壬唱片-MSR"}},
{CID: 1019, Name: "in your blue eyes", CoverURL: "https://web.hycdn.cn/siren/pic/20250903/63d83dcec8698fde96edcd039d9f4fcf.jpg", Artists: []string{"Ave Mujica"}}, {CID: 1019, Name: "in your blue eyes", CoverURL: "https://web.hycdn.cn/siren/pic/20250903/63d83dcec8698fde96edcd039d9f4fcf.jpg", Artists: []string{"Ave Mujica"}},
@ -261,31 +258,5 @@ func TestAlbums(t *testing.T) {
{CID: 1030, Name: "Speed of Light", CoverURL: "https://web.hycdn.cn/siren/pic/20210322/56cbcd1d0093d8ee8ee22bf6d68ab4a6.jpg", Artists: []string{"塞壬唱片-MSR", "DJ Okawari"}}, {CID: 1030, Name: "Speed of Light", CoverURL: "https://web.hycdn.cn/siren/pic/20210322/56cbcd1d0093d8ee8ee22bf6d68ab4a6.jpg", Artists: []string{"塞壬唱片-MSR", "DJ Okawari"}},
{CID: 8947, Name: "火蓝之心原声带", CoverURL: "https://web.hycdn.cn/siren/pic/20210322/199df150e1370a4138fa0352ff95a5b5.jpg", Artists: []string{"Alive Until Sunset", " Emperor", " D.D.D."}}, {CID: 8947, Name: "火蓝之心原声带", CoverURL: "https://web.hycdn.cn/siren/pic/20210322/199df150e1370a4138fa0352ff95a5b5.jpg", Artists: []string{"Alive Until Sunset", " Emperor", " D.D.D."}},
{CID: 4527, Name: "明日方舟OST1", CoverURL: "https://web.hycdn.cn/siren/pic/20210322/bb51040a1dfe53b97590451156852bd6.jpg", Artists: []string{"塞壬唱片-MSR"}}, {CID: 4527, Name: "明日方舟OST1", CoverURL: "https://web.hycdn.cn/siren/pic/20210322/bb51040a1dfe53b97590451156852bd6.jpg", Artists: []string{"塞壬唱片-MSR"}},
}} }}, albumsJSON)
t.Run("marshal", func(t *testing.T) {
buf := new(bytes.Buffer)
buf.Grow(len(albumsJSON))
e := json.NewEncoder(buf)
// to match upstream behaviour
e.SetEscapeHTML(false)
err := e.Encode(&want)
if err != nil {
t.Fatalf("Marshal: error = %v", err)
}
got := bytes.TrimSuffix(buf.Bytes(), []byte{'\n'})
if string(got) != string(albumsJSON) {
t.Errorf("Marshal:\n%s\nwant\n%s", buf, string(albumsJSON))
}
})
t.Run("unmarshal", func(t *testing.T) {
var got Albums
if err := json.Unmarshal(albumsJSON, &got); err != nil {
t.Fatalf("Unmarshal: error = %v", err)
}
if !reflect.DeepEqual(&got, &want) {
t.Errorf("Unmarshal:\n%#v\nwant\n%#v", got, want)
}
})
} }

View File

@ -1,6 +1,7 @@
package monstersirenfetch_test package monstersirenfetch_test
import ( import (
"bytes"
"encoding/json" "encoding/json"
"reflect" "reflect"
"strconv" "strconv"
@ -59,3 +60,31 @@ func newSyntaxError(msg string, offset int64) *json.SyntaxError {
reflect.NewAt(msgV.Type(), unsafe.Pointer(msgV.UnsafeAddr())).Elem().SetString(msg) reflect.NewAt(msgV.Type(), unsafe.Pointer(msgV.UnsafeAddr())).Elem().SetString(msg)
return e return e
} }
func checkJSONRoundTrip[T any](t *testing.T, v T, data []byte) {
t.Run("marshal", func(t *testing.T) {
buf := new(bytes.Buffer)
buf.Grow(len(data))
e := json.NewEncoder(buf)
// to match upstream behaviour
e.SetEscapeHTML(false)
err := e.Encode(&v)
if err != nil {
t.Fatalf("Marshal: error = %v", err)
}
got := buf.Bytes()[:buf.Len()-1]
if string(got) != string(data) {
t.Errorf("Marshal:\n%s\nwant\n%s", string(got), string(data))
}
})
t.Run("unmarshal", func(t *testing.T) {
var got T
if err := json.Unmarshal(data, &got); err != nil {
t.Fatalf("Unmarshal: error = %v", err)
}
if !reflect.DeepEqual(&got, &v) {
t.Errorf("Unmarshal:\n%#v\nwant\n%#v", got, v)
}
})
}