// Copyright (c) 2016 Bitfury Group Limited
// Distributed under the MIT software license, see the accompanying
// file LICENSE or http://www.opensource.org/licenses/mit-license.php

package lnwire

import (
	"bytes"
	"testing"
	"github.com/roasbeef/btcd/wire"
	"reflect"
)


func samplePubKey(b byte) [33]byte {
	var a [33]byte
	for i:=0; i<33; i++ {
		a[i] = b
	}
	return a
}

func sampleOutPoint(b byte) wire.OutPoint {
	var w wire.OutPoint
	for i:=0; i<len(w.Hash); i++ {
		w.Hash[i] = b
	}
	w.Index = uint32(b)
	return w
}

func genNeighborHelloMessage() *NeighborHelloMessage {
	p1 := samplePubKey(1)
	p2 := samplePubKey(2)
	p3 := samplePubKey(3)
	e1 := sampleOutPoint(4)
	e2 := sampleOutPoint(5)

	msg := NeighborHelloMessage{
		Channels: []ChannelOperation{
			{
				NodePubKey1: p1,
				NodePubKey2: p2,
				ChannelId: &e1,
				Capacity: 100000,
				Weight: 1.0,
				Operation: 0,
			},
			{
				NodePubKey1: p2,
				NodePubKey2: p3,
				ChannelId: &e2,
				Capacity: 210000,
				Weight: 2.0,
				Operation: 0,
			},
		},
	}
	return &msg
}

func TestNeighborHelloMessageEncodeDecode(t *testing.T) {
	msg1 := genNeighborHelloMessage()

	b := new(bytes.Buffer)
	err := msg1.Encode(b, 0)
	if err != nil {
		t.Fatalf("Can't encode message ", err)
	}
	msg2 := new(NeighborHelloMessage)
	err = msg2.Decode(b, 0)

	// Assert equality of the two instances.
	if !reflect.DeepEqual(msg1, msg2) {
		t.Fatalf("encode/decode error messages don't match %v vs %v",
			msg1, msg2)
	}
}

func TestNeighborHelloMessageReadWrite(t *testing.T) {
	msg1 := genNeighborHelloMessage()

	b := new(bytes.Buffer)
	_, err := WriteMessage(b, msg1, 0, wire.SimNet)
	if err != nil {
		t.Fatalf("Can't write message %v", err)
	}
	_, msg2, _, err := ReadMessage(b, 0, wire.SimNet)
	if err != nil {
		t.Fatalf("Can't read message %v", err)
	}

	// Assert equality of the two instances.
	if !reflect.DeepEqual(msg1, msg2) {
		t.Fatalf("encode/decode error messages don't match %v vs %v",
			msg1, msg2)
	}
}