From 8e7251d6a0cd2b17d267f9a1a3f9657dee9b6637 Mon Sep 17 00:00:00 2001 From: Benjamin DENEUX Date: Wed, 18 Jan 2023 15:09:41 +0100 Subject: [PATCH] test(logic): add locked_coins unit tests --- x/logic/predicate/bank_test.go | 152 +++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/x/logic/predicate/bank_test.go b/x/logic/predicate/bank_test.go index d9bdca7f..8891d044 100644 --- a/x/logic/predicate/bank_test.go +++ b/x/logic/predicate/bank_test.go @@ -26,6 +26,7 @@ func TestBank(t *testing.T) { cases := []struct { balances []bank.Balance spendableCoins []bank.Balance + lockedCoins []bank.Balance program string query string wantResult []types.TermResults @@ -268,6 +269,150 @@ func TestBank(t *testing.T) { wantResult: []types.TermResults{{"X": "[uknow-100]"}}, wantError: fmt.Errorf("bank_spendable_coins/2: decoding bech32 failed: invalid bech32 string length 3"), }, + + { + balances: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(1000))), + }, + }, + spendableCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(100))), + }, + }, + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(900))), + }, + }, + query: `bank_locked_coins('okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm', X).`, + wantResult: []types.TermResults{{"X": "[uknow-900]"}}, + }, + { + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(100))), + }, + }, + query: `bank_locked_coins('okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm', [X]).`, + wantResult: []types.TermResults{{"X": "uatom-100"}}, + }, + { + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(420)), sdk.NewCoin("uatom", sdk.NewInt(589))), + }, + }, + query: `bank_locked_coins('okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm', [X, Y]).`, + wantResult: []types.TermResults{{"X": "uatom-589", "Y": "uknow-420"}}, + }, + { + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(420)), sdk.NewCoin("uatom", sdk.NewInt(589))), + }, + }, + query: `bank_locked_coins('okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm', [-(D, A) | _]).`, + wantResult: []types.TermResults{{"D": "uatom", "A": "589"}}, + }, + { + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(420)), sdk.NewCoin("uatom", sdk.NewInt(493))), + }, + { + Address: "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(589)), sdk.NewCoin("uatom", sdk.NewInt(693))), + }, + }, + query: `bank_locked_coins('okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38', [_, X]).`, + wantResult: []types.TermResults{{"X": "uknow-589"}}, + }, + { + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(420)), sdk.NewCoin("uatom", sdk.NewInt(493))), + }, + { + Address: "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(589)), sdk.NewCoin("uatom", sdk.NewInt(693))), + }, + }, + program: `bank_locked_has_coin(A, D, V) :- bank_locked_coins(A, R), member(D-V, R).`, + query: `bank_locked_has_coin('okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38', 'uknow', V).`, + wantResult: []types.TermResults{{"V": "589"}}, + }, + { + lockedCoins: []bank.Balance{ + { + Address: "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", + Coins: sdk.NewCoins( + sdk.NewCoin("uknow", sdk.NewInt(589)), + sdk.NewCoin("uatom", sdk.NewInt(693)), + sdk.NewCoin("uband", sdk.NewInt(4282)), + sdk.NewCoin("uakt", sdk.NewInt(4099)), + sdk.NewCoin("ukava", sdk.NewInt(836)), + sdk.NewCoin("uscrt", sdk.NewInt(599)), + ), + }, + }, + program: `bank_locked_has_sufficient_coin(A, C, S) :- bank_locked_coins(A, R), member(C, R), +-(_, V) = C, compare(>, V, S).`, + query: `bank_locked_has_sufficient_coin('okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38', C, 600).`, + wantResult: []types.TermResults{{"C": "uakt-4099"}, {"C": "uatom-693"}, {"C": "uband-4282"}, {"C": "ukava-836"}}, + }, + { + balances: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(1220))), + }, + { + Address: "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", + Coins: sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(8000))), + }, + }, + spendableCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(420))), + }, + { + Address: "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", + Coins: sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(589))), + }, + }, + lockedCoins: []bank.Balance{ + { + Address: "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", + Coins: sdk.NewCoins(sdk.NewCoin("uknow", sdk.NewInt(800))), + }, + { + Address: "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", + Coins: sdk.NewCoins(sdk.NewCoin("uatom", sdk.NewInt(7411))), + }, + }, + query: `bank_locked_coins(Accounts, SpendableCoins).`, + wantResult: []types.TermResults{ + {"Accounts": "okp41ffd5wx65l407yvm478cxzlgygw07h79sq0m3fm", "SpendableCoins": "[uknow-420]"}, + {"Accounts": "okp41wze8mn5nsgl9qrgazq6a92fvh7m5e6pslyrz38", "SpendableCoins": "[uatom-589]"}, + }, + }, + { + lockedCoins: []bank.Balance{}, + query: `bank_locked_coins('foo', X).`, + wantResult: []types.TermResults{{"X": "[uknow-100]"}}, + wantError: fmt.Errorf("bank_locked_coins/2: decoding bech32 failed: invalid bech32 string length 3"), + }, } for nc, tc := range cases { Convey(fmt.Sprintf("Given the query #%d: %s", nc, tc.query), func() { @@ -295,6 +440,13 @@ func TestBank(t *testing.T) { AnyTimes(). Return(balance.Coins) } + for _, balance := range tc.lockedCoins { + bankKeeper. + EXPECT(). + LockedCoins(ctx, sdk.MustAccAddressFromBech32(balance.Address)). + AnyTimes(). + Return(balance.Coins) + } bankKeeper. EXPECT(). GetAccountsBalances(ctx).