forked from mirror/go-json
122 lines
1.9 KiB
Go
122 lines
1.9 KiB
Go
package json_test
|
|
|
|
import (
|
|
"context"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
type queryTestX struct {
|
|
XA int
|
|
XB string
|
|
XC *queryTestY
|
|
XD bool
|
|
XE float32
|
|
}
|
|
|
|
type queryTestY struct {
|
|
YA int
|
|
YB string
|
|
YC *queryTestZ
|
|
YD bool
|
|
YE float32
|
|
}
|
|
|
|
type queryTestZ struct {
|
|
ZA string
|
|
ZB bool
|
|
ZC int
|
|
}
|
|
|
|
func (z *queryTestZ) MarshalJSON(ctx context.Context) ([]byte, error) {
|
|
type _queryTestZ queryTestZ
|
|
return json.MarshalContext(ctx, (*_queryTestZ)(z))
|
|
}
|
|
|
|
func TestFieldQuery(t *testing.T) {
|
|
query, err := json.BuildFieldQuery(
|
|
"XA",
|
|
"XB",
|
|
json.BuildSubFieldQuery("XC").Fields(
|
|
"YA",
|
|
"YB",
|
|
json.BuildSubFieldQuery("YC").Fields(
|
|
"ZA",
|
|
"ZB",
|
|
),
|
|
),
|
|
)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(query, &json.FieldQuery{
|
|
Fields: []*json.FieldQuery{
|
|
{
|
|
Name: "XA",
|
|
},
|
|
{
|
|
Name: "XB",
|
|
},
|
|
{
|
|
Name: "XC",
|
|
Fields: []*json.FieldQuery{
|
|
{
|
|
Name: "YA",
|
|
},
|
|
{
|
|
Name: "YB",
|
|
},
|
|
{
|
|
Name: "YC",
|
|
Fields: []*json.FieldQuery{
|
|
{
|
|
Name: "ZA",
|
|
},
|
|
{
|
|
Name: "ZB",
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
},
|
|
}) {
|
|
t.Fatal("cannot get query")
|
|
}
|
|
queryStr, err := query.QueryString()
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if queryStr != `["XA","XB",{"XC":["YA","YB",{"YC":["ZA","ZB"]}]}]` {
|
|
t.Fatalf("failed to create query string. %s", queryStr)
|
|
}
|
|
ctx := json.SetFieldQueryToContext(context.Background(), query)
|
|
b, err := json.MarshalContext(ctx, &queryTestX{
|
|
XA: 1,
|
|
XB: "xb",
|
|
XC: &queryTestY{
|
|
YA: 2,
|
|
YB: "yb",
|
|
YC: &queryTestZ{
|
|
ZA: "za",
|
|
ZB: true,
|
|
ZC: 3,
|
|
},
|
|
YD: true,
|
|
YE: 4,
|
|
},
|
|
XD: true,
|
|
XE: 5,
|
|
})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
expected := `{"XA":1,"XB":"xb","XC":{"YA":2,"YB":"yb","YC":{"ZA":"za","ZB":true}}}`
|
|
got := string(b)
|
|
if expected != got {
|
|
t.Fatalf("failed to encode with field query: expected %q but got %q", expected, got)
|
|
}
|
|
}
|