fxsplit 0.0.3

split FASTX into N chunks/files/headers
Documentation
mod common;

use common::*;
use flate2::write::GzEncoder;
use flate2::Compression;
use std::io::Write;
use std::process::{Command, Stdio};

fn run_binary(args: &[&str], stdin_bytes: &[u8]) {
    let mut child = Command::new(env!("CARGO_BIN_EXE_fxsplit"))
        .args(args)
        .stdin(Stdio::piped())
        .stdout(Stdio::null())
        .stderr(Stdio::null())
        .spawn()
        .expect("failed to spawn fxsplit");

    child
        .stdin
        .as_mut()
        .expect("missing stdin handle")
        .write_all(stdin_bytes)
        .expect("failed to write stdin");

    let status = child.wait().expect("failed to wait on fxsplit");
    assert!(status.success());
}

#[test]
fn plain_fasta_can_be_read_from_stdin() {
    let t = tempdir();
    let outdir = join(t.path(), "out_chunks");

    run_binary(
        &[
            "--chunks",
            "2",
            "--threads",
            "2",
            "--outdir",
            &path_str(&outdir),
        ],
        b">r1\nAAAA\n>r2\nCCCC\n>r3\nGGGG\n",
    );

    let files = list_files(&outdir);
    assert_eq!(files.len(), 2);

    let counts: Vec<usize> = files
        .iter()
        .map(|name| count_fasta_records(&join(&outdir, name), false))
        .collect();
    assert_eq!(counts, vec![2, 1]);
}

#[test]
fn gz_fastq_can_be_read_from_stdin() {
    let t = tempdir();
    let outdir = join(t.path(), "out_chunks");

    let mut gz = GzEncoder::new(Vec::new(), Compression::default());
    gz.write_all(b"@r1\naaaa\n+\n!!!!\n@r2\ncccc\n+\n####\n")
        .expect("failed to write gzip payload");
    let input = gz.finish().expect("failed to finish gzip payload");

    run_binary(
        &[
            "--chunks",
            "1",
            "--threads",
            "2",
            "--outdir",
            &path_str(&outdir),
        ],
        &input,
    );

    let files = list_files(&outdir);
    assert_eq!(files.len(), 2);

    let counts: Vec<usize> = files
        .iter()
        .map(|name| count_fastq_records(&join(&outdir, name), true))
        .collect();
    assert_eq!(counts, vec![1, 1]);
}