termal-export 0.2.0

A generator of SVG representations of multiple sequence alignments
Documentation
// SPDX-License-Identifier: MIT
// Copyright (c) 2025-2026 Thomas Junier

use assert_cmd::Command;
use predicates::prelude::*;
use std::io::Write;
use tempfile::NamedTempFile;

fn fasta_fixture() -> NamedTempFile {
    let mut file = NamedTempFile::new().unwrap();
    writeln!(file, ">seq1").unwrap();
    writeln!(file, "ACG").unwrap();
    writeln!(file, ">seq2").unwrap();
    writeln!(file, "TTA").unwrap();
    file
}

#[test]
#[ignore = "order not implemented yet"]
fn cli_requires_order_argument_for_now() {
    let input = fasta_fixture();

    let mut cmd = Command::cargo_bin("termal-export").unwrap();
    cmd.arg(input.path());

    cmd.assert()
        .failure()
        .stderr(predicate::str::contains("--order <ORDER>"));
}

#[test]
fn cli_rejects_invalid_rows_range_syntax() {
    let input = fasta_fixture();

    let mut cmd = Command::cargo_bin("termal-export").unwrap();
    cmd.args(["--order", "TODO"])
        .arg(input.path())
        .args(["--rows", "abc"]);

    cmd.assert()
        .failure()
        .stderr(predicate::str::contains("invalid range 'abc'"));
}

#[test]
fn cli_rejects_reversed_rows_range() {
    let input = fasta_fixture();

    let mut cmd = Command::cargo_bin("termal-export").unwrap();
    cmd.args(["--order", "TODO"])
        .arg(input.path())
        .args(["--rows", "5:2"]);

    cmd.assert().failure().stderr(predicate::str::contains(
        "range START must be <= END in '5:2'",
    ));
}

#[test]
fn cli_rejects_invalid_cols_range_syntax() {
    let input = fasta_fixture();

    let mut cmd = Command::cargo_bin("termal-export").unwrap();
    cmd.args(["--order", "TODO"])
        .arg(input.path())
        .args(["--cols", "bogus"]);

    cmd.assert()
        .failure()
        .stderr(predicate::str::contains("invalid range 'bogus'"));
}