1package grc20
2
3import (
4 "std"
5 "testing"
6
7 "gno.land/p/demo/testutils"
8 "gno.land/p/demo/ufmt"
9 "gno.land/p/demo/urequire"
10)
11
12func TestUserTokenImpl(t *testing.T) {
13 bank := NewBanker("Dummy", "DUMMY", 4)
14 tok := bank.Token()
15 _ = tok
16}
17
18func TestUserApprove(t *testing.T) {
19 owner := testutils.TestAddress("owner")
20 spender := testutils.TestAddress("spender")
21 dest := testutils.TestAddress("dest")
22
23 bank := NewBanker("Dummy", "DUMMY", 6)
24 tok := bank.Token()
25
26 // Set owner as the original caller
27 std.TestSetOrigCaller(owner)
28 // Mint 100000000 tokens for owner
29 urequire.NoError(t, bank.Mint(owner, 100000000))
30
31 // Approve spender to spend 5000000 tokens
32 urequire.NoError(t, tok.Approve(spender, 5000000))
33
34 // Set spender as the original caller
35 std.TestSetOrigCaller(spender)
36 // Try to transfer 10000000 tokens from owner to dest, should fail because it exceeds allowance
37 urequire.Error(t,
38 tok.TransferFrom(owner, dest, 10000000),
39 ErrInsufficientAllowance.Error(),
40 "should not be able to transfer more than approved",
41 )
42
43 // Define a set of test data with spend amount and expected remaining allowance
44 tests := []struct {
45 spend uint64 // Spend amount
46 exp uint64 // Remaining allowance
47 }{
48 {3, 4999997},
49 {999997, 4000000},
50 {4000000, 0},
51 }
52
53 // perform transfer operation,and check if allowance and balance are correct
54 for _, tt := range tests {
55 b0 := tok.BalanceOf(dest)
56 // Perform transfer from owner to dest
57 urequire.NoError(t, tok.TransferFrom(owner, dest, tt.spend))
58 a := tok.Allowance(owner, spender)
59 // Check if allowance equals expected value
60 urequire.True(t, a == tt.exp, ufmt.Sprintf("allowance exp: %d,got %d", tt.exp, a))
61
62 // Get dest current balance
63 b := tok.BalanceOf(dest)
64 // Calculate expected balance ,should be initial balance plus transfer amount
65 expB := b0 + tt.spend
66 // Check if balance equals expected value
67 urequire.True(t, b == expB, ufmt.Sprintf("balance exp: %d,got %d", expB, b))
68 }
69
70 // Try to transfer one token from owner to dest ,should fail because no allowance left
71 urequire.Error(t, tok.TransferFrom(owner, dest, 1), ErrInsufficientAllowance.Error(), "no allowance")
72}
token_test.gno
2.11 Kb ยท 72 lines