use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ReportType {
Coverage,
Violations,
Drift,
Stale,
Gates,
Integrity,
Versions,
Dependencies,
Lifecycle,
Summary,
All,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum OutputFormat {
Json,
Markdown,
Table,
}
#[derive(Debug, Serialize)]
pub struct HeadlessOutput {
pub report_type: String,
pub timestamp: String,
pub console_version: String,
pub exit_code: i32,
#[serde(flatten)]
pub data: serde_json::Value,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn report_type_equality() {
assert_eq!(ReportType::Coverage, ReportType::Coverage);
assert_ne!(ReportType::Coverage, ReportType::Violations);
assert_eq!(ReportType::All, ReportType::All);
}
#[test]
fn output_format_equality() {
assert_eq!(OutputFormat::Json, OutputFormat::Json);
assert_ne!(OutputFormat::Json, OutputFormat::Markdown);
assert_eq!(OutputFormat::Table, OutputFormat::Table);
}
#[test]
fn headless_output_serializes_correctly() {
let output = HeadlessOutput {
report_type: "coverage".to_string(),
timestamp: "2025-01-01T00:00:00.000Z".to_string(),
console_version: "1.0.0".to_string(),
exit_code: 0,
data: serde_json::json!({"aggregate_score": 95.0}),
};
let json = serde_json::to_string(&output).expect("serialize");
let parsed: serde_json::Value = serde_json::from_str(&json).expect("parse");
assert_eq!(parsed["report_type"], "coverage");
assert_eq!(parsed["timestamp"], "2025-01-01T00:00:00.000Z");
assert_eq!(parsed["console_version"], "1.0.0");
assert_eq!(parsed["exit_code"], 0);
assert_eq!(parsed["aggregate_score"], 95.0);
}
#[test]
fn headless_output_flatten_merges_data() {
let output = HeadlessOutput {
report_type: "gates".to_string(),
timestamp: "2025-06-01T00:00:00.000Z".to_string(),
console_version: "2.0.0".to_string(),
exit_code: 1,
data: serde_json::json!({"gates_passed": 3, "gates_failed": 1}),
};
let json = serde_json::to_string(&output).unwrap();
let parsed: serde_json::Value = serde_json::from_str(&json).unwrap();
assert_eq!(parsed["exit_code"], 1);
assert_eq!(parsed["gates_passed"], 3);
assert_eq!(parsed["gates_failed"], 1);
assert!(parsed.get("data").is_none());
}
#[test]
fn report_type_all_variants_are_distinct() {
let variants = [
ReportType::Coverage,
ReportType::Violations,
ReportType::Drift,
ReportType::Stale,
ReportType::Gates,
ReportType::Integrity,
ReportType::Versions,
ReportType::Dependencies,
ReportType::Lifecycle,
ReportType::Summary,
ReportType::All,
];
for (i, a) in variants.iter().enumerate() {
for (j, b) in variants.iter().enumerate() {
if i == j {
assert_eq!(a, b);
} else {
assert_ne!(a, b);
}
}
}
}
}