use rand::{distributions::Alphanumeric, rngs::OsRng, CryptoRng, Rng};
use std::{fmt::Debug, iter, thread, time::Duration};
use tari_core::transactions::{
tari_amount::MicroTari,
transaction::{OutputFeatures, TransactionInput, UnblindedOutput},
types::{CommitmentFactory, PrivateKey, PublicKey},
};
use tari_crypto::{
commitment::HomomorphicCommitmentFactory,
keys::{PublicKey as PublicKeyTrait, SecretKey as SecretKeyTrait},
};
pub fn assert_change<F, T>(mut func: F, to: T, poll_count: usize)
where
F: FnMut() -> T,
T: Eq + Debug,
{
let mut i = 0;
loop {
let last_val = func();
if last_val == to {
break;
}
i += 1;
if i >= poll_count {
panic!(
"Value did not change to {:?} within {}ms (last value: {:?})",
to,
poll_count * 100,
last_val,
);
}
thread::sleep(Duration::from_millis(100));
}
}
pub struct TestParams {
pub spend_key: PrivateKey,
pub change_key: PrivateKey,
pub offset: PrivateKey,
pub nonce: PrivateKey,
pub public_nonce: PublicKey,
}
impl TestParams {
pub fn new<R: Rng + CryptoRng>(rng: &mut R) -> TestParams {
let r = PrivateKey::random(rng);
TestParams {
spend_key: PrivateKey::random(rng),
change_key: PrivateKey::random(rng),
offset: PrivateKey::random(rng),
public_nonce: PublicKey::from_secret_key(&r),
nonce: r,
}
}
}
pub fn make_input<R: Rng + CryptoRng>(
rng: &mut R,
val: MicroTari,
factory: &CommitmentFactory,
) -> (TransactionInput, UnblindedOutput)
{
let key = PrivateKey::random(rng);
let commitment = factory.commit_value(&key, val.into());
let input = TransactionInput::new(OutputFeatures::default(), commitment);
(input, UnblindedOutput::new(val, key, None))
}
pub fn random_string(len: usize) -> String {
iter::repeat(()).map(|_| OsRng.sample(Alphanumeric)).take(len).collect()
}