use super::starts_with_coordinate_keyword;
#[test]
fn a_well_formed_coordinate_row_is_not_malformed() {
assert!(!starts_with_coordinate_keyword(
"ATOM 1 N ALA A 1 27.340 24.430 2.614 1.00 10.00 N"
));
assert!(!starts_with_coordinate_keyword(
"HETATM 1 O HOH A 100 27.340 24.430 2.614 1.00 10.00 O"
));
}
#[test]
fn a_serial_that_outgrew_its_field_is_recognised_as_a_coordinate_row() {
assert!(starts_with_coordinate_keyword(
"ATOM 100000 N ALA A 1 27.340 24.430 2.614 1.00 10.00 N"
));
assert!(starts_with_coordinate_keyword(
"ATOM 1000000 N ALA A 1 27.340 24.430 2.614 1.00 10.00 N"
));
}
#[test]
fn other_records_and_prose_are_not_coordinate_rows() {
for line in [
"HEADER HYDROLASE 01-JAN-00 1ABC",
"TER 7 ASN A 2",
"REMARK 2 RESOLUTION. 1.50 ANGSTROMS.",
"",
"ATOM",
] {
assert!(
!starts_with_coordinate_keyword(line),
"`{line}` is not a coordinate row"
);
}
}
#[test]
fn a_serial_that_outgrew_its_field_is_reported_as_an_unparseable_row() {
use molframe_core::diagnostic::Code;
use molframe_core::io::{InputBuffer, ReadOptions};
let input = InputBuffer::from_bytes(
"ATOM 100000 N ALA A 1 27.340 24.430 2.614 1.00 10.00 N\n\
END\n"
.as_bytes()
.to_vec(),
);
let Err(findings) = crate::read(&input, &ReadOptions::new()) else {
panic!("a serial outside the field layout cannot be read as an atom row");
};
assert!(
findings.iter().any(|finding| {
finding.code() == Code::E1201 && finding.message().contains("fields do not parse")
}),
"the report must name the field layout, not claim the file is empty: {findings:?}"
);
let input = InputBuffer::from_bytes(
"ATOM A0000 N ALA A 1 27.340 24.430 2.614 1.00 10.00 N\n\
END\n"
.as_bytes()
.to_vec(),
);
let (structure, _) = crate::read(&input, &ReadOptions::new())
.unwrap_or_else(|findings| panic!("hybrid-36 serial: {findings:?}"));
assert_eq!(structure.atom_count(), 1);
}
#[test]
fn a_file_without_coordinate_records_reports_exactly_that() {
use molframe_core::diagnostic::Code;
use molframe_core::io::{InputBuffer, ReadOptions};
let input = InputBuffer::from_bytes(b"HEADER NOTHING\nEND\n".to_vec());
let Err(findings) = crate::read(&input, &ReadOptions::new()) else {
panic!("no coordinates is a failure");
};
assert!(
findings.iter().any(|finding| finding.code() == Code::E1001
&& finding.message().contains("no coordinate records")),
"{findings:?}"
);
assert!(
!findings.iter().any(|finding| finding.code() == Code::E1201),
"a file with no coordinate rows at all must not be reported as a layout fault: {findings:?}"
);
}