cosmos-sdk/collections/indexes/helpers_test.go
2023-06-22 15:35:51 +00:00

90 lines
2.4 KiB
Go

package indexes
import (
"testing"
"github.com/stretchr/testify/require"
"cosmossdk.io/collections"
)
func TestHelpers(t *testing.T) {
// uses ReversePair scenario.
// We store balances as:
// Key: Pair[Address=string, Denom=string] => Value: Amount=uint64
sk, ctx := deps()
sb := collections.NewSchemaBuilder(sk)
keyCodec := collections.PairKeyCodec(collections.StringKey, collections.StringKey)
indexedMap := collections.NewIndexedMap(
sb,
collections.NewPrefix("balances"), "balances",
keyCodec,
collections.Uint64Value,
balanceIndex{
Denom: NewReversePair[Amount](sb, collections.NewPrefix("denom_index"), "denom_index", keyCodec),
},
)
err := indexedMap.Set(ctx, collections.Join("address1", "atom"), 100)
require.NoError(t, err)
err = indexedMap.Set(ctx, collections.Join("address1", "osmo"), 200)
require.NoError(t, err)
err = indexedMap.Set(ctx, collections.Join("address2", "osmo"), 300)
require.NoError(t, err)
// test collect values
iter, err := indexedMap.Indexes.Denom.MatchExact(ctx, "osmo")
require.NoError(t, err)
values, err := CollectValues(ctx, indexedMap, iter)
require.NoError(t, err)
require.Equal(t, []Amount{200, 300}, values)
// test collect key values
iter, err = indexedMap.Indexes.Denom.MatchExact(ctx, "osmo")
require.NoError(t, err)
kvs, err := CollectKeyValues(ctx, indexedMap, iter)
require.NoError(t, err)
require.Equal(t, []collections.KeyValue[collections.Pair[Address, Denom], Amount]{
{
Key: collections.Join("address1", "osmo"),
Value: 200,
},
{
Key: collections.Join("address2", "osmo"),
Value: 300,
},
}, kvs)
// test scan values with early termination
iter, err = indexedMap.Indexes.Denom.MatchExact(ctx, "osmo")
require.NoError(t, err)
numCalled := 0
err = ScanValues(ctx, indexedMap, iter, func(v Amount) bool {
require.Equal(t, Amount(200), v)
numCalled++
require.Equal(t, numCalled, 1)
return true // says to stop
})
require.NoError(t, err)
// test scan kv with early termination
iter, err = indexedMap.Indexes.Denom.MatchExact(ctx, "osmo")
require.NoError(t, err)
numCalled = 0
err = ScanKeyValues(ctx, indexedMap, iter, func(kv collections.KeyValue[collections.Pair[Address, Denom], Amount]) bool {
require.Equal(t, Amount(200), kv.Value)
require.Equal(t, collections.Join("address1", "osmo"), kv.Key)
numCalled++
require.Equal(t, numCalled, 1)
return true // says to stop
})
require.NoError(t, err)
}