github.com/bytedance/sonic@v1.11.7-0.20240517092252-d2edb31b167b/issue_test/issue_recurse_test.go (about)

     1  package issue_test
     2  
     3  import (
     4      `encoding/json`
     5      `fmt`
     6      `reflect`
     7      `strconv`
     8      `testing`
     9      `time`
    10  
    11      `github.com/bytedance/sonic`
    12      `github.com/davecgh/go-spew/spew`
    13      `github.com/stretchr/testify/require`
    14  )
    15  
    16  func TestPointerValueRecurseMarshal(t *testing.T) {
    17      info := &TestStruct1{
    18          StartTime: JSONTime(time.Now()),
    19      }
    20      infos := &[]*TestStruct1{info}
    21  
    22      bytes, err1 := json.Marshal(infos)
    23      fmt.Printf("%+v\n", string(bytes))
    24      spew.Dump(bytes, err1)
    25  
    26      jbytes, err2 := sonic.Marshal(infos)
    27      fmt.Printf("%+v\n", string(jbytes))
    28      spew.Dump(jbytes, err2)
    29      require.Equal(t, bytes, jbytes)
    30  }
    31  
    32  func TestPointerValueRecursePretouch(t *testing.T) {
    33      info := &TestStruct2{
    34          StartTime: JSONTime(time.Now()),
    35      }
    36      infos := &[]*TestStruct2{info}
    37  
    38      bytes, err1 := json.Marshal(infos)
    39      fmt.Printf("%+v\n", string(bytes))
    40      spew.Dump(bytes, err1)
    41  
    42      sonic.Pretouch(reflect.TypeOf(infos))
    43      jbytes, err2 := sonic.Marshal(infos)
    44      fmt.Printf("%+v\n", string(jbytes))
    45      spew.Dump(jbytes, err2)
    46      require.Equal(t, bytes, jbytes)
    47  }
    48  
    49  type TestStruct1 struct {
    50      StartTime JSONTime
    51  }
    52  
    53  type TestStruct2 struct {
    54      StartTime JSONTime
    55  }
    56  
    57  type JSONTime time.Time
    58  
    59  func (t *JSONTime) MarshalJSON() ([]byte, error) {
    60      return []byte(strconv.FormatInt(time.Time(*t).Unix(), 10)), nil
    61  }