ic_test/
lib.rs

1use std::sync::Arc;
2
3use candid::{decode_one, encode_one, CandidType};
4use icp::http_outcalls::handle_http_outcalls;
5use serde::Deserialize;
6use tokio::task;
7
8#[cfg(feature = "evm")]
9mod evm;
10
11#[cfg(not(feature = "evm"))]
12mod dummy_evm;
13
14#[cfg(not(feature = "evm"))]
15use dummy_evm as evm;
16
17mod icp;
18pub use crate::evm::{Evm, EvmUser};
19
20pub use crate::{
21    icp::caller::{CallBuilder, CallError, CallMode, Caller},
22    icp::deployer::{DeployBuilder, DeployError, DeployMode, Deployer},
23    icp::user::IcpUser,
24    icp::Icp,
25};
26
27pub struct IcpTest {
28    pub icp: Icp,
29    pub evm: Evm,
30}
31
32impl IcpTest {
33    pub async fn new() -> Self {
34        let result = Self {
35            icp: Icp::new().await,
36            evm: Evm::new(),
37        };
38
39        let pic = Arc::downgrade(&result.icp.pic);
40        task::spawn(handle_http_outcalls(
41            pic,
42            result.evm.rpc_url(),
43            vec![result.evm.rpc_url().to_string()],
44        ));
45        result
46    }
47
48    pub async fn tick(&self) {
49        self.icp.tick().await;
50        self.evm.mine_block().await;
51    }
52}
53
54pub fn convert<F, T>(value: F) -> T
55where
56    F: CandidType,
57    T: for<'a> Deserialize<'a> + CandidType,
58{
59    decode_one(&encode_one(&value).unwrap()).unwrap()
60}