package sarama

import (
	"bytes"
	"reflect"
	"testing"
)

var (
	groupMemberMetadata = []byte{
		0, 1, // Version
		0, 0, 0, 2, // Topic array length
		0, 3, 'o', 'n', 'e', // Topic one
		0, 3, 't', 'w', 'o', // Topic two
		0, 0, 0, 3, 0x01, 0x02, 0x03, // Userdata
	}
	groupMemberAssignment = []byte{
		0, 1, // Version
		0, 0, 0, 1, // Topic array length
		0, 3, 'o', 'n', 'e', // Topic one
		0, 0, 0, 3, // Topic one, partition array length
		0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, // 0, 2, 4
		0, 0, 0, 3, 0x01, 0x02, 0x03, // Userdata
	}
)

func TestConsumerGroupMemberMetadata(t *testing.T) {
	meta := &ConsumerGroupMemberMetadata{
		Version:  1,
		Topics:   []string{"one", "two"},
		UserData: []byte{0x01, 0x02, 0x03},
	}

	buf, err := encode(meta, nil)
	if err != nil {
		t.Error("Failed to encode data", err)
	} else if !bytes.Equal(groupMemberMetadata, buf) {
		t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", groupMemberMetadata, buf)
	}

	meta2 := new(ConsumerGroupMemberMetadata)
	err = decode(buf, meta2)
	if err != nil {
		t.Error("Failed to decode data", err)
	} else if !reflect.DeepEqual(meta, meta2) {
		t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", meta, meta2)
	}
}

func TestConsumerGroupMemberAssignment(t *testing.T) {
	amt := &ConsumerGroupMemberAssignment{
		Version: 1,
		Topics: map[string][]int32{
			"one": {0, 2, 4},
		},
		UserData: []byte{0x01, 0x02, 0x03},
	}

	buf, err := encode(amt, nil)
	if err != nil {
		t.Error("Failed to encode data", err)
	} else if !bytes.Equal(groupMemberAssignment, buf) {
		t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", groupMemberAssignment, buf)
	}

	amt2 := new(ConsumerGroupMemberAssignment)
	err = decode(buf, amt2)
	if err != nil {
		t.Error("Failed to decode data", err)
	} else if !reflect.DeepEqual(amt, amt2) {
		t.Errorf("Encoded data does not match expectation\nexpected: %v\nactual: %v", amt, amt2)
	}
}