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",
			},
		},
	}

	buf, 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(buf, want) {
		t.Fatalf("MarshalBinary() = %X, but wanted %X", buf, want)
	}

	*p = InitPacket{}

	// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
	if err := p.UnmarshalBinary(buf[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",
			},
		},
	}

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

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

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

	*p = VersionPacket{}

	// UnmarshalBinary assumes the uint32(length) + uint8(type) have already been consumed.
	if err := p.UnmarshalBinary(buf[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)
	}
}
