#![allow(clippy::panic_in_result_fn)]
use crush_core::{init_plugins, list_plugins, Result};
#[test]
fn test_plugin_discovery_deflate() -> Result<()> {
init_plugins()?;
let plugins = list_plugins();
assert!(!plugins.is_empty(), "Should discover at least one plugin");
let deflate = plugins.iter().find(|p| p.name == "deflate");
assert!(deflate.is_some(), "DEFLATE plugin should be discovered");
#[allow(clippy::unwrap_used)] let deflate = deflate.unwrap();
assert_eq!(deflate.magic_number, [0x43, 0x52, 0x01, 0x00]);
assert_eq!(deflate.version, "1.0.0");
Ok(())
}
#[test]
fn test_list_plugins_before_init() {
let plugins = list_plugins();
assert!(plugins.is_empty() || !plugins.is_empty());
}
#[test]
fn test_multiple_plugin_registration() -> Result<()> {
init_plugins()?;
let plugins = list_plugins();
for plugin in &plugins {
assert!(!plugin.name.is_empty(), "Plugin name should not be empty");
assert!(
!plugin.version.is_empty(),
"Plugin version should not be empty"
);
assert!(plugin.throughput > 0.0, "Throughput should be positive");
assert!(
plugin.compression_ratio > 0.0 && plugin.compression_ratio <= 1.0,
"Compression ratio should be in (0.0, 1.0]"
);
}
assert!(plugins.iter().any(|p| p.name == "deflate"));
Ok(())
}
#[test]
fn test_duplicate_magic_number_handling() -> Result<()> {
init_plugins()?;
let plugins = list_plugins();
let mut magic_counts = std::collections::HashMap::new();
for plugin in &plugins {
*magic_counts.entry(plugin.magic_number).or_insert(0) += 1;
}
for (magic, count) in magic_counts {
assert_eq!(
count, 1,
"Magic number {magic:02X?} should appear exactly once in registry"
);
}
Ok(())
}
#[test]
fn test_reinitialization() -> Result<()> {
init_plugins()?;
let plugins_first = list_plugins();
let count_first = plugins_first.len();
init_plugins()?;
let plugins_second = list_plugins();
let count_second = plugins_second.len();
assert_eq!(
count_first, count_second,
"Re-initialization should produce same plugin count"
);
assert!(plugins_second.iter().any(|p| p.name == "deflate"));
Ok(())
}
#[test]
fn test_plugin_retrieval_by_name() -> Result<()> {
init_plugins()?;
let plugins = list_plugins();
let deflate = plugins.iter().find(|p| p.name == "deflate");
assert!(
deflate.is_some(),
"Should be able to find DEFLATE plugin by name"
);
Ok(())
}
#[test]
fn test_plugin_metadata_validity() -> Result<()> {
init_plugins()?;
let plugins = list_plugins();
assert!(!plugins.is_empty(), "Should have at least one plugin");
for plugin in plugins {
assert_eq!(
plugin.magic_number[0], 0x43,
"Magic number should start with 'C'"
);
assert_eq!(
plugin.magic_number[1], 0x52,
"Magic number should have 'R' as second byte"
);
assert_eq!(
plugin.magic_number[2], 0x01,
"Version should be 0x01 for V1 format"
);
assert!(
plugin.throughput >= 1.0,
"Throughput should be at least 1 MB/s"
);
assert!(
plugin.compression_ratio > 0.0 && plugin.compression_ratio <= 1.0,
"Compression ratio should be in range (0.0, 1.0]"
);
}
Ok(())
}