package core

import (
	"testing"

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

func TestEncodeDecodeAssetState(t *testing.T) {
	asset := &AssetState{
		ID:         randomUint256(),
		AssetType:  transaction.Token,
		Name:       "super cool token",
		Amount:     util.Fixed8(1000000),
		Available:  util.Fixed8(100),
		Precision:  0,
		FeeMode:    feeMode,
		Owner:      &keys.PublicKey{},
		Admin:      randomUint160(),
		Issuer:     randomUint160(),
		Expiration: 10,
		IsFrozen:   false,
	}

	buf := io.NewBufBinWriter()
	asset.EncodeBinary(buf.BinWriter)
	assert.Nil(t, buf.Err)
	assetDecode := &AssetState{}
	r := io.NewBinReaderFromBuf(buf.Bytes())
	assetDecode.DecodeBinary(r)
	assert.Nil(t, r.Err)
	assert.Equal(t, asset, assetDecode)
}

func TestPutGetAssetState(t *testing.T) {
	s := storage.NewMemoryStore()
	asset := &AssetState{
		ID:         randomUint256(),
		AssetType:  transaction.Token,
		Name:       "super cool token",
		Amount:     util.Fixed8(1000000),
		Available:  util.Fixed8(100),
		Precision:  8,
		FeeMode:    feeMode,
		Owner:      &keys.PublicKey{},
		Admin:      randomUint160(),
		Issuer:     randomUint160(),
		Expiration: 10,
		IsFrozen:   false,
	}
	assert.NoError(t, putAssetStateIntoStore(s, asset))
	asRead := getAssetStateFromStore(s, asset.ID)
	assert.NotNil(t, asRead)
	assert.Equal(t, asset, asRead)
}