use ruchy::stdlib::logging;
#[test]
fn test_init_logger_valid_levels() {
for level in &["trace", "debug", "info", "warn", "error", "off"] {
let result = logging::init_logger(level);
assert!(result.is_ok(), "Failed to init logger with level: {level}");
}
}
#[test]
fn test_init_logger_invalid() {
let result = logging::init_logger("invalid_level");
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.contains("Invalid log level"));
}
#[test]
fn test_log_info() {
logging::init_logger("info").ok();
let result = logging::log_info("Test info message");
assert!(result.is_ok());
}
#[test]
fn test_log_warn() {
logging::init_logger("warn").ok();
let result = logging::log_warn("Test warning message");
assert!(result.is_ok());
}
#[test]
fn test_log_error() {
logging::init_logger("error").ok();
let result = logging::log_error("Test error message");
assert!(result.is_ok());
}
#[test]
fn test_log_debug() {
logging::init_logger("debug").ok();
let result = logging::log_debug("Test debug message");
assert!(result.is_ok());
}
#[test]
fn test_log_trace() {
logging::init_logger("trace").ok();
let result = logging::log_trace("Test trace message");
assert!(result.is_ok());
}
#[test]
fn test_get_level() {
logging::init_logger("info").ok();
let result = logging::get_level();
assert!(result.is_ok());
let level = result.unwrap();
assert!(["trace", "debug", "info", "warn", "error", "off"].contains(&level.as_str()));
}
#[test]
fn test_is_level_enabled_valid() {
logging::init_logger("info").ok();
let result = logging::is_level_enabled("info");
assert!(result.is_ok());
}
#[test]
fn test_is_level_enabled_invalid() {
logging::init_logger("info").ok();
let result = logging::is_level_enabled("invalid");
assert!(result.is_err());
let err = result.unwrap_err();
assert!(err.contains("Invalid log level"));
}
use proptest::prelude::*;
proptest! {
#[test]
fn property_log_functions_never_fail(
message in "[ -~]{1,100}" ) {
logging::init_logger("trace").ok();
prop_assert!(logging::log_trace(&message).is_ok());
prop_assert!(logging::log_debug(&message).is_ok());
prop_assert!(logging::log_info(&message).is_ok());
prop_assert!(logging::log_warn(&message).is_ok());
prop_assert!(logging::log_error(&message).is_ok());
}
#[test]
fn property_get_level_always_valid(
_dummy in 0..100i32
) {
logging::init_logger("info").ok();
let level = logging::get_level().unwrap();
prop_assert!(
["trace", "debug", "info", "warn", "error", "off"].contains(&level.as_str()),
"Invalid level: {}", level
);
}
#[test]
fn property_is_level_enabled_consistency(
level in prop::sample::select(vec!["trace", "debug", "info", "warn", "error"])
) {
logging::init_logger(level).ok();
let result = logging::is_level_enabled(level);
prop_assert!(result.is_ok());
}
}
#[test]
fn test_log_empty_message() {
logging::init_logger("info").ok();
let result = logging::log_info("");
assert!(result.is_ok());
}
#[test]
fn test_log_unicode() {
logging::init_logger("info").ok();
let result = logging::log_info("Hello δΈη π");
assert!(result.is_ok());
}
#[test]
fn test_log_special_chars() {
logging::init_logger("info").ok();
let result = logging::log_info("Test: !@#$%^&*(){}[]|\\:;\"'<>,.?/~`");
assert!(result.is_ok());
}
#[test]
fn test_log_long_message() {
logging::init_logger("info").ok();
let long_msg = "x".repeat(10000);
let result = logging::log_info(&long_msg);
assert!(result.is_ok());
}
#[test]
fn test_init_logger_case_variations() {
assert!(logging::init_logger("info").is_ok());
assert!(logging::init_logger("INFO").is_ok());
assert!(logging::init_logger("Info").is_ok());
}
#[test]
fn test_logging_workflow() {
logging::init_logger("trace").ok();
let level = logging::get_level().unwrap();
assert!(["trace", "debug", "info", "warn", "error", "off"].contains(&level.as_str()));
assert!(logging::log_trace("trace").is_ok());
assert!(logging::log_debug("debug").is_ok());
assert!(logging::log_info("info").is_ok());
assert!(logging::log_warn("warn").is_ok());
assert!(logging::log_error("error").is_ok());
}
#[test]
fn test_level_hierarchy() {
logging::init_logger("info").ok();
assert!(logging::is_level_enabled("info").unwrap());
assert!(logging::is_level_enabled("warn").unwrap());
assert!(logging::is_level_enabled("error").unwrap());
}
#[test]
fn test_multiple_log_calls() {
logging::init_logger("debug").ok();
for i in 0..100 {
let msg = format!("Message {i}");
assert!(logging::log_debug(&msg).is_ok());
}
}