package encoding

import (
	"math/rand"
	"testing"
)

func TestCompressDecompressZSTD(t *testing.T) {
	testCompressDecompressZSTD(t, []byte("a"))
	testCompressDecompressZSTD(t, []byte("foobarbaz"))

	r := rand.New(rand.NewSource(1))
	var b []byte
	for range 64 * 1024 {
		b = append(b, byte(r.Int31n(256)))
	}
	testCompressDecompressZSTD(t, b)
}

func testCompressDecompressZSTD(t *testing.T, b []byte) {
	bc := CompressZSTDLevel(nil, b, 5)
	bNew, err := DecompressZSTD(nil, bc)
	if err != nil {
		t.Fatalf("unexpected error when decompressing b=%x from bc=%x: %s", b, bc, err)
	}
	if string(bNew) != string(b) {
		t.Fatalf("invalid bNew; got\n%x; expecting\n%x", bNew, b)
	}

	prefix := []byte{1, 2, 33}
	bcNew := CompressZSTDLevel(prefix, b, 5)
	if string(bcNew[:len(prefix)]) != string(prefix) {
		t.Fatalf("invalid prefix for b=%x; got\n%x; expecting\n%x", b, bcNew[:len(prefix)], prefix)
	}
	if string(bcNew[len(prefix):]) != string(bc) {
		t.Fatalf("invalid prefixed bcNew for b=%x; got\n%x; expecting\n%x", b, bcNew[len(prefix):], bc)
	}

	bNew, err = DecompressZSTD(prefix, bc)
	if err != nil {
		t.Fatalf("unexpected error when decompressing b=%x from bc=%x with prefix: %s", b, bc, err)
	}
	if string(bNew[:len(prefix)]) != string(prefix) {
		t.Fatalf("invalid bNew prefix when decompressing bc=%x; got\n%x; expecting\n%x", bc, bNew[:len(prefix)], prefix)
	}
	if string(bNew[len(prefix):]) != string(b) {
		t.Fatalf("invalid prefixed bNew; got\n%x; expecting\n%x", bNew[len(prefix):], b)
	}
}
