use caesar_cipher_enc_dec::caesar_cipher::{decrypt_safe, encrypt_safe, CipherError};
#[test]
fn test_decrypt_safe_shift_25_maximum_valid() {
let text = "Z";
let shift = 25;
let result = decrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "A");
}
#[test]
fn test_decrypt_safe_shift_negative_25_minimum_valid() {
let text = "A";
let shift = -25;
let result = decrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Z");
}
#[test]
fn test_decrypt_safe_shift_26_boundary_invalid() {
let text = "Test";
let shift = 26;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_decrypt_safe_shift_negative_26_boundary_invalid() {
let text = "Test";
let shift = -26;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_decrypt_safe_shift_zero() {
let text = "Hello World";
let shift = 0;
let result = decrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Hello World");
}
#[test]
fn test_decrypt_safe_shift_i16_max_no_panic() {
let text = "Test";
let shift = i16::MAX;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_decrypt_safe_shift_i16_min_no_panic() {
let text = "Test";
let shift = i16::MIN;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_decrypt_safe_empty_text_with_i16_min() {
let text = "";
let shift = i16::MIN;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_decrypt_safe_empty_text_with_i16_max() {
let text = "";
let shift = i16::MAX;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_decrypt_safe_i16_max_error_message_contains_shift() {
let text = "Test";
let shift = i16::MAX;
let result = decrypt_safe(text, shift);
let error = result.unwrap_err();
let error_msg = error.to_string();
assert!(
error_msg.contains(&i16::MAX.to_string()),
"Error message should contain shift value {}: got '{}'",
i16::MAX,
error_msg
);
}
#[test]
fn test_decrypt_safe_i16_min_error_message_contains_shift() {
let text = "Test";
let shift = i16::MIN;
let result = decrypt_safe(text, shift);
let error = result.unwrap_err();
let error_msg = error.to_string();
assert!(
error_msg.contains(&i16::MIN.to_string()),
"Error message should contain shift value {}: got '{}'",
i16::MIN,
error_msg
);
}
#[test]
fn test_decrypt_safe_roundtrip_with_encrypt_safe() {
let original = "Hello World";
let shift = 13;
let encrypted = encrypt_safe(original, shift).unwrap();
let decrypted = decrypt_safe(&encrypted, shift).unwrap();
assert_eq!(original, decrypted);
}
#[test]
fn test_decrypt_safe_roundtrip_all_valid_shifts() {
let original = "TestOverflow";
for shift in -25..=25_i16 {
let encrypted = encrypt_safe(original, shift).unwrap();
let decrypted = decrypt_safe(&encrypted, shift).unwrap();
assert_eq!(original, decrypted, "Failed for shift {}", shift);
}
}