use testlib::*;
use tracing::info;
interface!(name = "token", path = "../example-contracts/token/wit");
async fn run_test_token_contract(runtime: &mut Runtime) -> Result<()> {
info!("test_token_contract");
let minter = runtime.identity().await?;
let holder = runtime.identity().await?;
let token = runtime.publish(&minter, "token").await?;
// Mint tokens
token::mint(runtime, &token, &minter, 900.into()).await?;
token::mint(runtime, &token, &minter, 100.into()).await?;
// Check balance
let result = token::balance(runtime, &token, &minter).await?;
assert_eq!(result, Some(1000.into()));
// Test insufficient funds error
let result = token::transfer(runtime, &token, &holder, &minter, 123.into()).await?;
assert_eq!(
result,
Err(Error::Message("insufficient funds".to_string()))
);
// Successful transfers
token::transfer(runtime, &token, &minter, &holder, 40.into()).await??;
token::transfer(runtime, &token, &minter, &holder, 2.into()).await??;
let result = token::balance(runtime, &token, &holder).await?;
assert_eq!(result, Some(42.into()));
let result = token::balance(runtime, &token, &minter).await?;
assert_eq!(result, Some(958.into()));
// Test non-existent account
let result = token::balance(runtime, &token, "foo").await?;
assert_eq!(result, None);
Ok(())
}
#[testlib::test]
async fn test_token_contract() -> Result<()> {
run_test_token_contract(runtime).await
}