1use anyhow::Result;
2use dashcore::block::Version;
3use dashcore::hashes::Hash;
4use dashcore::{Block, BlockHash, CompactTarget, Header, TxMerkleNode};
5use platform_value::Value;
6#[cfg(test)]
7use serde_json::Value as JsonValue;
8
9use crate::prelude::Identifier;
10
11#[cfg(test)]
12#[macro_export]
13macro_rules! assert_error_contains {
14 ($result:ident, $contains:expr) => {
15 match $result {
16 Ok(o) => {
17 panic!("expected error, but returned: {:?}", o);
18 }
19 Err(e) => {
20 let string_error = e.to_string();
21 if !string_error.contains($contains) {
22 panic!(
23 "assertion error: '{}' hasn't been found in '{}'",
24 $contains, string_error
25 );
26 }
27 }
28 }
29 };
30}
31
32pub fn serde_set<T, S>(mut object: serde_json::Value, key: T, value: S) -> serde_json::Value
34where
35 T: Into<String>,
36 S: Into<serde_json::Value>,
37 serde_json::Value: From<S>,
38{
39 let map = object
40 .as_object_mut()
41 .expect("Expected value to be an JSON object");
42 map.insert(key.into(), serde_json::Value::from(value));
43
44 object
45}
46
47pub fn platform_value_set_ref<T, S>(object: &mut Value, key: T, value: S)
49where
50 T: Into<Value>,
51 S: Into<Value>,
52 Value: From<S>,
53{
54 let map = object
55 .as_map_mut()
56 .expect("Expected value to be an JSON object");
57 map.push((key.into(), value.into()));
58}
59
60pub fn generate_random_identifier_struct() -> Identifier {
61 let mut buffer = [0u8; 32];
62 getrandom::getrandom(&mut buffer).unwrap();
63 Identifier::from_bytes(&buffer).unwrap()
64}
65
66pub fn get_data_from_file(file_path: &str) -> Result<String> {
67 let current_dir = std::env::current_dir()?;
68 let file_path = format!("{}/{}", current_dir.display(), file_path);
69 let d = std::fs::read_to_string(file_path)?;
70 Ok(d)
71}
72
73#[cfg(test)]
74pub trait SerdeTestExtension {
75 fn remove_key(&mut self, key: impl Into<String>);
76 fn set_key_value<T, S>(&mut self, key: T, value: S)
77 where
78 T: Into<String>,
79 S: Into<serde_json::Value>,
80 serde_json::Value: From<S>;
81 fn get_value(&self, key: impl Into<String>) -> &serde_json::Value;
82 fn get_value_mut(&mut self, key: impl Into<String>) -> &mut serde_json::Value;
83}
84
85#[cfg(test)]
86impl SerdeTestExtension for serde_json::Value {
87 fn remove_key(&mut self, key: impl Into<String>) {
88 self.as_object_mut()
89 .expect("Expected value to be an JSON object")
90 .remove(&key.into());
91 }
92
93 fn set_key_value<T, S>(&mut self, key: T, value: S)
94 where
95 T: Into<String>,
96 S: Into<JsonValue>,
97 JsonValue: From<S>,
98 {
99 let map = self
100 .as_object_mut()
101 .expect("Expected value to be an JSON object");
102 map.insert(key.into(), serde_json::Value::from(value));
103 }
104
105 fn get_value(&self, key: impl Into<String>) -> &JsonValue {
106 self.as_object()
107 .expect("Expected key to exist")
108 .get(&key.into())
109 .expect("Expected key to exist")
110 }
111
112 fn get_value_mut(&mut self, key: impl Into<String>) -> &mut JsonValue {
113 self.as_object_mut()
114 .expect("Expected key to exist")
115 .get_mut(&key.into())
116 .expect("Expected key to exist")
117 }
118}
119
120#[macro_export]
134macro_rules! assert_consensus_errors {
135 ($validation_result: expr, $variant: path, $expected_errors_count: expr) => {{
136 if $validation_result.errors.len() != $expected_errors_count {
137 for error in $validation_result.errors.iter() {
138 println!("{:?}", error);
139 }
140 }
141
142 assert_eq!($validation_result.errors.len(), $expected_errors_count);
143
144 let mut errors = Vec::new();
145
146 for error in &$validation_result.errors {
147 match error {
148 $variant(err) => errors.push(err),
149 err => {
150 panic!("Got error that differs from what was expected: {:?}", err)
151 }
152 }
153 }
154
155 errors
156 }};
157}
158
159#[macro_export]
162macro_rules! assert_basic_consensus_errors {
163 ($validation_result: expr, $variant: path, $expected_errors_count: expr) => {{
164 if $validation_result.errors.len() != $expected_errors_count {
165 for error in $validation_result.errors.iter() {
166 println!("{:?}", error);
167 }
168 }
169
170 assert_eq!($validation_result.errors.len(), $expected_errors_count);
171
172 let mut errors = Vec::new();
173
174 for error in &$validation_result.errors {
175 match error {
176 ConsensusError::BasicError($variant(err)) => errors.push(err),
177 err => {
178 panic!("Got error that differs from what was expected: {:?}", err)
179 }
180 }
181 }
182
183 errors
184 }};
185}
186
187#[macro_export]
190macro_rules! assert_state_consensus_errors {
191 ($validation_result: expr, $variant: path, $expected_errors_count: expr) => {{
192 if $validation_result.errors.len() != $expected_errors_count {
193 for error in $validation_result.errors.iter() {
194 println!("{:?}", error);
195 }
196 }
197
198 assert_eq!($validation_result.errors.len(), $expected_errors_count);
199
200 let mut errors = Vec::new();
201
202 for error in &$validation_result.errors {
203 match error {
204 ConsensusError::StateError($variant(err)) => errors.push(err),
205 err => {
206 panic!("Got error that differs from what was expected: {:?}", err)
207 }
208 }
209 }
210
211 errors
212 }};
213}
214
215pub fn create_empty_block(timestamp_secs: Option<u32>) -> Block {
216 Block {
217 txdata: vec![],
218 header: new_block_header(timestamp_secs),
219 }
220}
221
222pub fn new_block_header(timestamp_secs: Option<u32>) -> Header {
223 Header {
224 bits: CompactTarget::default(),
225 nonce: 0,
226 merkle_root: TxMerkleNode::all_zeros(),
227 prev_blockhash: BlockHash::all_zeros(),
228 version: Version::default(),
229 time: timestamp_secs.unwrap_or_default(),
230 }
231}