use solana_sdk::signer::Signer;
use solana_test_framework::*;
pub mod common;
use crate::common::test_runner::TestRunner;
#[tokio::test]
async fn common_unstake_limit() {
let mut tr = TestRunner::new(1_000_000_000).await.unwrap();
let stake_pool_owner = tr.create_user_with_ata().await.unwrap();
let staker = tr.create_user_with_ata().await.unwrap();
tr.mint(&staker.pubkey(), 10_200).await.unwrap();
tr.create_pool(&stake_pool_owner, 1000)
.await
.unwrap();
tr.activate_stake_pool(&stake_pool_owner.pubkey())
.await
.unwrap();
tr.create_stake_account(&stake_pool_owner.pubkey(), &staker.pubkey())
.await
.unwrap();
tr.stake(&stake_pool_owner.pubkey(), &staker, 1100)
.await
.unwrap();
let result = tr.unstake(&stake_pool_owner.pubkey(), &staker, 200).await;
assert!(result.is_err());
let pool_stats = tr.pool_stats(stake_pool_owner.pubkey()).await.unwrap();
assert_eq!(pool_stats.header.total_staked, 1100);
tr.sleep(1).await.unwrap();
tr.unstake(&stake_pool_owner.pubkey(), &staker, 100)
.await
.unwrap();
let pool_stats = tr.pool_stats(stake_pool_owner.pubkey()).await.unwrap();
assert_eq!(pool_stats.header.total_staked, 1000);
tr.sleep(1).await.unwrap();
tr.unstake(&stake_pool_owner.pubkey(), &staker, 1000)
.await
.unwrap();
let pool_stats = tr.pool_stats(stake_pool_owner.pubkey()).await.unwrap();
assert_eq!(pool_stats.header.total_staked, 0);
tr.change_pool_minimum(&stake_pool_owner, 9000)
.await
.unwrap();
let result = tr.stake(&stake_pool_owner.pubkey(), &staker, 8999).await;
assert!(result.is_err());
tr.stake(&stake_pool_owner.pubkey(), &staker, 9000)
.await
.unwrap();
tr.create_bond(&stake_pool_owner.pubkey(), &staker.pubkey(), 5_000, 1, 1, 1)
.await
.unwrap();
tr.claim_bond(&stake_pool_owner.pubkey(), &staker.pubkey())
.await
.unwrap();
let result = tr.unstake(&stake_pool_owner.pubkey(), &staker, 5001).await;
assert!(result.is_err());
tr.unstake(&stake_pool_owner.pubkey(), &staker, 5000)
.await
.unwrap_err();
tr.unstake(&stake_pool_owner.pubkey(), &staker, 9000)
.await
.unwrap();
}