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