// Copyright (C) Parity Technologies (UK) Ltd.
// This file is part of Polkadot.
// Polkadot is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// Polkadot is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with Polkadot. If not, see .
#![cfg(test)]
use super::*;
use executor::block_on;
use futures::{channel::mpsc, executor, FutureExt, SinkExt, StreamExt};
use polkadot_primitives_test_helpers::AlwaysZeroRng;
use std::{
sync::{
atomic::{AtomicUsize, Ordering},
Arc,
},
time::Duration,
};
#[test]
fn tick_tack_metronome() {
let n = Arc::new(AtomicUsize::default());
let (tick, mut block) = mpsc::unbounded();
let metronome = {
let n = n.clone();
let stream = Metronome::new(Duration::from_millis(137_u64));
stream
.for_each(move |_res| {
let _ = n.fetch_add(1, Ordering::Relaxed);
let mut tick = tick.clone();
async move {
tick.send(()).await.expect("Test helper channel works. qed");
}
})
.fuse()
};
let f2 = async move {
block.next().await;
assert_eq!(n.load(Ordering::Relaxed), 1_usize);
block.next().await;
assert_eq!(n.load(Ordering::Relaxed), 2_usize);
block.next().await;
assert_eq!(n.load(Ordering::Relaxed), 3_usize);
block.next().await;
assert_eq!(n.load(Ordering::Relaxed), 4_usize);
}
.fuse();
futures::pin_mut!(f2);
futures::pin_mut!(metronome);
block_on(async move {
// futures::join!(metronome, f2)
futures::select!(
_ = metronome => unreachable!("Metronome never stops. qed"),
_ = f2 => (),
)
});
}
#[test]
fn subset_generation_check() {
let mut values = (0_u8..=25).collect::>();
// 12 even numbers exist
choose_random_subset::(|v| v & 0x01 == 0, &mut values, 12);
values.sort();
for (idx, v) in dbg!(values).into_iter().enumerate() {
assert_eq!(v as usize, idx * 2);
}
}
#[test]
fn subset_predefined_generation_check() {
let mut values = (0_u8..=25).collect::>();
choose_random_subset_with_rng::(|_| false, &mut values, &mut AlwaysZeroRng, 12);
assert_eq!(values.len(), 12);
for (idx, v) in dbg!(values).into_iter().enumerate() {
// Since shuffle actually shuffles the indexes from 1..len, then
// our PRG that returns zeroes will shuffle 0 and 1, 1 and 2, ... len-2 and len-1
assert_eq!(v as usize, idx + 1);
}
}