···8282 pub fn is_in_filter(&self, mut light_id: i32, mut group_size: i32) -> bool {
8383 assert!(light_id < group_size);
84848585+ if let Some(limit) = self.limit_percent {
8686+ if light_id >= (group_size as f32 * limit) as i32 {
8787+ return false;
8888+ }
8989+ }
9090+8591 if self.reverse.is_true() {
8692 light_id = group_size - light_id - 1;
8793 }
···122128 group_size = chunks;
123129 }
124130125125- match self.filter_type {
131131+ let mut filtered = match self.filter_type {
126132 FilterType::Division => {
127133 let start = self.parameter2 * group_size / self.parameter1.max(1);
128134 let end = (self.parameter2 + 1) * group_size / self.parameter1.max(1);
···132138 group_size / self.parameter2.max(1) - self.parameter1 / self.parameter2.max(1)
133139 }
134140 FilterType::Unknown(_) => group_size,
141141+ };
142142+143143+ if let Some(limit) = self.limit_percent {
144144+ filtered = (filtered as f32 * limit) as i32;
135145 }
146146+147147+ filtered
136148 }
137149138150 #[allow(deprecated)]
···141153 /// If the [`FilterType`] is `Unknown` then the result will be the same as `light_id`.
142154 /// # Panics
143155 /// Will panic if the light ID is greater than or equal to the group size.
156156+ // Todo what is the behaviour when the light ID is not in the filter?
144157 #[must_use]
145158 #[inline]
146159 #[deprecated(note = "Experimental. Does not consider random or limit in calculations.")]
···208221 None = 0,
209222 Duration = 1,
210223 Distribution = 2,
224224+ Both = 3,
211225 }
212226);
213227···450464 assert!((0..3).all(|i| filter.get_relative_index(i, 8) == 0));
451465 assert!((3..6).all(|i| filter.get_relative_index(i, 8) == 1));
452466 assert!((6..8).all(|i| filter.get_relative_index(i, 8) == 2));
467467+ }
468468+469469+ #[test]
470470+ fn limit() {
471471+ let filter = Filter {
472472+ limit_percent: Some(0.5),
473473+ ..Default::default()
474474+ };
475475+476476+ assert!((0..6).all(|i| filter.is_in_filter(i, 12)));
477477+ assert!((6..12).all(|i| !filter.is_in_filter(i, 12)));
478478+ assert_eq!(filter.count_filtered(12), 6);
479479+ assert!((0..6).all(|i| filter.get_relative_index(i, 12) == i));
480480+ }
481481+482482+ #[test]
483483+ fn limit_non_factor_none() {
484484+ let filter = Filter {
485485+ limit_percent: Some(0.01),
486486+ ..Default::default()
487487+ };
488488+489489+ assert!((0..8).all(|i| !filter.is_in_filter(i, 8)));
490490+ assert_eq!(filter.count_filtered(8), 0);
491491+ }
492492+493493+ #[test]
494494+ fn limit_non_factor_all_but_one() {
495495+ let filter = Filter {
496496+ limit_percent: Some(0.90),
497497+ ..Default::default()
498498+ };
499499+500500+ assert!((0..7).all(|i| filter.is_in_filter(i, 8)));
501501+ assert!(!filter.is_in_filter(7, 8));
502502+ assert_eq!(filter.count_filtered(8), 7);
503503+ assert!((0..7).all(|i| filter.get_relative_index(i, 8) == i));
453504 }
454505}
+6-1
test_maps/README.md
···11-Put testing maps in this directory.11+Put testing maps in this directory.
22+33+The map test is ignored by default, so to run it use:
44+```rust
55+cargo test -- --ignored
66+```
+1
tests/parse_map.rs
···33use std::fs;
4455#[test]
66+#[ignore]
67fn parse_beatmaps() {
78 let paths = fs::read_dir("test_maps").unwrap().filter_map(|result| {
89 if let Ok(dir) = result {