[401678c] | 1 | import pytest
|
---|
[d7a66ad] | 2 | import json
|
---|
[401678c] | 3 | from flowtimer.Schedule import Schedule
|
---|
| 4 | from flowtimer.Phase import Phase
|
---|
[d7a66ad] | 5 | from flowtimer.RecurringPhaseSequence import RecurringPhaseSequence
|
---|
| 6 |
|
---|
[401678c] | 7 |
|
---|
| 8 | class TestSchedule:
|
---|
[d7a66ad] | 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
|
---|
[401678c] | 25 | assert schedule.state == "initial"
|
---|
| 26 |
|
---|
[d7a66ad] | 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
|
---|
[401678c] | 49 | schedule.start()
|
---|
| 50 | assert schedule.state == "running"
|
---|
[d7a66ad] | 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
|
---|
[401678c] | 55 | schedule.start()
|
---|
[d7a66ad] | 56 | assert schedule.running() is True
|
---|
[401678c] | 57 | schedule.pause()
|
---|
[d7a66ad] | 58 | assert schedule.running() is False
|
---|
[401678c] | 59 |
|
---|
[d7a66ad] | 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
|
---|
[401678c] | 67 | schedule.abort()
|
---|
[d7a66ad] | 68 | assert schedule.state == "aborted"
|
---|
[401678c] | 69 |
|
---|
[d7a66ad] | 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 | assert schedule.completed() is True
|
---|
| 77 | assert schedule.state == "completed"
|
---|
[401678c] | 78 |
|
---|
[d7a66ad] | 79 | def test_advance_to_next_block(self, setup_schedule):
|
---|
| 80 | schedule, _, _, sequence = setup_schedule
|
---|
| 81 | schedule.advance_to_next_block()
|
---|
| 82 | assert schedule.current_block == schedule.blocks[1]
|
---|
| 83 |
|
---|
| 84 | def test_skip(self, setup_schedule):
|
---|
| 85 | schedule, _, _, sequence = setup_schedule
|
---|
[401678c] | 86 | schedule.skip()
|
---|
[d7a66ad] | 87 | assert schedule.current_block == schedule.blocks[1] # Should skip to Phase 2 within the sequence
|
---|
| 88 |
|
---|
| 89 | def test_total_ticks_left(self, setup_schedule):
|
---|
| 90 | schedule, phase1, phase2, sequence = setup_schedule
|
---|
| 91 | expected_total_ticks = phase1.ticks_left + sequence.ticks_left
|
---|
| 92 | assert schedule.total_ticks_left() == expected_total_ticks
|
---|
| 93 |
|
---|
| 94 | def test_upcoming_blocks(self, setup_schedule):
|
---|
| 95 | schedule, _, _, sequence = setup_schedule
|
---|
| 96 | assert schedule.upcoming_blocks() == [sequence]
|
---|
| 97 |
|
---|
| 98 | def test_current_block_is_final(self, setup_schedule):
|
---|
| 99 | schedule, _, _, sequence = setup_schedule
|
---|
| 100 | assert schedule.current_block_is_final() is False
|
---|
| 101 | schedule.advance_to_next_block()
|
---|
| 102 | assert schedule.current_block_is_final() is True
|
---|
| 103 |
|
---|
| 104 | def test_tick(self, setup_schedule):
|
---|
| 105 | schedule, phase1, _, _ = setup_schedule
|
---|
| 106 | initial_ticks = phase1.ticks_left
|
---|
| 107 | schedule.tick(100)
|
---|
| 108 | assert phase1.ticks_left == initial_ticks - 100
|
---|
[401678c] | 109 |
|
---|
[d7a66ad] | 110 | schedule.tick(phase1.ticks_left) # Finish phase1
|
---|
| 111 | assert schedule.current_block == schedule.blocks[1] # Should advance to the next block
|
---|