use std::io::Write;
use yara_mapper::{
IndexerOptions, MapperOptions, ReadBatch, ReadEnd, Sensitivity, YaraIndexer, YaraMapper,
};
fn write_test_fasta(path: &std::path::Path) {
let mut f = std::fs::File::create(path).unwrap();
let base_seq = "ATTTTATAAAGAGAAGCCTGGGGCAAAAATAAATTCAGTAATTTGTTGACTCTTCTAAAGCACATTAGTGGTGGAACTGCAACTCACCATTATTTCCTTCTAAGACCTTTGCTCTTCTCCCCAGGACTTAAGGCTCTTCAGCGTGTCTAA";
let substitutions = [('A', 'C'), ('C', 'G'), ('G', 'T'), ('T', 'A')];
for i in 0..200 {
writeln!(f, ">contig_{i}").unwrap();
let mut seq: Vec<u8> = base_seq.bytes().collect();
for j in 0..3 {
let pos = (i * 3 + j * 7) % seq.len();
let orig = seq[pos] as char;
for &(from, to) in &substitutions {
if orig == from {
seq[pos] = to as u8;
break;
}
}
}
f.write_all(&seq).unwrap();
writeln!(f).unwrap();
}
}
#[test]
fn strata_count_sentinel_does_not_crash() {
let tmp = tempfile::tempdir().unwrap();
let fasta = tmp.path().join("ref.fasta");
let prefix = tmp.path().join("ref.fasta.yara");
write_test_fasta(&fasta);
let _indexer = YaraIndexer::build(&fasta, &prefix, &IndexerOptions::default())
.expect("index build failed");
let options = MapperOptions {
sensitivity: Sensitivity::Full,
threads: 1,
strata_count: None,
..Default::default()
};
let mapper = YaraMapper::open(&prefix, &options).expect("open failed");
let seq = b"ATTTTATAAAGAGAAGCCTGGGGCAAAAATAAATTCAGTAATTTGTTGACTCTTCTAAAGCACATTAGTGGTGGAACTGCAACTCACCATTATTTCCTTCTAAGACCTTTGCTCTTCTCCCCAGGACTTAAGGCTCTTCAGCGTGTCTAA";
let qual = vec![b'I'; seq.len()];
let mut batch = ReadBatch::new();
batch.push("test_read", ReadEnd { seq, qual: &qual }, ReadEnd { seq, qual: &qual }).unwrap();
let records = mapper.map_paired(&batch).expect("mapping failed");
assert!(!records.is_empty(), "expected at least one alignment record");
}