biors 0.51.0

Command-line tools for bio-rs biological AI model input workflows.
use serde_json::Value;
use std::process::{Command, Stdio};

mod common;
use common::ChildInputExt;

const PDB: &str = "\
HEADER    TEST STRUCTURE                          01-JAN-00   1ABC
TITLE     EXAMPLE STRUCTURE
SEQRES   1 A    4  ALA CYS ASP GLU
REMARK 465     CYS A    2
ATOM      1  N   ALA A   1      11.104  13.207  14.100  1.00 20.00           N
ATOM      2  CA  ALA A   1      12.000  13.500  14.700  1.00 21.00           C
ATOM      3  N   GLU A   4      15.104  17.207  18.100  1.00 20.00           N
END
";

#[test]
fn structure_validate_pdb_reports_chain_mapping_and_missing_residue() {
    let output = common::run_biors_stdin(&["structure", "validate", "--format", "pdb", "-"], PDB);
    common::assert_payload_matches_schema(
        &output.stdout,
        "schemas/structure-validation-output.v0.json",
    );

    let value: Value = serde_json::from_slice(&output.stdout).expect("valid JSON output");
    assert_eq!(value["data"]["format"], "pdb");
    assert_eq!(value["data"]["valid"], true);
    assert_eq!(value["data"]["chains"], 1);
    assert_eq!(
        value["data"]["chain_reports"][0]["sequence_mapping"]["status"],
        "coordinate_subsequence"
    );
    assert_eq!(value["data"]["warnings"][0]["code"], "missing_residue");
}

#[test]
fn structure_sequence_pdb_outputs_coordinate_and_seqres_sequences() {
    let output = common::run_biors_stdin(&["structure", "sequence", "--format", "pdb", "-"], PDB);
    common::assert_payload_matches_schema(
        &output.stdout,
        "schemas/structure-sequence-output.v0.json",
    );

    let value: Value = serde_json::from_slice(&output.stdout).expect("valid JSON output");
    assert_eq!(value["data"]["chains"][0]["chain_id"], "A");
    assert_eq!(value["data"]["chains"][0]["coordinate_sequence"], "AE");
    assert_eq!(value["data"]["chains"][0]["seqres_sequence"], "ACDE");
    assert_eq!(
        value["data"]["chains"][0]["mapping"]["coordinate_to_seqres_positions"],
        serde_json::json!([1, 4])
    );
}

#[test]
fn structure_validate_pdb_parse_error_uses_pdb_code() {
    let output = Command::new(env!("CARGO_BIN_EXE_biors"))
        .args(["--json", "structure", "validate", "--format", "pdb", "-"])
        .stdin(Stdio::piped())
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
        .expect("spawn biors structure validate")
        .tap_stdin(
            "ATOM      1  N   ALA A   1      not-num 13.207  14.100  1.00 20.00           N\n",
        );

    assert_eq!(output.status.code(), Some(2));
    assert!(output.stderr.is_empty());
    let value: Value = serde_json::from_slice(&output.stdout).expect("valid JSON error");
    assert_eq!(value["error"]["code"], "pdb.invalid_atom_field");
    assert_eq!(value["error"]["location"]["line"], 1);
}