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 schedules::{DbPeriods, DbSchedule};
|
||||||
pub use tag::DbTag;
|
pub use tag::DbTag;
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub(crate) use model_utils::Period;
|
||||||
|
|
||||||
use crate::errors::{DatabaseError, EmgauwaError};
|
use crate::errors::{DatabaseError, EmgauwaError};
|
||||||
|
|
||||||
static MIGRATOR: Migrator = sqlx::migrate!(); // defaults to "./migrations"
|
static MIGRATOR: Migrator = sqlx::migrate!(); // defaults to "./migrations"
|
||||||
|
|
|
@ -63,12 +63,13 @@ impl Period {
|
||||||
let start_after_now = self.start.gt(now);
|
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
|
// 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
|
// 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 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) {
|
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, 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
|
(true, false, _) => false, // only start after now
|
||||||
(false, true, _) => true, // only end after now
|
(false, true, _) => true, // only end after now
|
||||||
(true, true, true) => false, // both after now but start first
|
(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 settings;
|
||||||
pub mod types;
|
pub mod types;
|
||||||
pub mod utils;
|
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…
Reference in a new issue