use super::*;
fn names(v: &[&str]) -> Vec<Box<str>> {
v.iter().map(|s| Box::from(*s)).collect()
}
#[test]
fn gene_index_resolves_hgnc_renames_both_ways() {
let dict = names(&[
"H4C3", "H2BC21", "H1-0", "MARCHF2", "SEPTIN7", "MTARC1", "CD8A",
]);
let idx = GeneIndex::build(&dict);
assert_eq!(idx.match_gene("HIST1H4C"), Some(0));
assert_eq!(idx.match_gene("HIST2H2BE"), Some(1));
assert_eq!(idx.match_gene("H1F0"), Some(2));
assert_eq!(idx.match_gene("MARCH2"), Some(3), "rule-based MARCH family");
assert_eq!(idx.match_gene("SEPT7"), Some(4), "rule-based SEPT family");
assert_eq!(
idx.match_gene("MARC1"),
Some(5),
"MARC1 is MTARC1, not a MARCH-family member"
);
let old = names(&["HIST1H4C", "MARCH2", "SEPT7", "CD8A"]);
let idx_old = GeneIndex::build(&old);
assert_eq!(idx_old.match_gene("H4C3"), Some(0));
assert_eq!(idx_old.match_gene("MARCHF2"), Some(1));
assert_eq!(idx_old.match_gene("SEPTIN7"), Some(2));
let faba = names(&["ENSG00000197061_H4C3/count/spliced", "CD8A/count/spliced"]);
let idx_faba = GeneIndex::build(&faba);
assert_eq!(idx_faba.match_gene("HIST1H4C"), Some(0));
assert_eq!(idx.match_gene("ZZZ9"), None);
}
#[test]
fn gene_index_tiers_and_idf() {
let dict = names(&["ENSG00000153563_CD8A", "MS4A1", "A_FOO", "FOO"]);
let idx = GeneIndex::build(&dict);
assert_eq!(idx.match_gene("ms4a1"), Some(1));
assert_eq!(idx.match_gene("CD8A"), Some(0));
assert_eq!(idx.match_gene("FOO"), Some(3));
assert_eq!(idx.match_gene("ZZZ9"), None);
assert_eq!(idx.match_gene("ENSG00000153563"), Some(0));
assert_eq!(idx.match_gene("ENSG00000153563_CD8A"), Some(0));
let dict2 = names(&["ENSG00000153563", "MS4A1"]);
let idx2 = GeneIndex::build(&dict2);
assert_eq!(idx2.match_gene("ENSG00000153563_CD8A"), Some(0));
assert_eq!(idx2.match_gene("ensg00000153563"), Some(0));
assert_eq!(idf_weight(4, 4), 0.0);
assert!(idf_weight(4, 1) > 1.38 && idf_weight(4, 1) < 1.39);
}
#[test]
fn a_row_is_named_by_id_alone_when_its_name_adds_nothing() {
assert_eq!(id_name("FID1", "GENE1"), Box::from("FID1_GENE1"));
assert_eq!(id_name("FID2", "FID2"), Box::from("FID2"));
assert_eq!(id_name("FID3", ""), Box::from("FID3"));
}