#![allow(clippy::panic_in_result_fn)]
use crush_core::{compress_with_options, init_plugins, CompressionOptions, Result, ScoringWeights};
#[test]
fn test_plugin_scoring_selection() -> Result<()> {
init_plugins()?;
let data = b"Test data for plugin selection based on scoring algorithm.";
let options = CompressionOptions::default();
let compressed = compress_with_options(data, &options)?;
assert!(!compressed.is_empty());
Ok(())
}
#[test]
fn test_manual_plugin_override() -> Result<()> {
init_plugins()?;
let data = b"Test data for manual plugin override.";
let options = CompressionOptions::default().with_plugin("deflate");
let compressed = compress_with_options(data, &options)?;
assert!(!compressed.is_empty());
assert_eq!(&compressed[0..4], &[0x43, 0x52, 0x01, 0x00]);
Ok(())
}
#[test]
fn test_manual_override_nonexistent_plugin() -> Result<()> {
init_plugins()?;
let data = b"Test data";
let options = CompressionOptions::default().with_plugin("nonexistent");
let result = compress_with_options(data, &options);
assert!(result.is_err());
Ok(())
}
#[test]
fn test_tied_score_alphabetical_resolution() -> Result<()> {
init_plugins()?;
let data = b"Test data for tied score resolution.";
let options = CompressionOptions::default();
let compressed = compress_with_options(data, &options)?;
assert!(!compressed.is_empty());
Ok(())
}
#[test]
fn test_custom_scoring_weights() -> Result<()> {
init_plugins()?;
let data = b"Test data for custom weights.";
let weights = ScoringWeights::new(0.5, 0.5)?;
let options = CompressionOptions::default().with_weights(weights);
let compressed = compress_with_options(data, &options)?;
assert!(!compressed.is_empty());
Ok(())
}
#[test]
fn test_invalid_scoring_weights() {
let result = ScoringWeights::new(0.6, 0.6);
assert!(
result.is_err(),
"Weights summing to >1.0 should be rejected"
);
let result = ScoringWeights::new(0.3, 0.3);
assert!(
result.is_err(),
"Weights summing to <1.0 should be rejected"
);
let result = ScoringWeights::new(-0.1, 1.1);
assert!(result.is_err(), "Negative weights should be rejected");
let result = ScoringWeights::new(0.7, 0.3);
assert!(result.is_ok(), "Valid weights should be accepted");
}
#[test]
fn test_default_scoring_weights() {
let weights = ScoringWeights::default();
assert!((weights.throughput - 0.7).abs() < 1e-6);
assert!((weights.compression_ratio - 0.3).abs() < 1e-6);
}
#[test]
fn test_scoring_calculation() -> Result<()> {
use crush_core::PluginMetadata;
let plugin_a = PluginMetadata {
name: "fast_low_ratio",
version: "1.0.0",
magic_number: [0x43, 0x52, 0x01, 0x10],
throughput: 1000.0, compression_ratio: 0.8, description: "Fast but low compression",
};
let plugin_b = PluginMetadata {
name: "slow_high_ratio",
version: "1.0.0",
magic_number: [0x43, 0x52, 0x01, 0x11],
throughput: 100.0, compression_ratio: 0.3, description: "Slow but high compression",
};
let weights = ScoringWeights::default();
let plugins = vec![plugin_a, plugin_b];
let score_a = crush_core::calculate_plugin_score(&plugin_a, &plugins, &weights);
let score_b = crush_core::calculate_plugin_score(&plugin_b, &plugins, &weights);
assert!(
score_a > score_b,
"Fast plugin should score higher with 70% throughput weight"
);
let balanced_weights = ScoringWeights::new(0.5, 0.5)?;
let balanced_score_a =
crush_core::calculate_plugin_score(&plugin_a, &plugins, &balanced_weights);
let balanced_score_b =
crush_core::calculate_plugin_score(&plugin_b, &plugins, &balanced_weights);
assert!((balanced_score_a - score_a).abs() > 1e-6);
assert!((balanced_score_b - score_b).abs() > 1e-6);
Ok(())
}