use psltools::{Psl, Reader};
fn single(input: &str) -> Psl {
let reader = Reader::<Psl>::from_owned_bytes(input.as_bytes().to_vec()).expect("parse");
assert_eq!(reader.len(), 1);
reader.as_slice()[0].clone()
}
#[test]
fn score_simple_dna() {
let reader = Reader::<Psl>::from_path("tests/data/basic.psl").expect("read");
assert_eq!(reader.as_slice()[0].score(), 10);
}
#[test]
fn score_protein_uses_size_mul_3() {
let reader = Reader::<Psl>::from_path("tests/data/translated.psl").expect("read");
let psl = &reader.as_slice()[0];
assert!(psl.is_protein());
assert_eq!(psl.score(), 30);
}
#[test]
fn score_with_mismatches_and_perfect_identity_block() {
let psl =
single("90\t10\t0\t0\t0\t0\t0\t0\t+\tq\t100\t0\t100\tc\t1000\t0\t100\t1\t100,\t0,\t0,\n");
assert_eq!(psl.score(), 80);
assert_eq!(psl.milli_bad(false), 100);
assert!((psl.percent_id(false) - 90.0).abs() < 1e-9);
}
#[test]
fn milli_bad_exercises_log_term() {
let psl = single(
"50\t0\t0\t0\t1\t10\t0\t0\t+\tq\t100\t0\t60\tc\t1000\t0\t50\t2\t25,25,\t0,35,\t0,25,\n",
);
assert_eq!(psl.score(), 49); assert_eq!(psl.milli_bad(false), 160);
assert!((psl.percent_id(false) - 84.0).abs() < 1e-9);
}
#[test]
fn perfect_alignment_is_zero_milli_bad() {
let reader = Reader::<Psl>::from_path("tests/data/basic.psl").expect("read");
let psl = &reader.as_slice()[0];
assert_eq!(psl.milli_bad(false), 0);
assert!((psl.percent_id(false) - 100.0).abs() < 1e-9);
}