use amaru_kernel::{Transaction, utils::string::ListToString};
use amaru_ouroboros::{ResourceMempool, get_blocks};
use amaru_protocols::store_effects::ResourceHeaderStore;
use pure_stage::Resources;
use crate::tests::configuration::get_tx_ids;
pub fn check_state(initiator_resources: &Resources, responder_resources: &Resources) -> anyhow::Result<()> {
let responder_chain_store = responder_resources.get::<ResourceHeaderStore>()?.clone();
let responder_mempool = responder_resources.get::<ResourceMempool<Transaction>>()?.clone();
let initiator_chain_store = initiator_resources.get::<ResourceHeaderStore>()?.clone();
let initiator_mempool = initiator_resources.get::<ResourceMempool<Transaction>>()?.clone();
let initiator_best_chain =
initiator_chain_store.ancestors_hashes(&initiator_chain_store.get_best_chain_hash()).collect::<Vec<_>>();
let responder_best_chain =
responder_chain_store.ancestors_hashes(&responder_chain_store.get_best_chain_hash()).collect::<Vec<_>>();
assert_eq!(initiator_best_chain, responder_best_chain);
let initiator_block_headers = initiator_chain_store.retrieve_best_chain();
let responder_block_headers = responder_chain_store.retrieve_best_chain();
assert_eq!(initiator_block_headers, responder_block_headers);
let initiator_blocks = get_blocks(initiator_chain_store);
let responder_blocks = get_blocks(responder_chain_store);
assert!(!initiator_blocks.is_empty(), "the initiator should have blocks");
assert_eq!(
initiator_blocks,
responder_blocks,
"initiator blocks {:?}\nresponder blocks {:?}",
initiator_blocks.iter().map(|b| b.0).collect::<Vec<_>>().list_to_string(","),
responder_blocks.iter().map(|b| b.0).collect::<Vec<_>>().list_to_string(",")
);
let tx_ids = get_tx_ids();
assert_eq!(
responder_mempool.get_txs_for_ids(tx_ids.as_slice()),
initiator_mempool.get_txs_for_ids(tx_ids.as_slice())
);
Ok(())
}