mirror of
https://github.com/ii64/sonic.git
synced 2026-06-21 00:46:43 +08:00
86 lines
No EOL
2.6 KiB
Go
86 lines
No EOL
2.6 KiB
Go
/*
|
|
* Copyright 2021 ByteDance Inc.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package sonic
|
|
|
|
import (
|
|
`fmt`
|
|
`reflect`
|
|
_ `sync`
|
|
`testing`
|
|
`unsafe`
|
|
|
|
stdjson `encoding/json`
|
|
)
|
|
|
|
func TestLargeMapValue(t *testing.T) {
|
|
var jsonStr = `{
|
|
"1": {},
|
|
"2": {},
|
|
"3": {},
|
|
"4": {},
|
|
"5": {},
|
|
"6": {},
|
|
"7": {},
|
|
"8": {},
|
|
"9": {}
|
|
}`
|
|
type Case struct {
|
|
std interface{}
|
|
sonic interface{}
|
|
}
|
|
cases := []Case{
|
|
{&map[string]TestIssue100_LargeMapValue{}, &map[string]TestIssue100_LargeMapValue{}},
|
|
{&map[int32]TestIssue100_LargeMapValue{}, &map[int32]TestIssue100_LargeMapValue{}},
|
|
{&map[int64]TestIssue100_LargeMapValue{}, &map[int64]TestIssue100_LargeMapValue{}},
|
|
{&map[uint32]TestIssue100_LargeMapValue{}, &map[uint32]TestIssue100_LargeMapValue{}},
|
|
{&map[uint64]TestIssue100_LargeMapValue{}, &map[uint64]TestIssue100_LargeMapValue{}},
|
|
{&map[TestIssue100_textMarshalKey]TestIssue100_LargeMapValue{}, &map[TestIssue100_textMarshalKey]TestIssue100_LargeMapValue{}},
|
|
{&map[TestIssue100_textMarshalKeyPtr]TestIssue100_LargeMapValue{}, &map[TestIssue100_textMarshalKeyPtr]TestIssue100_LargeMapValue{}},
|
|
}
|
|
for i, c := range cases {
|
|
var stdw, sonicw = c.std, c.sonic
|
|
if err := stdjson.Unmarshal([]byte(jsonStr), stdw); err != nil {
|
|
t.Fatal(i, err)
|
|
}
|
|
fmt.Printf("[%d]struct size: %d\tmap length: %d\n", i, unsafe.Sizeof(TestIssue100_LargeMapValue{}), reflect.ValueOf(stdw).Elem().Len())
|
|
if err := Unmarshal([]byte(jsonStr), sonicw); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
if !reflect.DeepEqual(stdw, sonicw) {
|
|
fmt.Printf("have:\n\t%#v\nwant:\n\t%#v\n", sonicw, stdw)
|
|
t.Fatal(i)
|
|
}
|
|
}
|
|
}
|
|
|
|
type TestIssue100_textMarshalKey string
|
|
|
|
func(self TestIssue100_textMarshalKey) UnmarshalText(text []byte) error {
|
|
self = TestIssue100_textMarshalKey(text)
|
|
return nil
|
|
}
|
|
|
|
type TestIssue100_textMarshalKeyPtr string
|
|
|
|
func(self *TestIssue100_textMarshalKeyPtr) UnmarshalText(text []byte) error {
|
|
*self = TestIssue100_textMarshalKeyPtr(text)
|
|
return nil
|
|
}
|
|
|
|
type TestIssue100_LargeMapValue struct {
|
|
Id [129]byte
|
|
} |