bcl2fq_stats/
utils.rs

1use std::collections::HashMap;
2
3/// Descending sorting a hashmap, and return a vector of tuple
4pub fn sort_hashmap(input_hashmap: &HashMap<String, u64>) -> Result<Vec<(&String, &u64)>, String> {
5    let mut input_vec = Vec::from_iter(input_hashmap);
6    input_vec.sort_by(|(_, a), (_, b)| b.cmp(&a));
7    Ok(input_vec)
8}
9
10#[cfg(test)]
11mod tests {
12    use super::*;
13    use rstest::rstest;
14
15    #[rstest]
16    #[case(
17        vec![("AAA".to_string(), 1), ("ACA".to_string(), 2)], 
18        vec![("ACA".to_string(), 2), ("AAA".to_string(), 1)]
19    )]
20    #[case(
21        vec![("TTT".to_string(), 4),("AAA".to_string(), 1), ("ACA".to_string(), 2)], 
22        vec![("TTT".to_string(), 4),("ACA".to_string(), 2), ("AAA".to_string(), 1)]
23    )]
24    #[case(
25        vec![("TTT".to_string(), 2),("AAA".to_string(), 3), ("ACA".to_string(), 4)], 
26        vec![("ACA".to_string(), 4),("AAA".to_string(), 3), ("TTT".to_string(), 2)]
27    )]
28    fn test_sort_hashmap(
29        #[case] input_array: Vec<(String, u64)>,
30        #[case] expected_array: Vec<(String, u64)>,
31    ) {
32        let input_hashmap: HashMap<String, u64> = HashMap::from_iter(input_array);
33        let sorted = sort_hashmap(&input_hashmap).unwrap();
34        let sorted_vec: Vec<(String, u64)> = sorted
35            .into_iter()
36            .map(|(k, v)| (k.clone(), v.clone()))
37            .collect();
38        assert_eq!(sorted_vec, expected_array);
39    }
40}