rosu_pattern_detector/
calc.rs

1use crate::mania;
2use crate::mania::structs::SecondaryPattern;
3use eyre;
4use rosu_map::section::general::GameMode::Mania;
5use rosu_map::Beatmap;
6use std::collections::HashMap;
7pub(crate) fn get_patterns(path: &str) -> eyre::Result<HashMap<SecondaryPattern, f64>> {
8    let map = rosu_map::from_path::<Beatmap>(&path)?;
9    match map.mode
10    {
11        Mania => {
12            Ok(mania::transformers(map))
13        },
14        _ => Err(eyre::eyre!("Unsupported game mode for now."))
15    }
16}
17
18#[cfg(test)]
19mod tests {
20    use super::*;
21    use crate::mania::structs::JumpstreamPattern::JS;
22    use crate::mania::structs::SinglestreamPattern;
23    use crate::mania::structs::{JackPattern, JumpstreamPattern};
24    use crate::utils::{max_by_secondary_type, max_values};
25
26    #[test]
27    fn test_get_patterns_mania_secondary_js() {
28        let test_map_path = "./resources/mania/test_mania_js.osu";
29        let secondary = get_patterns(test_map_path).unwrap();
30        let max_vals = max_by_secondary_type(&secondary);
31        assert_eq!(SecondaryPattern::Jumpstream(JumpstreamPattern::All), max_vals[0].0);
32    }
33
34
35    #[test]
36    fn test_get_patterns_mania_tertiary_js() {
37        let test_map_path = "./resources/mania/test_mania_js.osu";
38        let secondary = get_patterns(test_map_path).unwrap();
39        let max_vals = max_values(&secondary);
40        assert_eq!(SecondaryPattern::Jumpstream(JS), max_vals[0].0);
41    }
42
43    #[test]
44    fn test_get_patterns_mania_secondary_cj() {
45        let test_map_path = "./resources/mania/test_mania_dense_cj.osu";
46        let secondary = get_patterns(test_map_path).unwrap();
47        let max_vals = max_by_secondary_type(&secondary);
48        assert_eq!(SecondaryPattern::Jack(JackPattern::All), max_vals[0].0);
49    }
50
51
52    #[test]
53    fn test_get_patterns_mania_tertiary_dense_cj() {
54        let test_map_path = "./resources/mania/test_mania_dense_cj.osu";
55        let secondary = get_patterns(test_map_path).unwrap();
56        let max_vals = max_values(&secondary);
57        assert!(max_vals.iter().any(|(pattern, _)| matches!(pattern, SecondaryPattern::Jack(JackPattern::DenseChordjack))));
58    }
59
60
61    #[test]
62    fn test_get_patterns_mania_secondary_singlestream() {
63        let test_map_path = "./resources/mania/test_mania_singlestream.osu";
64        let secondary = get_patterns(test_map_path).unwrap();
65        let max_vals = max_by_secondary_type(&secondary);
66        assert_eq!(SecondaryPattern::Singlestream(SinglestreamPattern::All), max_vals[0].0);
67    }
68
69
70    #[test]
71    fn test_get_patterns_mania_tertiary_singlestream() {
72        let test_map_path = "./resources/mania/test_mania_singlestream.osu";
73        let secondary = get_patterns(test_map_path).unwrap();
74        let max_vals = max_values(&secondary);
75        assert!(max_vals.iter().any(|(pattern, _)| matches!(pattern, SecondaryPattern::Singlestream(SinglestreamPattern::Singlestream))));
76    }
77
78    #[test]
79    fn test_get_patterns_invalid_path() {
80        let invalid_path = "non_existent_file.osu";
81
82        let result = get_patterns(invalid_path);
83
84        assert!(result.is_err());
85    }
86}
87
88