#![allow(
clippy::unwrap_used,
clippy::expect_used,
clippy::panic,
clippy::needless_raw_string_hashes,
clippy::duration_suboptimal_units,
clippy::branches_sharing_code,
clippy::used_underscore_binding,
clippy::single_char_pattern,
clippy::ignore_without_reason,
clippy::cloned_ref_to_slice_refs,
clippy::doc_overindented_list_items,
clippy::match_wildcard_for_single_variants,
clippy::ignored_unit_patterns,
clippy::needless_collect,
clippy::unnecessary_map_or,
clippy::manual_flatten,
clippy::manual_strip,
clippy::future_not_send,
clippy::unnested_or_patterns,
clippy::no_effect_underscore_binding,
clippy::literal_string_with_formatting_args
)]
#![allow(
dead_code,
unused_imports,
unused_variables,
deprecated,
clippy::all,
unused_mut
)]
use ggen_core::codegen::pipeline::{ValidationResult, ValidationSeverity};
#[test]
fn test_validation_pass_allows_sync() {
let validation = ValidationResult {
rule_name: "test_rule".to_string(),
passed: true,
message: Some("All checks passed".to_string()),
severity: ValidationSeverity::Error, };
assert!(validation.passed, "Validation should pass");
assert_eq!(
validation.severity,
ValidationSeverity::Error,
"Should have Error severity (would block if failed)"
);
let msg = validation.message.as_ref().unwrap();
assert!(msg.contains("passed"), "Message should indicate success");
}
#[test]
fn test_validation_fail_blocks_sync() {
let validation = ValidationResult {
rule_name: "failing_rule".to_string(),
passed: false,
message: Some("Validation failed: missing required field".to_string()),
severity: ValidationSeverity::Error,
};
assert!(!validation.passed, "Validation should fail");
assert_eq!(
validation.severity,
ValidationSeverity::Error,
"Should have Error severity"
);
let msg = validation.message.as_ref().unwrap();
assert!(msg.contains("failed"), "Message should indicate failure");
assert!(
msg.contains("missing required field"),
"Message should explain failure reason"
);
}
#[test]
fn test_severity_error_blocks() {
let error_validation = ValidationResult {
rule_name: "error_rule".to_string(),
passed: false,
message: Some("Critical error: syntax invalid".to_string()),
severity: ValidationSeverity::Error,
};
let warning_validation = ValidationResult {
rule_name: "warning_rule".to_string(),
passed: false,
message: Some("Warning: style issue detected".to_string()),
severity: ValidationSeverity::Warning,
};
assert_eq!(
error_validation.severity,
ValidationSeverity::Error,
"Should be Error severity"
);
assert!(
!error_validation.passed,
"Failed Error validation should block"
);
assert_eq!(
warning_validation.severity,
ValidationSeverity::Warning,
"Should be Warning severity"
);
assert_ne!(
warning_validation.severity, error_validation.severity,
"Warning and Error should be different"
);
}
#[test]
fn test_severity_warning_continues() {
let warning = ValidationResult {
rule_name: "style_check".to_string(),
passed: false,
message: Some("Warning: code style doesn't match conventions".to_string()),
severity: ValidationSeverity::Warning,
};
assert_eq!(
warning.severity,
ValidationSeverity::Warning,
"Should be Warning severity"
);
assert!(!warning.passed, "Warning validation failed");
}
#[test]
fn test_multiple_validations_scenario() {
let validations = vec![
ValidationResult {
rule_name: "syntax_check".to_string(),
passed: true,
message: Some("Syntax valid".to_string()),
severity: ValidationSeverity::Error,
},
ValidationResult {
rule_name: "type_check".to_string(),
passed: true,
message: Some("Types correct".to_string()),
severity: ValidationSeverity::Error,
},
ValidationResult {
rule_name: "style_check".to_string(),
passed: false,
message: Some("Style issues detected".to_string()),
severity: ValidationSeverity::Warning,
},
];
assert_eq!(validations.len(), 3, "Should have 3 validations");
let errors: Vec<_> = validations
.iter()
.filter(|v| v.severity == ValidationSeverity::Error)
.collect();
assert_eq!(errors.len(), 2, "Should have 2 Error validations");
assert!(
errors.iter().all(|v| v.passed),
"All Error validations should pass"
);
let warnings: Vec<_> = validations
.iter()
.filter(|v| v.severity == ValidationSeverity::Warning)
.collect();
assert_eq!(warnings.len(), 1, "Should have 1 Warning validation");
assert!(
!warnings[0].passed,
"Warning validation failed (but non-blocking)"
);
let blocking_failures = validations
.iter()
.any(|v| !v.passed && v.severity == ValidationSeverity::Error);
assert!(
!blocking_failures,
"No blocking failures - pipeline should continue"
);
}
#[test]
fn test_validation_with_empty_message() {
let validation = ValidationResult {
rule_name: "silent_check".to_string(),
passed: true,
message: None,
severity: ValidationSeverity::Error,
};
assert!(validation.message.is_none(), "Message should be None");
assert!(validation.passed, "Validation should still pass");
}
#[test]
fn test_validation_result_is_serializable() {
let validation = ValidationResult {
rule_name: "test_rule".to_string(),
passed: true,
message: Some("Success".to_string()),
severity: ValidationSeverity::Warning,
};
let json = serde_json::to_string(&validation).expect("Should serialize to JSON");
assert!(json.contains("test_rule"), "JSON should contain rule_name");
assert!(json.contains("true"), "JSON should contain passed status");
assert!(json.contains("Success"), "JSON should contain message");
assert!(json.contains("Warning"), "JSON should contain severity");
}
#[test]
fn test_severity_equality() {
let error1 = ValidationSeverity::Error;
let error2 = ValidationSeverity::Error;
let warning = ValidationSeverity::Warning;
assert_eq!(error1, error2, "Same severity should be equal");
assert_ne!(error1, warning, "Different severities should not be equal");
assert_ne!(warning, error1, "Different severities should not be equal");
}
#[test]
fn test_validation_pipeline_integration() {
let mut validations = Vec::new();
validations.push(ValidationResult {
rule_name: "syntax".to_string(),
passed: true,
message: Some("Syntax valid".to_string()),
severity: ValidationSeverity::Error,
});
validations.push(ValidationResult {
rule_name: "semantics".to_string(),
passed: true,
message: Some("Semantics valid".to_string()),
severity: ValidationSeverity::Error,
});
validations.push(ValidationResult {
rule_name: "linting".to_string(),
passed: false,
message: Some("Unused variable detected".to_string()),
severity: ValidationSeverity::Warning,
});
let can_continue = !validations
.iter()
.any(|v| !v.passed && v.severity == ValidationSeverity::Error);
assert!(can_continue, "Pipeline should continue with only warnings");
let critical_passed = validations
.iter()
.filter(|v| v.severity == ValidationSeverity::Error)
.all(|v| v.passed);
assert!(critical_passed, "All critical validations should pass");
let has_warnings = validations
.iter()
.any(|v| !v.passed && v.severity == ValidationSeverity::Warning);
assert!(has_warnings, "Should have warnings to log");
}