use crate::core::app::EditorState;
impl EditorState {
pub fn set_bpm_target(&mut self, target: usize) {
self.bpm_target = target.clamp(1, 360);
}
pub fn set_bpm(&mut self, bpm: usize) {
let c = bpm.clamp(1, 360);
self.bpm = c;
self.bpm_target = c;
}
pub fn mod_bpm_target(&mut self, diff: isize) {
let new_target = (self.bpm_target as isize + diff).clamp(1, 360) as usize;
self.bpm_target = new_target;
}
pub fn mod_bpm(&mut self, diff: isize) {
let new_val = (self.bpm as isize + diff).clamp(1, 360) as usize;
self.bpm = new_val;
self.bpm_target = new_val;
}
}
#[cfg(test)]
mod tests {
use crate::core::app::EditorState;
#[test]
fn test_set_bpm_clamps() {
let mut app = EditorState::new(10, 10, 1, 100);
app.set_bpm(120);
assert_eq!(app.bpm, 120);
assert_eq!(app.bpm_target, 120);
app.set_bpm(0);
assert_eq!(app.bpm, 1);
app.set_bpm(400);
assert_eq!(app.bpm, 360);
}
#[test]
fn test_set_bpm_target_clamps() {
let mut app = EditorState::new(10, 10, 1, 100);
app.set_bpm_target(150);
assert_eq!(app.bpm_target, 150);
app.set_bpm_target(0);
assert_eq!(app.bpm_target, 1);
app.set_bpm_target(999);
assert_eq!(app.bpm_target, 360);
}
#[test]
fn test_mod_bpm() {
let mut app = EditorState::new(10, 10, 1, 100);
app.set_bpm(120);
app.mod_bpm(69);
assert_eq!(app.bpm, 189);
assert_eq!(app.bpm_target, 189);
app.mod_bpm(-189);
assert_eq!(app.bpm, 1);
app.mod_bpm(360);
assert_eq!(app.bpm, 360);
}
#[test]
fn test_mod_bpm_target() {
let mut app = EditorState::new(10, 10, 1, 100);
app.set_bpm_target(120);
app.mod_bpm_target(50);
assert_eq!(app.bpm_target, 170);
app.mod_bpm_target(-200);
assert_eq!(app.bpm_target, 1);
app.mod_bpm_target(400);
assert_eq!(app.bpm_target, 360);
}
}
#[cfg(test)]
mod property_tests {
use crate::core::app::EditorState;
use proptest::prelude::*;
proptest! {
#[test]
fn prop_bpm_always_clamped(
initial in any::<usize>(),
target in any::<usize>(),
mod_val in any::<isize>(),
mod_target in any::<isize>()
) {
let mut app = EditorState::new(10, 10, 1, 100);
app.set_bpm(initial);
assert!(app.bpm >= 1 && app.bpm <= 360);
assert_eq!(app.bpm, app.bpm_target);
app.set_bpm_target(target);
assert!(app.bpm_target >= 1 && app.bpm_target <= 360);
app.mod_bpm(mod_val);
assert!(app.bpm >= 1 && app.bpm <= 360);
assert_eq!(app.bpm, app.bpm_target);
app.mod_bpm_target(mod_target);
assert!(app.bpm_target >= 1 && app.bpm_target <= 360);
}
}
}