Search Apps Documentation Source Content File Folder Download Copy

token_test.gno

2.11 Kb ยท 72 lines
 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}