github.com/amazechain/amc@v0.1.3/internal/avm/abi/method_test.go (about)

     1  // Copyright 2023 The AmazeChain Authors
     2  // This file is part of the AmazeChain library.
     3  //
     4  // The AmazeChain library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The AmazeChain library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the AmazeChain library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package abi
    18  
    19  import (
    20  	"strings"
    21  	"testing"
    22  )
    23  
    24  const methoddata = `
    25  [
    26  	{"type": "function", "name": "balance", "stateMutability": "view"},
    27  	{"type": "function", "name": "send", "inputs": [{ "name": "amount", "type": "uint256" }]},
    28  	{"type": "function", "name": "transfer", "inputs": [{"name": "from", "type": "address"}, {"name": "to", "type": "address"}, {"name": "value", "type": "uint256"}], "outputs": [{"name": "success", "type": "bool"}]},
    29  	{"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple"}],"name":"tuple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},
    30  	{"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[]"}],"name":"tupleSlice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},
    31  	{"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[5]"}],"name":"tupleArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},
    32  	{"constant":false,"inputs":[{"components":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"a","type":"tuple[5][]"}],"name":"complexTuple","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},
    33  	{"stateMutability":"nonpayable","type":"fallback"},
    34  	{"stateMutability":"payable","type":"receive"}
    35  ]`
    36  
    37  func TestMethodString(t *testing.T) {
    38  	var table = []struct {
    39  		method      string
    40  		expectation string
    41  	}{
    42  		{
    43  			method:      "balance",
    44  			expectation: "function balance() view returns()",
    45  		},
    46  		{
    47  			method:      "send",
    48  			expectation: "function send(uint256 amount) returns()",
    49  		},
    50  		{
    51  			method:      "transfer",
    52  			expectation: "function transfer(address from, address to, uint256 value) returns(bool success)",
    53  		},
    54  		{
    55  			method:      "tuple",
    56  			expectation: "function tuple((uint256,uint256) a) returns()",
    57  		},
    58  		{
    59  			method:      "tupleArray",
    60  			expectation: "function tupleArray((uint256,uint256)[5] a) returns()",
    61  		},
    62  		{
    63  			method:      "tupleSlice",
    64  			expectation: "function tupleSlice((uint256,uint256)[] a) returns()",
    65  		},
    66  		{
    67  			method:      "complexTuple",
    68  			expectation: "function complexTuple((uint256,uint256)[5][] a) returns()",
    69  		},
    70  		{
    71  			method:      "fallback",
    72  			expectation: "fallback() returns()",
    73  		},
    74  		{
    75  			method:      "receive",
    76  			expectation: "receive() payable returns()",
    77  		},
    78  	}
    79  
    80  	abi, err := JSON(strings.NewReader(methoddata))
    81  	if err != nil {
    82  		t.Fatal(err)
    83  	}
    84  
    85  	for _, test := range table {
    86  		var got string
    87  		if test.method == "fallback" {
    88  			got = abi.Fallback.String()
    89  		} else if test.method == "receive" {
    90  			got = abi.Receive.String()
    91  		} else {
    92  			got = abi.Methods[test.method].String()
    93  		}
    94  		if got != test.expectation {
    95  			t.Errorf("expected string to be %s, got %s", test.expectation, got)
    96  		}
    97  	}
    98  }
    99  
   100  func TestMethodSig(t *testing.T) {
   101  	var cases = []struct {
   102  		method string
   103  		expect string
   104  	}{
   105  		{
   106  			method: "balance",
   107  			expect: "balance()",
   108  		},
   109  		{
   110  			method: "send",
   111  			expect: "send(uint256)",
   112  		},
   113  		{
   114  			method: "transfer",
   115  			expect: "transfer(address,address,uint256)",
   116  		},
   117  		{
   118  			method: "tuple",
   119  			expect: "tuple((uint256,uint256))",
   120  		},
   121  		{
   122  			method: "tupleArray",
   123  			expect: "tupleArray((uint256,uint256)[5])",
   124  		},
   125  		{
   126  			method: "tupleSlice",
   127  			expect: "tupleSlice((uint256,uint256)[])",
   128  		},
   129  		{
   130  			method: "complexTuple",
   131  			expect: "complexTuple((uint256,uint256)[5][])",
   132  		},
   133  	}
   134  	abi, err := JSON(strings.NewReader(methoddata))
   135  	if err != nil {
   136  		t.Fatal(err)
   137  	}
   138  
   139  	for _, test := range cases {
   140  		got := abi.Methods[test.method].Sig
   141  		if got != test.expect {
   142  			t.Errorf("expected string to be %s, got %s", test.expect, got)
   143  		}
   144  	}
   145  }