diff --git a/.github/workflows/python-tests.yml b/.github/workflows/python-tests.yml new file mode 100644 index 0000000..c7d9102 --- /dev/null +++ b/.github/workflows/python-tests.yml @@ -0,0 +1,26 @@ +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 + python3 -m pip install pytest + - name: Test with pytest + run: | + pytest diff --git a/__pycache__/test_times.cpython-37-pytest-6.1.2.pyc b/__pycache__/test_times.cpython-37-pytest-6.1.2.pyc new file mode 100644 index 0000000..c7023c4 Binary files /dev/null and b/__pycache__/test_times.cpython-37-pytest-6.1.2.pyc differ diff --git a/__pycache__/times.cpython-37.pyc b/__pycache__/times.cpython-37.pyc new file mode 100644 index 0000000..249ca7f Binary files /dev/null and b/__pycache__/times.cpython-37.pyc differ diff --git a/test_times.py b/test_times.py new file mode 100644 index 0000000..25dc96d --- /dev/null +++ b/test_times.py @@ -0,0 +1,44 @@ +# Test Times File + +from times import compute_overlap_time +from times import time_range +import pytest + +def test_subset_overlap(): + large = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00", 2) + short = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2) + result = compute_overlap_time(large, short) + expected = 15.0*60.0 + assert result == expected + +def test_partial_overlap(): + large = time_range("2010-01-12 10:00:00", "2010-01-12 10:40:00", 2) + short = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2) + + result = compute_overlap_time(large, short) + expected = 10.0*60.0 + assert result == expected + +def test_vanishing_overlap(): + large = time_range("2010-01-12 10:45:00", "2010-01-12 12:00:00", 2) + short = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2) + + result = compute_overlap_time(large, short) + expected = 0.0 + assert result == expected + +def test_zero_overlap(): + large = time_range("2010-01-12 12:00:00", "2010-01-12 12:00:00", 2) + short = time_range("2010-01-12 10:30:00", "2010-01-12 10:45:00", 2,) + + result = compute_overlap_time(large, short) + expected = 0.0 + assert result == expected + +def test_input_values(): + with pytest.raises(ValueError): + large = time_range("2010-01-12 10:00:00", "2010-01-12 12:00:00", 2) + short = time_range("2010-01-12 10:50:00", "2010-01-12 10:45:00", 2) + result = compute_overlap_time(large, short) + +# Forgot to mention Answers UCL-COMP0233-22-23/RSE-Classwork#19 diff --git a/times.py b/times.py index d57f401..f946903 100644 --- a/times.py +++ b/times.py @@ -1,7 +1,13 @@ import datetime +import time +from pytest import raises -def time_range(start_time, end_time, number_of_intervals=1, gap_between_intervals_s=0): +def correctly_ordered_inputs(range0): + if range0[0][0] > range0[-1][1]: + raise ValueError("\n The input contains a time range which goes backwards in time as index is increased. \n Please ensure inputs are time-ordered.") + +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) @@ -11,16 +17,27 @@ def time_range(start_time, end_time, number_of_intervals=1, gap_between_interval 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: - low = max(start1, start2) - high = min(end1, end2) - overlap_time.append((low, high)) - return overlap_time + + # Checking inputs + correctly_ordered_inputs(range1) + correctly_ordered_inputs(range2) + + latest_start = max(min([start for start, end in range1]), + min([start for start, end in range2])) + earliest_end = min(max([end for start, end in range1]), + max([end for start, end in range2])) + ls_sec = time.mktime(time.strptime(latest_start, "%Y-%m-%d %H:%M:%S")) + ee_sec = time.mktime(time.strptime(earliest_end, "%Y-%m-%d %H:%M:%S")) + if ls_sec < ee_sec: + return ee_sec - ls_sec + else: + return 0 + if __name__ == "__main__": - 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 + large = time_range("2010-01-12 10:35:00", "2010-01-12 10:31:00", 2) + short = time_range("2010-01-12 10:30:00", "2010-01-12 10:50:00", 2) + print() + print(compute_overlap_time(large, short), 'seconds of overlap') \ No newline at end of file