#![allow(dead_code)]
#[derive(Clone, Copy, Debug)]
pub struct TimeSignature {
numerator: u8,
denominator: u8,
}
impl TimeSignature {
pub fn new(numerator: u8, denominator: u8) -> TimeSignature {
TimeSignature {
numerator,
denominator,
}
}
pub fn is_valid(&self) -> bool {
let denominator = self.denominator;
self.numerator > 0
&& (denominator == 2
|| denominator == 4
|| denominator == 8
|| denominator == 16
|| denominator == 32)
}
pub fn get_numerator(&self) -> u8 {
self.numerator
}
pub fn get_denominator(&self) -> u8 {
self.denominator
}
pub fn as_tuple(&self) -> (u8, u8) {
(self.numerator, self.denominator)
}
}
impl PartialEq for TimeSignature {
fn eq(&self, other: &TimeSignature) -> bool {
self.numerator == other.numerator && self.denominator == other.denominator
}
}
impl Default for TimeSignature {
fn default() -> TimeSignature {
TimeSignature {
numerator: 4,
denominator: 4,
}
}
}
mod tests {
#[test]
fn test_valid() {
use crate::time_signature::TimeSignature;
assert_eq!(TimeSignature::default().is_valid(), true);
assert_eq!(TimeSignature::new(4, 5).is_valid(), false);
assert_eq!(TimeSignature::new(0, 2).is_valid(), false);
}
#[test]
fn test_equality() {
use crate::time_signature::TimeSignature;
let a = TimeSignature::default();
let b = TimeSignature::new(4, 4);
assert_eq!(a, b);
let a = TimeSignature::new(3, 4);
let b = TimeSignature::new(4, 4);
assert_ne!(a, b);
}
}