source: flowtimer/tests/test_schedule.py

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

predicates renamed

  • Property mode set to 100644
File size: 4.3 KB
RevLine 
[401678c]1import pytest
[d7a66ad]2import json
[401678c]3from flowtimer.Schedule import Schedule
4from flowtimer.Phase import Phase
[d7a66ad]5from flowtimer.RecurringPhaseSequence import RecurringPhaseSequence
6
[401678c]7
8class 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
[813e855]25 assert schedule.state() == "initial"
[401678c]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()
[813e855]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()
[813e855]56 assert schedule.is_running() is True
[401678c]57 schedule.pause()
[813e855]58 assert schedule.is_running() is False
[401678c]59
[d7a66ad]60 def test_paused(self, setup_schedule):
61 schedule, _, _, _ = setup_schedule
62 schedule.pause()
[813e855]63 assert schedule.is_paused() is True
[d7a66ad]64
65 def test_abort(self, setup_schedule):
66 schedule, _, _, _ = setup_schedule
[401678c]67 schedule.abort()
[813e855]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
[813e855]76 assert schedule.is_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
Note: See TracBrowser for help on using the repository browser.