use std::sync::{Arc, Mutex, MutexGuard};
use anyhow::Result;
use litesvm::LiteSVM;
use solana_client::nonblocking::rpc_client::RpcClient;
use solana_sdk::{
clock::Clock,
signature::{Keypair, Signer},
};
use crate::mock_rpc::MockRpcSender;
pub struct TestContext {
pub svm: Arc<Mutex<LiteSVM>>,
pub rpc: RpcClient,
pub payer: Arc<Keypair>,
}
impl TestContext {
pub fn lock_svm(&self) -> MutexGuard<'_, LiteSVM> {
self.svm.lock().expect("SVM mutex poisoned")
}
}
pub fn new_test_context() -> Result<TestContext> {
let mut svm = LiteSVM::new();
let current_ts = chrono::Utc::now().timestamp();
let mut updated_clock = svm.get_sysvar::<Clock>();
updated_clock.unix_timestamp = current_ts;
svm.set_sysvar::<Clock>(&updated_clock);
let payer = Arc::new(Keypair::new());
let payer_balance: u64 = 1_000_000_000_000;
svm.airdrop(&payer.pubkey(), payer_balance)
.map_err(|e| anyhow::anyhow!("Failed to fund payer account: {:?}", e))?;
let svm = Arc::new(Mutex::new(svm));
let rpc = MockRpcSender::new(Arc::clone(&svm)).create_rpc_client();
Ok(TestContext { svm, rpc, payer })
}