package sarama

import (
	"bytes"
	"testing"
)

var (
	requestSimple = []byte{
		0x00, 0x00, 0x00, 0x17, // msglen
		0x06, 0x66,
		0x00, 0xD2,
		0x00, 0x00, 0x12, 0x34,
		0x00, 0x08, 'm', 'y', 'C', 'l', 'i', 'e', 'n', 't',
		0x00, 0x03, 'a', 'b', 'c'}
)

type testRequestBody struct {
}

func (s *testRequestBody) key() int16 {
	return 0x666
}

func (s *testRequestBody) version() int16 {
	return 0xD2
}

func (s *testRequestBody) encode(pe packetEncoder) error {
	return pe.putString("abc")
}

func TestRequest(t *testing.T) {
	request := request{correlationID: 0x1234, id: "myClient", body: new(testRequestBody)}
	testEncodable(t, "simple", &request, requestSimple)
}

// not specific to request tests, just helper functions for testing structures that
// implement the encoder or decoder interfaces that needed somewhere to live

func testEncodable(t *testing.T, name string, in encoder, expect []byte) {
	packet, err := encode(in)
	if err != nil {
		t.Error(err)
	} else if !bytes.Equal(packet, expect) {
		t.Error("Encoding", name, "failed\ngot ", packet, "\nwant", expect)
	}
}

func testDecodable(t *testing.T, name string, out decoder, in []byte) {
	err := decode(in, out)
	if err != nil {
		t.Error("Decoding", name, "failed:", err)
	}
}