Changeset d7a66ad in flowtimer for tests/test_schedule.py


Ignore:
Timestamp:
08/25/24 18:20:14 (9 months ago)
Author:
Enrico Schwass <ennoausberlin@…>
Branches:
guix
Children:
d310de3
Parents:
5f4ef8e
Message:

more refactorings

Signed-off-by: Enrico Schwass <ennoausberlin@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/test_schedule.py

    r5f4ef8e rd7a66ad  
    11import pytest
     2import json
    23from flowtimer.Schedule import Schedule
    34from flowtimer.Phase import Phase
     5from flowtimer.RecurringPhaseSequence import RecurringPhaseSequence
     6
    47
    58class TestSchedule:
    6    
    7     def test_schedule_initialization(self):
    8         phase1 = Phase("Warm-up", 300)
    9         phase2 = Phase("Workout", 600)
    10         schedule = Schedule([phase1, phase2])
    11    
    12         assert schedule.phase_list == [phase1, phase2]
    13         assert schedule.current_phase == phase1
     9
     10    @pytest.fixture
     11    def setup_schedule(self):
     12        #  Set up some real Phase and RecurringPhaseSequence objects for testing
     13        phase1 = Phase("Phase 1", 300)
     14        phase2 = Phase("Phase 2", 600)
     15        sequence = RecurringPhaseSequence("Sequence 1", [phase1, phase2], 2)
     16        blocks = [phase1, sequence]
     17        schedule = Schedule("Test Schedule", blocks)
     18        return schedule, phase1, phase2, sequence
     19
     20    def test_initialization(self, setup_schedule):
     21        schedule, phase1, _, _ = setup_schedule
     22        assert schedule.title == "Test Schedule"
     23        assert schedule.blocks == [phase1, schedule.blocks[1]]
     24        assert schedule.current_block == phase1
    1425        assert schedule.state == "initial"
    1526
    16     def test_schedule_start(self):
    17         phase1 = Phase("Warm-up", 300)
    18         schedule = Schedule([phase1])
     27    def test_default_json_string(self):
     28        default_json = Schedule.default_json_string()
     29        assert isinstance(default_json, str)
     30
     31    def test_from_json(self):
     32        json_string = Schedule.default_json_string()
     33        schedule = Schedule.from_json(json_string)
     34        assert schedule.title == "Default"
     35        assert len(schedule.blocks) == 2
     36        assert isinstance(schedule.blocks[0], Phase)
     37        assert isinstance(schedule.blocks[1], RecurringPhaseSequence)
     38
     39    def test_to_json(self, setup_schedule):
     40        schedule, _, _, _ = setup_schedule
     41        json_string = schedule.to_json()
     42        assert isinstance(json_string, str)
     43        data = json.loads(json_string)
     44        assert data['title'] == "Test Schedule"
     45        assert len(data['blocks']) == 2
     46
     47    def test_start(self, setup_schedule):
     48        schedule, phase1, _, _ = setup_schedule
    1949        schedule.start()
    20    
    2150        assert schedule.state == "running"
    22         assert schedule.current_phase.running() is True
    23    
    24     def test_schedule_pause(self):
    25         phase1 = Phase("Warm-up", 300)
    26         schedule = Schedule([phase1])
     51        # assert phase1.ticks_left < phase1.initial_ticks  # Assuming the phase reduces ticks when started
     52
     53    def test_running(self, setup_schedule):
     54        schedule, _, _, _ = setup_schedule
    2755        schedule.start()
     56        assert schedule.running() is True
    2857        schedule.pause()
    29    
    30         assert schedule.state == "paused"
    31         assert schedule.is_paused() is True
     58        assert schedule.running() is False
    3259
    33     def test_schedule_abort(self):
    34         phase1 = Phase("Warm-up", 300)
    35         schedule = Schedule([phase1])
    36         schedule.start()
     60    def test_paused(self, setup_schedule):
     61        schedule, _, _, _ = setup_schedule
     62        schedule.pause()
     63        assert schedule.paused() is True
     64
     65    def test_abort(self, setup_schedule):
     66        schedule, _, _, _ = setup_schedule
    3767        schedule.abort()
    38    
    39         assert schedule.state == "finished"
    40         assert schedule.current_phase.finished() is True
     68        assert schedule.state == "aborted"
    4169
    42     def test_schedule_finished(self):
    43         phase1 = Phase("Warm-up", 300)
    44         phase2 = Phase("Workout", 600)
    45         schedule = Schedule([phase1, phase2])
    46    
    47         assert schedule.finished() is False
    48    
    49         phase1.start()
    50         phase1.tick(300)
    51         assert phase1.finished() is True
    52         assert schedule.finished() is False
    53    
     70    def test_completed(self, setup_schedule):
     71        schedule, phase1, _, sequence = setup_schedule
     72        schedule.tick(phase1.initial_ticks)  # Complete phase1
     73        schedule.tick(sequence.initial_ticks)  # Complete sequence
     74        schedule.tick(phase1.initial_ticks)  # Complete phase1
     75        schedule.tick(sequence.initial_ticks)  # Complete sequence
     76        print(schedule.current_block)
     77        assert schedule.completed() is True
     78        assert schedule.state == "completed"
     79
     80    def test_advance_to_next_block(self, setup_schedule):
     81        schedule, _, _, sequence = setup_schedule
     82        schedule.advance_to_next_block()
     83        assert schedule.current_block == schedule.blocks[1]
     84
     85    def test_skip(self, setup_schedule):
     86        schedule, _, _, sequence = setup_schedule
    5487        schedule.skip()
    55         schedule.current_phase.tick(600)
    56         assert schedule.finished() is True
     88        assert schedule.current_block == schedule.blocks[1]  # Should skip to Phase 2 within the sequence
    5789
    58     def test_schedule_skip(self):
    59         phase1 = Phase("Warm-up", 300)
    60         phase2 = Phase("Workout", 600)
    61         schedule = Schedule([phase1, phase2])
    62    
    63         schedule.start()
    64         schedule.skip()
    65    
    66         assert schedule.current_phase == phase2
     90    def test_total_ticks_left(self, setup_schedule):
     91        schedule, phase1, phase2, sequence = setup_schedule
     92        expected_total_ticks = phase1.ticks_left + sequence.ticks_left
     93        assert schedule.total_ticks_left() == expected_total_ticks
    6794
    68     def test_schedule_skip_at_final_phase(self):
    69         phase1 = Phase("Warm-up", 300)
    70         schedule = Schedule([phase1])
    71    
    72         schedule.start()
    73         schedule.skip()
    74    
    75         assert schedule.state == "finished"
     95    def test_upcoming_blocks(self, setup_schedule):
     96        schedule, _, _, sequence = setup_schedule
     97        assert schedule.upcoming_blocks() == [sequence]
    7698
    77     def test_schedule_tick(self):
    78         phase1 = Phase("Warm-up", 300)
    79         phase2 = Phase("Workout", 600)
    80         schedule = Schedule([phase1, phase2])
    81    
    82         schedule.start()
    83         schedule.tick(300)
    84    
    85         assert phase1.finished() is True
    86         assert schedule.current_phase == phase2
    87         assert schedule.state == "running"
     99    def test_current_block_is_final(self, setup_schedule):
     100        schedule, _, _, sequence = setup_schedule
     101        assert schedule.current_block_is_final() is False
     102        schedule.advance_to_next_block()
     103        assert schedule.current_block_is_final() is True
    88104
    89     def test_schedule_tick_to_completion(self):
    90         phase1 = Phase("Warm-up", 300)
    91         phase2 = Phase("Workout", 600)
    92         schedule = Schedule([phase1, phase2])
    93    
    94         schedule.start()
    95         schedule.tick(300)  # Should finish phase1 and move to phase2
    96         schedule.tick(600)  # Should finish phase2 and complete the schedule
    97    
    98         assert phase2.finished() is True
    99         assert schedule.finished() is True
     105    def test_tick(self, setup_schedule):
     106        schedule, phase1, _, _ = setup_schedule
     107        initial_ticks = phase1.ticks_left
     108        schedule.tick(100)
     109        assert phase1.ticks_left == initial_ticks - 100
    100110
    101     def test_schedule_current_phase_is_final(self):
    102         phase1 = Phase("Warm-up", 300)
    103         phase2 = Phase("Workout", 600)
    104         schedule = Schedule([phase1, phase2])
    105    
    106         assert schedule.current_phase_is_final() is False
    107    
    108         schedule.skip()
    109         assert schedule.current_phase_is_final() is True
    110 
     111        schedule.tick(phase1.ticks_left)  # Finish phase1
     112        assert schedule.current_block == schedule.blocks[1]  # Should advance to the next block
Note: See TracChangeset for help on using the changeset viewer.