From 69b882410a299e1c43abadad331ef5e13ea2c619 Mon Sep 17 00:00:00 2001 From: Phil Elson Date: Thu, 17 Dec 2020 21:37:35 +0100 Subject: [PATCH] Pass all arguments through to the present_interval method, rather than pulling them from the state. This method can be made entirely indep at this point (static). --- cara/apps/calculator/model_generator.py | 10 +------ .../apps/calculator/test_model_generator.py | 29 ++++++++++++++----- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/cara/apps/calculator/model_generator.py b/cara/apps/calculator/model_generator.py index 3a7e5f50..b5c95ca7 100644 --- a/cara/apps/calculator/model_generator.py +++ b/cara/apps/calculator/model_generator.py @@ -348,14 +348,6 @@ class FormData: a number of monotonic, non-overlapping, but potentially unsorted, breaks (also in minutes). """ - if not breaks: - breaks = [] - if self.lunch_option: - breaks.append((self.lunch_start, self.lunch_finish)) - - for coffee_start, coffee_end in self.coffee_break_times(): - breaks.append((coffee_start, coffee_end)) - if not breaks: # If there are no breaks, the interval is the start and end. return models.SpecificInterval(((start, finish),)) @@ -389,7 +381,7 @@ class FormData: # we must cover. Let S=start; E=end; Bs=Break start; Be=Break end: # 1. The interval is entirely before the break. S < E <= Bs < Be # 2. The interval straddles the start of the break. S < Bs < E <= Be - # 3. The break is entirely inside the interval. S < Bs < Be < E + # 3. The break is entirely inside the interval. S < Bs < Be <= E # 4. The interval is entirely inside the break. Bs <= S < E <= Be # 5. The interval straddles the end of the break. Bs <= S < Be <= E # 6. The interval is entirely after the break. Bs < Be <= S < E diff --git a/cara/tests/apps/calculator/test_model_generator.py b/cara/tests/apps/calculator/test_model_generator.py index 915c13f3..e0e307d4 100644 --- a/cara/tests/apps/calculator/test_model_generator.py +++ b/cara/tests/apps/calculator/test_model_generator.py @@ -199,27 +199,37 @@ def coffee_break_between_1045_and_1115(baseline_form): def test_present_before_coffee(coffee_break_between_1045_and_1115): - interval = coffee_break_between_1045_and_1115.present_interval(10.5 * 60, 11 * 60) + breaks = coffee_break_between_1045_and_1115.coffee_break_times() + interval = coffee_break_between_1045_and_1115.present_interval( + 10.5 * 60, 11 * 60, breaks=breaks) assert interval.boundaries() == ((10.5, 10.75),) def test_present_after_coffee(coffee_break_between_1045_and_1115): - interval = coffee_break_between_1045_and_1115.present_interval(11 * 60, 11.5 * 60) + breaks = coffee_break_between_1045_and_1115.coffee_break_times() + interval = coffee_break_between_1045_and_1115.present_interval( + 11 * 60, 11.5 * 60, breaks=breaks) assert interval.boundaries() == ((11.25, 11.5),) def test_present_when_coffee_starts(coffee_break_between_1045_and_1115): - interval = coffee_break_between_1045_and_1115.present_interval(10.75 * 60, 11.5 * 60) + breaks = coffee_break_between_1045_and_1115.coffee_break_times() + interval = coffee_break_between_1045_and_1115.present_interval( + 10.75 * 60, 11.5 * 60, breaks=breaks) assert interval.boundaries() == ((11.25, 11.5),) def test_present_when_coffee_ends(coffee_break_between_1045_and_1115): - interval = coffee_break_between_1045_and_1115.present_interval(10.5 * 60, 11.25 * 60) + breaks = coffee_break_between_1045_and_1115.coffee_break_times() + interval = coffee_break_between_1045_and_1115.present_interval( + 10.5 * 60, 11.25 * 60, breaks=breaks) assert interval.boundaries() == ((10.5, 10.75), ) def test_present_only_for_coffee_ends(coffee_break_between_1045_and_1115): - interval = coffee_break_between_1045_and_1115.present_interval(10.75 * 60, 11.25 * 60) + breaks = coffee_break_between_1045_and_1115.coffee_break_times() + interval = coffee_break_between_1045_and_1115.present_interval( + 10.75 * 60, 11.25 * 60, breaks=breaks) assert interval.boundaries() == () @@ -249,8 +259,9 @@ def breaks_every_25_mins_for_20_mins(baseline_form): baseline_form.lunch_finish = time2mins("12:15") baseline_form.lunch_option = True + breaks = baseline_form.coffee_break_times() + baseline_form.lunch_break_times() interval = baseline_form.present_interval( - baseline_form.activity_start, baseline_form.activity_finish + baseline_form.activity_start, baseline_form.activity_finish, breaks=breaks, ) assert_boundaries(interval, [ @@ -265,18 +276,20 @@ def breaks_every_25_mins_for_20_mins(baseline_form): def test_present_after_two_breaks_for_small_interval(breaks_every_25_mins_for_20_mins): + breaks = breaks_every_25_mins_for_20_mins.coffee_break_times() + breaks_every_25_mins_for_20_mins.lunch_break_times() # The first two breaks start at 10:25 and 11:10. interval = breaks_every_25_mins_for_20_mins.present_interval( - time2mins("11:35"), time2mins("11:40") + time2mins("11:35"), time2mins("11:40"), breaks=breaks, ) # Only present for a short duration of a presence period. assert_boundaries(interval, [('11:35', '11:40')]) def test_present_only_during_second_break(breaks_every_25_mins_for_20_mins): + breaks = breaks_every_25_mins_for_20_mins.coffee_break_times() + breaks_every_25_mins_for_20_mins.lunch_break_times() # The first two breaks start at 10:25 and 11:10. interval = breaks_every_25_mins_for_20_mins.present_interval( - time2mins("11:15"), time2mins("11:20") + time2mins("11:15"), time2mins("11:20"), breaks=breaks ) # No presence. assert_boundaries(interval, [])