molframe-cif 0.6.1

PDBx/mmCIF reading and writing for molframe
Documentation
use super::*;
use crate::{CifValue, Document, parse};
use molframe_core::io::InputBuffer;

#[test]
fn every_quote_shape_reparses_to_the_original_text() {
    for text in [
        "plain",
        "two words",
        "don't",
        "say \"don't\"",
        "line\nbreak",
    ] {
        let rendered = render_value(&CifValue::Text(text.to_owned().into()));
        let source = format!("data_x\n_test.value {rendered}\n");
        let input = InputBuffer::from_bytes(source.into_bytes());
        let Ok((document, _)) = parse(&input) else {
            panic!("rendered value did not parse: {rendered}");
        };
        assert_eq!(value(&document), Some(text));
    }
}

#[test]
fn reserved_cif_words_are_not_rendered_bare() {
    for text in ["loop_", "STOP_", "data_x", "save_frame", ".", "?"] {
        assert_ne!(quote_text(text), text);
    }
}

#[test]
fn streaming_quoting_is_exactly_equivalent_for_every_shape() {
    for text in [
        "",
        "plain",
        "two words",
        "don't",
        "say \"don't\"",
        "line\nbreak",
        "_tag",
        "#comment",
        ".",
        "?",
        "loop_",
        "STOP_",
        "global_",
        "data_x",
        "save_frame",
        "[list]",
        "$value",
        ";field",
    ] {
        let mut streamed = String::new();
        write_quoted(&mut streamed, text);
        assert_eq!(streamed, quote_text(text), "text={text:?}");
    }
}

fn value(document: &Document) -> Option<&str> {
    document.first_block()?.category("test")?.text("value", 0)
}