#[path = "../src/generated/test_flatbed.rs"]
#[allow(warnings, clippy::all)]
mod generated;
use generated::test::{LogEvent, Severity};
#[test]
fn log_event_with_enum_field_round_trips() {
let original = LogEvent {
message: Some("disk full".to_string()),
severity: Severity::Error,
history: Some(vec![Severity::Info, Severity::Warning, Severity::Error]),
};
let bytes = original.to_flatbuffer();
let decoded = LogEvent::from_flatbuffer(&bytes).expect("flatbuffer decode failed");
assert_eq!(decoded, original);
assert_eq!(decoded.severity, Severity::Error);
assert_eq!(
decoded.history.as_deref(),
Some([Severity::Info, Severity::Warning, Severity::Error].as_slice()),
);
}
#[test]
fn log_event_with_default_enum_round_trips() {
let original = LogEvent {
message: Some("ping".to_string()),
severity: Severity::Info,
history: None,
};
let bytes = original.to_flatbuffer();
let decoded = LogEvent::from_flatbuffer(&bytes).expect("flatbuffer decode failed");
assert_eq!(decoded, original);
assert_eq!(decoded.severity, Severity::Info);
assert!(decoded.history.is_none());
}
#[test]
fn log_event_with_empty_enum_vector_round_trips() {
let original = LogEvent {
message: None,
severity: Severity::Warning,
history: Some(vec![]),
};
let bytes = original.to_flatbuffer();
let decoded = LogEvent::from_flatbuffer(&bytes).expect("flatbuffer decode failed");
assert_eq!(decoded, original);
assert_eq!(decoded.severity, Severity::Warning);
assert_eq!(decoded.history.as_ref().map(Vec::len), Some(0));
}
#[test]
fn log_event_default_uses_first_enum_variant() {
assert_eq!(LogEvent::default().severity, Severity::Info);
assert_eq!(Severity::default(), Severity::Info);
}
#[test]
fn log_event_json_omits_enum_field_uses_default() {
let json = r#"{ "message": "no severity in payload" }"#;
let parsed: LogEvent = serde_json::from_str(json).expect("JSON decode failed");
assert_eq!(parsed.severity, Severity::Info);
assert_eq!(parsed.message.as_deref(), Some("no severity in payload"));
assert!(parsed.history.is_none());
}
#[test]
fn log_event_json_serialises_enum_as_variant_name_string() {
let event = LogEvent {
message: Some("disk full".to_string()),
severity: Severity::Error,
history: Some(vec![Severity::Info, Severity::Warning, Severity::Error]),
};
let json = serde_json::to_value(&event).expect("JSON encode failed");
assert_eq!(json["severity"], serde_json::Value::String("Error".into()));
let history_json = json["history"].clone();
assert_eq!(
history_json,
serde_json::json!(["Info", "Warning", "Error"])
);
let decoded: LogEvent = serde_json::from_value(json).expect("JSON decode failed");
assert_eq!(decoded, event);
}
#[test]
fn log_event_json_rejects_unknown_variant_name() {
let json = r#"{ "message": "x", "severity": "Catastrophic" }"#;
let err = serde_json::from_str::<LogEvent>(json).expect_err("expected unknown-variant error");
let msg = err.to_string();
assert!(
msg.contains("Catastrophic")
&& msg.contains("Info")
&& msg.contains("Warning")
&& msg.contains("Error"),
"error should name the unknown variant and list valid ones: {msg}"
);
}
#[test]
fn log_event_json_rejects_integer_for_enum_field() {
let json = r#"{ "message": "x", "severity": 2 }"#;
let err = serde_json::from_str::<LogEvent>(json)
.expect_err("integer should not deserialise as a string-typed enum");
let msg = err.to_string();
assert!(
msg.contains("string") || msg.contains("integer") || msg.contains("expected"),
"error should indicate type mismatch: {msg}"
);
}