Browse Source

Add more tests

febo 2 weeks ago
parent
commit
b93bb2c422
2 changed files with 80 additions and 2 deletions
  1. 47 2
      p-token/tests/amount_to_ui_amount.rs
  2. 33 0
      p-token/tests/ui_amount_to_amount.rs

+ 47 - 2
p-token/tests/amount_to_ui_amount.rs

@@ -66,8 +66,8 @@ fn amount_to_ui_amount_with_maximum_decimals() {
         &TOKEN_PROGRAM_ID,
     );
 
-    // When we convert a 20 amount using the mint the transaction should succeed and
-    // return the correct UI amount.
+    // When we convert a 20 amount using the mint, the transaction should
+    //  succeed and return the correct UI amount.
 
     let instruction =
         spl_token::instruction::amount_to_ui_amount(&spl_token::ID, &mint, 20).unwrap();
@@ -83,3 +83,48 @@ fn amount_to_ui_amount_with_maximum_decimals() {
         &[Check::success(), Check::return_data(&ui_amount)],
     );
 }
+
+#[test]
+fn amount_to_ui_amount_with_u64_max() {
+    // Given a mint account with `u8::MAX` as decimals.
+
+    let mint = Pubkey::new_unique();
+    let mint_authority = Pubkey::new_unique();
+    let freeze_authority = Pubkey::new_unique();
+
+    let mint_account = create_mint_account(
+        mint_authority,
+        Some(freeze_authority),
+        u8::MAX,
+        &TOKEN_PROGRAM_ID,
+    );
+
+    // When we convert an u64::MAX amount using the mint, the transaction should
+    // succeed and return the correct UI amount.
+
+    let instruction =
+        spl_token::instruction::amount_to_ui_amount(&spl_token::ID, &mint, u64::MAX).unwrap();
+
+    // The expected UI amount is a `u64::MAX` with 255 decimal places.
+    //   - 2 digits for `0.`
+    //   - 255 digits for the maximum decimals.
+    let mut ui_amount = [b'0'; u8::MAX as usize + 2];
+    ui_amount[1] = b'.';
+
+    let mut offset = ui_amount.len();
+    let mut value = u64::MAX;
+
+    while value > 0 {
+        let remainder = value % 10;
+        value /= 10;
+        offset -= 1;
+
+        ui_amount[offset] = b'0' + (remainder as u8);
+    }
+
+    mollusk().process_and_validate_instruction(
+        &instruction,
+        &[(mint, mint_account)],
+        &[Check::success(), Check::return_data(&ui_amount)],
+    );
+}

+ 33 - 0
p-token/tests/ui_amount_to_amount.rs

@@ -5,6 +5,7 @@ use {
     core::str::from_utf8,
     mollusk_svm::result::Check,
     setup::{mint, TOKEN_PROGRAM_ID},
+    solana_program_error::ProgramError,
     solana_program_test::{tokio, ProgramTest},
     solana_pubkey::Pubkey,
     solana_signer::Signer,
@@ -83,3 +84,35 @@ fn ui_amount_to_amount_with_maximum_decimals() {
         &[Check::success(), Check::return_data(&20u64.to_le_bytes())],
     );
 }
+
+#[test]
+fn fail_ui_amount_to_amount_with_invalid_ui_amount() {
+    // Given a mint account with `u8::MAX` as decimals.
+
+    let mint = Pubkey::new_unique();
+    let mint_authority = Pubkey::new_unique();
+    let freeze_authority = Pubkey::new_unique();
+
+    let mint_account = create_mint_account(
+        mint_authority,
+        Some(freeze_authority),
+        u8::MAX,
+        &TOKEN_PROGRAM_ID,
+    );
+
+    // String representing the ui value `2.0`
+    let ui_amount = [b'2', b'.', b'0'];
+    let input = from_utf8(&ui_amount).unwrap();
+
+    // When we try to convert the ui amount using the mint, the transaction should
+    // fail with an error since the resulting value does not fit in an `u64`.
+
+    let instruction =
+        spl_token::instruction::ui_amount_to_amount(&spl_token::ID, &mint, input).unwrap();
+
+    mollusk().process_and_validate_instruction(
+        &instruction,
+        &[(mint, mint_account)],
+        &[Check::err(ProgramError::InvalidArgument)],
+    );
+}