github.com/bingoohuang/gg@v0.0.0-20240325092523-45da7dee9335/pkg/jsoni/stream_test.go (about)

     1  package jsoni
     2  
     3  import (
     4  	"context"
     5  	"testing"
     6  
     7  	"github.com/stretchr/testify/require"
     8  )
     9  
    10  func Test_writeByte_should_grow_buffer(t *testing.T) {
    11  	should := require.New(t)
    12  	stream := NewStream(ConfigDefault, nil, 1)
    13  	stream.writeByte('1')
    14  	should.Equal("1", string(stream.Buffer()))
    15  	should.Equal(1, len(stream.buf))
    16  	stream.writeByte('2')
    17  	should.Equal("12", string(stream.Buffer()))
    18  	should.Equal(2, len(stream.buf))
    19  	stream.write3Bytes('3', '4', '5')
    20  	should.Equal("12345", string(stream.Buffer()))
    21  }
    22  
    23  func Test_writeBytes_should_grow_buffer(t *testing.T) {
    24  	should := require.New(t)
    25  	stream := NewStream(ConfigDefault, nil, 1)
    26  	stream.Write([]byte{'1', '2'})
    27  	should.Equal("12", string(stream.Buffer()))
    28  	should.Equal(2, len(stream.buf))
    29  	stream.Write([]byte{'3', '4', '5', '6', '7'})
    30  	should.Equal("1234567", string(stream.Buffer()))
    31  	should.Equal(7, len(stream.buf))
    32  }
    33  
    34  func Test_writeIndention_should_grow_buffer(t *testing.T) {
    35  	ctx := context.Background()
    36  	should := require.New(t)
    37  	stream := NewStream(Config{IndentionStep: 2}.Froze(), nil, 1)
    38  	stream.WriteVal(ctx, []int{1, 2, 3})
    39  	should.Equal("[\n  1,\n  2,\n  3\n]", string(stream.Buffer()))
    40  }
    41  
    42  func Test_writeRaw_should_grow_buffer(t *testing.T) {
    43  	should := require.New(t)
    44  	stream := NewStream(ConfigDefault, nil, 1)
    45  	stream.WriteRaw("123")
    46  	should.Nil(stream.Error)
    47  	should.Equal("123", string(stream.Buffer()))
    48  }
    49  
    50  func Test_writeString_should_grow_buffer(t *testing.T) {
    51  	should := require.New(t)
    52  	stream := NewStream(ConfigDefault, nil, 0)
    53  	stream.WriteString("123")
    54  	should.Nil(stream.Error)
    55  	should.Equal(`"123"`, string(stream.Buffer()))
    56  }
    57  
    58  type NopWriter struct {
    59  	bufferSize int
    60  }
    61  
    62  func (w *NopWriter) Write(p []byte) (n int, err error) {
    63  	w.bufferSize = cap(p)
    64  	return len(p), nil
    65  }
    66  
    67  func Test_flush_buffer_should_stop_grow_buffer(t *testing.T) {
    68  	// Stream an array of a zillion zeros.
    69  	writer := new(NopWriter)
    70  	stream := NewStream(ConfigDefault, writer, 512)
    71  	stream.WriteArrayStart()
    72  	for i := 0; i < 10000000; i++ {
    73  		stream.WriteInt(0)
    74  		stream.WriteMore()
    75  		stream.Flush()
    76  	}
    77  	stream.WriteInt(0)
    78  	stream.WriteArrayEnd()
    79  
    80  	// Confirm that the buffer didn't have to grow.
    81  	should := require.New(t)
    82  
    83  	// 512 is the internal buffer size set in NewEncoder
    84  	//
    85  	// Flush is called after each array element, so only the first 8 bytes of it
    86  	// is ever used, and it is never extended. Capacity remains 512.
    87  	should.Equal(512, writer.bufferSize)
    88  }