use mrrc::mods::mods_xml_to_record;
fn assert_subfield(record: &mrrc::Record, tag: &str, code: char, expected: &str) {
let fields = record
.get_fields(tag)
.unwrap_or_else(|| panic!("Expected field {tag} not found"));
let found = fields.iter().any(|f| {
f.subfields
.iter()
.any(|sf| sf.code == code && sf.value == expected)
});
assert!(
found,
"Field {tag}${code} with value \"{expected}\" not found. Fields: {fields:?}",
);
}
#[test]
fn test_conformance_simple_monograph() {
let xml = include_str!("data/mods/simple_monograph.xml");
let record = mods_xml_to_record(xml).expect("Failed to parse simple_monograph");
assert_subfield(&record, "245", 'a', "Rust Systems Programming");
assert_subfield(&record, "245", 'b', "A Practical Guide");
assert_subfield(&record, "100", 'a', "Smith, Jane");
assert_subfield(&record, "100", 'd', "1975-");
assert_subfield(&record, "100", 'e', "creator");
assert_subfield(&record, "260", 'a', "San Francisco");
assert_subfield(&record, "260", 'b', "O'Reilly Media");
assert_subfield(&record, "260", 'c', "2020");
assert_subfield(&record, "300", 'a', "xv, 450 pages");
assert_subfield(&record, "300", 'c', "24 cm");
assert_subfield(
&record,
"520",
'a',
"An introduction to systems programming using the Rust language.",
);
assert_subfield(&record, "650", 'a', "Rust (Computer program language)");
assert_subfield(
&record,
"650",
'a',
"Systems programming (Computer science)",
);
assert_subfield(&record, "020", 'a', "9781491927285");
assert_subfield(&record, "041", 'a', "eng");
assert_eq!(record.leader.record_type, 'a');
}
#[test]
fn test_conformance_multi_author() {
let xml = include_str!("data/mods/multi_author.xml");
let record = mods_xml_to_record(xml).expect("Failed to parse multi_author");
assert_subfield(&record, "245", 'a', "Advanced Database Systems");
assert_subfield(&record, "100", 'a', "Garcia, Maria");
assert_subfield(&record, "700", 'a', "Chen, Wei");
assert_subfield(&record, "710", 'a', "University Press");
assert_subfield(&record, "260", 'a', "Cambridge");
assert_subfield(&record, "260", 'b', "University Press");
assert_subfield(&record, "260", 'c', "2021");
assert_subfield(&record, "250", 'a', "2nd ed.");
assert_subfield(&record, "020", 'a', "9780521168120");
assert_subfield(&record, "010", 'a', "2021012345");
assert_subfield(&record, "050", 'a', "QA76.9.D3");
assert_subfield(&record, "082", 'a', "005.74");
}
#[test]
fn test_conformance_with_subjects() {
let xml = include_str!("data/mods/with_subjects.xml");
let record = mods_xml_to_record(xml).expect("Failed to parse with_subjects");
assert_subfield(&record, "245", 'a', "History of the American West");
assert_subfield(&record, "100", 'a', "Johnson, Robert");
assert_subfield(&record, "655", 'a', "History");
assert_subfield(&record, "650", 'a', "Frontier and pioneer life");
assert_subfield(&record, "651", 'a', "West (U.S.)");
assert_subfield(&record, "650", 'a', "Native Americans");
assert_subfield(&record, "020", 'a', "9780195071221");
assert_eq!(record.get_control_field("001"), Some("99887766"));
assert_eq!(record.get_control_field("003"), Some("OCoLC"));
assert_subfield(&record, "040", 'a', "DLC");
assert_subfield(&record, "506", 'a', "Open access");
assert_subfield(
&record,
"505",
'a',
"Chapter 1: The frontier -- Chapter 2: Expansion",
);
assert_subfield(&record, "521", 'a', "General");
}
#[test]
fn test_conformance_with_related_items() {
let xml = include_str!("data/mods/with_related_items.xml");
let record = mods_xml_to_record(xml).expect("Failed to parse with_related_items");
assert_subfield(&record, "245", 'a', "Machine Learning Fundamentals");
assert_subfield(&record, "100", 'a', "Lee, David");
assert_subfield(&record, "260", 'a', "New York");
assert_subfield(&record, "260", 'b', "Springer");
assert_subfield(&record, "260", 'c', "2022");
assert_subfield(&record, "300", 'a', "xii, 380 pages");
assert_subfield(&record, "300", 'c', "25 cm");
assert_subfield(&record, "020", 'a', "9783030597849");
assert_subfield(&record, "773", 't', "Graduate Texts in Computer Science");
assert_subfield(&record, "830", 'a', "Springer AI Series");
assert_subfield(&record, "852", 'a', "MIT Libraries");
assert_subfield(&record, "540", 'a', "Copyright 2022 Springer");
}