github.com/goshafaq/sonic@v0.0.0-20231026082336-871835fb94c6/compat_test.go (about) 1 /* 2 * Copyright 2022 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 sonic 18 19 import ( 20 "bytes" 21 "encoding/json" 22 "reflect" 23 "testing" 24 25 "github.com/goshafaq/sonic/option" 26 "github.com/stretchr/testify/require" 27 ) 28 29 func TestCompatUnmarshalStd(t *testing.T) { 30 var sobj = map[string]interface{}{} 31 var jobj = map[string]interface{}{} 32 var data = []byte(`{"a":1.00000001E-10}`) 33 var str = string(data) 34 serr := ConfigStd.UnmarshalFromString(str, &sobj) 35 jerr := json.Unmarshal(data, &jobj) 36 require.Equal(t, jerr, serr) 37 require.Equal(t, jobj, sobj) 38 data[2] = '0' 39 require.Equal(t, jobj, sobj) 40 41 sobj = map[string]interface{}{} 42 jobj = map[string]interface{}{} 43 data = []byte(`{"a":1}`) 44 cfg := Config{ 45 UseNumber: true, 46 }.Froze() 47 serr = cfg.Unmarshal(data, &sobj) 48 dec := json.NewDecoder(bytes.NewBuffer(data)) 49 dec.UseNumber() 50 jerr = dec.Decode(&jobj) 51 require.Equal(t, jerr, serr) 52 require.Equal(t, jobj, sobj) 53 54 x := struct { 55 A json.Number 56 B json.Number 57 }{} 58 y := struct { 59 A json.Number 60 B json.Number 61 }{} 62 data = []byte(`{"A":"1", "C":-1, "B":1}`) 63 cfg = Config{ 64 DisallowUnknownFields: true, 65 }.Froze() 66 serr = cfg.Unmarshal(data, &x) 67 dec = json.NewDecoder(bytes.NewBuffer(data)) 68 dec.UseNumber() 69 dec.DisallowUnknownFields() 70 jerr = dec.Decode(&y) 71 require.Equal(t, jerr, serr) 72 // require.Equal(t, y, x) 73 } 74 75 func TestCompatMarshalStd(t *testing.T) { 76 t.Parallel() 77 var obj = map[string]interface{}{ 78 "c": json.RawMessage(" [ \"<&>\" ] "), 79 "b": json.RawMessage(" [ ] "), 80 } 81 sout, serr := ConfigStd.Marshal(obj) 82 jout, jerr := json.Marshal(obj) 83 require.Equal(t, jerr, serr) 84 require.Equal(t, string(jout), string(sout)) 85 86 obj = map[string]interface{}{ 87 "a": json.RawMessage(" [} "), 88 } 89 sout, serr = ConfigStd.Marshal(obj) 90 jout, jerr = json.Marshal(obj) 91 require.NotNil(t, jerr) 92 require.NotNil(t, serr) 93 require.Equal(t, string(jout), string(sout)) 94 95 obj = map[string]interface{}{ 96 "a": json.RawMessage("1"), 97 } 98 sout, serr = ConfigStd.MarshalIndent(obj, "xxxx", " ") 99 jout, jerr = json.MarshalIndent(obj, "xxxx", " ") 100 require.Equal(t, jerr, serr) 101 require.Equal(t, string(jout), string(sout)) 102 } 103 104 func TestCompatEncoderStd(t *testing.T) { 105 var o = map[string]interface{}{ 106 "a": "<>", 107 "b": json.RawMessage(" [ ] "), 108 } 109 var w1 = bytes.NewBuffer(nil) 110 var w2 = bytes.NewBuffer(nil) 111 var enc1 = json.NewEncoder(w1) 112 var enc2 = ConfigStd.NewEncoder(w2) 113 114 require.Nil(t, enc1.Encode(o)) 115 require.Nil(t, enc2.Encode(o)) 116 require.Equal(t, w1.String(), w2.String()) 117 118 enc1.SetEscapeHTML(true) 119 enc2.SetEscapeHTML(true) 120 enc1.SetIndent("\n", " ") 121 enc2.SetIndent("\n", " ") 122 require.Nil(t, enc1.Encode(o)) 123 require.Nil(t, enc2.Encode(o)) 124 require.Equal(t, w1.String(), w2.String()) 125 126 enc1.SetEscapeHTML(false) 127 enc2.SetEscapeHTML(false) 128 enc1.SetIndent("", "") 129 enc2.SetIndent("", "") 130 require.Nil(t, enc1.Encode(o)) 131 require.Nil(t, enc2.Encode(o)) 132 require.Equal(t, w1.String(), w2.String()) 133 } 134 135 func TestCompatDecoderStd(t *testing.T) { 136 var o1 = map[string]interface{}{} 137 var o2 = map[string]interface{}{} 138 var s = `{"a":"b"} {"1":"2"} a {}` 139 var w1 = bytes.NewBuffer([]byte(s)) 140 var w2 = bytes.NewBuffer([]byte(s)) 141 var enc1 = json.NewDecoder(w1) 142 var enc2 = ConfigStd.NewDecoder(w2) 143 144 require.Equal(t, enc1.More(), enc2.More()) 145 require.Nil(t, enc1.Decode(&o1)) 146 require.Nil(t, enc2.Decode(&o2)) 147 require.Equal(t, w1.String(), w2.String()) 148 149 require.Equal(t, enc1.More(), enc2.More()) 150 require.Nil(t, enc1.Decode(&o1)) 151 require.Nil(t, enc2.Decode(&o2)) 152 require.Equal(t, w1.String(), w2.String()) 153 154 require.Equal(t, enc1.More(), enc2.More()) 155 require.NotNil(t, enc1.Decode(&o1)) 156 require.NotNil(t, enc2.Decode(&o2)) 157 require.Equal(t, w1.String(), w2.String()) 158 } 159 160 func TestPretouch(t *testing.T) { 161 var v map[string]interface{} 162 if err := Pretouch(reflect.TypeOf(v)); err != nil { 163 t.Errorf("err:%v", err) 164 } 165 166 if err := Pretouch(reflect.TypeOf(v), 167 option.WithCompileRecursiveDepth(1), 168 option.WithCompileMaxInlineDepth(2), 169 ); err != nil { 170 t.Errorf("err:%v", err) 171 } 172 } 173 174 func TestGet(t *testing.T) { 175 var data = `{"a":"b"}` 176 r, err := GetFromString(data, "a") 177 if err != nil { 178 t.Fatal(err) 179 } 180 v, err := r.String() 181 if err != nil { 182 t.Fatal(err) 183 } 184 if v != "b" { 185 t.Fatal(v) 186 } 187 }