Beatsaber Rust Utilities: A Beatsaber V3 parsing library.
beatsaber beatmap
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Simple step calculations in filter methods.

This does not consider filter type, altho the `Filter` methods may not need to care anyway.

AlephCubed a560b2c8 0121a06d

+59 -2
+52 -1
src/difficulty/lightshow/filter.rs
··· 82 82 pub fn is_in_filter(&self, mut light_id: i32, mut group_size: i32) -> bool { 83 83 assert!(light_id < group_size); 84 84 85 + if let Some(limit) = self.limit_percent { 86 + if light_id >= (group_size as f32 * limit) as i32 { 87 + return false; 88 + } 89 + } 90 + 85 91 if self.reverse.is_true() { 86 92 light_id = group_size - light_id - 1; 87 93 } ··· 122 128 group_size = chunks; 123 129 } 124 130 125 - match self.filter_type { 131 + let mut filtered = match self.filter_type { 126 132 FilterType::Division => { 127 133 let start = self.parameter2 * group_size / self.parameter1.max(1); 128 134 let end = (self.parameter2 + 1) * group_size / self.parameter1.max(1); ··· 132 138 group_size / self.parameter2.max(1) - self.parameter1 / self.parameter2.max(1) 133 139 } 134 140 FilterType::Unknown(_) => group_size, 141 + }; 142 + 143 + if let Some(limit) = self.limit_percent { 144 + filtered = (filtered as f32 * limit) as i32; 135 145 } 146 + 147 + filtered 136 148 } 137 149 138 150 #[allow(deprecated)] ··· 141 153 /// If the [`FilterType`] is `Unknown` then the result will be the same as `light_id`. 142 154 /// # Panics 143 155 /// Will panic if the light ID is greater than or equal to the group size. 156 + // Todo what is the behaviour when the light ID is not in the filter? 144 157 #[must_use] 145 158 #[inline] 146 159 #[deprecated(note = "Experimental. Does not consider random or limit in calculations.")] ··· 208 221 None = 0, 209 222 Duration = 1, 210 223 Distribution = 2, 224 + Both = 3, 211 225 } 212 226 ); 213 227 ··· 450 464 assert!((0..3).all(|i| filter.get_relative_index(i, 8) == 0)); 451 465 assert!((3..6).all(|i| filter.get_relative_index(i, 8) == 1)); 452 466 assert!((6..8).all(|i| filter.get_relative_index(i, 8) == 2)); 467 + } 468 + 469 + #[test] 470 + fn limit() { 471 + let filter = Filter { 472 + limit_percent: Some(0.5), 473 + ..Default::default() 474 + }; 475 + 476 + assert!((0..6).all(|i| filter.is_in_filter(i, 12))); 477 + assert!((6..12).all(|i| !filter.is_in_filter(i, 12))); 478 + assert_eq!(filter.count_filtered(12), 6); 479 + assert!((0..6).all(|i| filter.get_relative_index(i, 12) == i)); 480 + } 481 + 482 + #[test] 483 + fn limit_non_factor_none() { 484 + let filter = Filter { 485 + limit_percent: Some(0.01), 486 + ..Default::default() 487 + }; 488 + 489 + assert!((0..8).all(|i| !filter.is_in_filter(i, 8))); 490 + assert_eq!(filter.count_filtered(8), 0); 491 + } 492 + 493 + #[test] 494 + fn limit_non_factor_all_but_one() { 495 + let filter = Filter { 496 + limit_percent: Some(0.90), 497 + ..Default::default() 498 + }; 499 + 500 + assert!((0..7).all(|i| filter.is_in_filter(i, 8))); 501 + assert!(!filter.is_in_filter(7, 8)); 502 + assert_eq!(filter.count_filtered(8), 7); 503 + assert!((0..7).all(|i| filter.get_relative_index(i, 8) == i)); 453 504 } 454 505 }
+6 -1
test_maps/README.md
··· 1 - Put testing maps in this directory. 1 + Put testing maps in this directory. 2 + 3 + The map test is ignored by default, so to run it use: 4 + ```rust 5 + cargo test -- --ignored 6 + ```
+1
tests/parse_map.rs
··· 3 3 use std::fs; 4 4 5 5 #[test] 6 + #[ignore] 6 7 fn parse_beatmaps() { 7 8 let paths = fs::read_dir("test_maps").unwrap().filter_map(|result| { 8 9 if let Ok(dir) = result {