#![allow(unused_imports)]
#![allow(clippy::field_reassign_with_default)]
use std::collections::BTreeMap;
use std::path::Path;
use super::aggregate::{format_cpu_range, merge_aggregated_into};
use super::cgroup_merge::{
merge_cgroup_cpu, merge_cgroup_memory, merge_cgroup_pids, merge_kv_counters, merge_max_option,
merge_memory_stat, merge_min_option, merge_psi,
};
use super::columns::{compare_columns_for, format_cgroup_only_section_warning};
use super::compare::sort_diff_rows_by_keys;
use super::groups::build_row;
use super::pattern::{
Segment, apply_systemd_template, cgroup_normalize_skeleton, cgroup_skeleton_tokens,
classify_token, is_token_separator, pattern_counts_union, pattern_key, split_into_segments,
tighten_group,
};
use super::render::psi_pair_has_data;
use super::scale::{auto_scale, format_delta_cell};
use super::tests_fixtures::*;
use super::*;
use crate::ctprof::{CgroupStats, CtprofSnapshot, Psi, ThreadState};
use crate::metric_types::{
Bytes, CategoricalString, CpuSet, MonotonicCount, MonotonicNs, OrdinalI32, PeakNs,
};
use regex::Regex;
#[test]
fn cgroup_cell_renders_all_four_branches() {
assert_eq!(
cgroup_cell(Some(10), Some(42), ScaleLadder::Unitless),
"10 → 42 (+32)"
);
assert_eq!(
cgroup_cell(Some(50), Some(5), ScaleLadder::Unitless),
"50 → 5 (-45)"
);
assert_eq!(cgroup_cell(Some(7), None, ScaleLadder::Unitless), "7 → -");
assert_eq!(cgroup_cell(None, Some(99), ScaleLadder::Unitless), "- → 99");
assert_eq!(cgroup_cell(None, None, ScaleLadder::Unitless), "-");
}
#[test]
fn format_psi_avg_cell_renders_all_four_branches() {
assert_eq!(
format_psi_avg_cell(Some(1859), Some(2431)),
"18.59% → 24.31% (+5.72%)",
);
assert_eq!(
format_psi_avg_cell(Some(2431), Some(1859)),
"24.31% → 18.59% (-5.72%)",
);
assert_eq!(format_psi_avg_cell(Some(750), None), "7.50% → -");
assert_eq!(format_psi_avg_cell(None, Some(50)), "- → 0.50%");
assert_eq!(format_psi_avg_cell(None, None), "-");
}
#[test]
fn format_psi_avg_centi_percent_zero_pads_fraction() {
assert_eq!(format_psi_avg_centi_percent(0), "0.00%");
assert_eq!(format_psi_avg_centi_percent(5), "0.05%");
assert_eq!(format_psi_avg_centi_percent(50), "0.50%");
assert_eq!(format_psi_avg_centi_percent(100), "1.00%");
assert_eq!(format_psi_avg_centi_percent(101), "1.01%");
assert_eq!(format_psi_avg_centi_percent(10000), "100.00%");
assert_eq!(format_psi_avg_centi_percent(10099), "100.99%");
}
#[test]
fn psi_pair_has_data_returns_false_when_both_sides_zero() {
let zero = Psi::default();
assert!(!psi_pair_has_data(&zero, &zero));
}
#[test]
fn psi_pair_has_data_returns_true_when_one_side_nonzero() {
let zero = Psi::default();
let mut nonzero = Psi::default();
nonzero.cpu.some.avg10 = 1;
assert!(psi_pair_has_data(&zero, &nonzero));
assert!(psi_pair_has_data(&nonzero, &zero));
}
#[test]
fn psi_pair_has_data_detects_total_usec_only_data() {
let zero = Psi::default();
let mut total_only = Psi::default();
total_only.io.full.total_usec = 1;
assert!(psi_pair_has_data(&zero, &total_only));
assert!(psi_pair_has_data(&total_only, &zero));
}
#[test]
fn cgroup_cell_scales_microseconds_to_ms_or_s() {
assert_eq!(
cgroup_cell(Some(1_500_000), Some(3_000_000), ScaleLadder::Us),
"1.500s → 3.000s (+1.500s)",
);
assert_eq!(
cgroup_cell(Some(500), Some(900), ScaleLadder::Us),
"500µs → 900µs (+400µs)",
);
}
#[test]
fn cgroup_cell_scales_bytes_to_iec_prefix() {
let one_gib: u64 = 1024 * 1024 * 1024;
let two_gib: u64 = 2 * one_gib;
assert_eq!(
cgroup_cell(Some(one_gib), Some(two_gib), ScaleLadder::Bytes),
"1.000GiB → 2.000GiB (+1.000GiB)",
);
}
#[test]
fn cgroup_cell_scales_unitless_count_to_k_m_g() {
assert_eq!(
cgroup_cell(Some(1_500), Some(2_500), ScaleLadder::Unitless),
"1.500K → 2.500K (+1.000K)",
);
assert_eq!(
cgroup_cell(Some(1_500_000), Some(2_500_000), ScaleLadder::Unitless),
"1.500M → 2.500M (+1.000M)",
);
assert_eq!(
cgroup_cell(
Some(1_500_000_000),
Some(2_500_000_000),
ScaleLadder::Unitless
),
"1.500G → 2.500G (+1.000G)",
);
}
#[test]
fn cgroup_cell_each_cell_scales_independently() {
let cell = cgroup_cell(Some(999), Some(2000), ScaleLadder::Us);
assert_eq!(
cell, "999µs → 2.000ms (+1.001ms)",
"asymmetric scaling: each cell must pick its own prefix",
);
}