#![allow(missing_docs)]
use std::sync::Once;
static INIT: Once = Once::new();
fn init_test_logger() {
INIT.call_once(|| {
let _ = env_logger::builder().is_test(true).try_init();
});
}
#[test]
fn test_std_009_init_logger_info() {
init_test_logger();
let result = ruchy::stdlib::logging::init_logger("info");
assert!(result.is_ok(), "init_logger(info) should succeed");
}
#[test]
fn test_std_009_init_logger_debug() {
init_test_logger();
let result = ruchy::stdlib::logging::init_logger("debug");
assert!(result.is_ok(), "init_logger(debug) should succeed");
}
#[test]
fn test_std_009_init_logger_invalid() {
init_test_logger();
let result = ruchy::stdlib::logging::init_logger("invalid_level");
assert!(result.is_err(), "init_logger(invalid) should fail");
}
#[test]
fn test_std_009_init_logger_off() {
init_test_logger();
let result = ruchy::stdlib::logging::init_logger("off");
assert!(result.is_ok(), "init_logger(off) should succeed");
}
#[test]
fn test_std_009_log_info_basic() {
init_test_logger();
let result = ruchy::stdlib::logging::log_info("Test info message");
assert!(result.is_ok(), "log_info should succeed");
}
#[test]
fn test_std_009_log_warn_basic() {
init_test_logger();
let result = ruchy::stdlib::logging::log_warn("Test warning message");
assert!(result.is_ok(), "log_warn should succeed");
}
#[test]
fn test_std_009_log_error_basic() {
init_test_logger();
let result = ruchy::stdlib::logging::log_error("Test error message");
assert!(result.is_ok(), "log_error should succeed");
}
#[test]
fn test_std_009_log_debug_basic() {
init_test_logger();
let result = ruchy::stdlib::logging::log_debug("Test debug message");
assert!(result.is_ok(), "log_debug should succeed");
}
#[test]
fn test_std_009_log_trace_basic() {
init_test_logger();
let result = ruchy::stdlib::logging::log_trace("Test trace message");
assert!(result.is_ok(), "log_trace should succeed");
}
#[test]
fn test_std_009_log_info_empty() {
init_test_logger();
let result = ruchy::stdlib::logging::log_info("");
assert!(result.is_ok(), "log_info with empty message should succeed");
}
#[test]
fn test_std_009_log_info_long() {
init_test_logger();
let long_message = "a".repeat(10000);
let result = ruchy::stdlib::logging::log_info(&long_message);
assert!(result.is_ok(), "log_info with long message should succeed");
}
#[test]
fn test_std_009_log_info_special_chars() {
init_test_logger();
let result = ruchy::stdlib::logging::log_info("Test \n\t\r special chars !@#$%^&*()");
assert!(result.is_ok(), "log_info with special chars should succeed");
}
#[test]
fn test_std_009_log_info_unicode() {
init_test_logger();
let result = ruchy::stdlib::logging::log_info("Test unicode: ä½ å¥½ 🚀 мир");
assert!(result.is_ok(), "log_info with unicode should succeed");
}
#[test]
fn test_std_009_log_info_newlines() {
init_test_logger();
let result = ruchy::stdlib::logging::log_info("Line 1\nLine 2\nLine 3");
assert!(result.is_ok(), "log_info with newlines should succeed");
}
#[test]
fn test_std_009_get_level_info() {
init_test_logger();
let _ = ruchy::stdlib::logging::init_logger("info");
let result = ruchy::stdlib::logging::get_level();
assert!(result.is_ok(), "get_level should succeed");
let level = result.unwrap();
assert!(
["info", "debug", "trace", "warn", "error", "off"].contains(&level.as_str()),
"Level should be valid"
);
}
#[test]
fn test_std_009_get_level_debug() {
init_test_logger();
let _ = ruchy::stdlib::logging::init_logger("debug");
let result = ruchy::stdlib::logging::get_level();
assert!(result.is_ok(), "get_level should succeed");
}
#[test]
fn test_std_009_get_level_off() {
init_test_logger();
let _ = ruchy::stdlib::logging::init_logger("off");
let result = ruchy::stdlib::logging::get_level();
assert!(result.is_ok(), "get_level should succeed");
}
#[test]
fn test_std_009_is_level_enabled_true() {
init_test_logger();
let result = ruchy::stdlib::logging::is_level_enabled("error");
assert!(result.is_ok(), "is_level_enabled should succeed");
assert!(result.unwrap(), "Error level should always be enabled");
}
#[test]
fn test_std_009_is_level_enabled_false() {
init_test_logger();
let _ = ruchy::stdlib::logging::init_logger("error");
let result = ruchy::stdlib::logging::is_level_enabled("debug");
assert!(result.is_ok(), "is_level_enabled should succeed");
assert!(
!result.unwrap(),
"Debug should be disabled when error level is set"
);
}
#[test]
fn test_std_009_is_level_enabled_invalid() {
init_test_logger();
let result = ruchy::stdlib::logging::is_level_enabled("invalid_level");
assert!(
result.is_err(),
"is_level_enabled with invalid level should fail"
);
}
#[test]
fn test_std_009_is_level_enabled_trace() {
init_test_logger();
let result = ruchy::stdlib::logging::is_level_enabled("warn");
assert!(result.is_ok(), "is_level_enabled should succeed");
let _enabled = result.unwrap();
}
#[cfg(test)]
mod property_tests {
use super::*;
use proptest::prelude::*;
proptest! {
#![proptest_config(ProptestConfig::with_cases(20))]
#[test]
fn test_std_009_logging_never_panics(message: String) {
init_test_logger();
let _ = ruchy::stdlib::logging::log_info(&message);
let _ = ruchy::stdlib::logging::log_warn(&message);
let _ = ruchy::stdlib::logging::log_error(&message);
let _ = ruchy::stdlib::logging::log_debug(&message);
let _ = ruchy::stdlib::logging::log_trace(&message);
}
#[test]
fn test_std_009_level_check_consistent(level in prop::sample::select(vec!["trace", "debug", "info", "warn", "error"])) {
init_test_logger();
let result = ruchy::stdlib::logging::is_level_enabled(level);
prop_assert!(result.is_ok(), "is_level_enabled should succeed for valid level");
}
#[test]
fn test_std_009_invalid_level_fails(level: String) {
init_test_logger();
let valid_levels = ["trace", "debug", "info", "warn", "error", "off"];
if !valid_levels.contains(&level.as_str()) {
let result = ruchy::stdlib::logging::init_logger(&level);
prop_assert!(result.is_err(), "Invalid level should fail");
}
}
}
}