use super::*;
use crate::core::ir::{DefaultValue, EnumDef, EnumVariant};
use crate::docs::formatting::format_field_default;
fn detection_policy_enum() -> EnumDef {
EnumDef {
name: "DetectionPolicy".to_string(),
has_default: true,
variants: vec![
EnumVariant {
name: "PreferContent".to_string(),
is_default: true,
..Default::default()
},
EnumVariant {
name: "ContentOnly".to_string(),
..Default::default()
},
],
..Default::default()
}
}
const NULLISH_BY_LANGUAGE: &[(Language, &str)] = &[
(Language::Python, "`None`"),
(Language::Node, "`null`"),
(Language::Kotlin, "`null`"),
(Language::KotlinAndroid, "`null`"),
(Language::Swift, "`null`"),
(Language::Dart, "`null`"),
(Language::Csharp, "`null`"),
(Language::Ruby, "`nil`"),
(Language::Go, "`nil`"),
(Language::Php, "`null`"),
];
#[test]
fn optional_enum_field_with_no_explicit_default_documents_absence_not_the_variant() {
let api = ApiSurface {
enums: vec![detection_policy_enum()],
..make_minimal_api("0.1.0")
};
let field = make_field(
"detection_policy",
TypeRef::Named("DetectionPolicy".to_string()),
true,
Some(DefaultValue::Empty),
);
for (lang, expected) in NULLISH_BY_LANGUAGE {
let rendered = format_field_default(&field, *lang, &api, "Htm");
assert_eq!(
rendered, *expected,
"docs for {lang:?} must document an Option<Enum> field with no explicit default as \
absent (`{expected}`), not as the enum's `#[default]` variant `PreferContent`; got \
`{rendered}`"
);
}
}
#[test]
fn required_enum_field_with_empty_default_still_documents_the_default_variant() {
let api = ApiSurface {
enums: vec![detection_policy_enum()],
..make_minimal_api("0.1.0")
};
let field = make_field(
"detection_policy",
TypeRef::Named("DetectionPolicy".to_string()),
false,
Some(DefaultValue::Empty),
);
let rendered = format_field_default(&field, Language::Python, &api, "Htm");
assert_eq!(
rendered, "`DetectionPolicy.PREFER_CONTENT`",
"a required enum field must still document its own `#[default]` variant"
);
}
#[test]
fn optional_enum_field_with_explicit_variant_default_still_documents_it() {
let api = ApiSurface {
enums: vec![detection_policy_enum()],
..make_minimal_api("0.1.0")
};
let field = make_field(
"detection_policy",
TypeRef::Named("DetectionPolicy".to_string()),
true,
Some(DefaultValue::EnumVariant("ContentOnly".to_string())),
);
let rendered = format_field_default(&field, Language::Python, &api, "Htm");
assert_eq!(
rendered, "`DetectionPolicy.CONTENT_ONLY`",
"an explicit variant default on an optional field must still be documented"
);
}