use frame_support::sp_runtime::{
traits::{One, Saturating},
BuildStorage,
};
use frame_system::{pallet_prelude::BlockNumberFor, GenesisConfig};
use sp_io::TestExternalities;
use super::Sandbox;
use crate::{DrinkResult, Error, Runtime};
impl<R: Runtime> Sandbox<R> {
pub fn new() -> DrinkResult<Self> {
let mut storage = GenesisConfig::<R::Config>::default()
.build_storage()
.map_err(Error::StorageBuilding)?;
R::initialize_storage(&mut storage).map_err(Error::StorageBuilding)?;
let mut sandbox = Self {
externalities: TestExternalities::new(storage),
_phantom: Default::default(),
};
sandbox
.externalities
.execute_with(|| {
R::initialize_block(BlockNumberFor::<R::Config>::one(), Default::default())
})
.map_err(Error::BlockInitialize)?;
Ok(sandbox)
}
pub fn build_block(&mut self) -> DrinkResult<BlockNumberFor<R::Config>> {
self.execute_with(|| {
let mut current_block = frame_system::Pallet::<R::Config>::block_number();
let block_hash = R::finalize_block(current_block).map_err(Error::BlockFinalize)?;
current_block.saturating_inc();
R::initialize_block(current_block, block_hash).map_err(Error::BlockInitialize)?;
Ok(current_block)
})
}
pub fn build_blocks(&mut self, n: u32) -> DrinkResult<BlockNumberFor<R::Config>> {
let mut last_block = None;
for _ in 0..n {
last_block = Some(self.build_block()?);
}
Ok(last_block.unwrap_or_else(|| self.block_number()))
}
}