tellers_test.gno
4.28 Kb ยท 134 lines
1package grc20
2
3import (
4 "testing"
5
6 "gno.land/p/nt/testutils"
7 "gno.land/p/nt/uassert"
8 "gno.land/p/nt/ufmt"
9 "gno.land/p/nt/urequire"
10)
11
12func TestCallerTellerImpl(t *testing.T) {
13 tok, _ := NewToken("Dummy", "DUMMY", 4)
14 teller := tok.CallerTeller()
15 urequire.False(t, tok == nil)
16 var _ Teller = teller
17}
18
19func TestTeller(t *testing.T) {
20 var (
21 alice = testutils.TestAddress("alice")
22 bob = testutils.TestAddress("bob")
23 carl = testutils.TestAddress("carl")
24 )
25
26 token, ledger := NewToken("Dummy", "DUMMY", 6)
27
28 checkBalances := func(aliceEB, bobEB, carlEB int64) {
29 t.Helper()
30 exp := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceEB, bobEB, carlEB)
31 aliceGB := token.BalanceOf(alice)
32 bobGB := token.BalanceOf(bob)
33 carlGB := token.BalanceOf(carl)
34 got := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceGB, bobGB, carlGB)
35 uassert.Equal(t, got, exp, "invalid balances")
36 }
37 checkAllowances := func(abEB, acEB, baEB, bcEB, caEB, cbEB int64) {
38 t.Helper()
39 exp := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abEB, acEB, baEB, bcEB, caEB, cbEB)
40 abGB := token.Allowance(alice, bob)
41 acGB := token.Allowance(alice, carl)
42 baGB := token.Allowance(bob, alice)
43 bcGB := token.Allowance(bob, carl)
44 caGB := token.Allowance(carl, alice)
45 cbGB := token.Allowance(carl, bob)
46 got := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abGB, acGB, baGB, bcGB, caGB, cbGB)
47 uassert.Equal(t, got, exp, "invalid allowances")
48 }
49
50 checkBalances(0, 0, 0)
51 checkAllowances(0, 0, 0, 0, 0, 0)
52
53 urequire.NoError(t, ledger.Mint(alice, 1000))
54 urequire.NoError(t, ledger.Mint(alice, 100))
55 checkBalances(1100, 0, 0)
56 checkAllowances(0, 0, 0, 0, 0, 0)
57
58 urequire.NoError(t, ledger.Approve(alice, bob, 99999999))
59 checkBalances(1100, 0, 0)
60 checkAllowances(99999999, 0, 0, 0, 0, 0)
61
62 urequire.NoError(t, ledger.Approve(alice, bob, 400))
63 checkBalances(1100, 0, 0)
64 checkAllowances(400, 0, 0, 0, 0, 0)
65
66 urequire.Error(t, ledger.TransferFrom(alice, bob, carl, 100000000))
67 checkBalances(1100, 0, 0)
68 checkAllowances(400, 0, 0, 0, 0, 0)
69
70 urequire.NoError(t, ledger.TransferFrom(alice, bob, carl, 100))
71 checkBalances(1000, 0, 100)
72 checkAllowances(300, 0, 0, 0, 0, 0)
73
74 urequire.Error(t, ledger.SpendAllowance(alice, bob, 2000000))
75 checkBalances(1000, 0, 100)
76 checkAllowances(300, 0, 0, 0, 0, 0)
77
78 urequire.NoError(t, ledger.SpendAllowance(alice, bob, 100))
79 checkBalances(1000, 0, 100)
80 checkAllowances(200, 0, 0, 0, 0, 0)
81}
82
83func TestCallerTeller(t *testing.T) {
84 alice := testutils.TestAddress("alice")
85 bob := testutils.TestAddress("bob")
86 carl := testutils.TestAddress("carl")
87
88 token, ledger := NewToken("Dummy", "DUMMY", 6)
89 teller := token.CallerTeller()
90
91 checkBalances := func(aliceEB, bobEB, carlEB int64) {
92 t.Helper()
93 exp := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceEB, bobEB, carlEB)
94 aliceGB := token.BalanceOf(alice)
95 bobGB := token.BalanceOf(bob)
96 carlGB := token.BalanceOf(carl)
97 got := ufmt.Sprintf("alice=%d bob=%d carl=%d", aliceGB, bobGB, carlGB)
98 uassert.Equal(t, got, exp, "invalid balances")
99 }
100 checkAllowances := func(abEB, acEB, baEB, bcEB, caEB, cbEB int64) {
101 t.Helper()
102 exp := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abEB, acEB, baEB, bcEB, caEB, cbEB)
103 abGB := token.Allowance(alice, bob)
104 acGB := token.Allowance(alice, carl)
105 baGB := token.Allowance(bob, alice)
106 bcGB := token.Allowance(bob, carl)
107 caGB := token.Allowance(carl, alice)
108 cbGB := token.Allowance(carl, bob)
109 got := ufmt.Sprintf("ab=%d ac=%d ba=%d bc=%d ca=%d cb=%s", abGB, acGB, baGB, bcGB, caGB, cbGB)
110 uassert.Equal(t, got, exp, "invalid allowances")
111 }
112
113 urequire.NoError(t, ledger.Mint(alice, 1000))
114 checkBalances(1000, 0, 0)
115 checkAllowances(0, 0, 0, 0, 0, 0)
116
117 tellerThrough := func(action func()) {
118 testing.SetRealm(testing.NewCodeRealm("gno.land/r/realm_exposing_the_teller"))
119 action()
120 }
121
122 testing.SetRealm(testing.NewUserRealm(alice))
123 tellerThrough(func() { urequire.NoError(t, teller.Approve(bob, 600)) })
124 checkBalances(1000, 0, 0)
125 checkAllowances(600, 0, 0, 0, 0, 0)
126
127 testing.SetRealm(testing.NewUserRealm(bob))
128 tellerThrough(func() { urequire.Error(t, teller.TransferFrom(alice, carl, 700)) })
129 checkBalances(1000, 0, 0)
130 checkAllowances(600, 0, 0, 0, 0, 0)
131 tellerThrough(func() { urequire.NoError(t, teller.TransferFrom(alice, carl, 400)) })
132 checkBalances(600, 0, 400)
133 checkAllowances(200, 0, 0, 0, 0, 0)
134}