rosu_pattern_detector/
calc.rs1use 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 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