Tworzenie zasilonych kont
Najpowszechniejszą potrzebą podczas testowania jest tworzenie kont z SOL. Cecha
TestHelpers sprawia, że jest to proste.
Pojedyncze konto
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_funded_account() {let mut svm = LiteSVM::new();// Create a funded account with 10 SOLlet alice = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// The keypair is ready to use immediatelyprintln!("Alice's pubkey: {}", alice.pubkey());}
Wiele kont
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_multiple_accounts() {let mut svm = LiteSVM::new();// Create 5 funded accounts, each with 5 SOLlet accounts = svm.create_funded_accounts(5, 5 * LAMPORTS_PER_SOL).unwrap();assert_eq!(accounts.len(), 5);for (i, account) in accounts.iter().enumerate() {println!("Account {}: {}", i, account.pubkey());}}
Operacje na tokenach
Twórz minty tokenów i konta bez zbędnego powtarzalnego kodu.
Tworzenie mintu tokenu
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_token_mint() {let mut svm = LiteSVM::new();// Create authority accountlet authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();// Create a token mint with 9 decimals (returns Keypair)let mint = svm.create_token_mint(&authority, 9).unwrap();println!("Mint address: {}", mint.pubkey());}
Tworzenie token account
use litesvm_utils::{LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_create_token_accounts() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();// Create mint (returns Keypair)let mint = svm.create_token_mint(&authority, 9).unwrap();// Create a regular token account (returns Keypair)let token_account = svm.create_token_account(&mint.pubkey(), &user).unwrap();// Or create an Associated Token Account — ATA (returns Pubkey)let ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();println!("Token account: {}", token_account.pubkey());println!("ATA: {}", ata);}
W większości przypadków używaj ATA. Associated Token Accounts są deterministyczne i zgodne z konwencjami Solany. Używaj zwykłych token account tylko wtedy, gdy potrzebujesz wielu kont dla tej samej pary mint/właściciel.
Mintowanie tokenów
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_mint_tokens() {let mut svm = LiteSVM::new();let authority = svm.create_funded_account(10 * LAMPORTS_PER_SOL).unwrap();let user = svm.create_funded_account(5 * LAMPORTS_PER_SOL).unwrap();// Create mint with authoritylet mint = svm.create_token_mint(&authority, 9).unwrap();// Create ATA for user (returns Pubkey)let user_ata = svm.create_associated_token_account(&mint.pubkey(), &user).unwrap();// Mint 1000 tokens to user's ATAsvm.mint_to(&mint.pubkey(), &user_ata, &authority, 1000).unwrap();// Verify the balancesvm.assert_token_balance(&user_ata, 1000);}
Wyprowadzanie PDA
Łatwo wyprowadzaj Program Derived Addresses na potrzeby swoich testów.
Podstawowe wyprowadzanie PDA
use litesvm_utils::{LiteSVM, Pubkey, TestHelpers};#[test]fn test_derive_pda() {let mut svm = LiteSVM::new();let program_id = Pubkey::new_unique();let user = Pubkey::new_unique();// Get PDA with bumplet (pda, bump) = svm.derive_pda(&[b"user_account", user.as_ref()],&program_id,);println!("PDA: {}, Bump: {}", pda, bump);}
Pobierz sam PDA
use litesvm_utils::{LiteSVM, Pubkey, TestHelpers};#[test]fn test_get_pda() {let mut svm = LiteSVM::new();let program_id = Pubkey::new_unique();// When you don't need the bumplet pda = svm.get_pda(&[b"config"], &program_id);println!("Config PDA: {}", pda);}
Użyj derive_pda gdy potrzebujesz bump seed (np. do wywołań CPI). Użyj
get_pda gdy potrzebujesz tylko adresu.
Zarządzanie slot
Kontroluj postęp czasu na potrzeby testowania logiki zależnej od czasu.
Pobierz bieżący slot
use litesvm_utils::{LiteSVM, TestHelpers};#[test]fn test_get_current_slot() {let mut svm = LiteSVM::new();let slot = svm.get_current_slot();println!("Current slot: {}", slot);}
Przesuń sloty
use litesvm_utils::{LiteSVM, TestHelpers};#[test]fn test_advance_slots() {let mut svm = LiteSVM::new();let initial_slot = svm.get_current_slot();// Advance by 100 slotssvm.advance_slot(100);let new_slot = svm.get_current_slot();assert_eq!(new_slot, initial_slot + 100);}
Kompletny przykład
Oto kompleksowy przykład użycia wielu pomocników testowych jednocześnie:
use litesvm_utils::{AssertionHelpers, LiteSVM, Signer, TestHelpers};use solana_sdk::native_token::LAMPORTS_PER_SOL;#[test]fn test_complete_setup() {let mut svm = LiteSVM::new();// Create accountslet admin = svm.create_funded_account(100 * LAMPORTS_PER_SOL).unwrap();let users = svm.create_funded_accounts(3, 10 * LAMPORTS_PER_SOL).unwrap();// Create token infrastructure (returns Keypair)let mint = svm.create_token_mint(&admin, 6).unwrap(); // 6 decimals like USDC// Create ATAs and mint tokens to each userfor (i, user) in users.iter().enumerate() {// create_associated_token_account returns Pubkeylet ata = svm.create_associated_token_account(&mint.pubkey(), user).unwrap();let amount = (i as u64 + 1) * 1_000_000; // 1, 2, 3 tokenssvm.mint_to(&mint.pubkey(), &ata, &admin, amount).unwrap();// Verifysvm.assert_token_balance(&ata, amount);}// Verify total supplylet total_supply = 1_000_000 + 2_000_000 + 3_000_000;svm.assert_mint_supply(&mint.pubkey(), total_supply);// Test time-based logiclet start_slot = svm.get_current_slot();svm.advance_slot(1000);assert!(svm.get_current_slot() > start_slot);}
Is this page helpful?