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)
}