package core

import (
	"bytes"
	"crypto/sha256"
	"testing"
	"time"

	"github.com/CityOfZion/neo-go/pkg/util"
)

func TestHeaderEncodeDecode(t *testing.T) {
	header := Header{BlockBase: BlockBase{
		Version:       0,
		PrevHash:      sha256.Sum256([]byte("prevhash")),
		MerkleRoot:    sha256.Sum256([]byte("merkleroot")),
		Timestamp:     uint32(time.Now().UTC().Unix()),
		Index:         3445,
		ConsensusData: 394949,
		NextConsensus: util.Uint160{},
		Script: &Witness{
			InvocationScript:   []byte{0x10},
			VerificationScript: []byte{0x11},
		},
	}}

	buf := new(bytes.Buffer)
	if err := header.EncodeBinary(buf); err != nil {
		t.Fatal(err)
	}

	headerDecode := &Header{}
	if err := headerDecode.DecodeBinary(buf); err != nil {
		t.Fatal(err)
	}
	if header.Version != headerDecode.Version {
		t.Fatal("expected both versions to be equal")
	}
	if !header.PrevHash.Equals(headerDecode.PrevHash) {
		t.Fatal("expected both prev hashes to be equal")
	}
	if !header.MerkleRoot.Equals(headerDecode.MerkleRoot) {
		t.Fatal("expected both merkle roots to be equal")
	}
	if header.Index != headerDecode.Index {
		t.Fatal("expected both indexes to be equal")
	}
	if header.ConsensusData != headerDecode.ConsensusData {
		t.Fatal("expected both consensus data fields to be equal")
	}
	if !header.NextConsensus.Equals(headerDecode.NextConsensus) {
		t.Fatalf("expected both next consensus fields to be equal")
	}

	if bytes.Compare(header.Script.InvocationScript, headerDecode.Script.InvocationScript) != 0 {
		t.Fatalf("expected equal invocation scripts %v and %v", header.Script.InvocationScript, headerDecode.Script.InvocationScript)
	}
	if bytes.Compare(header.Script.VerificationScript, headerDecode.Script.VerificationScript) != 0 {
		t.Fatalf("expected equal verification scripts %v and %v", header.Script.VerificationScript, headerDecode.Script.VerificationScript)
	}
}