1 | import pytest
|
---|
2 | import json
|
---|
3 | from flowtimer.Schedule import Schedule
|
---|
4 | from flowtimer.Phase import Phase
|
---|
5 | from flowtimer.RecurringPhaseSequence import RecurringPhaseSequence
|
---|
6 |
|
---|
7 |
|
---|
8 | class TestSchedule:
|
---|
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
|
---|
25 | assert schedule.state == "initial"
|
---|
26 |
|
---|
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
|
---|
49 | schedule.start()
|
---|
50 | assert schedule.state == "running"
|
---|
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
|
---|
55 | schedule.start()
|
---|
56 | assert schedule.running() is True
|
---|
57 | schedule.pause()
|
---|
58 | assert schedule.running() is False
|
---|
59 |
|
---|
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
|
---|
67 | schedule.abort()
|
---|
68 | assert schedule.state == "aborted"
|
---|
69 |
|
---|
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"
|
---|
78 |
|
---|
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
|
---|
86 | schedule.skip()
|
---|
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
|
---|
109 |
|
---|
110 | schedule.tick(phase1.ticks_left) # Finish phase1
|
---|
111 | assert schedule.current_block == schedule.blocks[1] # Should advance to the next block
|
---|