diff --git a/pallets/acurast/common/src/tests.rs b/pallets/acurast/common/src/tests.rs index f58b7717..71d94eaf 100644 --- a/pallets/acurast/common/src/tests.rs +++ b/pallets/acurast/common/src/tests.rs @@ -311,6 +311,24 @@ tests! { 0, vec![((0,1), true), ((8,10), false)] ); + // ╭start ╭end + // _■■■■■■■■ + // ranges: + // ■ + // ■■ + // ■■■■■■■■■■ + // ■■ + test_schedule_overlaps_start( + Schedule{ + duration: 2, + start_time: 1, + end_time: 9, + interval: 2, + max_start_delay: 0, + }, + 0, + vec![((0,1), false), ((0,2), true), ((0, 10), true), ((8, 10), true), ((9, 10), false)] + ); // ╭start ╭end // ■■___■■___■■___ // ■■ @@ -346,5 +364,27 @@ tests! { 2, vec![((0,3), false), ((2,4), false), ((10,12), true), ((12,15), false)] ); + test_schedule_overlaps_end_before_start( + Schedule{ + duration: 2, + start_time: 1, + end_time: 0, + interval: 2, + max_start_delay: 0, + }, + 0, + vec![((0,1), false), ((0,2), false)] + ); + test_schedule_overlaps_equal_start_end( + Schedule{ + duration: 2, + start_time: 0, + end_time: 0, + interval: 2, + max_start_delay: 0, + }, + 0, + vec![((0,1), false), ((0,2), false)] + ); } } diff --git a/pallets/acurast/common/src/types.rs b/pallets/acurast/common/src/types.rs index c7b55552..f864ab8b 100644 --- a/pallets/acurast/common/src/types.rs +++ b/pallets/acurast/common/src/types.rs @@ -153,23 +153,25 @@ impl Schedule { pub fn overlaps(&self, start_delay: u64, a: u64, b: u64) -> Option { let (start, end) = self.range(start_delay)?; - if a == b || start == end || b <= start || a >= end { + if b <= a || start == end || b <= start || end <= a { return Some(false); } // if query interval `[a, b]` starts before, we can pretend it only starts at `start` - let relative_a = a.checked_sub(start).or(Some(start))?; + let relative_a = a.checked_sub(start).unwrap_or(start); if let Some(relative_b) = b.checked_sub(start) { + let a = relative_a % self.interval; let _b = relative_b % self.interval; - let (a, b) = ( - relative_a % self.interval, - if _b == 0 { self.interval } else { _b }, - ); - // b > a from here - - let l = b.checked_sub(a)?; - Some(a < self.duration || l >= self.interval) + let b = if _b == 0 { self.interval } else { _b }; + + let l = b.checked_sub(a).unwrap_or(0); + // ╭a ╭b + // ■■■■______■■■■______ + // OR + // ╭b ╭a ╭b' + // ■■■■______■■■■______ + Some(b < a || a < self.duration || l >= self.interval) } else { Some(false) }