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(() => 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.FromMinutes(1), mockTimer.DueTime);
70 TestUtils.DriftTime(TimeSpan.FromMinutes(1));
71 await mockTimer.Invoke();
73 Assert.True(mockTimer.IsTimerRunning);
74 Assert.Equal(TimeSpan.FromSeconds(50), mockTimer.DueTime); // UpdateFunc 内で掛かった時間を減算する
79 public async Task Callback_SystemResumeTest()
81 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
83 using var scheduler = new TestTimelineScheduler();
84 var mockTimer = scheduler.MockTimer;
86 Assert.False(mockTimer.IsTimerRunning);
89 scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
92 return Task.CompletedTask;
94 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
95 scheduler.UpdateAfterSystemResume = TimeSpan.FromMinutes(10);
96 scheduler.Enabled = true;
98 Assert.True(mockTimer.IsTimerRunning);
99 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
102 TestUtils.DriftTime(TimeSpan.FromMinutes(1));
103 await mockTimer.Invoke();
105 Assert.Equal(1, count); // invoked
106 Assert.True(mockTimer.IsTimerRunning);
107 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
109 scheduler.SystemResumed();
111 Assert.True(mockTimer.IsTimerRunning);
112 Assert.Equal(TimeSpan.FromMinutes(10), mockTimer.DueTime);
115 TestUtils.DriftTime(TimeSpan.FromMinutes(10));
116 await mockTimer.Invoke();
118 Assert.Equal(2, count); // invoked
119 Assert.True(mockTimer.IsTimerRunning);
120 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
125 public void RefreshSchedule_Test()
127 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
129 using var scheduler = new TestTimelineScheduler();
130 var mockTimer = scheduler.MockTimer;
132 scheduler.Enabled = true;
133 Assert.False(mockTimer.IsTimerRunning);
135 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
136 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
137 scheduler.RefreshSchedule();
139 Assert.True(mockTimer.IsTimerRunning);
140 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
145 public void RefreshSchedule_EmptyTest()
147 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
149 using var scheduler = new TestTimelineScheduler();
150 var mockTimer = scheduler.MockTimer;
152 scheduler.Enabled = true;
153 Assert.False(mockTimer.IsTimerRunning);
155 scheduler.RefreshSchedule();
156 Assert.False(mockTimer.IsTimerRunning);
161 public void RefreshSchedule_MultipleTest()
163 using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
165 using var scheduler = new TestTimelineScheduler();
166 var mockTimer = scheduler.MockTimer;
168 scheduler.Enabled = true;
169 Assert.False(mockTimer.IsTimerRunning);
171 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
172 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(2);
173 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Mention] = DateTimeUtc.Now;
174 scheduler.UpdateInterval[TimelineSchedulerTaskType.Mention] = TimeSpan.FromMinutes(3);
175 scheduler.RefreshSchedule();
177 Assert.True(mockTimer.IsTimerRunning);
178 Assert.Equal(TimeSpan.FromMinutes(2), mockTimer.DueTime);
180 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
181 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(2);
182 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Mention] = DateTimeUtc.Now - TimeSpan.FromMinutes(2);
183 scheduler.UpdateInterval[TimelineSchedulerTaskType.Mention] = TimeSpan.FromMinutes(3);
184 scheduler.RefreshSchedule();
186 Assert.True(mockTimer.IsTimerRunning);
187 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);