Add tests and fix is_on calculation
This commit is contained in:
		
							parent
							
								
									2f5bb538b2
								
							
						
					
					
						commit
						e923ecb9d8
					
				
					 3 changed files with 71 additions and 2 deletions
				
			
		| 
						 | 
				
			
			@ -23,6 +23,9 @@ pub use relays::DbRelay;
 | 
			
		|||
pub use schedules::{DbPeriods, DbSchedule};
 | 
			
		||||
pub use tag::DbTag;
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
pub(crate) use model_utils::Period;
 | 
			
		||||
 | 
			
		||||
use crate::errors::{DatabaseError, EmgauwaError};
 | 
			
		||||
 | 
			
		||||
static MIGRATOR: Migrator = sqlx::migrate!(); // defaults to "./migrations"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,12 +63,13 @@ impl Period {
 | 
			
		|||
		let start_after_now = self.start.gt(now);
 | 
			
		||||
		// add check for end time being 00:00 because end being 00:00 would cause end_after_now to always be false
 | 
			
		||||
		// this will handle end like 24:00 and end_after_now will be true
 | 
			
		||||
		// same for start_before_end
 | 
			
		||||
		let end_after_now = self.end.gt(now) || self.end.eq(&NaiveTime::MIN);
 | 
			
		||||
		let start_before_end = self.start.lt(&self.end);
 | 
			
		||||
		let start_before_end = self.start.lt(&self.end) || self.end.eq(&NaiveTime::MIN);
 | 
			
		||||
 | 
			
		||||
		match (start_after_now, end_after_now, start_before_end) {
 | 
			
		||||
			(false, false, true) => false, // both before now; start before end means "normal" period before now
 | 
			
		||||
			(false, false, false) => true, // both before now; end before start means "inversed" period around now
 | 
			
		||||
			(false, false, false) => true, // both before now; end before start means "inverse" period around now
 | 
			
		||||
			(true, false, _) => false,     // only start after now
 | 
			
		||||
			(false, true, _) => true,      // only end after now
 | 
			
		||||
			(true, true, true) => false,   // both after now but start first
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										65
									
								
								src/lib.rs
									
										
									
									
									
								
							
							
						
						
									
										65
									
								
								src/lib.rs
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -5,3 +5,68 @@ pub mod models;
 | 
			
		|||
pub mod settings;
 | 
			
		||||
pub mod types;
 | 
			
		||||
pub mod utils;
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod periods {
 | 
			
		||||
    use chrono::NaiveTime;
 | 
			
		||||
    use crate::db::Period;
 | 
			
		||||
    use crate::types::EmgauwaNow;
 | 
			
		||||
 | 
			
		||||
    const MIDNIGHT: NaiveTime = NaiveTime::MIN;
 | 
			
		||||
 | 
			
		||||
    fn new_time(hour: u32, minute: u32) -> NaiveTime {
 | 
			
		||||
        NaiveTime::from_hms_opt(hour, minute, 0).expect("Failed to create NaiveTime")
 | 
			
		||||
    }
 | 
			
		||||
    fn new_period(start_hour: u32, start_minute: u32, end_hour: u32, end_minute: u32) -> Period {
 | 
			
		||||
        Period {
 | 
			
		||||
            start: new_time(start_hour, start_minute),
 | 
			
		||||
            end: new_time(end_hour, end_minute),
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn always_on() {
 | 
			
		||||
        let period = Period::new_on();
 | 
			
		||||
        let now: EmgauwaNow = EmgauwaNow::now(&MIDNIGHT);
 | 
			
		||||
        assert_eq!(period.is_always_on(), true);
 | 
			
		||||
        assert_eq!(period.is_on(&MIDNIGHT), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(12, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&now.time), true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn simple_period() {
 | 
			
		||||
        let period = new_period(11, 00, 13, 00);
 | 
			
		||||
        assert_eq!(period.is_always_on(), false);
 | 
			
		||||
        assert_eq!(period.is_on(&MIDNIGHT), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(10, 00)), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(11, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(12, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(13, 00)), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(14, 00)), false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn to_midnight_period() {
 | 
			
		||||
        let period = new_period(22, 00, 00, 00);
 | 
			
		||||
        assert_eq!(period.is_always_on(), false);
 | 
			
		||||
        assert_eq!(period.is_on(&MIDNIGHT), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(21, 00)), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(22, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(23, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(00, 00)), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(01, 00)), false);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #[test]
 | 
			
		||||
    fn from_midnight_period() {
 | 
			
		||||
        let period = new_period(00, 00, 02, 00);
 | 
			
		||||
        assert_eq!(period.is_always_on(), false);
 | 
			
		||||
        assert_eq!(period.is_on(&MIDNIGHT), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(23, 00)), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(00, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(01, 00)), true);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(02, 00)), false);
 | 
			
		||||
        assert_eq!(period.is_on(&new_time(03, 00)), false);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue