package encoding_test

import (
	"bytes"
	"fmt"
	"strings"
	"testing"

	"github.com/chaisql/chai/internal/encoding"
	"github.com/stretchr/testify/require"
)

func TestEncodeDecodeText(t *testing.T) {
	a100 := append([]byte{encoding.TextValue}, makeUvarint(100)...)
	a100 = append(a100, bytes.Repeat([]byte{'a'}, 100)...)
	tests := []struct {
		input string
		want  []byte
	}{
		{"", []byte{encoding.TextValue, makeUvarint(0)[0]}},
		{"a", []byte{encoding.TextValue, makeUvarint(1)[0], 'a'}},
		{strings.Repeat("a", 100), a100},
	}

	for _, test := range tests {
		t.Run(fmt.Sprintf("%v", test.input), func(t *testing.T) {
			got := encoding.EncodeText(nil, test.input)
			require.Equal(t, test.want, got)

			x, n := encoding.DecodeText(got)
			require.Equal(t, test.input, x)
			require.Equal(t, len(test.input)+len(makeUvarint(len(test.input)))+1, n)
		})
	}
}

func TestEncodeDecodeBytea(t *testing.T) {
	a100 := append([]byte{encoding.ByteaValue}, makeUvarint(100)...)
	a100 = append(a100, bytes.Repeat([]byte{'a'}, 100)...)
	tests := []struct {
		input []byte
		want  []byte
	}{
		{[]byte{}, []byte{encoding.ByteaValue, makeUvarint(0)[0]}},
		{[]byte{'a'}, []byte{encoding.ByteaValue, makeUvarint(1)[0], 'a'}},
		{bytes.Repeat([]byte{'a'}, 100), a100},
	}

	for _, test := range tests {
		t.Run(fmt.Sprintf("%v", test.input), func(t *testing.T) {
			got := encoding.EncodeBytea(nil, test.input)
			require.Equal(t, test.want, got)

			x, n := encoding.DecodeBytea(got)
			require.Equal(t, test.input, x)
			require.Equal(t, len(test.input)+len(makeUvarint(len(test.input)))+1, n)
		})
	}
}
