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 }