use caesar_cipher_enc_dec::caesar_cipher::{decrypt_safe, encrypt_safe, CipherError};
mod encrypt_safe_tests {
use super::*;
#[test]
fn test_encrypt_safe_valid_input() {
let text = "Hello";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Khoor");
}
#[test]
fn test_encrypt_safe_single_character() {
let text = "A";
let shift = 1;
let result = encrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "B");
}
#[test]
fn test_encrypt_safe_shift_zero() {
let text = "Test";
let shift = 0;
let result = encrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Test");
}
#[test]
fn test_encrypt_safe_shift_25_maximum_valid() {
let text = "A";
let shift = 25;
let result = encrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Z");
}
#[test]
fn test_encrypt_safe_shift_negative_25_minimum_valid() {
let text = "Z";
let shift = -25;
let result = encrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "A");
}
#[test]
fn test_encrypt_safe_shift_26_boundary_invalid() {
let text = "Test";
let shift = 26;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_encrypt_safe_shift_negative_26_boundary_invalid() {
let text = "Test";
let shift = -26;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_encrypt_safe_empty_text() {
let text = "";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_encrypt_safe_shift_100_far_out_of_range() {
let text = "Test";
let shift = 100;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_encrypt_safe_shift_negative_100_far_out_of_range() {
let text = "Test";
let shift = -100;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::InvalidShift(_)));
}
#[test]
fn test_encrypt_safe_error_message_contains_shift_value() {
let text = "Test";
let shift = 30;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
let error = result.unwrap_err();
let error_message = error.to_string();
assert!(
error_message.contains("30"),
"Error message should contain shift value 30: {}",
error_message
);
}
#[test]
fn test_encrypt_safe_empty_text_error_message() {
let text = "";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
let error = result.unwrap_err();
assert_eq!(
error.to_string(),
"Input text cannot be empty or whitespace-only"
);
}
}
mod decrypt_safe_tests {
use super::*;
#[test]
fn test_decrypt_safe_valid_input() {
let text = "Khoor";
let shift = 3;
let result = decrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Hello");
}
#[test]
fn test_decrypt_safe_shift_zero() {
let text = "Test";
let shift = 0;
let result = decrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), "Test");
}
#[test]
fn test_decrypt_safe_shift_25() {
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_26_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_empty_text() {
let text = "";
let shift = 3;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_decrypt_safe_whitespace_only_spaces() {
let text = " ";
let shift = 3;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_decrypt_safe_whitespace_only_tabs() {
let text = "\t\t";
let shift = 3;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_decrypt_safe_whitespace_only_mixed() {
let text = " \t\n ";
let shift = 3;
let result = decrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
}
mod whitespace_validation_tests {
use super::*;
#[test]
fn test_encrypt_safe_whitespace_only_spaces() {
let text = " ";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_encrypt_safe_whitespace_only_tabs() {
let text = "\t\t";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_encrypt_safe_whitespace_only_newlines() {
let text = "\n\n";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_encrypt_safe_whitespace_only_mixed() {
let text = " \t\n ";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_err());
assert!(matches!(result.unwrap_err(), CipherError::EmptyText));
}
#[test]
fn test_encrypt_safe_text_with_leading_trailing_spaces() {
let text = " Hello ";
let shift = 3;
let result = encrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), " Khoor ");
}
#[test]
fn test_decrypt_safe_text_with_leading_trailing_spaces() {
let text = " Khoor ";
let shift = 3;
let result = decrypt_safe(text, shift);
assert!(result.is_ok());
assert_eq!(result.unwrap(), " Hello ");
}
}