#![cfg(feature = "ts")]
use gedcomkit::{build, convert, dates, decode, family, validate, view};
use ts_rs::{Config, TS};
fn config() -> Config {
Config::new().with_large_int("number")
}
fn fields<T: TS>() -> Vec<String> {
T::decl(&config())
.lines()
.map(str::trim)
.filter(|line| !line.starts_with("/**") && !line.starts_with('*'))
.filter(|line| line.contains(": "))
.map(|line| line.trim_end_matches(['{', ',', ' ', ';', '}']).to_owned())
.collect()
}
#[test]
fn a_structure_kind_is_one_of_the_five_words_the_view_writes() {
assert!(
fields::<view::StructureView>().contains(
&r#"kind: "record" | "event" | "attribute" | "structure" | "unknown""#.to_owned()
),
"{:?}",
fields::<view::StructureView>()
);
}
#[test]
fn fields_are_camel_case_and_an_absent_value_is_null() {
assert_eq!(
fields::<view::IndividualView>(),
[
"xref: string",
"names: Array<NameView>",
"sex: string | null",
"events: Array<EventView>",
"childIn: Array<FamilyLinkView>",
"partnerIn: Array<FamilyLinkView>",
"citations: Array<string>",
"media: Array<string>",
"identifiers: Array<IdentifierView>",
]
);
assert!(fields::<view::EventView>().contains(&"sortKey: number | null".to_owned()));
}
#[test]
fn unit_enums_are_the_variant_names_serde_writes() {
assert_eq!(
convert::ConversionKind::decl(&config()),
r#"type ConversionKind = "Converted" | "Dropped" | "Kept";"#
);
assert!(validate::Severity::decl(&config()).contains(r#""Contradiction" | "Question""#));
}
#[test]
fn every_serialized_type_has_a_definition() {
let config = config();
for exported in [
build::WrappedLine::export_to_string(&config),
convert::ConversionNote::export_to_string(&config),
dates::Timestamp::export_to_string(&config),
dates::Precision::export_to_string(&config),
decode::EncodingReport::export_to_string(&config),
family::FamilyMembers::export_to_string(&config),
gedcomkit::UnresolvedPointer::export_to_string(&config),
validate::Finding::export_to_string(&config),
view::RecordView::export_to_string(&config),
view::FamilyView::export_to_string(&config),
view::IndividualView::export_to_string(&config),
] {
let exported = exported.expect("exports");
assert!(exported.contains("export type "), "{exported}");
}
}