OSDN Git Service

TwitterCredentialOAuth1に渡す引数の誤りを修正
[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(() => 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.FromMinutes(1), mockTimer.DueTime);
68
69                 // 0:01:00 - 0:01:10
70                 TestUtils.DriftTime(TimeSpan.FromMinutes(1));
71                 await mockTimer.Invoke();
72
73                 Assert.True(mockTimer.IsTimerRunning);
74                 Assert.Equal(TimeSpan.FromSeconds(50), mockTimer.DueTime); // UpdateFunc 内で掛かった時間を減算する
75             }
76         }
77
78         [Fact]
79         public async Task Callback_SystemResumeTest()
80         {
81             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
82             {
83                 using var scheduler = new TestTimelineScheduler();
84                 var mockTimer = scheduler.MockTimer;
85
86                 Assert.False(mockTimer.IsTimerRunning);
87
88                 var count = 0;
89                 scheduler.UpdateFunc[TimelineSchedulerTaskType.Home] = () =>
90                 {
91                     count++;
92                     return Task.CompletedTask;
93                 };
94                 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
95                 scheduler.UpdateAfterSystemResume = TimeSpan.FromMinutes(10);
96                 scheduler.Enabled = true;
97
98                 Assert.True(mockTimer.IsTimerRunning);
99                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
100
101                 // 0:01:00
102                 TestUtils.DriftTime(TimeSpan.FromMinutes(1));
103                 await mockTimer.Invoke();
104
105                 Assert.Equal(1, count); // invoked
106                 Assert.True(mockTimer.IsTimerRunning);
107                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
108
109                 scheduler.SystemResumed();
110
111                 Assert.True(mockTimer.IsTimerRunning);
112                 Assert.Equal(TimeSpan.FromMinutes(10), mockTimer.DueTime);
113
114                 // 0:11:00
115                 TestUtils.DriftTime(TimeSpan.FromMinutes(10));
116                 await mockTimer.Invoke();
117
118                 Assert.Equal(2, count); // invoked
119                 Assert.True(mockTimer.IsTimerRunning);
120                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
121             }
122         }
123
124         [Fact]
125         public void RefreshSchedule_Test()
126         {
127             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
128             {
129                 using var scheduler = new TestTimelineScheduler();
130                 var mockTimer = scheduler.MockTimer;
131
132                 scheduler.Enabled = true;
133                 Assert.False(mockTimer.IsTimerRunning);
134
135                 scheduler.LastUpdatedAt[TimelineSchedulerTaskType.Home] = DateTimeUtc.Now;
136                 scheduler.UpdateInterval[TimelineSchedulerTaskType.Home] = TimeSpan.FromMinutes(1);
137                 scheduler.RefreshSchedule();
138
139                 Assert.True(mockTimer.IsTimerRunning);
140                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
141             }
142         }
143
144         [Fact]
145         public void RefreshSchedule_EmptyTest()
146         {
147             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
148             {
149                 using var scheduler = new TestTimelineScheduler();
150                 var mockTimer = scheduler.MockTimer;
151
152                 scheduler.Enabled = true;
153                 Assert.False(mockTimer.IsTimerRunning);
154
155                 scheduler.RefreshSchedule();
156                 Assert.False(mockTimer.IsTimerRunning);
157             }
158         }
159
160         [Fact]
161         public void RefreshSchedule_MultipleTest()
162         {
163             using (TestUtils.FreezeTime(new DateTimeUtc(2022, 1, 1, 0, 0, 0)))
164             {
165                 using var scheduler = new TestTimelineScheduler();
166                 var mockTimer = scheduler.MockTimer;
167
168                 scheduler.Enabled = true;
169                 Assert.False(mockTimer.IsTimerRunning);
170
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();
176
177                 Assert.True(mockTimer.IsTimerRunning);
178                 Assert.Equal(TimeSpan.FromMinutes(2), mockTimer.DueTime);
179
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();
185
186                 Assert.True(mockTimer.IsTimerRunning);
187                 Assert.Equal(TimeSpan.FromMinutes(1), mockTimer.DueTime);
188             }
189         }
190     }
191 }