mod helpers;
use helpers::*;
const REF: &str = "CACACACACA";
#[test]
fn unmapped_template_passes_through_untouched() {
let env = TestEnv::new();
let reference = RefBuilder::new().contig("chr1", REF);
let stats = env.stats.to_str().unwrap().to_string();
let r1 = FLAG_PAIRED | FLAG_UNMAPPED | FLAG_MATE_UNMAPPED | FLAG_FIRST_SEGMENT;
let r2 = FLAG_PAIRED | FLAG_UNMAPPED | FLAG_MATE_UNMAPPED | FLAG_LAST_SEGMENT;
let sam = SamBuilder::new()
.sq("chr1", REF.len())
.record("u", r1, "*", 0, "*", "CACACACACA", &q40(10))
.record("u", r2, "*", 0, "*", "CACACACACA", &q40(10));
let recs = run_ok(&sam, &reference, &env, &["--stats", &stats]);
assert_eq!(recs.len(), 2);
for rec in &recs {
assert!(!has_tag(rec, [b'X', b'X']), "unmapped reads must not be tagged");
assert_eq!(u16::from(rec.flags()) & FLAG_QC_FAIL, 0);
}
let g = genome_stats(&env.stats);
assert_eq!(g["unmapped_templates"], "1");
assert_eq!(g["n_evaluated"], "0");
}
#[test]
fn zero_site_template_is_counted_and_not_tagged() {
let env = TestEnv::new();
let reference = RefBuilder::new().contig("chr1", "AAAAAAAAAA");
let stats = env.stats.to_str().unwrap().to_string();
let sam =
SamBuilder::new().sq("chr1", 10).record("z", 0, "chr1", 1, "10M", "AAAAAAAAAA", &q40(10));
let recs = run_ok(&sam, &reference, &env, &["--stats", &stats]);
assert!(!has_tag(&recs[0], [b'X', b'X']));
let g = genome_stats(&env.stats);
assert_eq!(g["zero_site_templates"], "1");
assert_eq!(g["n_evaluated"], "0");
}
#[test]
fn count_threshold_boundary_is_inclusive() {
let env = TestEnv::new();
let reference = RefBuilder::new().contig("chr1", REF);
let sam = SamBuilder::new().sq("chr1", REF.len()).record(
"r",
0,
"chr1",
1,
"10M",
"CACATATATA",
&q40(10), );
let tagged_at_2 = run_ok(&sam, &reference, &env, &["--max-unconverted-count", "2"]);
assert!(has_tag(&tagged_at_2[0], [b'X', b'X']), "2 ≥ 2 → tagged");
let env2 = TestEnv::new();
let not_at_3 = run_ok(&sam, &reference, &env2, &["--max-unconverted-count", "3"]);
assert!(!has_tag(¬_at_3[0], [b'X', b'X']), "2 < 3 → not tagged");
}
#[test]
fn count_of_zero_is_rejected() {
let env = TestEnv::new();
let reference = RefBuilder::new().contig("chr1", REF);
let sam =
SamBuilder::new().sq("chr1", REF.len()).record("r", 0, "chr1", 1, "10M", REF, &q40(10));
let r = run_methylsieve(&sam, &reference, &env, &["--max-unconverted-count", "0"]);
assert!(!r.status_ok, "count 0 should be rejected");
assert!(r.stderr.contains("max-unconverted-count"), "got: {}", r.stderr);
}
#[test]
fn deletion_skips_reference_cytosines() {
let env = TestEnv::new();
let reference = RefBuilder::new().contig("chr1", REF);
let stats = env.stats.to_str().unwrap().to_string();
let sam = SamBuilder::new().sq("chr1", REF.len()).record(
"d",
0,
"chr1",
1,
"4M2D4M",
"CACACACA",
&q40(8),
);
run_ok(&sam, &reference, &env, &["--stats", &stats]);
let g = genome_stats(&env.stats);
assert_eq!(g["CA_total"], "4", "deleted C@4 must not be tallied");
assert_eq!(g["CA_unconv"], "4");
}