use perl_diagnostics::codes::DiagnosticSeverity as CodesSeverity;
use perl_diagnostics::codes::DiagnosticTag as CodesTag;
use perl_diagnostics::types::DiagnosticSeverity as TypesSeverity;
use perl_diagnostics::types::DiagnosticTag as TypesTag;
#[test]
fn severity_is_unified_single_type() {
let from_codes = CodesSeverity::Error;
let _as_types: TypesSeverity = from_codes;
assert_eq!(from_codes as u8, 1);
}
#[test]
fn severity_has_identical_type_id_across_module_paths() {
let codes_id = std::any::TypeId::of::<CodesSeverity>();
let types_id = std::any::TypeId::of::<TypesSeverity>();
assert_eq!(
codes_id, types_id,
"DiagnosticSeverity must be unified — same TypeId from both module paths"
);
}
#[test]
fn severity_all_variants_accessible_from_both_paths() {
let _error_codes = CodesSeverity::Error;
let _error_types = TypesSeverity::Error;
let _warning_codes = CodesSeverity::Warning;
let _warning_types = TypesSeverity::Warning;
let _info_codes = CodesSeverity::Information;
let _info_types = TypesSeverity::Information;
let _hint_codes = CodesSeverity::Hint;
let _hint_types = TypesSeverity::Hint;
}
#[test]
fn severity_equality_across_module_paths() {
let from_codes = CodesSeverity::Warning;
let from_types = TypesSeverity::Warning;
assert_eq!(from_codes, from_types);
}
#[test]
fn severity_ordering_across_module_paths() {
let error_codes = CodesSeverity::Error;
let warning_types = TypesSeverity::Warning;
assert!(error_codes < warning_types);
}
#[test]
fn tag_is_unified_single_type() {
let from_codes = CodesTag::Unnecessary;
let _as_types: TypesTag = from_codes;
}
#[test]
fn tag_has_identical_type_id_across_module_paths() {
let codes_id = std::any::TypeId::of::<CodesTag>();
let types_id = std::any::TypeId::of::<TypesTag>();
assert_eq!(
codes_id, types_id,
"DiagnosticTag must be unified — same TypeId from both module paths"
);
}
#[test]
fn tag_all_variants_accessible_from_both_paths() {
let _unnecessary_codes = CodesTag::Unnecessary;
let _unnecessary_types = TypesTag::Unnecessary;
let _deprecated_codes = CodesTag::Deprecated;
let _deprecated_types = TypesTag::Deprecated;
}
#[test]
fn tag_equality_across_module_paths() {
let from_codes = CodesTag::Deprecated;
let from_types = TypesTag::Deprecated;
assert_eq!(from_codes, from_types);
}
#[test]
fn diagnostic_struct_binds_unified_severity_type() {
use perl_diagnostics::types::Diagnostic;
let diag = Diagnostic { severity: CodesSeverity::Error, ..Default::default() };
let _severity: TypesSeverity = diag.severity;
}
#[test]
fn mixed_severity_assignments_from_both_paths() {
let mut severities: Vec<TypesSeverity> = vec![];
severities.push(CodesSeverity::Error);
severities.push(CodesSeverity::Warning);
severities.push(TypesSeverity::Information);
severities.push(TypesSeverity::Hint);
assert_eq!(severities.len(), 4);
}
#[test]
fn mixed_tag_assignments_from_both_paths() {
let mut tags: Vec<TypesTag> = vec![];
tags.push(CodesTag::Unnecessary);
tags.push(CodesTag::Deprecated);
tags.push(TypesTag::Unnecessary);
tags.push(TypesTag::Deprecated);
assert_eq!(tags.len(), 4);
}
#[test]
fn severity_to_lsp_value_works_from_both_paths() {
let codes_lsp = CodesSeverity::Error.to_lsp_value();
let types_lsp = TypesSeverity::Error.to_lsp_value();
assert_eq!(codes_lsp, types_lsp);
assert_eq!(codes_lsp, 1);
}
#[test]
fn tag_to_lsp_value_works_from_both_paths() {
let codes_lsp = CodesTag::Unnecessary.to_lsp_value();
let types_lsp = TypesTag::Unnecessary.to_lsp_value();
assert_eq!(codes_lsp, types_lsp);
assert_eq!(codes_lsp, 1);
}
#[test]
fn severity_display_works() {
assert_eq!(format!("{}", CodesSeverity::Error), "error");
assert_eq!(format!("{}", CodesSeverity::Warning), "warning");
assert_eq!(format!("{}", CodesSeverity::Information), "info");
assert_eq!(format!("{}", CodesSeverity::Hint), "hint");
assert_eq!(format!("{}", TypesSeverity::Error), "error");
}
#[test]
fn tag_display_works() {
assert_eq!(format!("{}", CodesTag::Unnecessary), "unnecessary");
assert_eq!(format!("{}", CodesTag::Deprecated), "deprecated");
assert_eq!(format!("{}", TypesTag::Unnecessary), "unnecessary");
}
#[test]
fn severity_debug_works() {
let debug_str = format!("{:?}", CodesSeverity::Error);
assert_eq!(debug_str, "Error", "Debug output should be variant name");
let types_debug = format!("{:?}", TypesSeverity::Warning);
assert_eq!(types_debug, "Warning");
}
#[test]
fn tag_debug_works() {
let debug_str = format!("{:?}", CodesTag::Unnecessary);
assert_eq!(debug_str, "Unnecessary", "Debug output should be variant name");
let types_debug = format!("{:?}", TypesTag::Deprecated);
assert_eq!(types_debug, "Deprecated");
}
#[test]
fn severity_hash_works() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(CodesSeverity::Error);
set.insert(TypesSeverity::Error); set.insert(CodesSeverity::Warning);
assert_eq!(set.len(), 2);
}
#[test]
fn tag_hash_works() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(CodesTag::Unnecessary);
set.insert(TypesTag::Unnecessary); set.insert(CodesTag::Deprecated);
assert_eq!(set.len(), 2);
}