You are an expert in writing code in many different languages. Your goal is to perform code completion for the following code, keeping in mind the rest of the code and the file meta data.
    Metadata details:
    filename: helpers_test.go
    path of file: ./repos/cosmos-sdk/collections/indexes
    
    the code of the file until where you have to start completion: 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"
    
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)
}