github.com/goshafaq/sonic@v0.0.0-20231026082336-871835fb94c6/internal/encoder/stream_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 encoder
    18  
    19  import (
    20  	"bytes"
    21  	"encoding/json"
    22  	"strings"
    23  	"testing"
    24  
    25  	"github.com/stretchr/testify/require"
    26  )
    27  
    28  func TestEncodeStream(t *testing.T) {
    29  	var o = map[string]interface{}{
    30  		"a": "<>",
    31  		"b": json.RawMessage(" [ ] "),
    32  	}
    33  	var w1 = bytes.NewBuffer(nil)
    34  	var w2 = bytes.NewBuffer(nil)
    35  	var enc1 = json.NewEncoder(w1)
    36  	var enc2 = NewStreamEncoder(w2)
    37  	enc2.SetEscapeHTML(true)
    38  	enc2.SortKeys()
    39  	enc2.SetCompactMarshaler(true)
    40  
    41  	require.Nil(t, enc1.Encode(o))
    42  	require.Nil(t, enc2.Encode(o))
    43  	require.Equal(t, w1.String(), w2.String())
    44  
    45  	enc1.SetEscapeHTML(true)
    46  	enc2.SetEscapeHTML(true)
    47  	enc1.SetIndent("你好", "\b")
    48  	enc2.SetIndent("你好", "\b")
    49  	require.Nil(t, enc1.Encode(o))
    50  	require.Nil(t, enc2.Encode(o))
    51  	require.Equal(t, w1.String(), w2.String())
    52  
    53  	enc1.SetEscapeHTML(false)
    54  	enc2.SetEscapeHTML(false)
    55  	enc1.SetIndent("", "")
    56  	enc2.SetIndent("", "")
    57  	require.Nil(t, enc1.Encode(o))
    58  	require.Nil(t, enc2.Encode(o))
    59  	require.Equal(t, w1.String(), w2.String())
    60  }
    61  
    62  func BenchmarkEncodeStream_Sonic(b *testing.B) {
    63  	var o = map[string]interface{}{
    64  		"a": `<` + strings.Repeat("1", 1024) + `>`,
    65  		"b": json.RawMessage(` [ ` + strings.Repeat(" ", 1024) + ` ] `),
    66  	}
    67  
    68  	b.Run("single", func(b *testing.B) {
    69  		var w = bytes.NewBuffer(nil)
    70  		var enc = NewStreamEncoder(w)
    71  		b.ResetTimer()
    72  		for i := 0; i < b.N; i++ {
    73  			_ = enc.Encode(o)
    74  			w.Reset()
    75  		}
    76  	})
    77  
    78  	b.Run("double", func(b *testing.B) {
    79  		var w = bytes.NewBuffer(nil)
    80  		var enc = NewStreamEncoder(w)
    81  		b.ResetTimer()
    82  		for i := 0; i < b.N; i++ {
    83  			_ = enc.Encode(o)
    84  			_ = enc.Encode(o)
    85  			w.Reset()
    86  		}
    87  	})
    88  
    89  	b.Run("compatible", func(b *testing.B) {
    90  		var w = bytes.NewBuffer(nil)
    91  		var enc = NewStreamEncoder(w)
    92  		enc.SetEscapeHTML(true)
    93  		enc.SortKeys()
    94  		enc.SetCompactMarshaler(true)
    95  		b.ResetTimer()
    96  		for i := 0; i < b.N; i++ {
    97  			_ = enc.Encode(o)
    98  			w.Reset()
    99  		}
   100  	})
   101  }
   102  
   103  func BenchmarkEncodeStream_Std(b *testing.B) {
   104  	var o = map[string]interface{}{
   105  		"a": `<` + strings.Repeat("1", 1024) + `>`,
   106  		"b": json.RawMessage(` [ ` + strings.Repeat(" ", 1024) + ` ] `),
   107  	}
   108  
   109  	b.Run("single", func(b *testing.B) {
   110  		var w = bytes.NewBuffer(nil)
   111  		var enc = json.NewEncoder(w)
   112  		b.ResetTimer()
   113  		for i := 0; i < b.N; i++ {
   114  			_ = enc.Encode(o)
   115  			w.Reset()
   116  		}
   117  	})
   118  
   119  	b.Run("double", func(b *testing.B) {
   120  		var w = bytes.NewBuffer(nil)
   121  		var enc = json.NewEncoder(w)
   122  		b.ResetTimer()
   123  		for i := 0; i < b.N; i++ {
   124  			_ = enc.Encode(o)
   125  			_ = enc.Encode(o)
   126  			w.Reset()
   127  		}
   128  	})
   129  
   130  	b.Run("compatible", func(b *testing.B) {
   131  		var w = bytes.NewBuffer(nil)
   132  		var enc = json.NewEncoder(w)
   133  		enc.SetEscapeHTML(true)
   134  		b.ResetTimer()
   135  		for i := 0; i < b.N; i++ {
   136  			_ = enc.Encode(o)
   137  			w.Reset()
   138  		}
   139  	})
   140  }