Merge PR #3826: Port IsAllGT from safe-coins PR

This commit is contained in:
Jack Zampolin 2019-03-08 12:22:44 -08:00 committed by GitHub
commit f37ab4a898
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 38 additions and 10 deletions

View File

@ -269,6 +269,23 @@ func (coins Coins) safeAdd(coinsB Coins) Coins {
} }
} }
// ContainsDenomsOf returns true if coinsB' denom set
// is subset of the receiver's denoms.
func (coins Coins) ContainsDenomsOf(coinsB Coins) bool {
// more denoms in B than in receiver
if len(coinsB) > len(coins) {
return false
}
for _, coinB := range coinsB {
if coins.AmountOf(coinB.Denom).IsZero() {
return false
}
}
return true
}
// Sub subtracts a set of coins from another. // Sub subtracts a set of coins from another.
// //
// e.g. // e.g.
@ -297,12 +314,26 @@ func (coins Coins) SafeSub(coinsB Coins) (Coins, bool) {
// IsAllGT returns true if for every denom in coins, the denom is present at a // IsAllGT returns true if for every denom in coins, the denom is present at a
// greater amount in coinsB. // greater amount in coinsB.
func (coins Coins) IsAllGT(coinsB Coins) bool { func (coins Coins) IsAllGT(coinsB Coins) bool {
diff, _ := coins.SafeSub(coinsB) if len(coins) == 0 {
if len(diff) == 0 {
return false return false
} }
return diff.IsAllPositive() if len(coinsB) == 0 {
return true
}
if !coins.ContainsDenomsOf(coinsB) {
return false
}
for _, coinB := range coinsB {
amountA, amountB := coins.AmountOf(coinB.Denom), coinB.Amount
if !amountA.GT(amountB) {
return false
}
}
return true
} }
// IsAllGTE returns true iff for every denom in coins, the denom is present at // IsAllGTE returns true iff for every denom in coins, the denom is present at

View File

@ -276,10 +276,7 @@ func TestCoins(t *testing.T) {
mixedCase3 := Coins{ mixedCase3 := Coins{
{"gAs", NewInt(1)}, {"gAs", NewInt(1)},
} }
empty := Coins{ empty := NewCoins()
{"gold", NewInt(0)},
}
null := Coins{}
badSort1 := Coins{ badSort1 := Coins{
{"tree", NewInt(1)}, {"tree", NewInt(1)},
{"gas", NewInt(1)}, {"gas", NewInt(1)},
@ -312,7 +309,7 @@ func TestCoins(t *testing.T) {
assert.False(t, mixedCase2.IsValid(), "First Coins denoms contain upper case characters") assert.False(t, mixedCase2.IsValid(), "First Coins denoms contain upper case characters")
assert.False(t, mixedCase3.IsValid(), "Single denom in Coins contains upper case characters") assert.False(t, mixedCase3.IsValid(), "Single denom in Coins contains upper case characters")
assert.True(t, good.IsAllPositive(), "Expected coins to be positive: %v", good) assert.True(t, good.IsAllPositive(), "Expected coins to be positive: %v", good)
assert.False(t, null.IsAllPositive(), "Expected coins to not be positive: %v", null) assert.False(t, empty.IsAllPositive(), "Expected coins to not be positive: %v", empty)
assert.True(t, good.IsAllGTE(empty), "Expected %v to be >= %v", good, empty) assert.True(t, good.IsAllGTE(empty), "Expected %v to be >= %v", good, empty)
assert.False(t, good.IsAllLT(empty), "Expected %v to be < %v", good, empty) assert.False(t, good.IsAllLT(empty), "Expected %v to be < %v", good, empty)
assert.True(t, empty.IsAllLT(good), "Expected %v to be < %v", empty, good) assert.True(t, empty.IsAllLT(good), "Expected %v to be < %v", empty, good)
@ -331,7 +328,7 @@ func TestCoinsGT(t *testing.T) {
assert.True(t, Coins{{testDenom1, one}}.IsAllGT(Coins{})) assert.True(t, Coins{{testDenom1, one}}.IsAllGT(Coins{}))
assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom1, one}})) assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom1, one}}))
assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom2, one}})) assert.False(t, Coins{{testDenom1, one}}.IsAllGT(Coins{{testDenom2, one}}))
assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGT(Coins{{testDenom2, one}})) assert.True(t, Coins{{testDenom1, one}, {testDenom2, two}}.IsAllGT(Coins{{testDenom2, one}}))
assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGT(Coins{{testDenom2, two}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllGT(Coins{{testDenom2, two}}))
} }
@ -358,7 +355,7 @@ func TestCoinsLT(t *testing.T) {
assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom2, one}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom2, one}}))
assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom2, two}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom2, two}}))
assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, one}, {testDenom2, one}})) assert.False(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, one}, {testDenom2, one}}))
assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, one}, {testDenom2, two}})) assert.True(t, Coins{{testDenom1, one}, {testDenom2, one}}.IsAllLT(Coins{{testDenom1, two}, {testDenom2, two}}))
assert.True(t, Coins{}.IsAllLT(Coins{{testDenom1, one}})) assert.True(t, Coins{}.IsAllLT(Coins{{testDenom1, one}}))
} }