// Copyright © 2024 Mikhail Hogrefe
//
// This file is part of Malachite.
//
// Malachite is free software: you can redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License (LGPL) as published by the Free Software Foundation; either version
// 3 of the License, or (at your option) any later version. See .
use itertools::Itertools;
use malachite_base::num::random::random_primitive_ints;
use malachite_base::random::EXAMPLE_SEED;
use malachite_base::rational_sequences::random::random_rational_sequences;
use malachite_base::rational_sequences::RationalSequence;
use malachite_base::test_util::stats::common_values_map::common_values_map;
use malachite_base::test_util::stats::median;
#[test]
fn test_random_rational_sequences() {
let xs = random_rational_sequences(EXAMPLE_SEED, &random_primitive_ints::, 4, 1);
let values = xs
.clone()
.map(|x| RationalSequence::to_string(&x))
.take(20)
.collect_vec();
let values = values.iter().map(String::as_str).collect_vec();
let common_values = common_values_map(1000000, 10, xs.clone())
.into_iter()
.map(|(x, freq)| (x.to_string(), freq))
.collect_vec();
let common_values = common_values
.iter()
.map(|(x, freq)| (x.as_str(), *freq))
.collect_vec();
let (median_lo, median_hi) = median(xs.take(1000000));
let (median_lo, median_hi) = (
median_lo.to_string(),
median_hi.map(|x| RationalSequence::to_string(&x)),
);
let actual_median = (median_lo.as_str(), median_hi.as_deref());
assert_eq!(
(values.as_slice(), common_values.as_slice(), actual_median),
(
&[
"[[85, 11, 136, 200, 235, 134, 203, 223, 38, 235, 217, 177, 162, 32]]",
"[166, 234, 30, 218, [90, 106, 9, 216]]",
"[204]",
"[151, 213, 97, 253, 78, [91, 39]]",
"[191, 175, 170, 232]",
"[233, 2, 35, 22, 217, 198]",
"[[114, 17, 32, 173, 114, 65, 121, 222, 173, 25, 144]]",
"[148, 79, 115, 52, 73, 69, 137, 91]",
"[153, 178, 112]",
"[34, 95, 106, 167, 197, [130, 168, 122, 207, 172, 177, 86, 150, 221]]",
"[218, [101]]",
"[115, 74, 9, 123, 109, 52, 201]",
"[159, 247, 250, 48, 133, 235, 196, 40, [97]]",
"[104, 68, 190, [216, 7, 216, 157, 43, 43, 112]]",
"[]",
"[217, 24, 11, 103, 211, [84, 135]]",
"[[55, 29, 206, 89, 65, 191, 51, 9, 79]]",
"[[148, 34]]",
"[22, 22, 62, 3, 114, 118, 20, 47, 194, 50, 32, [120, 176, 166, 23]]",
"[204, 248, 177, 238, 237, 222, 154, 113, [225, 65]]"
][..],
&[
("[]", 39885),
("[[243]]", 157),
("[68]", 154),
("[1]", 153),
("[120]", 153),
("[71]", 152),
("[[40]]", 152),
("[[158]]", 151),
("[[169]]", 151),
("[[183]]", 151)
][..],
(
"[122, 194, 41, 122, [232]]",
Some("[[122, 194, 89, 228, 124, 219]]")
)
)
);
}