OSDN Git Service

Merge pull request #120 from opentween/stylecop
[opentween/open-tween.git] / OpenTween.Tests / TimelineScheduerTest.cs
1 // OpenTween - Client of Twitter
2 // Copyright (c) 2022 kim_upsilon (@kim_upsilon) <https://upsilo.net/~upsilon/>
3 // All rights reserved.
4 //
5 // This file is part of OpenTween.
6 //
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)
10 // any later version.
11 //
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
15 // for more details.
16 //
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.
21
22 using System;
23 using System.Collections.Generic;
24 using System.Linq;
25 using System.Text;
26 using System.Threading.Tasks;
27 using Xunit;
28
29 namespace OpenTween
30 {
31     public class TimelineScheduerTest
32     {
33         private class TestTimelineScheduler : TimelineScheduler
34         {
35             public MockTimer MockTimer = new MockTimer(() => Task.CompletedTask);
36
37             public TestTimelineScheduler()
38                 : base()
39             {
40             }
41
42             protected override ITimer CreateTimer(Func<Task> callback)
43                 => this.MockTimer = new MockTimer(callback);
44         }
45
46         [Fact]
47         public async Task Callback_Test()
48         {
49             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
50             {
51                 using var scheduler = new TestTimelineScheduler();
52                 var mockTimer = scheduler.MockTimer;
53
54                 Assert.False(mockTimer.IsTimerRunning);
55
56                 var count = 0;
57                 scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
58                 {
59                     count++;
60                     TestUtils.DriftTime(TimeSpan.FromSeconds(10));
61                     return Task.CompletedTask;
62                 };
63                 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
64                 scheduler.Enabled = true;
65
66                 Assert.True(mockTimer.IsTimerRunning);
67                 Assert.Equal(TimeSpan.Zero, mockTimer.DueTime);
68
69                 // 0:00:00 - 0:00:10
70                 await mockTimer.Invoke();
71
72                 Assert.True(mockTimer.IsTimerRunning);
73                 Assert.Equal(TimeSpan.FromSeconds(50), mockTimer.DueTime); // UpdateFunc 内で掛かった時間を減算する
74             }
75         }
76
77         [Fact]
78         public async Task Callback_SystemResumeTest()
79         {
80             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
81             {
82                 using var scheduler = new TestTimelineScheduler();
83                 var mockTimer = scheduler.MockTimer;
84
85                 Assert.False(mockTimer.IsTimerRunning);
86
87                 var count = 0;
88                 scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
89                 {
90                     count++;
91                     return Task.CompletedTask;
92                 };
93                 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
94                 scheduler.UpdateAfterSystemResume = TimeSpan.FromMinutes(10);
95                 scheduler.Enabled = true;
96
97                 Assert.True(mockTimer.IsTimerRunning);
98                 Assert.Equal(TimeSpan.Zero, mockTimer.DueTime);
99
100                 // 0:00:00
101                 await mockTimer.Invoke();
102
103                 Assert.Equal(1, count); // invoked
104                 Assert.True(mockTimer.IsTimerRunning);
105                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
106
107                 scheduler.SystemResumed();
108
109                 Assert.True(mockTimer.IsTimerRunning);
110                 Assert.Equal(TimeSpan.FromMinutes(10), mockTimer.DueTime);
111
112                 // 0:10:00
113                 TestUtils.DriftTime(TimeSpan.FromMinutes(10));
114                 await mockTimer.Invoke();
115
116                 Assert.Equal(2, count); // invoked
117                 Assert.True(mockTimer.IsTimerRunning);
118                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
119             }
120         }
121
122         [Fact]
123         public void RefreshSchedule_Test()
124         {
125             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
126             {
127                 using var scheduler = new TestTimelineScheduler();
128                 var mockTimer = scheduler.MockTimer;
129
130                 scheduler.Enabled = true;
131                 Assert.False(mockTimer.IsTimerRunning);
132
133                 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
134                 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
135                 scheduler.RefreshSchedule();
136
137                 Assert.True(mockTimer.IsTimerRunning);
138                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
139             }
140         }
141
142         [Fact]
143         public void RefreshSchedule_EmptyTest()
144         {
145             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
146             {
147                 using var scheduler = new TestTimelineScheduler();
148                 var mockTimer = scheduler.MockTimer;
149
150                 scheduler.Enabled = true;
151                 Assert.False(mockTimer.IsTimerRunning);
152
153                 scheduler.RefreshSchedule();
154                 Assert.False(mockTimer.IsTimerRunning);
155             }
156         }
157
158         [Fact]
159         public void RefreshSchedule_MultipleTest()
160         {
161             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
162             {
163                 using var scheduler = new TestTimelineScheduler();
164                 var mockTimer = scheduler.MockTimer;
165
166                 scheduler.Enabled = true;
167                 Assert.False(mockTimer.IsTimerRunning);
168
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();
174
175                 Assert.True(mockTimer.IsTimerRunning);
176                 Assert.Equal(TimeSpan.FromMinutes(2), mockTimer.DueTime);
177
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();
183
184                 Assert.True(mockTimer.IsTimerRunning);
185                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
186             }
187         }
188     }
189 }