cyber_std_test/
multitest.rs1use std::cmp::max;
2use std::fmt::Debug;
3use std::ops::{Deref, DerefMut};
4
5use anyhow::{bail, Result as AnyResult};
6use cosmwasm_std::{Addr, Api, Binary, BlockInfo, CustomQuery, Empty, Querier, QuerierResult, Storage};
7use cosmwasm_std::testing::{MockApi, MockStorage};
8use cw_multi_test::{App, AppResponse, BankKeeper, BasicAppBuilder, CosmosRouter, Module, WasmKeeper};
9use schemars::JsonSchema;
10use serde::de::DeserializeOwned;
11
12use cyber_std::{
13 query_res::*,
14 types::*,
15 CyberMsg,
16 CyberQuery,
17};
18
19pub const BLOCK_TIME: u64 = 5;
20
21pub struct CyberModule {}
22
23impl CyberModule{}
24impl Module for CyberModule {
25 type ExecT = CyberMsg;
26 type QueryT = CyberQuery;
27 type SudoT = Empty;
28
29 fn execute<ExecC, QueryC>(
30 &self,
31 _api: &dyn Api,
32 _storage: &mut dyn Storage,
33 _router: &dyn CosmosRouter<ExecC=ExecC, QueryC=QueryC>,
34 _block: &BlockInfo,
35 _sender: Addr,
36 _msg: Self::ExecT,
37 ) -> AnyResult<AppResponse>
38 where
39 ExecC: Debug + Clone + PartialEq + JsonSchema + DeserializeOwned + 'static,
40 QueryC: CustomQuery + DeserializeOwned + 'static
41 {
42 bail!("execute not implemented for CyberModule")
43 }
44
45 fn query(
46 &self,
47 _api: &dyn Api,
48 _storage: &dyn Storage,
49 _querier: &dyn Querier,
50 _block: &BlockInfo,
51 _request: Self::QueryT,
52 ) -> AnyResult<Binary> {
53 bail!("query not implemented for CyberModule")
54 }
55
56 fn sudo<ExecC, QueryC>(
57 &self,
58 _api: &dyn Api,
59 _storage: &mut dyn Storage,
60 _router: &dyn CosmosRouter<ExecC=ExecC, QueryC=QueryC>,
61 _block: &BlockInfo,
62 _msg: Self::SudoT,
63 ) -> AnyResult<AppResponse>
64 where
65 ExecC: Debug + Clone + PartialEq + JsonSchema + DeserializeOwned + 'static,
66 QueryC: CustomQuery + DeserializeOwned + 'static
67 {
68 bail!("sudo not implemented for CyberModule")
69 }
70}
71
72pub type CyberAppWrapped =
73 App<BankKeeper, MockApi, MockStorage, CyberModule, WasmKeeper<CyberMsg, CyberQuery>>;
74
75pub struct CyberApp(CyberAppWrapped);
76
77impl Deref for CyberApp {
78 type Target = CyberAppWrapped;
79
80 fn deref(&self) -> &Self::Target {
81 &self.0
82 }
83}
84
85impl DerefMut for CyberApp {
86 fn deref_mut(&mut self) -> &mut Self::Target {
87 &mut self.0
88 }
89}
90
91impl Querier for CyberApp {
92 fn raw_query(&self, bin_request: &[u8]) -> QuerierResult {
93 self.0.raw_query(bin_request)
94 }
95}
96
97impl Default for CyberApp {
98 fn default() -> Self {
99 Self::new()
100 }
101}
102
103impl CyberApp {
104 pub fn new() -> Self {
105 Self(
106 BasicAppBuilder::<CyberMsg, CyberQuery>::new_custom()
107 .with_custom(CyberModule {})
108 .build(|_router, _, _storage| {}),
109 )
110 }
111
112 pub fn block_info(&self) -> BlockInfo {
113 self.0.block_info()
114 }
115
116 pub fn advance_blocks(&mut self, blocks: u64) {
117 self.update_block(|block| {
118 block.time = block.time.plus_seconds(BLOCK_TIME * blocks);
119 block.height += blocks;
120 });
121 }
122
123 pub fn advance_seconds(&mut self, seconds: u64) {
124 self.update_block(|block| {
125 block.time = block.time.plus_seconds(seconds);
126 block.height += max(1, seconds / BLOCK_TIME);
127 });
128 }
129
130 pub fn next_block(&mut self) {
131 self.advance_blocks(1)
132 }
133}