#[cfg(test)]
mod tests {
use llmosafe::{
calculate_halo_signal, sift_perceptions, SiftedSynapse, Synapse, WorkingMemory,
};
#[test]
fn test_no_integer_overflow_entropy() {
let mut synapse = Synapse::new();
synapse.set_raw_entropy(0);
assert_eq!(synapse.raw_entropy(), 0);
synapse.set_raw_entropy(u16::MAX);
assert_eq!(synapse.raw_entropy(), u16::MAX);
synapse.set_raw_entropy(u16::MAX / 2);
assert_eq!(synapse.raw_entropy(), u16::MAX / 2);
let mut memory = WorkingMemory::<64>::new(i128::MAX);
for i in 0..1000 {
let mut s = Synapse::new();
s.set_raw_entropy(i as u16 % 1000);
let sifted = SiftedSynapse::new(s);
let _ = memory.update(sifted);
}
}
#[test]
fn test_no_panic_on_malformed_input() {
let signal = calculate_halo_signal("hello\0world\0test");
assert!(signal >= 0, "Should handle null bytes");
let signal = calculate_halo_signal("expert recommendation");
assert!(signal >= 0, "Should handle normal strings");
let long = "expert ".repeat(100_000);
let signal = calculate_halo_signal(&long);
assert!(signal >= 0, "Should handle very long strings");
let signal = calculate_halo_signal("\0\0\0");
assert!(signal >= 0, "Should handle all-null string");
}
#[test]
fn test_resource_exhaustion_limits() {
let mut memory = WorkingMemory::<2>::new(1000);
for i in 0..1000 {
let mut synapse = Synapse::new();
synapse.set_raw_entropy((i % 100) as u16);
let sifted = SiftedSynapse::new(synapse);
memory.update(sifted).unwrap();
}
let mean = memory.mean_entropy();
assert!(mean.is_finite(), "Mean should be finite after wraparound");
}
#[test]
fn test_injection_patterns_in_text() {
let injection_patterns = vec![
"expert '; DROP TABLE users; --",
"expert <script>alert('xss')</script>",
"expert ${dangerous}",
"expert {{template_injection}}",
"expert \n\n\n\n\n",
"expert \r\n\r\n",
"expert \t\t\t",
"expert \\x00\\x01\\x02",
"expert {{config.secret}}",
"expert <%= evil %>",
"expert <?php system('ls'); ?>",
"expert ${7*7}",
];
for pattern in injection_patterns {
let signal = calculate_halo_signal(pattern);
assert!(signal >= 0, "Should safely handle: {}", pattern);
assert!(
signal > 0,
"Should still detect 'expert' in injection attempt"
);
}
}
#[test]
fn test_synapse_bit_injection() {
let test_patterns: Vec<u128> = vec![
0,
u128::MAX,
0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFE,
0x00000000_00000000_00000000_FFFFFFFF,
0xFFFFFFFF_00000000_00000000_00000000,
1 << 127, 1, ];
for pattern in test_patterns {
let synapse = Synapse::from_raw_u128(pattern);
let _ = synapse.raw_entropy();
let _ = synapse.raw_surprise();
let _ = synapse.has_bias();
}
}
#[test]
fn test_empty_array_handling() {
let empty: Vec<&str> = vec![];
let result = std::panic::catch_unwind(|| sift_perceptions(&empty, "test"));
match result {
Ok(synapse) => {
assert!(synapse.raw_entropy() <= u16::MAX as u16);
}
Err(_) => {
}
}
}
#[test]
fn test_surprise_threshold_boundaries() {
let mut memory = WorkingMemory::<64>::new(1000);
let mut synapse = Synapse::new();
synapse.set_raw_entropy(100);
synapse.set_raw_surprise(1000);
let sifted = SiftedSynapse::new(synapse);
assert!(memory.update(sifted).is_ok(), "At threshold should succeed");
let mut synapse = Synapse::new();
synapse.set_raw_entropy(100);
synapse.set_raw_surprise(1001);
let sifted = SiftedSynapse::new(synapse);
assert!(
memory.update(sifted).is_err(),
"Above threshold should fail"
);
}
#[test]
fn test_unicode_boundary_handling() {
let unicode_tests = vec![
"\u{0000}", "\u{FFFF}", "\u{10FFFF}", "\u{FFFD}", "\u{200D}", "\u{FEFF}", "\u{0041}\u{0301}", "\u{1F600}", ];
for test in unicode_tests {
let signal = calculate_halo_signal(test);
assert!(signal >= 0, "Should handle unicode boundary: {:?}", test);
}
}
}