package core

import (
	"testing"

	"github.com/CityOfZion/neo-go/pkg/core/storage"
	"github.com/CityOfZion/neo-go/pkg/io"
	"github.com/CityOfZion/neo-go/pkg/util"
	"github.com/stretchr/testify/assert"
)

func TestEncodeDecodeSpentCoinState(t *testing.T) {
	spent := &SpentCoinState{
		txHash:   randomUint256(),
		txHeight: 1001,
		items: map[uint16]uint32{
			1: 3,
			2: 8,
			4: 100,
		},
	}

	buf := io.NewBufBinWriter()
	spent.EncodeBinary(buf.BinWriter)
	assert.Nil(t, buf.Err)
	spentDecode := new(SpentCoinState)
	r := io.NewBinReaderFromBuf(buf.Bytes())
	spentDecode.DecodeBinary(r)
	assert.Nil(t, r.Err)
	assert.Equal(t, spent, spentDecode)
}

func TestCommitSpentCoins(t *testing.T) {
	var (
		store      = storage.NewMemoryStore()
		batch      = store.Batch()
		spentCoins = make(SpentCoins)
	)

	txx := []util.Uint256{
		randomUint256(),
		randomUint256(),
		randomUint256(),
	}

	for i := 0; i < len(txx); i++ {
		spentCoins[txx[i]] = &SpentCoinState{
			txHash:   txx[i],
			txHeight: 1,
		}
	}
	assert.Nil(t, spentCoins.commit(batch))
	assert.Nil(t, store.PutBatch(batch))
}