assert_instruction_count.rs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. mod setup;
  2. use {
  3. mollusk_svm::{result::Check, Mollusk},
  4. solana_account::{Account as SolanaAccount, ReadableAccount},
  5. solana_program_pack::Pack,
  6. solana_pubkey::Pubkey,
  7. spl_token::{
  8. id, instruction,
  9. state::{Account, Mint},
  10. },
  11. };
  12. const TRANSFER_AMOUNT: u64 = 1_000_000_000_000_000;
  13. #[test]
  14. fn initialize_mint() {
  15. let mut mollusk = Mollusk::new(&id(), "spl_token");
  16. mollusk.compute_budget.compute_unit_limit = 5_000; // last known 2252
  17. let owner = Pubkey::new_unique();
  18. let mint = Pubkey::new_unique();
  19. let decimals = 9;
  20. let mint_account = {
  21. let space = Mint::LEN;
  22. let lamports = mollusk.sysvars.rent.minimum_balance(space);
  23. SolanaAccount::new(lamports, space, &id())
  24. };
  25. mollusk.process_and_validate_instruction(
  26. &instruction::initialize_mint(&id(), &mint, &owner, None, decimals).unwrap(),
  27. &[
  28. (mint, mint_account),
  29. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  30. ],
  31. &[
  32. Check::success(),
  33. Check::account(&mint)
  34. .data(setup::setup_mint_account(Some(&owner), None, 0, decimals).data())
  35. .build(),
  36. ],
  37. );
  38. }
  39. #[test]
  40. fn initialize_account() {
  41. let mut mollusk = Mollusk::new(&id(), "spl_token");
  42. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 3284
  43. let owner = Pubkey::new_unique();
  44. let mint = Pubkey::new_unique();
  45. let account = Pubkey::new_unique();
  46. let decimals = 9;
  47. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  48. let token_account = {
  49. let space = Account::LEN;
  50. let lamports = mollusk.sysvars.rent.minimum_balance(space);
  51. SolanaAccount::new(lamports, space, &id())
  52. };
  53. mollusk.process_and_validate_instruction(
  54. &instruction::initialize_account(&id(), &account, &mint, &owner).unwrap(),
  55. &[
  56. (account, token_account),
  57. (mint, mint_account),
  58. (owner, SolanaAccount::default()),
  59. mollusk.sysvars.keyed_account_for_rent_sysvar(),
  60. ],
  61. &[
  62. Check::success(),
  63. Check::account(&account)
  64. .data(setup::setup_token_account(&mint, &owner, 0).data())
  65. .build(),
  66. ],
  67. );
  68. }
  69. #[test]
  70. fn mint_to() {
  71. let mut mollusk = Mollusk::new(&id(), "spl_token");
  72. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 2668
  73. let owner = Pubkey::new_unique();
  74. let mint = Pubkey::new_unique();
  75. let account = Pubkey::new_unique();
  76. let decimals = 9;
  77. let mint_account = setup::setup_mint_account(Some(&owner), None, 0, decimals);
  78. let token_account = setup::setup_token_account(&mint, &owner, 0);
  79. mollusk.process_and_validate_instruction(
  80. &instruction::mint_to(&id(), &mint, &account, &owner, &[], TRANSFER_AMOUNT).unwrap(),
  81. &[
  82. (mint, mint_account),
  83. (account, token_account),
  84. (owner, SolanaAccount::default()),
  85. ],
  86. &[
  87. Check::success(),
  88. Check::account(&mint)
  89. .data(
  90. setup::setup_mint_account(Some(&owner), None, TRANSFER_AMOUNT, decimals).data(),
  91. )
  92. .build(),
  93. Check::account(&account)
  94. .data(setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT).data())
  95. .build(),
  96. ],
  97. );
  98. }
  99. #[test]
  100. fn transfer() {
  101. let mut mollusk = Mollusk::new(&id(), "spl_token");
  102. mollusk.compute_budget.compute_unit_limit = 7_000; // last known 2972
  103. let owner = Pubkey::new_unique();
  104. let mint = Pubkey::new_unique();
  105. let source = Pubkey::new_unique();
  106. let destination = Pubkey::new_unique();
  107. let source_token_account = setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT);
  108. let destination_token_account = setup::setup_token_account(&mint, &owner, 0);
  109. mollusk.process_and_validate_instruction(
  110. &instruction::transfer(&id(), &source, &destination, &owner, &[], TRANSFER_AMOUNT).unwrap(),
  111. &[
  112. (source, source_token_account),
  113. (destination, destination_token_account),
  114. (owner, SolanaAccount::default()),
  115. ],
  116. &[
  117. Check::success(),
  118. Check::account(&source)
  119. .data(setup::setup_token_account(&mint, &owner, 0).data())
  120. .build(),
  121. Check::account(&destination)
  122. .data(setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT).data())
  123. .build(),
  124. ],
  125. );
  126. }
  127. #[test]
  128. fn burn() {
  129. let mut mollusk = Mollusk::new(&id(), "spl_token");
  130. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 2655
  131. let owner = Pubkey::new_unique();
  132. let mint = Pubkey::new_unique();
  133. let account = Pubkey::new_unique();
  134. let decimals = 9;
  135. let mint_account = setup::setup_mint_account(None, None, TRANSFER_AMOUNT, decimals);
  136. let token_account = setup::setup_token_account(&mint, &owner, TRANSFER_AMOUNT);
  137. mollusk.process_and_validate_instruction(
  138. &instruction::burn(&id(), &account, &mint, &owner, &[], TRANSFER_AMOUNT).unwrap(),
  139. &[
  140. (mint, mint_account),
  141. (account, token_account),
  142. (owner, SolanaAccount::default()),
  143. ],
  144. &[
  145. Check::success(),
  146. Check::account(&account)
  147. .data(setup::setup_token_account(&mint, &owner, 0).data())
  148. .build(),
  149. ],
  150. );
  151. }
  152. #[test]
  153. fn close_account() {
  154. let mut mollusk = Mollusk::new(&id(), "spl_token");
  155. mollusk.compute_budget.compute_unit_limit = 6_000; // last known 1783
  156. let owner = Pubkey::new_unique();
  157. let mint = Pubkey::new_unique();
  158. let account = Pubkey::new_unique();
  159. let decimals = 9;
  160. let mint_account = setup::setup_mint_account(None, None, 0, decimals);
  161. let token_account = setup::setup_token_account(&mint, &owner, 0);
  162. mollusk.process_and_validate_instruction(
  163. &instruction::close_account(&id(), &account, &owner, &owner, &[]).unwrap(),
  164. &[
  165. (mint, mint_account),
  166. (account, token_account),
  167. (owner, SolanaAccount::default()),
  168. ],
  169. &[Check::success(), Check::account(&account).closed().build()],
  170. );
  171. }