1 // OpenTween - Client of Twitter
2 // Copyright (c) 2022 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
5 // This file is part of OpenTween.
7 // This program is free software; you can redistribute it and/or modify it
8 // under the terms of the GNU General public License as published by the Free
9 // Software Foundation; either version 3 of the License, or (at your option)
12 // This program is distributed in the hope that it will be useful, but
13 // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General public License
17 // You should have received a copy of the GNU General public License along
18 // with this program. If not, see <http://www.gnu.org/licenses/>, or write to
19 // the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20 // Boston, MA 02110-1301, USA.
23 using System.Collections.Generic;
26 using System.Threading.Tasks;
31 public class TimelineScheduerTest
33 private class TestTimelineScheduler : TimelineScheduler
35 public MockTimer MockTimer = new MockTimer(() => Task.CompletedTask);
37 public TestTimelineScheduler()
42 protected override ITimer CreateTimer(Func<Task> callback)
43 => this.MockTimer = new MockTimer(callback);
47 public async Task Callback_Test()
49 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
51 using var scheduler = new TestTimelineScheduler();
52 var mockTimer = scheduler.MockTimer;
54 Assert.False(mockTimer.IsTimerRunning);
57 scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
60 TestUtils.DriftTime(TimeSpan.FromSeconds(10));
61 return Task.CompletedTask;
63 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
64 scheduler.Enabled = true;
66 Assert.True(mockTimer.IsTimerRunning);
67 Assert.Equal(TimeSpan.Zero, mockTimer.DueTime);
70 await mockTimer.Invoke();
72 Assert.True(mockTimer.IsTimerRunning);
73 Assert.Equal(TimeSpan.FromSeconds(50), mockTimer.DueTime); // UpdateFunc 内で掛かった時間を減算する
78 public async Task Callback_SystemResumeTest()
80 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
82 using var scheduler = new TestTimelineScheduler();
83 var mockTimer = scheduler.MockTimer;
85 Assert.False(mockTimer.IsTimerRunning);
88 scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
91 return Task.CompletedTask;
93 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
94 scheduler.UpdateAfterSystemResume = TimeSpan.FromMinutes(10);
95 scheduler.Enabled = true;
97 Assert.True(mockTimer.IsTimerRunning);
98 Assert.Equal(TimeSpan.Zero, mockTimer.DueTime);
101 await mockTimer.Invoke();
103 Assert.Equal(1, count); // invoked
104 Assert.True(mockTimer.IsTimerRunning);
105 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
107 scheduler.SystemResumed();
109 Assert.True(mockTimer.IsTimerRunning);
110 Assert.Equal(TimeSpan.FromMinutes(10), mockTimer.DueTime);
113 TestUtils.DriftTime(TimeSpan.FromMinutes(10));
114 await mockTimer.Invoke();
116 Assert.Equal(2, count); // invoked
117 Assert.True(mockTimer.IsTimerRunning);
118 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
123 public void RefreshSchedule_Test()
125 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
127 using var scheduler = new TestTimelineScheduler();
128 var mockTimer = scheduler.MockTimer;
130 scheduler.Enabled = true;
131 Assert.False(mockTimer.IsTimerRunning);
133 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
134 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
135 scheduler.RefreshSchedule();
137 Assert.True(mockTimer.IsTimerRunning);
138 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
143 public void RefreshSchedule_EmptyTest()
145 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
147 using var scheduler = new TestTimelineScheduler();
148 var mockTimer = scheduler.MockTimer;
150 scheduler.Enabled = true;
151 Assert.False(mockTimer.IsTimerRunning);
153 scheduler.RefreshSchedule();
154 Assert.False(mockTimer.IsTimerRunning);
159 public void RefreshSchedule_MultipleTest()
161 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
163 using var scheduler = new TestTimelineScheduler();
164 var mockTimer = scheduler.MockTimer;
166 scheduler.Enabled = true;
167 Assert.False(mockTimer.IsTimerRunning);
169 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
170 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(2);
171 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Mention] = DateTimeUtc.Now;
172 scheduler.UpdateInterval[TimelineSchedulerTaskType.Mention] = TimeSpan.FromMinutes(3);
173 scheduler.RefreshSchedule();
175 Assert.True(mockTimer.IsTimerRunning);
176 Assert.Equal(TimeSpan.FromMinutes(2), mockTimer.DueTime);
178 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
179 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(2);
180 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Mention] = DateTimeUtc.Now - TimeSpan.FromMinutes(2);
181 scheduler.UpdateInterval[TimelineSchedulerTaskType.Mention] = TimeSpan.FromMinutes(3);
182 scheduler.RefreshSchedule();
184 Assert.True(mockTimer.IsTimerRunning);
185 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);