Files
wifi-densepose/crates/cognitum-gate-kernel/tests_disabled/report_tests.rs
ruv d803bfe2b1 Squashed 'vendor/ruvector/' content from commit b64c2172
git-subtree-dir: vendor/ruvector
git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
2026-02-28 14:39:40 -05:00

250 lines
6.4 KiB
Rust

//! Comprehensive tests for TileReport generation and serialization
//!
//! Tests cover:
//! - Report creation and initialization
//! - Serialization/deserialization roundtrips
//! - Checksum verification
//! - WitnessFragment operations
use cognitum_gate_kernel::report::{TileReport, TileStatus, WitnessFragment};
use cognitum_gate_kernel::shard::EdgeId;
#[cfg(test)]
mod tile_status {
use super::*;
#[test]
fn test_status_values() {
assert_eq!(TileStatus::Active as u8, 0);
assert_eq!(TileStatus::Idle as u8, 1);
assert_eq!(TileStatus::Recovery as u8, 2);
assert_eq!(TileStatus::Error as u8, 3);
}
#[test]
fn test_status_from_u8() {
assert_eq!(TileStatus::from_u8(0), Some(TileStatus::Active));
assert_eq!(TileStatus::from_u8(1), Some(TileStatus::Idle));
assert_eq!(TileStatus::from_u8(255), None);
}
#[test]
fn test_is_healthy() {
assert!(TileStatus::Active.is_healthy());
assert!(TileStatus::Idle.is_healthy());
assert!(!TileStatus::Error.is_healthy());
}
}
#[cfg(test)]
mod witness_fragment {
use super::*;
#[test]
fn test_fragment_creation() {
let frag = WitnessFragment::new(42);
assert_eq!(frag.tile_id, 42);
assert_eq!(frag.min_cut_value, 0);
}
#[test]
fn test_is_fragile() {
let mut frag = WitnessFragment::new(0);
frag.min_cut_value = 5;
assert!(frag.is_fragile(10));
assert!(!frag.is_fragile(5));
}
#[test]
fn test_fragment_hash_deterministic() {
let frag = WitnessFragment::new(5);
assert_eq!(frag.compute_hash(), frag.compute_hash());
}
#[test]
fn test_fragment_hash_unique() {
let frag1 = WitnessFragment::new(1);
let frag2 = WitnessFragment::new(2);
assert_ne!(frag1.compute_hash(), frag2.compute_hash());
}
}
#[cfg(test)]
mod tile_report_creation {
use super::*;
#[test]
fn test_new_report() {
let report = TileReport::new(5);
assert_eq!(report.tile_id, 5);
assert_eq!(report.status, TileStatus::Active);
assert!(report.is_healthy());
}
#[test]
fn test_error_report() {
let report = TileReport::error(10);
assert_eq!(report.status, TileStatus::Error);
assert!(!report.is_healthy());
}
#[test]
fn test_idle_report() {
let report = TileReport::idle(15);
assert_eq!(report.status, TileStatus::Idle);
assert!(report.is_healthy());
}
}
#[cfg(test)]
mod report_health_checks {
use super::*;
#[test]
fn test_needs_attention_boundary_moved() {
let mut report = TileReport::new(0);
assert!(!report.needs_attention());
report.boundary_moved = true;
assert!(report.needs_attention());
}
#[test]
fn test_needs_attention_negative_coherence() {
let mut report = TileReport::new(0);
report.coherence = -100;
assert!(report.needs_attention());
}
}
#[cfg(test)]
mod coherence_conversion {
use super::*;
#[test]
fn test_coherence_f32_values() {
let mut report = TileReport::new(0);
report.coherence = 0;
assert!((report.coherence_f32() - 0.0).abs() < 0.001);
report.coherence = 256;
assert!((report.coherence_f32() - 1.0).abs() < 0.01);
report.coherence = -128;
assert!((report.coherence_f32() - (-0.5)).abs() < 0.01);
}
}
#[cfg(test)]
mod serialization {
use super::*;
#[test]
fn test_to_bytes_size() {
let report = TileReport::new(0);
let bytes = report.to_bytes();
assert_eq!(bytes.len(), 64);
}
#[test]
fn test_roundtrip_basic() {
let report = TileReport::new(42);
let bytes = report.to_bytes();
let restored = TileReport::from_bytes(&bytes).unwrap();
assert_eq!(report.tile_id, restored.tile_id);
assert_eq!(report.status, restored.status);
}
#[test]
fn test_roundtrip_with_data() {
let mut report = TileReport::new(100);
report.coherence = 512;
report.e_value = 2.5;
report.boundary_moved = true;
report.suspicious_edges[0] = EdgeId(100);
let bytes = report.to_bytes();
let restored = TileReport::from_bytes(&bytes).unwrap();
assert_eq!(restored.coherence, 512);
assert!((restored.e_value - 2.5).abs() < 0.001);
assert!(restored.boundary_moved);
assert_eq!(restored.suspicious_edges[0], EdgeId(100));
}
}
#[cfg(test)]
mod checksum {
use super::*;
#[test]
fn test_checksum_deterministic() {
let report = TileReport::new(42);
assert_eq!(report.checksum(), report.checksum());
}
#[test]
fn test_checksum_different_reports() {
let r1 = TileReport::new(1);
let r2 = TileReport::new(2);
assert_ne!(r1.checksum(), r2.checksum());
}
#[test]
fn test_verify_checksum() {
let report = TileReport::new(42);
let cs = report.checksum();
assert!(report.verify_checksum(cs));
assert!(!report.verify_checksum(0));
}
}
#[cfg(test)]
mod report_size {
use super::*;
use std::mem::size_of;
#[test]
fn test_report_fits_cache_line() {
assert!(size_of::<TileReport>() <= 64);
}
}
#[cfg(test)]
mod property_tests {
use super::*;
use proptest::prelude::*;
proptest! {
#[test]
fn prop_serialization_roundtrip(
tile_id in 0u8..255,
coherence in i16::MIN..i16::MAX,
e_value in 0.0f32..100.0,
boundary_moved: bool
) {
let mut report = TileReport::new(tile_id);
report.coherence = coherence;
report.e_value = e_value;
report.boundary_moved = boundary_moved;
let bytes = report.to_bytes();
let restored = TileReport::from_bytes(&bytes).unwrap();
assert_eq!(report.tile_id, restored.tile_id);
assert_eq!(report.coherence, restored.coherence);
assert_eq!(report.boundary_moved, restored.boundary_moved);
}
#[test]
fn prop_checksum_changes_with_data(a: i16, b: i16) {
prop_assume!(a != b);
let mut r1 = TileReport::new(0);
let mut r2 = TileReport::new(0);
r1.coherence = a;
r2.coherence = b;
assert_ne!(r1.checksum(), r2.checksum());
}
}
}