internal/encoder/json/fast/buffer_test.go

package fast_test

import (
	"math"
	"testing"

	"mercemay.top/src/lambdalog/internal/encoder/json/fast"
)

func TestBuffer_Append(t *testing.T) {
	b := fast.Get()
	t.Cleanup(func() { fast.Put(b) })

	b.AppendByte('{')
	b.AppendString("\"a\":")
	fast.AppendInt(b, 42)
	b.AppendByte('}')

	if got, want := string(b.Bytes()), `{"a":42}`; got != want {
		t.Fatalf("got %q, want %q", got, want)
	}
}

func TestBuffer_Reset(t *testing.T) {
	b := fast.Get()
	t.Cleanup(func() { fast.Put(b) })

	b.AppendString("discard me")
	b.Reset()
	if b.Len() != 0 {
		t.Fatalf("len after reset = %d", b.Len())
	}
}

func TestAppendNumbers(t *testing.T) {
	cases := []struct {
		name string
		do   func(b *fast.Buffer)
		want string
	}{
		{"int-pos", func(b *fast.Buffer) { fast.AppendInt(b, 12345) }, "12345"},
		{"int-neg", func(b *fast.Buffer) { fast.AppendInt(b, -7) }, "-7"},
		{"uint", func(b *fast.Buffer) { fast.AppendUint(b, 18446744073709551615) }, "18446744073709551615"},
		{"float-small", func(b *fast.Buffer) { fast.AppendFloat(b, 1.5, 64) }, "1.5"},
		{"float-neg-zero", func(b *fast.Buffer) { fast.AppendFloat(b, math.Copysign(0, -1), 64) }, "-0"},
	}
	for _, tc := range cases {
		tc := tc
		t.Run(tc.name, func(t *testing.T) {
			t.Helper()
			b := fast.Get()
			t.Cleanup(func() { fast.Put(b) })
			tc.do(b)
			if got := string(b.Bytes()); got != tc.want {
				t.Fatalf("got %q, want %q", got, tc.want)
			}
		})
	}
}

func TestPool_DropsOversized(t *testing.T) {
	b := fast.Get()
	// Grow beyond maxRetainedCapacity.
	big := make([]byte, 1<<14)
	for i := range big {
		big[i] = 'x'
	}
	b.AppendBytes(big)
	fast.Put(b)

	// The next Get must deliver a small, fresh buffer rather than the
	// oversized one we just returned.
	b2 := fast.Get()
	t.Cleanup(func() { fast.Put(b2) })
	if cap(b2.Bytes()) > 1<<13 {
		t.Fatalf("pool retained oversized buffer: cap=%d", cap(b2.Bytes()))
	}
}

func TestPut_NilSafe(t *testing.T) {
	t.Helper()
	defer func() {
		if r := recover(); r != nil {
			t.Fatalf("Put(nil) panicked: %v", r)
		}
	}()
	fast.Put(nil)
}