use super::quartiles;
use num_traits::{Num, NumCast};
pub fn inter_quartile_range<T>(data: &mut [T]) -> f64
where
T: Num + NumCast + Copy + PartialOrd,
{
let (q1, _, q3) = quartiles(data);
q3 - q1
}
#[cfg(test)]
mod tests {
use super::inter_quartile_range;
#[test]
fn calculate_inter_quartile_range_works() {
assert_eq!(inter_quartile_range(&mut [10.0, 7.0, 4.0]), 3.0);
assert_eq!(inter_quartile_range(&mut [7, 1, 3, 9, 5]), 4.0);
let data = &mut [2, 4, 18, 26, 3, 3, 7, 5, 5, 12];
assert_eq!(inter_quartile_range(data), 7.5);
}
#[test]
#[should_panic(expected = "Input data slice must not be empty")]
fn inter_quartile_range_panics_on_empty_input() {
let mut data: Vec<i32> = vec![];
inter_quartile_range(&mut data);
}
#[test]
fn inter_quartile_range_single_element() {
let mut data = vec![42];
assert_eq!(inter_quartile_range(&mut data), 0.0);
}
#[test]
fn inter_quartile_range_two_elements() {
let mut data = vec![10, 20];
assert_eq!(inter_quartile_range(&mut data), 5.0);
}
#[test]
fn inter_quartile_range_three_elements() {
let mut data = vec![1, 2, 3];
assert_eq!(inter_quartile_range(&mut data), 1.0);
}
#[test]
fn inter_quartile_range_four_elements() {
let mut data = vec![1, 2, 3, 4];
assert_eq!(inter_quartile_range(&mut data), 1.5);
}
#[test]
fn inter_quartile_range_with_floats() {
let mut data = vec![1.5, 2.7, 3.2, 4.8, 5.1];
let iqr = inter_quartile_range(&mut data);
assert!((iqr - 2.1).abs() < 1e-14);
}
#[test]
fn inter_quartile_range_with_negative_values() {
let mut data = vec![-10, -5, 0, 5, 10];
assert_eq!(inter_quartile_range(&mut data), 10.0);
}
#[test]
fn inter_quartile_range_with_duplicates() {
let mut data = vec![1, 2, 2, 2, 3, 4, 5];
assert_eq!(inter_quartile_range(&mut data), 1.5);
}
#[test]
fn inter_quartile_range_all_same_values() {
let mut data = vec![5, 5, 5, 5, 5];
assert_eq!(inter_quartile_range(&mut data), 0.0);
}
#[test]
fn inter_quartile_range_unsorted_input() {
let mut data = vec![100, 1, 50, 25, 75];
assert_eq!(inter_quartile_range(&mut data), 50.0);
}
#[test]
fn inter_quartile_range_large_dataset() {
let mut data: Vec<i32> = (1..=100).collect();
assert_eq!(inter_quartile_range(&mut data), 49.5);
}
#[test]
fn inter_quartile_range_odd_length() {
let mut data = vec![17, 2, 5, 11, 14, 8, 20];
assert_eq!(inter_quartile_range(&mut data), 9.0);
}
#[test]
fn inter_quartile_range_even_length() {
let mut data = vec![2, 14, 17, 20, 5, 8, 11, 23];
assert_eq!(inter_quartile_range(&mut data), 10.5);
}
#[test]
fn inter_quartile_range_with_outliers() {
let mut data = vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 100];
assert_eq!(inter_quartile_range(&mut data), 4.5);
}
#[test]
fn inter_quartile_range_verifies_sorting() {
let mut data = vec![5, 2, 8, 1, 9, 3, 7];
let _ = inter_quartile_range(&mut data);
assert_eq!(data, vec![1, 2, 3, 5, 7, 8, 9]);
}
}