From 72ff13eb9722ca08ae3c633622ae7dfe10bdd2fc Mon Sep 17 00:00:00 2001 From: Alessio Treglia Date: Fri, 6 Dec 2019 16:25:25 +0100 Subject: [PATCH] [x/simulation] RandSubsetCoins() should return sorted coinset (#5373) Closes: #5372 --- x/simulation/rand_util.go | 2 +- x/simulation/rand_util_test.go | 40 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 x/simulation/rand_util_test.go diff --git a/x/simulation/rand_util.go b/x/simulation/rand_util.go index b0c403cf7..b494b0fb8 100644 --- a/x/simulation/rand_util.go +++ b/x/simulation/rand_util.go @@ -122,7 +122,7 @@ func RandSubsetCoins(r *rand.Rand, coins sdk.Coins) sdk.Coins { } subset = append(subset, sdk.NewCoin(c.Denom, amt)) } - return subset + return subset.Sort() } // DeriveRand derives a new Rand deterministically from another random source. diff --git a/x/simulation/rand_util_test.go b/x/simulation/rand_util_test.go new file mode 100644 index 000000000..e212fed0a --- /dev/null +++ b/x/simulation/rand_util_test.go @@ -0,0 +1,40 @@ +package simulation_test + +import ( + "math/rand" + "testing" + + "github.com/stretchr/testify/require" + + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/simulation" +) + +func TestRandSubsetCoins(t *testing.T) { + tests := []struct { + name string + r *rand.Rand + coins sdk.Coins + }{ + {"seed=1", rand.New(rand.NewSource(1)), mustParseCoins("100stake,2testtoken")}, + {"seed=50", rand.New(rand.NewSource(50)), mustParseCoins("100stake,2testtoken")}, + {"seed=99", rand.New(rand.NewSource(99)), mustParseCoins("100stake,2testtoken")}, + } + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + got := simulation.RandSubsetCoins(tt.r, tt.coins) + gotStringRep := got.String() + sortedStringRep := got.Sort().String() + require.Equal(t, gotStringRep, sortedStringRep) + }) + } +} + +func mustParseCoins(s string) sdk.Coins { + coins, err := sdk.ParseCoins(s) + if err != nil { + panic(err) + } + return coins +}