From 2f3459982393aed0deb0dc66d8cc942ef2b1d4ce Mon Sep 17 00:00:00 2001 From: Yonah Date: Wed, 17 Sep 2025 06:32:57 +0900 Subject: [PATCH] generic: generalise json check This code is shared for all json checks. Signed-off-by: Yonah --- albums_test.go | 33 ++------------------------------- generic_test.go | 29 +++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/albums_test.go b/albums_test.go index 8e1868f..486896e 100644 --- a/albums_test.go +++ b/albums_test.go @@ -1,10 +1,7 @@ package monstersirenfetch_test import ( - "bytes" _ "embed" - "encoding/json" - "reflect" "testing" . "git.gensokyo.uk/yonah/monstersirenfetch" @@ -14,7 +11,7 @@ import ( var albumsJSON []byte 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: 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"}}, @@ -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: 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"}}, - }} - - 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) - } - }) + }}, albumsJSON) } diff --git a/generic_test.go b/generic_test.go index 1d7f04c..9c7793b 100644 --- a/generic_test.go +++ b/generic_test.go @@ -1,6 +1,7 @@ package monstersirenfetch_test import ( + "bytes" "encoding/json" "reflect" "strconv" @@ -59,3 +60,31 @@ func newSyntaxError(msg string, offset int64) *json.SyntaxError { reflect.NewAt(msgV.Type(), unsafe.Pointer(msgV.UnsafeAddr())).Elem().SetString(msg) 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) + } + }) +}