github.com/gagliardetto/solana-go@v1.11.0/account_test.go (about)

     1  // Copyright 2021 github.com/gagliardetto
     2  // This file has been modified by github.com/gagliardetto
     3  //
     4  // Copyright 2020 dfuse Platform Inc.
     5  //
     6  // Licensed under the Apache License, Version 2.0 (the "License");
     7  // you may not use this file except in compliance with the License.
     8  // You may obtain a copy of the License at
     9  //
    10  //      http://www.apache.org/licenses/LICENSE-2.0
    11  //
    12  // Unless required by applicable law or agreed to in writing, software
    13  // distributed under the License is distributed on an "AS IS" BASIS,
    14  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    15  // See the License for the specific language governing permissions and
    16  // limitations under the License.
    17  
    18  package solana
    19  
    20  import (
    21  	"testing"
    22  
    23  	"github.com/stretchr/testify/assert"
    24  	"github.com/stretchr/testify/require"
    25  )
    26  
    27  func TestNewAccount(t *testing.T) {
    28  	a := NewWallet()
    29  	privateKey := a.PrivateKey
    30  	public := a.PublicKey()
    31  
    32  	a2, err := WalletFromPrivateKeyBase58(privateKey.String())
    33  	require.NoError(t, err)
    34  
    35  	require.Equal(t, privateKey, a2.PrivateKey)
    36  	require.Equal(t, public, a2.PublicKey())
    37  }
    38  
    39  func Test_AccountMeta_less(t *testing.T) {
    40  	pkey := MustPublicKeyFromBase58("SysvarS1otHashes111111111111111111111111111")
    41  	tests := []struct {
    42  		name   string
    43  		left   *AccountMeta
    44  		right  *AccountMeta
    45  		expect bool
    46  	}{
    47  		{
    48  			name:   "accounts are equal",
    49  			left:   &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: false},
    50  			right:  &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: false},
    51  			expect: false,
    52  		},
    53  		{
    54  			name:   "left is a signer, right is not a signer",
    55  			left:   &AccountMeta{PublicKey: pkey, IsSigner: true, IsWritable: false},
    56  			right:  &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: false},
    57  			expect: true,
    58  		},
    59  		{
    60  			name:   "left is not a signer, right is a signer",
    61  			left:   &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: false},
    62  			right:  &AccountMeta{PublicKey: pkey, IsSigner: true, IsWritable: false},
    63  			expect: false,
    64  		},
    65  		{
    66  			name:   "left is writable, right is not writable",
    67  			left:   &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: true},
    68  			right:  &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: false},
    69  			expect: true,
    70  		},
    71  		{
    72  			name:   "left is not writable, right is writable",
    73  			left:   &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: false},
    74  			right:  &AccountMeta{PublicKey: pkey, IsSigner: false, IsWritable: true},
    75  			expect: false,
    76  		},
    77  		{
    78  			name:   "both are signers and left is writable, right is not writable",
    79  			left:   &AccountMeta{PublicKey: pkey, IsSigner: true, IsWritable: true},
    80  			right:  &AccountMeta{PublicKey: pkey, IsSigner: true, IsWritable: false},
    81  			expect: true,
    82  		},
    83  		{
    84  			name:   "both are signers andleft is not writable, right is writable",
    85  			left:   &AccountMeta{PublicKey: pkey, IsSigner: true, IsWritable: false},
    86  			right:  &AccountMeta{PublicKey: pkey, IsSigner: true, IsWritable: true},
    87  			expect: false,
    88  		},
    89  	}
    90  
    91  	for _, test := range tests {
    92  		t.Run(test.name, func(t *testing.T) {
    93  			assert.Equal(t, test.expect, test.left.less(test.right))
    94  		})
    95  	}
    96  }
    97  
    98  func TestAccountMetaSlice(t *testing.T) {
    99  	pkey1 := MustPublicKeyFromBase58("SysvarS1otHashes111111111111111111111111111")
   100  
   101  	var slice AccountMetaSlice
   102  
   103  	setting := []*AccountMeta{
   104  		{PublicKey: pkey1, IsSigner: true, IsWritable: false},
   105  	}
   106  	err := slice.SetAccounts(setting)
   107  	require.NoError(t, err)
   108  
   109  	require.Len(t, slice, 1)
   110  	require.Equal(t, setting[0], slice[0])
   111  	require.Equal(t, setting, slice.GetAccounts())
   112  
   113  	{
   114  		pkey2 := MustPublicKeyFromBase58("BPFLoaderUpgradeab1e11111111111111111111111")
   115  
   116  		meta := NewAccountMeta(pkey2, true, false)
   117  		slice.Append(meta)
   118  
   119  		require.Len(t, slice, 2)
   120  		require.Equal(t, meta, slice[1])
   121  		require.Equal(t, meta, slice.GetAccounts()[1])
   122  	}
   123  }
   124  
   125  func TestNewAccountMeta(t *testing.T) {
   126  	pkey := MustPublicKeyFromBase58("SysvarS1otHashes111111111111111111111111111")
   127  
   128  	isWritable := false
   129  	isSigner := true
   130  
   131  	out := NewAccountMeta(pkey, isWritable, isSigner)
   132  
   133  	require.NotNil(t, out)
   134  
   135  	require.Equal(t, isSigner, out.IsSigner)
   136  	require.Equal(t, isWritable, out.IsWritable)
   137  }
   138  
   139  func TestMeta(t *testing.T) {
   140  	pkey := MustPublicKeyFromBase58("SysvarS1otHashes111111111111111111111111111")
   141  
   142  	meta := Meta(pkey)
   143  	require.NotNil(t, meta)
   144  	require.Equal(t, pkey, meta.PublicKey)
   145  
   146  	require.False(t, meta.IsSigner)
   147  	require.False(t, meta.IsWritable)
   148  
   149  	meta.SIGNER()
   150  
   151  	require.True(t, meta.IsSigner)
   152  	require.False(t, meta.IsWritable)
   153  
   154  	meta.WRITE()
   155  
   156  	require.True(t, meta.IsSigner)
   157  	require.True(t, meta.IsWritable)
   158  }
   159  
   160  func TestSplitFrom(t *testing.T) {
   161  	slice := make(AccountMetaSlice, 0)
   162  	slice = append(slice, Meta(BPFLoaderDeprecatedProgramID))
   163  	slice = append(slice, Meta(TokenProgramID))
   164  	slice = append(slice, Meta(TokenLendingProgramID))
   165  	slice = append(slice, Meta(SPLAssociatedTokenAccountProgramID))
   166  	slice = append(slice, Meta(MemoProgramID))
   167  
   168  	require.Len(t, slice, 5)
   169  
   170  	{
   171  		part1, part2 := slice.SplitFrom(0)
   172  		require.Len(t, part1, 0)
   173  		require.Len(t, part2, 5)
   174  	}
   175  	{
   176  		part1, part2 := slice.SplitFrom(1)
   177  		require.Len(t, part1, 1)
   178  		require.Len(t, part2, 4)
   179  		require.Equal(t, Meta(BPFLoaderDeprecatedProgramID), part1[0])
   180  		require.Equal(t, Meta(TokenProgramID), part2[0])
   181  		require.Equal(t, Meta(TokenLendingProgramID), part2[1])
   182  		require.Equal(t, Meta(SPLAssociatedTokenAccountProgramID), part2[2])
   183  		require.Equal(t, Meta(MemoProgramID), part2[3])
   184  	}
   185  	{
   186  		part1, part2 := slice.SplitFrom(2)
   187  		require.Len(t, part1, 2)
   188  		require.Len(t, part2, 3)
   189  	}
   190  	{
   191  		part1, part2 := slice.SplitFrom(3)
   192  		require.Len(t, part1, 3)
   193  		require.Len(t, part2, 2)
   194  	}
   195  	{
   196  		part1, part2 := slice.SplitFrom(4)
   197  		require.Len(t, part1, 4)
   198  		require.Len(t, part2, 1)
   199  	}
   200  	{
   201  		part1, part2 := slice.SplitFrom(5)
   202  		require.Len(t, part1, 5)
   203  		require.Len(t, part2, 0)
   204  	}
   205  	{
   206  		part1, part2 := slice.SplitFrom(6)
   207  		require.Len(t, part1, 5)
   208  		require.Len(t, part2, 0)
   209  	}
   210  	{
   211  		part1, part2 := slice.SplitFrom(10000)
   212  		require.Len(t, part1, 5)
   213  		require.Len(t, part2, 0)
   214  	}
   215  	require.Panics(t,
   216  		func() {
   217  			slice.SplitFrom(-1)
   218  		})
   219  }