package filexfer

import (
	"bytes"
	"testing"
)

func TestInitPacket(t *testing.T) {
	var version uint8 = 3

	p := &InitPacket{
		Version: uint32(version),
		Extensions: []*ExtensionPair{
			{
				Name: "foo",
				Data: "1",
			},
		},
	}

	data, err := p.MarshalBinary()
	if err != nil {
		t.Fatal("unexpected error:", err)
	}

	want := []byte{
		0x00, 0x00, 0x00, 17,
		1,
		0x00, 0x00, 0x00, version,
		0x00, 0x00, 0x00, 3, 'f', 'o', 'o',
		0x00, 0x00, 0x00, 1, '1',
	}

	if !bytes.Equal(data, want) {
		t.Fatalf("Marshal() = %X, but wanted %X", data, want)
	}

	*p = InitPacket{}

	// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
	if err := p.UnmarshalBinary(data[5:]); err != nil {
		t.Fatal("unexpected error:", err)
	}

	if p.Version != uint32(version) {
		t.Errorf("UnmarshalBinary(): Version was %d, but expected %d", p.Version, version)
	}

	if len(p.Extensions) != 1 {
		t.Fatalf("UnmarshalBinary(): len(p.Extensions) was %d, but expected %d", len(p.Extensions), 1)
	}

	if got, want := p.Extensions[0].Name, "foo"; got != want {
		t.Errorf("UnmarshalBinary(): p.Extensions[0].Name was %q, but expected %q", got, want)
	}

	if got, want := p.Extensions[0].Data, "1"; got != want {
		t.Errorf("UnmarshalBinary(): p.Extensions[0].Data was %q, but expected %q", got, want)
	}
}

func TestVersionPacket(t *testing.T) {
	var version uint8 = 3

	p := &VersionPacket{
		Version: uint32(version),
		Extensions: []*ExtensionPair{
			{
				Name: "foo",
				Data: "1",
			},
		},
	}

	data, err := p.MarshalBinary()
	if err != nil {
		t.Fatal("unexpected error:", err)
	}

	want := []byte{
		0x00, 0x00, 0x00, 17,
		1,
		0x00, 0x00, 0x00, version,
		0x00, 0x00, 0x00, 3, 'f', 'o', 'o',
		0x00, 0x00, 0x00, 1, '1',
	}

	if !bytes.Equal(data, want) {
		t.Fatalf("Marshal() = %X, but wanted %X", data, want)
	}

	*p = VersionPacket{}

	// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
	if err := p.UnmarshalBinary(data[5:]); err != nil {
		t.Fatal("unexpected error:", err)
	}

	if p.Version != uint32(version) {
		t.Errorf("UnmarshalBinary(): Version was %d, but expected %d", p.Version, version)
	}

	if len(p.Extensions) != 1 {
		t.Fatalf("UnmarshalBinary(): len(p.Extensions) was %d, but expected %d", len(p.Extensions), 1)
	}

	if got, want := p.Extensions[0].Name, "foo"; got != want {
		t.Errorf("UnmarshalBinary(): p.Extensions[0].Name was %q, but expected %q", got, want)
	}

	if got, want := p.Extensions[0].Data, "1"; got != want {
		t.Errorf("UnmarshalBinary(): p.Extensions[0].Data was %q, but expected %q", got, want)
	}
}
