Skip to content

Commit

Permalink
refactor: streamline error from the decoded method by returning `Resu…
Browse files Browse the repository at this point in the history
…lt` (#130)
  • Loading branch information
chungquantin authored Jul 26, 2024
1 parent 28d971b commit 4e4512e
Showing 1 changed file with 33 additions and 32 deletions.
65 changes: 33 additions & 32 deletions pop-api/integration-tests/src/local_fungibles.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,25 @@ use pop_primitives::error::{
const ASSET_ID: AssetId = 1;
const CONTRACT: &str = "contracts/fungibles/target/ink/fungibles.wasm";

fn decoded<T: Decode>(result: ExecReturnValue) -> T {
match <T>::decode(&mut &result.data[2..]) {
Ok(value) => value,
Err(_) => panic!("\nTest failed by trying to decode `{:?}` into `T`\n", result),
}
fn decoded<T: Decode>(result: ExecReturnValue) -> Result<T, String> {
<T>::decode(&mut &result.data[2..])
.map_err(|_| format!("\nTest failed by trying to decode `{:?}` into `T`\n", result))
}

// Call total_supply contract message.
fn total_supply(addr: AccountId32, asset_id: AssetId) -> Balance {
let function = function_selector("total_supply");
let params = [function, asset_id.encode()].concat();
let result = bare_call(addr, params, 0).expect("should work");
decoded::<Balance>(result)
decoded::<Balance>(result).unwrap()
}

// Call balance_of contract message.
fn balance_of(addr: AccountId32, asset_id: AssetId, owner: AccountId32) -> Balance {
let function = function_selector("balance_of");
let params = [function, asset_id.encode(), owner.encode()].concat();
let result = bare_call(addr, params, 0).expect("should work");
decoded::<Balance>(result)
decoded::<Balance>(result).unwrap()
}

// Call allowance contract message.
Expand All @@ -41,31 +39,31 @@ fn allowance(
let function = function_selector("allowance");
let params = [function, asset_id.encode(), owner.encode(), spender.encode()].concat();
let result = bare_call(addr, params, 0).expect("should work");
decoded::<Balance>(result)
decoded::<Balance>(result).unwrap()
}

// Call token_name contract message.
fn token_name(addr: AccountId32, asset_id: AssetId) -> Vec<u8> {
let function = function_selector("token_name");
let params = [function, asset_id.encode()].concat();
let result = bare_call(addr, params, 0).expect("should work");
decoded::<Vec<u8>>(result)
decoded::<Vec<u8>>(result).unwrap()
}

// Call token_symbol contract message.
fn token_symbol(addr: AccountId32, asset_id: AssetId) -> Vec<u8> {
let function = function_selector("token_symbol");
let params = [function, asset_id.encode()].concat();
let result = bare_call(addr, params, 0).expect("should work");
decoded::<Vec<u8>>(result)
decoded::<Vec<u8>>(result).unwrap()
}

// Call token_decimals contract message.
fn token_decimals(addr: AccountId32, asset_id: AssetId) -> u8 {
let function = function_selector("token_decimals");
let params = [function, asset_id.encode()].concat();
let result = bare_call(addr, params, 0).expect("should work");
decoded::<u8>(result)
decoded::<u8>(result).unwrap()
}

fn transfer(
Expand Down Expand Up @@ -327,26 +325,26 @@ fn transfer_works() {
// Asset does not exist.
assert_eq!(
decoded::<Error>(transfer(addr.clone(), 1, BOB, amount,)),
Module { index: 52, error: 3 },
Ok(Module { index: 52, error: 3 }),
);
// Create asset with Alice as owner and mint `amount` to contract address.
let asset = create_asset_and_mint_to(ALICE, 1, addr.clone(), amount);
// Asset is not live, i.e. frozen or being destroyed.
freeze_asset(ALICE, asset);
assert_eq!(
decoded::<Error>(transfer(addr.clone(), asset, BOB, amount,)),
Module { index: 52, error: 16 },
Ok(Module { index: 52, error: 16 }),
);
thaw_asset(ALICE, asset);
// Not enough balance.
assert_eq!(
decoded::<Error>(transfer(addr.clone(), asset, BOB, amount + 1 * UNIT)),
Module { index: 52, error: 0 },
Ok(Module { index: 52, error: 0 }),
);
// Not enough balance due to ED.
assert_eq!(
decoded::<Error>(transfer(addr.clone(), asset, BOB, amount)),
Module { index: 52, error: 0 },
Ok(Module { index: 52, error: 0 }),
);
// Successful transfer.
let balance_before_transfer = Assets::balance(asset, &BOB);
Expand All @@ -357,13 +355,13 @@ fn transfer_works() {
// Transfer asset to account that does not exist.
assert_eq!(
decoded::<Error>(transfer(addr.clone(), asset, FERDIE, amount / 4)),
Token(CannotCreate)
Ok(Token(CannotCreate))
);
// Asset is not live, i.e. frozen or being destroyed.
start_destroy_asset(ALICE, asset);
assert_eq!(
decoded::<Error>(transfer(addr.clone(), asset, BOB, amount / 4)),
Module { index: 52, error: 16 },
Ok(Module { index: 52, error: 16 }),
);
});
}
Expand All @@ -377,10 +375,13 @@ fn approve_works() {
// Asset does not exist.
assert_eq!(
decoded::<Error>(approve(addr.clone(), 0, BOB, amount)),
Module { index: 52, error: 3 },
Ok(Module { index: 52, error: 3 }),
);
let asset = create_asset_and_mint_to(ALICE, 0, addr.clone(), amount);
assert_eq!(decoded::<Error>(approve(addr.clone(), asset, BOB, amount)), ConsumerRemaining);
assert_eq!(
decoded::<Error>(approve(addr.clone(), asset, BOB, amount)),
Ok(ConsumerRemaining)
);

let addr = instantiate(CONTRACT, INIT_VALUE, vec![1]);
// Create asset with Alice as owner and mint `amount` to contract address.
Expand All @@ -389,7 +390,7 @@ fn approve_works() {
freeze_asset(ALICE, asset);
assert_eq!(
decoded::<Error>(approve(addr.clone(), asset, BOB, amount)),
Module { index: 52, error: 16 },
Ok(Module { index: 52, error: 16 }),
);
thaw_asset(ALICE, asset);
// Successful approvals:
Expand All @@ -403,7 +404,7 @@ fn approve_works() {
start_destroy_asset(ALICE, asset);
assert_eq!(
decoded::<Error>(approve(addr.clone(), asset, BOB, amount)),
Module { index: 52, error: 16 },
Ok(Module { index: 52, error: 16 }),
);
});
}
Expand All @@ -417,12 +418,12 @@ fn increase_allowance_works() {
// Asset does not exist.
assert_eq!(
decoded::<Error>(increase_allowance(addr.clone(), 0, BOB, amount)),
Module { index: 52, error: 3 },
Ok(Module { index: 52, error: 3 }),
);
let asset = create_asset_and_mint_to(ALICE, 0, addr.clone(), amount);
assert_eq!(
decoded::<Error>(increase_allowance(addr.clone(), asset, BOB, amount)),
ConsumerRemaining
Ok(ConsumerRemaining)
);

let addr = instantiate(CONTRACT, INIT_VALUE, vec![1]);
Expand All @@ -432,7 +433,7 @@ fn increase_allowance_works() {
freeze_asset(ALICE, asset);
assert_eq!(
decoded::<Error>(increase_allowance(addr.clone(), asset, BOB, amount)),
Module { index: 52, error: 16 },
Ok(Module { index: 52, error: 16 }),
);
thaw_asset(ALICE, asset);
// Successful approvals:
Expand All @@ -452,7 +453,7 @@ fn increase_allowance_works() {
start_destroy_asset(ALICE, asset);
assert_eq!(
decoded::<Error>(increase_allowance(addr.clone(), asset, BOB, amount)),
Module { index: 52, error: 16 },
Ok(Module { index: 52, error: 16 }),
);
});
}
Expand Down Expand Up @@ -530,7 +531,7 @@ fn token_metadata_works() {
// // Minting can only be done by the owner.
// assert_eq!(
// decoded::<Error>(transfer_from(addr.clone(), asset, None, Some(BOB), amount, &[0u8])),
// Module { index: 52, error: 2 },
// Ok(Module { index: 52, error: 2 }),
// );
// // Minimum balance of an asset can not be zero.
// assert_eq!(
Expand All @@ -542,7 +543,7 @@ fn token_metadata_works() {
// freeze_asset(addr.clone(), asset);
// assert_eq!(
// decoded::<Error>(transfer_from(addr.clone(), asset, None, Some(BOB), amount, &[0u8])),
// Module { index: 52, error: 16 },
// Ok(Module { index: 52, error: 16 }),
// );
// thaw_asset(addr.clone(), asset);
// // Successful mint.
Expand All @@ -567,7 +568,7 @@ fn token_metadata_works() {
// start_destroy_asset(addr.clone(), asset);
// assert_eq!(
// decoded::<Error>(transfer_from(addr.clone(), asset, None, Some(BOB), amount, &[0u8])),
// Module { index: 52, error: 16 },
// Ok(Module { index: 52, error: 16 }),
// );
// });
// }
Expand All @@ -582,27 +583,27 @@ fn token_metadata_works() {
// // No balance to pay for fees.
// assert_eq!(
// decoded::<Error>(create(addr.clone(), ASSET_ID, addr.clone(), 1)),
// Module { index: 10, error: 2 },
// Ok(Module { index: 10, error: 2 }),
// );
// // Instantiate a contract without balance (relay token).
// let addr = instantiate(CONTRACT, 100, vec![2]);
// // No balance to pay the deposit.
// assert_eq!(
// decoded::<Error>(create(addr.clone(), ASSET_ID, addr.clone(), 1)),
// Module { index: 10, error: 2 },
// Ok(Module { index: 10, error: 2 }),
// );
// // Instantiate a contract with balance.
// let addr =
// instantiate(CONTRACT, INIT_VALUE, vec![1]);
// assert_eq!(
// decoded::<Error>(create(addr.clone(), ASSET_ID, BOB, 0)),
// Module { index: 52, error: 7 },
// Ok(Module { index: 52, error: 7 }),
// );
// create_asset(ALICE, ASSET_ID, 1);
// // Asset ID is already taken.
// assert_eq!(
// decoded::<Error>(create(addr.clone(), ASSET_ID, BOB, 1)),
// Module { index: 52, error: 5 },
// Ok(Module { index: 52, error: 5 }),
// );
// // The minimal balance for an asset must be non zero.
// let new_asset = 2;
Expand Down

0 comments on commit 4e4512e

Please sign in to comment.