package frame_test

import (
	"bufio"
	"bytes"
	"testing"

	"koti.casa/numenor-labs/dsfx/internal/lib/frame"
)

func TestLenPrefixedWriteTo(t *testing.T) {
	// Given ...
	buf := bytes.NewBuffer(nil)
	msg := []byte("Hello, World!")
	expectedBytesWritten := len(msg) + 2

	// When ...

	n, err := frame.New(msg).WriteTo(buf)

	// Then ...

	if err != nil {
		t.Fatalf("failed to write frame: %v", err)
		return
	}

	if n != int64(expectedBytesWritten) {
		t.Fatalf("expected %d bytes written, got %d", expectedBytesWritten, n)
		return
	}

	if buf.Len() != expectedBytesWritten {
		t.Fatalf("expected %d bytes in buffer, got %d", expectedBytesWritten, buf.Len())
		return
	}

	if !bytes.Equal(buf.Bytes()[2:], msg) {
		t.Fatalf("expected %q in buffer, got %q", msg, buf.Bytes()[2:])
		return
	}
}

func TestLenPrefixedReadFrom(t *testing.T) {
	// Given ...
	msg := []byte{0x00, 0x0d}
	msg = append(msg, []byte("Hello, World!")...)
	buf := bufio.NewReader(bytes.NewBuffer(msg))
	expectedBytesRead := len(msg)

	// When ...
	f := frame.New(nil)
	n, err := f.ReadFrom(buf)

	// Then ...

	if err != nil {
		t.Fatalf("failed to write frame: %v", err)
		return
	}

	if n != int64(expectedBytesRead) {
		t.Fatalf("expected %d bytes read, got %d", expectedBytesRead, n)
		return
	}

	if !bytes.Equal(f.Contents(), []byte("Hello, World!")) {
		t.Fatalf("expected %q, got %q", []byte("Hello, World!"), f.Contents())
		return
	}
}