github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/grc/grc20/user_token_test.gno (about)

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