use dampen_cli::commands::check::errors::CheckError;
use dampen_cli::commands::check::themes::ThemeValidator;
#[test]
fn test_invalid_theme_property_detection() {
let mut validator = ThemeValidator::new();
let result = validator.add_invalid_theme_property(
"test_theme",
"font_size_base",
"-16.0",
"test.dampen",
10,
5,
);
assert!(result.is_err());
let errors = validator.validate();
assert!(!errors.is_empty());
let has_invalid_property = errors
.iter()
.any(|e| matches!(e, CheckError::InvalidThemeProperty { .. }));
assert!(
has_invalid_property,
"Expected invalid theme property error"
);
}
#[test]
fn test_circular_dependency_detection() {
let mut validator = ThemeValidator::new();
validator.add_style_class("class_a", vec!["class_b".to_string()], "test.dampen", 5, 1);
validator.add_style_class("class_b", vec!["class_c".to_string()], "test.dampen", 10, 1);
validator.add_style_class("class_c", vec!["class_a".to_string()], "test.dampen", 15, 1);
let errors = validator.validate();
assert!(!errors.is_empty());
let has_circular_error = errors
.iter()
.any(|e| matches!(e, CheckError::ThemeCircularDependency { .. }));
assert!(has_circular_error, "Expected circular dependency error");
}
#[test]
fn test_valid_theme() {
let validator = ThemeValidator::new();
let errors = validator.validate();
assert!(errors.is_empty(), "Expected no errors for valid theme");
}
#[test]
fn test_style_class_extends_nonexistent() {
let mut validator = ThemeValidator::new();
validator.add_style_class(
"child_class",
vec!["nonexistent_parent".to_string()],
"test.dampen",
5,
1,
);
let errors = validator.validate();
assert!(!errors.is_empty());
let has_invalid_property = errors
.iter()
.any(|e| matches!(e, CheckError::InvalidThemeProperty { .. }));
assert!(
has_invalid_property,
"Expected invalid theme property error for missing parent"
);
}
#[test]
fn test_multiple_circular_dependencies() {
let mut validator = ThemeValidator::new();
validator.add_style_class("class_a", vec!["class_b".to_string()], "test.dampen", 5, 1);
validator.add_style_class("class_b", vec!["class_a".to_string()], "test.dampen", 10, 1);
validator.add_style_class("class_c", vec!["class_d".to_string()], "test.dampen", 15, 1);
validator.add_style_class("class_d", vec!["class_e".to_string()], "test.dampen", 20, 1);
validator.add_style_class("class_e", vec!["class_c".to_string()], "test.dampen", 25, 1);
let errors = validator.validate();
let circular_error_count = errors
.iter()
.filter(|e| matches!(e, CheckError::ThemeCircularDependency { .. }))
.count();
assert!(
circular_error_count >= 2,
"Expected at least 2 circular dependency errors, got {}",
circular_error_count
);
}
#[test]
fn test_deep_inheritance_without_cycle() {
let mut validator = ThemeValidator::new();
validator.add_style_class("class_a", vec!["class_b".to_string()], "test.dampen", 5, 1);
validator.add_style_class("class_b", vec!["class_c".to_string()], "test.dampen", 10, 1);
validator.add_style_class("class_c", vec!["class_d".to_string()], "test.dampen", 15, 1);
validator.add_style_class("class_d", vec![], "test.dampen", 20, 1);
let errors = validator.validate();
let has_circular_error = errors
.iter()
.any(|e| matches!(e, CheckError::ThemeCircularDependency { .. }));
assert!(
!has_circular_error,
"Expected no circular dependency error for valid inheritance chain"
);
}