From 4dde928120601e59990ec3f6017edde86aabc131 Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Sat, 29 Oct 2022 16:32:19 +0100 Subject: [PATCH 1/7] Added test file and test for overlap_time function --- test_times.py | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 test_times.py diff --git a/test_times.py b/test_times.py new file mode 100644 index 0000000..9966318 --- /dev/null +++ b/test_times.py @@ -0,0 +1,8 @@ +from times import compute_overlap_time, time_range + +def test_given_input(): + 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) + result = compute_overlap_time(large, short) + 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 \ No newline at end of file From a2abd659c4a440b6cb0ee7fcd786ae96408efdee Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Thu, 3 Nov 2022 11:14:48 +0000 Subject: [PATCH 2/7] Automating tests --- .github/workflows/python-tests.yml | 25 +++++++++++++++++++++++++ times.py | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/python-tests.yml diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml new file mode 100644 index 0000000..efb5e99 --- /dev/null +++ b/.github/workflows/python-tests.yml @@ -0,0 +1,25 @@ +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 + - name: Test with pytest + run: | + pytest \ No newline at end of file diff --git a/times.py b/times.py index d57f401..5323fd6 100644 --- a/times.py +++ b/times.py @@ -20,7 +20,7 @@ def compute_overlap_time(range1, range2): 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 From b94a8efc32587e6a9c7e51a0295ade21b36cb71d Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Thu, 3 Nov 2022 16:29:54 +0000 Subject: [PATCH 3/7] Importing pytest as needed --- .github/workflows/python-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index efb5e99..2063fec 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -20,6 +20,8 @@ jobs: # 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 \ No newline at end of file From c7fc248be297159a460fbab68f9185e063a7b7c7 Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Thu, 3 Nov 2022 16:45:30 +0000 Subject: [PATCH 4/7] Added more tests for test_times.py and corrected overlap bug in times.py --- test_times.py | 34 ++++++++++++++++++++++++++++++---- times.py | 5 ++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/test_times.py b/test_times.py index 9966318..63c2f58 100644 --- a/test_times.py +++ b/test_times.py @@ -1,8 +1,34 @@ from times import compute_overlap_time, time_range +from pytest import raises def test_given_input(): - 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) - result = compute_overlap_time(large, short) + 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 \ No newline at end of file + 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") \ No newline at end of file diff --git a/times.py b/times.py index 5323fd6..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,7 +19,8 @@ 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__": #this will only be executed when file is run directly, not imported From ad2c3a19aac884bfa466b34ec5846e98506f6c43 Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Thu, 3 Nov 2022 16:53:05 +0000 Subject: [PATCH 5/7] Added coverage to CI --- .github/workflows/python-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 2063fec..019565a 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -24,4 +24,5 @@ jobs: pip install pytest-cov - name: Test with pytest run: | - pytest \ No newline at end of file + pytest + pytest --cov \ No newline at end of file From 40ffbede610354d6cfdf0c0a471a642a3bde66b9 Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Thu, 3 Nov 2022 17:00:08 +0000 Subject: [PATCH 6/7] Renamed workflow --- .github/workflows/python-tests.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml index 019565a..af5abac 100644 --- a/.github/workflows/python-tests.yml +++ b/.github/workflows/python-tests.yml @@ -25,4 +25,6 @@ jobs: - name: Test with pytest run: | pytest + - name: Test coverage + run: | pytest --cov \ No newline at end of file From a3f6458e69383eaefa2b878af41ba25d69e1227d Mon Sep 17 00:00:00 2001 From: pkruzikova Date: Tue, 8 Nov 2022 13:23:49 +0000 Subject: [PATCH 7/7] parametrised some tests --- test_times.py | 84 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 56 insertions(+), 28 deletions(-) diff --git a/test_times.py b/test_times.py index 63c2f58..beacb28 100644 --- a/test_times.py +++ b/test_times.py @@ -1,34 +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_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") \ No newline at end of file + 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