Skip to content

Instantly share code, notes, and snippets.

@alessandrofelder
Created November 3, 2020 19:23
Show Gist options
  • Save alessandrofelder/da00874d24b1269f62fe2620b62c320c to your computer and use it in GitHub Desktop.
Save alessandrofelder/da00874d24b1269f62fe2620b62c320c to your computer and use it in GitHub Desktop.
Sample solution "write more tests"
from times import compute_overlap_time, time_range
def test_generic_case():
large = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00")
short = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60)
expected = [("2010-01-12 10:30:00","2010-01-12 10:37:00"), ("2010-01-12 10:38:00", "2010-01-12 10:45:00")]
assert compute_overlap_time(large, short) == expected
def test_no_overlap():
before = time_range("2010-01-12 10:00:00", "2010-01-12 11:00:00")
after = time_range("2010-01-12 12:30:00", "2010-01-12 12:45:00", 2, 60)
expected = []
assert compute_overlap_time(before, after) == expected
def test_multiple_overlaps():
three_hours_with_two_fifteen_minute_breaks = time_range("2010-01-12 10:00:00", "2010-01-12 13:00:00", 3, 900)
two_ranges_splitting_the_first_break = time_range("2010-01-12 10:40:00", "2010-01-12 11:20:00", 2, 120)
expected = [("2010-01-12 10:40:00","2010-01-12 10:50:00"), ("2010-01-12 11:05:00", "2010-01-12 11:20:00")]
assert compute_overlap_time(three_hours_with_two_fifteen_minute_breaks, two_ranges_splitting_the_first_break) == expected
def test_touching_edges():
before = time_range("2010-01-12 10:00:00", "2010-01-12 11:00:00")
after = time_range("2010-01-12 11:00:00", "2010-01-12 12:45:00")
expected = []
assert compute_overlap_time(before, after) == expected
import datetime
def time_range(start_time, end_time, number_of_intervals=1, gap_between_intervals_s=0):
start_time_s = datetime.datetime.strptime(start_time, "%Y-%m-%d %H:%M:%S")
end_time_s = datetime.datetime.strptime(end_time, "%Y-%m-%d %H:%M:%S")
d = (end_time_s - start_time_s).total_seconds() / number_of_intervals + gap_between_intervals_s * (1 / number_of_intervals - 1)
sec_range = [(start_time_s + datetime.timedelta(seconds=i * d + i * gap_between_intervals_s),
start_time_s + datetime.timedelta(seconds=(i + 1) * d + i * gap_between_intervals_s))
for i in range(number_of_intervals)]
return [(ta.strftime("%Y-%m-%d %H:%M:%S"), tb.strftime("%Y-%m-%d %H:%M:%S")) for ta, tb in sec_range]
def compute_overlap_time(range1, range2):
overlap_time = []
for start1, end1 in range1:
for start2, end2 in range2:
# both ranges need to start before the other ends, otherwise there is no overlap!
if start1 <= end2 and start2 <= end1:
low = max(start1, start2)
high = min(end1, end2)
if high == low:
continue
overlap_time.append((low, high))
return overlap_time
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment