use super::*;
use crate::decoding::errors::FSETableError;
#[test]
fn build_from_probabilities_rejects_table_exceeding_capacity() {
let mut t = SeqFSETable::new(0);
let res = t.build_from_probabilities(10, &[1024]);
assert!(
matches!(res, Err(FSETableError::AccLogTooBig { .. })),
"table_size > CAP must be rejected, got {res:?}",
);
}
#[test]
fn build_from_probabilities_rejects_sum_too_small() {
let mut t = FSETable::new(8);
let probs: [i32; 4] = [4, 2, 1, 1];
let result = t.build_from_probabilities(4, &probs);
assert!(
matches!(
result,
Err(FSETableError::ProbabilityCounterMismatch { .. })
),
"expected ProbabilityCounterMismatch for sum=8 vs expected=16, got {result:?}",
);
}
#[test]
fn build_from_probabilities_rejects_sum_too_large() {
let mut t = FSETable::new(8);
let probs: [i32; 4] = [8, 6, 4, 2];
let result = t.build_from_probabilities(4, &probs);
assert!(
matches!(
result,
Err(FSETableError::ProbabilityCounterMismatch { .. })
),
"expected ProbabilityCounterMismatch for sum=20 vs expected=16, got {result:?}",
);
}
#[test]
fn build_from_probabilities_accepts_negative_one_in_sum() {
let mut t = FSETable::new(8);
let probs: [i32; 6] = [8, 4, -1, -1, -1, -1];
let result = t.build_from_probabilities(4, &probs);
assert!(
result.is_ok(),
"expected Ok for sum=16 with -1s, got {result:?}"
);
}
#[test]
fn build_from_probabilities_rejects_overflow_in_sum() {
let mut t = FSETable::new(8);
let probs: [i32; 3] = [i32::MAX, i32::MAX, 0x42];
let result = t.build_from_probabilities(6, &probs);
assert!(
matches!(result, Err(FSETableError::InvalidProbability { .. })),
"expected InvalidProbability for overflow-shaped exploit, got {result:?}",
);
}
#[test]
fn build_from_probabilities_rejects_negative_below_minus_one() {
let mut t = FSETable::new(8);
let probs: [i32; 4] = [-2, 8, 4, 4];
let result = t.build_from_probabilities(4, &probs);
assert!(
matches!(
result,
Err(FSETableError::InvalidProbability { value: -2, .. })
),
"expected InvalidProbability{{value: -2, ..}}, got {result:?}",
);
}
#[test]
fn build_from_probabilities_accepts_exact_sum() {
let mut t = FSETable::new(8);
let probs: [i32; 4] = [4, 4, 4, 4];
let result = t.build_from_probabilities(4, &probs);
assert!(result.is_ok(), "expected Ok for exact sum, got {result:?}");
}
#[test]
fn to_encoder_table_rejects_accuracy_log_above_nine() {
let mut t = FSETable::new(8);
t.accuracy_log = 10;
t.symbol_probabilities = alloc::vec![512, 512];
assert!(
t.to_encoder_table().is_none(),
"accuracy_log > 9 must not be reusable as an encoder table"
);
}
#[test]
fn is_populated_detects_built_rle_table() {
let mut t = SeqFSETable::new(9);
assert!(!t.is_populated(), "a fresh table must report unpopulated");
t.build_rle(7);
assert!(
t.is_populated(),
"an RLE table (decode_len = 1, accuracy_log = 0) must report populated"
);
}