ic_test/
lib.rs

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