diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml new file mode 100644 index 0000000..af5abac --- /dev/null +++ b/.github/workflows/python-tests.yml @@ -0,0 +1,30 @@ +name: Python package + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.8", "3.10"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + # This case we are only updating pip, but you could add other dependencies needed. + run: | + python -m pip install --upgrade pip + pip install pytest + pip install pytest-cov + - name: Test with pytest + run: | + pytest + - name: Test coverage + run: | + pytest --cov \ No newline at end of file diff --git a/test_times.py b/test_times.py new file mode 100644 index 0000000..beacb28 --- /dev/null +++ b/test_times.py @@ -0,0 +1,62 @@ +from times import compute_overlap_time, time_range +from pytest import raises +import pytest + +# def test_given_input(): +# outer = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00") +# inner = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60) +# result = compute_overlap_time(outer, inner) +# 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 result == expected + +# def test_nooverlap(): +# first = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00") +# second = time_range("2010-01-12 09:30:00", "2010-01-12 09:45:00") +# result = compute_overlap_time(first, second) +# expected = [] +# assert result == expected + +# def test_multipleintervals(): +# first = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00", 3, 10) +# second = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60) +# result = compute_overlap_time(first, second) +# expected = [('2010-01-12 10:30:00', '2010-01-12 10:37:00'), ('2010-01-12 10:38:00', '2010-01-12 10:39:53'), ('2010-01-12 10:40:03', '2010-01-12 10:45:00')] +# assert result == expected + +# def test_border(): +# first = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00") +# second = time_range("2010-01-12 12:00:00", "2010-01-12 12:45:00") +# result = compute_overlap_time(first, second) +# expected = [('2010-01-12 12:00:00', '2010-01-12 12:00:00')] +# assert result == expected + +def test_backwardsrange(): + with raises(ValueError): + range = time_range("2010-01-12 14:00:00", "2010-01-12 12:00:00") + +test_cases = [ + #given input + (time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00"), + time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60), + [('2010-01-12 10:30:00', '2010-01-12 10:37:00'), ('2010-01-12 10:38:00', '2010-01-12 10:45:00')]), + + #no overlap + (time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00"), + time_range("2010-01-12 09:30:00", "2010-01-12 09:45:00"), + []), + + #multiple intervals each + (time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00", 3, 10), + time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2, 60), + [('2010-01-12 10:30:00', '2010-01-12 10:37:00'), ('2010-01-12 10:38:00', '2010-01-12 10:39:53'), ('2010-01-12 10:40:03', '2010-01-12 10:45:00')]), + + #border case + (time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00"), + time_range("2010-01-12 12:00:00", "2010-01-12 12:45:00"), + [('2010-01-12 12:00:00', '2010-01-12 12:00:00')]) +] + +@pytest.mark.parametrize("time_range1, time_range2, expected", test_cases) +def test_timeranges(time_range1, time_range2, expected): + result = compute_overlap_time(time_range1, time_range2) + assert result == expected \ No newline at end of file diff --git a/times.py b/times.py index d57f401..4751e0d 100644 --- a/times.py +++ b/times.py @@ -4,6 +4,8 @@ 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") + if start_time_s > end_time_s: + raise ValueError('Start time needs to be before the end time') 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)) @@ -17,10 +19,11 @@ def compute_overlap_time(range1, range2): for start2, end2 in range2: low = max(start1, start2) high = min(end1, end2) - overlap_time.append((low, high)) + if low <= high: + overlap_time.append((low, high)) return overlap_time -if __name__ == "__main__": +if __name__ == "__main__": #this will only be executed when file is run directly, not imported 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) print(compute_overlap_time(large, short)) \ No newline at end of file