github.com/bytedance/sonic@v1.11.7-0.20240517092252-d2edb31b167b/issue_test/issue141_test.go (about) 1 /* 2 * Copyright 2021 ByteDance Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package issue_test 18 19 import ( 20 `encoding/json` 21 `testing` 22 `reflect` 23 24 `github.com/stretchr/testify/require` 25 .`github.com/bytedance/sonic` 26 ) 27 28 type Issue141_Case_Insentive1 struct { 29 Field0 int `json:"foo"` 30 Field1 int `json:"FOO"` 31 Field2 int `json:"FoO"` 32 FOo int 33 } 34 35 type Issue141_Case_Insentive2 struct { 36 Field0 int `json:"FOO"` 37 Field1 int `json:"foo"` 38 Field2 int `json:"FoO"` 39 FOo int 40 } 41 42 type Issue141_Case_Insentive3 struct { 43 FOo int 44 Field0 int `json:"FoO"` 45 Field1 int `json:"foo"` 46 Field2 int `json:"FOO"` 47 } 48 49 type Issue141_Case_Insentive4 struct { 50 foo int 51 Field0 int `json:"FoO"` 52 Field1 int `json:"foo"` 53 Field2 int `json:"FOO"` 54 } 55 56 type Issue141_Matched1 struct { 57 Field0 int `json:"FOO"` 58 Field1 int `json:"foo"` 59 Field2 int `json:"FoO"` 60 Foo int 61 } 62 63 type Issue141_Matched2 struct { 64 Field0 int `json:"FOO"` 65 Field1 int `json:"foo"` 66 Field2 int `json:"FoO"` 67 Foo int 68 Field3 int `json:"Foo"` 69 } 70 71 // Struct field priority in unmarshal, see https://go.dev/blog/json 72 func TestIssue141_StructFieldPriority(t *testing.T) { 73 data := []byte("{\"Foo\":1}") 74 for _, factory := range []func() interface{}{ 75 func() interface{} { return new(Issue141_Case_Insentive1) }, 76 func() interface{} { return new(Issue141_Case_Insentive2) }, 77 func() interface{} { return new(Issue141_Case_Insentive3) }, 78 func() interface{} { return new(Issue141_Case_Insentive4) }, 79 func() interface{} { return new(Issue141_Matched1) }, 80 func() interface{} { return new(Issue141_Matched2) }, 81 }{ 82 v1, v2 := factory(), factory() 83 err1 := json.Unmarshal(data, &v1) 84 err2 := Unmarshal(data, &v2) 85 require.NoError(t, err1) 86 require.NoError(t, err2) 87 require.Equal(t, v1, v2) 88 89 switch reflect.TypeOf(v2).Elem() { 90 case reflect.TypeOf(Issue141_Case_Insentive1{}): 91 println("Issue141_Case_Insentive1.Field0(tag foo) is ", v2.(*Issue141_Case_Insentive1).Field0) 92 case reflect.TypeOf(Issue141_Case_Insentive2{}): 93 println("Issue141_Case_Insentive2.Field0(tag FOO) is ", v2.(*Issue141_Case_Insentive2).Field0) 94 case reflect.TypeOf(Issue141_Case_Insentive3{}): 95 println("Issue141_Case_Insentive3.FOo is ", v2.(*Issue141_Case_Insentive3).FOo) 96 case reflect.TypeOf(Issue141_Case_Insentive4{}): 97 println("Issue141_Case_Insentive4.Field0(tag FoO) is ", v2.(*Issue141_Case_Insentive4).Field0) 98 case reflect.TypeOf(Issue141_Matched1{}): 99 println("Issue141_Matched1.Foo is ", v2.(*Issue141_Matched1).Foo) 100 case reflect.TypeOf(Issue141_Matched2{}): 101 println("Issue141_Matched2.Field3(tag Foo) is ", v2.(*Issue141_Matched2).Field3) 102 println("Issue141_Matched2.Foo is ", v2.(*Issue141_Matched2).Foo) 103 } 104 } 105 }