use crate::itertools::Itertools;
use crate::natural::Natural;
use malachite_base::num::conversion::traits::RoundingFrom;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_base::test_util::stats::common_values_map::common_values_map;
use malachite_base::test_util::stats::median;
use malachite_base::test_util::stats::moments::{MomentStats, moment_stats};
pub fn random_naturals_helper_helper<I: Clone + Iterator<Item = Natural>>(
xs: I,
expected_values: &[&str],
expected_common_values: &[(&str, usize)],
expected_sample_median: (&str, Option<&str>),
expected_sample_moment_stats: MomentStats,
) {
let actual_values = xs
.clone()
.map(|x| Natural::to_string(&x))
.take(20)
.collect_vec();
let actual_values = actual_values.iter().map(String::as_str).collect_vec();
let actual_common_values = common_values_map(1000000, 10, xs.clone())
.into_iter()
.map(|(x, freq)| (x.to_string(), freq))
.collect_vec();
let actual_common_values = actual_common_values
.iter()
.map(|(x, freq)| (x.as_str(), *freq))
.collect_vec();
let (median_lo, median_hi) = median(xs.clone().take(1000000));
let (median_lo, median_hi) = (
median_lo.to_string(),
median_hi.map(|x| Natural::to_string(&x)),
);
let actual_sample_median = (median_lo.as_str(), median_hi.as_deref());
let actual_sample_moment_stats =
moment_stats(xs.take(1000000).map(|x| f64::rounding_from(&x, Nearest).0));
assert_eq!(
(
actual_values.as_slice(),
actual_common_values.as_slice(),
actual_sample_median,
actual_sample_moment_stats
),
(
expected_values,
expected_common_values,
expected_sample_median,
expected_sample_moment_stats
)
);
}