package tools import ( "bytes" "encoding/json" "errors" "testing" "time" "github.com/stretchr/testify/assert" ) func TestWriteBuffer(t *testing.T) { when := time.Now() tests := []struct { name string value any out string err error }{ {"nil", nil, "", nil}, {"string", "hi", "hi", nil}, {"bytes", []byte{104, 105}, "hi", nil}, {"byte", byte(104), "h", nil}, {"rune", 'h', "h", nil}, {"int", 42, "42", nil}, {"int64", int64(42), "42", nil}, {"float", 42.13, "42.13", nil}, {"bool", false, "false", nil}, {"json.Number", json.Number("42.13"), "42.13", nil}, {"json.RawMessage", json.RawMessage("{}"), "{}", nil}, {"time", when, when.Format(time.RFC3339), nil}, {"slice", []any{1, 2, "foo"}, `[1,2,"foo"]`, nil}, {"map", map[string]any{"baz": 42, "foo": "bar"}, `{"baz":42,"foo":"bar"}`, nil}, {"struct", struct{}{}, "", errors.New("Unsupported type struct {}")}, {"skip-bang-num", "!42", "42", nil}, {"skip-bang-bool", "!false", "false", nil}, {"skip-bang-time", "!" + when.Format(time.RFC3339), when.Format(time.RFC3339), nil}, {"skip-bang-duration", "!15 mins", "15 mins", nil}, {"skip-bang-bytes-num", []byte("!42"), "42", nil}, {"skip-bang-bytes-bool", []byte("!false"), "false", nil}, {"skip-bang-bytes-time", []byte("!" + when.Format(time.RFC3339)), when.Format(time.RFC3339), nil}, {"skip-bang-bytes-duration", []byte("!15 mins"), "15 mins", nil}, } for _, tt := range tests { t.Run(tt.name, getWriteTestRunner(tt.value, tt.out, tt.err)) } } func getWriteTestRunner(value any, out string, err error) func(*testing.T) { return func(t *testing.T) { buff := &bytes.Buffer{} n, er := WriteValue(buff, value) assert.Equal(t, len(out), n) assert.Equal(t, err, er) assert.Equal(t, out, buff.String()) } }