#[derive(Clone, Copy, PartialEq, Eq)]
pub(super) struct RuntimeMetricCounts {
len: usize,
wait_len: Option<usize>,
}
impl RuntimeMetricCounts {
pub(super) const fn new(len: usize, wait_len: Option<usize>) -> Self {
Self { len, wait_len }
}
pub(super) const fn len(&self) -> usize {
self.len
}
pub(super) const fn wait_len(&self) -> Option<usize> {
self.wait_len
}
}
#[cfg(test)]
mod tests {
use super::RuntimeMetricCounts;
const VALUES: [usize; 5] = [0, 1, 17, usize::MAX - 1, usize::MAX];
const WAIT_VALUES: [Option<usize>; 6] = [
None, Some(0), Some(1), Some(17), Some(usize::MAX - 1), Some(usize::MAX),
];
#[test]
fn test_input_matrix_preserves_each_metric() {
for len in VALUES {
for wait_len in WAIT_VALUES {
let counts = RuntimeMetricCounts::new(len, wait_len);
assert_eq!((counts.len, counts.wait_len), (len, wait_len));
assert_eq!((counts.len(), counts.wait_len()), (len, wait_len));
}
}
}
#[test]
fn test_equality_matches_independent_input_pairs() {
for left_len in VALUES {
for left_wait in WAIT_VALUES {
for right_len in VALUES {
for right_wait in WAIT_VALUES {
let left = RuntimeMetricCounts::new(left_len, left_wait);
let right = RuntimeMetricCounts::new(right_len, right_wait);
let expected = (left_len, left_wait) == (right_len, right_wait);
assert_eq!(left == right, expected);
assert_eq!(left != right, !expected);
}
}
}
}
}
#[test]
fn test_copy_and_clone_keep_independent_values() {
for len in VALUES {
for wait_len in WAIT_VALUES {
let original = RuntimeMetricCounts::new(len, wait_len);
let copied = original;
let mut cloned = Clone::clone(&original);
assert!(copied == original && cloned == original);
cloned = RuntimeMetricCounts::new(len, if wait_len.is_none() { Some(0) } else { None });
assert!(cloned != original);
assert_eq!((original.len(), original.wait_len()), (len, wait_len));
assert_eq!((copied.len(), copied.wait_len()), (len, wait_len));
}
}
}
#[test]
fn test_accessors_repeat_in_either_order() {
for len in VALUES {
for wait_len in WAIT_VALUES {
let counts = RuntimeMetricCounts::new(len, wait_len);
for _ in 0..4 {
assert_eq!((counts.len(), counts.wait_len()), (len, wait_len));
assert_eq!((counts.wait_len(), counts.len()), (wait_len, len));
}
}
}
}
#[test]
fn test_const_construction_and_accessors() {
const COUNTS: [RuntimeMetricCounts; 6] = [
RuntimeMetricCounts::new(0, None),
RuntimeMetricCounts::new(usize::MAX, None),
RuntimeMetricCounts::new(0, Some(0)),
RuntimeMetricCounts::new(usize::MAX, Some(0)),
RuntimeMetricCounts::new(0, Some(usize::MAX)),
RuntimeMetricCounts::new(usize::MAX, Some(usize::MAX)),
];
const READ: [(usize, Option<usize>); 6] = [
(COUNTS[0].len(), COUNTS[0].wait_len()),
(COUNTS[1].len(), COUNTS[1].wait_len()),
(COUNTS[2].len(), COUNTS[2].wait_len()),
(COUNTS[3].len(), COUNTS[3].wait_len()),
(COUNTS[4].len(), COUNTS[4].wait_len()),
(COUNTS[5].len(), COUNTS[5].wait_len()),
];
assert_eq!(READ, [
(0, None), (usize::MAX, None), (0, Some(0)), (usize::MAX, Some(0)),
(0, Some(usize::MAX)), (usize::MAX, Some(usize::MAX)),
]);
}
#[test]
fn test_pure_value_traits_and_no_drop() {
fn require_traits<T: Copy + Clone + PartialEq + Eq + Send + Sync + 'static>() {}
require_traits::<RuntimeMetricCounts>();
assert!(!std::mem::needs_drop::<RuntimeMetricCounts>());
}
#[test]
fn test_returned_numbers_outlive_value_scope() {
for len in VALUES {
for wait_len in WAIT_VALUES {
let returned = {
let counts = RuntimeMetricCounts::new(len, wait_len);
(counts.len(), counts.wait_len())
};
assert_eq!(returned, (len, wait_len));
}
}
}
}