use super::*;
use crate::core::ir::{DefaultValue, EnumDef, EnumVariant};
use crate::docs::formatting::format_field_default;
fn render_mode_enum() -> EnumDef {
EnumDef {
name: "RenderMode".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 REQUIRED_FIELD_DEFAULT_BY_LANGUAGE: &[(Language, &str)] = &[
(Language::Go, "`RenderModePreferContent`"),
(Language::Java, "`RenderMode.PreferContent`"),
(Language::Swift, "`RenderMode.preferContent`"),
(Language::Dart, "`RenderMode.preferContent`"),
(Language::Php, "`RenderMode::PREFERCONTENT`"),
];
#[test]
fn required_enum_field_documents_default_variant_in_each_backends_real_syntax() {
let api = ApiSurface {
enums: vec![render_mode_enum()],
..make_minimal_api("0.1.0")
};
let field = make_field(
"mode",
TypeRef::Named("RenderMode".to_string()),
false,
Some(DefaultValue::Empty),
);
for (lang, expected) in REQUIRED_FIELD_DEFAULT_BY_LANGUAGE {
let rendered = format_field_default(&field, *lang, &api, "Htm");
assert_eq!(
rendered, *expected,
"docs for {lang:?} must spell the `RenderMode` default variant the way that \
backend's own generator declares it; got `{rendered}`, expected `{expected}`. If \
this fix were reverted, {lang:?}'s cell would render a syntax that does not parse \
(or does not name a real constant) in the generated binding."
);
}
}
#[test]
fn explicit_qualified_enum_variant_default_uses_each_backends_real_syntax() {
let api = ApiSurface {
enums: vec![render_mode_enum()],
..make_minimal_api("0.1.0")
};
let field = make_field(
"mode",
TypeRef::Named("RenderMode".to_string()),
false,
Some(DefaultValue::EnumVariant("RenderMode::ContentOnly".to_string())),
);
let expected_by_language: &[(Language, &str)] = &[
(Language::Go, "`RenderModeContentOnly`"),
(Language::Java, "`RenderMode.ContentOnly`"),
(Language::Swift, "`RenderMode.contentOnly`"),
(Language::Dart, "`RenderMode.contentOnly`"),
(Language::Php, "`RenderMode::CONTENTONLY`"),
];
for (lang, expected) in expected_by_language {
let rendered = format_field_default(&field, *lang, &api, "Htm");
assert_eq!(
rendered, *expected,
"explicit qualified default for {lang:?}; got `{rendered}`"
);
}
}
#[test]
fn optional_enum_field_in_the_five_fixed_languages_documents_absence_not_a_variant() {
let api = ApiSurface {
enums: vec![render_mode_enum()],
..make_minimal_api("0.1.0")
};
let field = make_field(
"mode",
TypeRef::Named("RenderMode".to_string()),
true,
Some(DefaultValue::Empty),
);
let nullish_by_language: &[(Language, &str)] = &[
(Language::Go, "`nil`"),
(Language::Java, "`null`"),
(Language::Swift, "`null`"),
(Language::Dart, "`null`"),
(Language::Php, "`null`"),
];
for (lang, expected) in nullish_by_language {
let rendered = format_field_default(&field, *lang, &api, "Htm");
assert_eq!(
rendered, *expected,
"optional enum field for {lang:?} must document absence, not the default variant; \
got `{rendered}`"
);
}
}