source: flowtimer/tests/test_schedule.py@ f2a2a82

guix
Last change on this file since f2a2a82 was 813e855, checked in by Enrico Schwass <ennoausberlin@…>, 9 months ago

predicates renamed

  • Property mode set to 100644
File size: 4.3 KB
Line 
1import pytest
2import json
3from flowtimer.Schedule import Schedule
4from flowtimer.Phase import Phase
5from flowtimer.RecurringPhaseSequence import RecurringPhaseSequence
6
7
8class 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.is_running() is True
57 schedule.pause()
58 assert schedule.is_running() is False
59
60 def test_paused(self, setup_schedule):
61 schedule, _, _, _ = setup_schedule
62 schedule.pause()
63 assert schedule.is_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.is_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
Note: See TracBrowser for help on using the repository browser.