OSDN Git Service

UserByScreenNameで空のユーザー情報が返ってきた場合にエラーとして扱う
[opentween/open-tween.git] / OpenTween.Tests / TimelineListViewCacheTest.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 OpenTween.Models;
24 using OpenTween.OpenTweenCustomControl;
25 using Xunit;
26
27 namespace OpenTween
28 {
29     public class TimelineListViewCacheTest
30     {
31         private readonly Random random = new();
32
33         private PostClass CreatePost()
34         {
35             return new()
36             {
37                 StatusId = new TwitterStatusId(this.random.Next(10000)),
38                 UserId = this.random.Next(10000),
39                 ScreenName = "test",
40                 Nickname = "てすと",
41                 AccessibleText = "foo",
42                 Source = "OpenTween",
43                 FavoritedCount = 0,
44                 CreatedAt = TestUtils.LocalTime(2022, 1, 1, 0, 0, 0),
45                 IsRead = true,
46             };
47         }
48
49         [Fact]
50         public void UpdateListSize_Test()
51         {
52             var tab = new PublicSearchTabModel("tab");
53             using var listView = new DetailsListView();
54             using var cache = new TimelineListViewCache(listView, tab, new());
55
56             Assert.Equal(0, listView.VirtualListSize);
57             Assert.False(cache.IsListSizeMismatched);
58
59             tab.AddPostQueue(this.CreatePost());
60             tab.AddSubmit();
61
62             Assert.True(cache.IsListSizeMismatched);
63
64             cache.UpdateListSize();
65
66             Assert.Equal(1, listView.VirtualListSize);
67             Assert.False(cache.IsListSizeMismatched);
68         }
69
70         [Fact]
71         public void GetItem_Test()
72         {
73             var tab = new PublicSearchTabModel("tab");
74             using var listView = new DetailsListView();
75             using var cache = new TimelineListViewCache(listView, tab, new());
76
77             var post = this.CreatePost();
78             tab.AddPostQueue(post);
79             tab.AddSubmit();
80
81             var item = cache.GetItem(0);
82
83             Assert.Equal("", item.SubItems[0].Text);
84             Assert.Equal("てすと", item.SubItems[1].Text);
85             Assert.Equal("foo", item.SubItems[2].Text);
86             Assert.Equal("2022/01/01 0:00:00", item.SubItems[3].Text);
87             Assert.Equal("test", item.SubItems[4].Text);
88             Assert.Equal("", item.SubItems[5].Text);
89             Assert.Equal("", item.SubItems[6].Text);
90             Assert.Equal("OpenTween", item.SubItems[7].Text);
91         }
92
93         [Fact]
94         public void GetItem_UnreadTest()
95         {
96             var tab = new PublicSearchTabModel("tab");
97             using var listView = new DetailsListView();
98             using var cache = new TimelineListViewCache(listView, tab, new());
99
100             var post = this.CreatePost();
101             post.IsRead = false;
102
103             tab.AddPostQueue(post);
104             tab.AddSubmit();
105
106             var item = cache.GetItem(0);
107             Assert.Equal("★", item.SubItems[5].Text);
108         }
109
110         [Fact]
111         public void GetItem_UnreadManageDisabledTest()
112         {
113             var tab = new PublicSearchTabModel("tab");
114             using var listView = new DetailsListView();
115             using var cache = new TimelineListViewCache(listView, tab, new());
116
117             // 未読管理が無効な場合は未読状態に関わらず未読マークを表示しない
118             tab.UnreadManage = false;
119
120             var post = this.CreatePost();
121             post.IsRead = false;
122
123             tab.AddPostQueue(post);
124             tab.AddSubmit();
125
126             var item = cache.GetItem(0);
127             Assert.Equal("", item.SubItems[5].Text);
128         }
129
130         [Fact]
131         public void GetItem_FavoritesTest()
132         {
133             var tab = new PublicSearchTabModel("tab");
134             using var listView = new DetailsListView();
135             using var cache = new TimelineListViewCache(listView, tab, new());
136
137             var post = this.CreatePost();
138             post.FavoritedCount = 1;
139
140             tab.AddPostQueue(post);
141             tab.AddSubmit();
142
143             var item = cache.GetItem(0);
144             Assert.Equal("+1", item.SubItems[6].Text);
145         }
146
147         [Fact]
148         public void GetItem_RetweetTest()
149         {
150             var tab = new PublicSearchTabModel("tab");
151             using var listView = new DetailsListView();
152             using var cache = new TimelineListViewCache(listView, tab, new());
153
154             var post = this.CreatePost() with
155             {
156                 RetweetedId = new TwitterStatusId("50"),
157                 RetweetedBy = "hoge",
158             };
159
160             tab.AddPostQueue(post);
161             tab.AddSubmit();
162
163             var item = cache.GetItem(0);
164             Assert.Equal($"test{Environment.NewLine}(RT:hoge)", item.SubItems[4].Text);
165         }
166
167         [Fact]
168         public void GetItem_DeletedTest()
169         {
170             var tab = new PublicSearchTabModel("tab");
171             using var listView = new DetailsListView();
172             using var cache = new TimelineListViewCache(listView, tab, new());
173
174             var post = this.CreatePost();
175             post.IsDeleted = true;
176
177             tab.AddPostQueue(post);
178             tab.AddSubmit();
179
180             var item = cache.GetItem(0);
181             Assert.Equal("(DELETED)", item.SubItems[2].Text);
182         }
183
184         [Fact]
185         public void GetItem_CachedTest()
186         {
187             var tab = new PublicSearchTabModel("tab");
188             using var listView = new DetailsListView();
189             using var cache = new TimelineListViewCache(listView, tab, new());
190
191             var post = this.CreatePost();
192             tab.AddPostQueue(post);
193             tab.AddSubmit();
194
195             cache.CreateCache(startIndex: 0, endIndex: 0);
196
197             post.IsRead = false;
198
199             // IsRead の状態はキャッシュに未反映なので既読状態で返るのが正しい
200             var item = cache.GetItem(0);
201             Assert.Equal("", item.SubItems[5].Text);
202         }
203
204         [Fact]
205         public void GetStyle_Font_ReadedTest()
206         {
207             var tab = new PublicSearchTabModel("tab");
208             using var listView = new DetailsListView();
209             using var cache = new TimelineListViewCache(listView, tab, new());
210
211             var post = this.CreatePost();
212             post.IsRead = true;
213
214             tab.AddPostQueue(post);
215             tab.AddSubmit();
216
217             var style = cache.GetStyle(0);
218             Assert.Equal(ListItemFont.Readed, style.Font);
219         }
220
221         [Fact]
222         public void GetStyle_Font_UnreadTest()
223         {
224             var tab = new PublicSearchTabModel("tab");
225             using var listView = new DetailsListView();
226             using var cache = new TimelineListViewCache(listView, tab, new());
227
228             var post = this.CreatePost();
229             post.IsRead = false;
230
231             tab.AddPostQueue(post);
232             tab.AddSubmit();
233
234             var style = cache.GetStyle(0);
235             Assert.Equal(ListItemFont.Unread, style.Font);
236         }
237
238         [Fact]
239         public void GetStyle_Font_UnreadStyleDisabledTest()
240         {
241             var tab = new PublicSearchTabModel("tab");
242             var settingCommon = new SettingCommon();
243             using var listView = new DetailsListView();
244             using var cache = new TimelineListViewCache(listView, tab, settingCommon);
245
246             var post = this.CreatePost();
247             post.IsRead = false;
248
249             settingCommon.UseUnreadStyle = false;
250
251             tab.AddPostQueue(post);
252             tab.AddSubmit();
253
254             var style = cache.GetStyle(0);
255             Assert.Equal(ListItemFont.Readed, style.Font);
256         }
257
258         [Fact]
259         public void GetStyle_Font_UnreadManageDisabledTest()
260         {
261             var tab = new PublicSearchTabModel("tab");
262             var settingCommon = new SettingCommon();
263             using var listView = new DetailsListView();
264             using var cache = new TimelineListViewCache(listView, tab, settingCommon);
265
266             var post = this.CreatePost();
267             post.IsRead = false;
268
269             tab.UnreadManage = false;
270
271             tab.AddPostQueue(post);
272             tab.AddSubmit();
273
274             var style = cache.GetStyle(0);
275             Assert.Equal(ListItemFont.Readed, style.Font);
276         }
277
278         [Fact]
279         public void GetStyleItem_ForeColor_Test()
280         {
281             var tab = new PublicSearchTabModel("tab");
282             using var listView = new DetailsListView();
283             using var cache = new TimelineListViewCache(listView, tab, new());
284
285             var post = this.CreatePost();
286
287             tab.AddPostQueue(post);
288             tab.AddSubmit();
289
290             var style = cache.GetStyle(0);
291             Assert.Equal(ListItemForeColor.None, style.ForeColor);
292         }
293
294         [Fact]
295         public void GetStyle_ForeColor_FavoritedTest()
296         {
297             var tab = new PublicSearchTabModel("tab");
298             using var listView = new DetailsListView();
299             using var cache = new TimelineListViewCache(listView, tab, new());
300
301             var post = this.CreatePost();
302             post.IsFav = true;
303
304             tab.AddPostQueue(post);
305             tab.AddSubmit();
306
307             var style = cache.GetStyle(0);
308             Assert.Equal(ListItemForeColor.Fav, style.ForeColor);
309         }
310
311         [Fact]
312         public void GetStyle_ForeColor_RetweetTest()
313         {
314             var tab = new PublicSearchTabModel("tab");
315             using var listView = new DetailsListView();
316             using var cache = new TimelineListViewCache(listView, tab, new());
317
318             var post = this.CreatePost() with
319             {
320                 RetweetedId = new TwitterStatusId("100"),
321             };
322
323             tab.AddPostQueue(post);
324             tab.AddSubmit();
325
326             var style = cache.GetStyle(0);
327             Assert.Equal(ListItemForeColor.Retweet, style.ForeColor);
328         }
329
330         [Fact]
331         public void GetStyle_ForeColor_OWLTest()
332         {
333             var tab = new PublicSearchTabModel("tab");
334             using var listView = new DetailsListView();
335             using var cache = new TimelineListViewCache(listView, tab, new());
336
337             var post = this.CreatePost();
338             post.IsOwl = true;
339
340             tab.AddPostQueue(post);
341             tab.AddSubmit();
342
343             var style = cache.GetStyle(0);
344             Assert.Equal(ListItemForeColor.OWL, style.ForeColor);
345         }
346
347         [Fact]
348         public void GetStyle_ForeColor_OWLStyleDisabledTest()
349         {
350             var tab = new PublicSearchTabModel("tab");
351             var settingCommon = new SettingCommon();
352             using var listView = new DetailsListView();
353             using var cache = new TimelineListViewCache(listView, tab, settingCommon);
354
355             var post = this.CreatePost();
356             post.IsOwl = true;
357
358             settingCommon.OneWayLove = false;
359
360             tab.AddPostQueue(post);
361             tab.AddSubmit();
362
363             var style = cache.GetStyle(0);
364             Assert.Equal(ListItemForeColor.None, style.ForeColor);
365         }
366
367         [Fact]
368         public void GetStyle_ForeColor_DMTest()
369         {
370             var tab = new PublicSearchTabModel("tab");
371             var settingCommon = new SettingCommon();
372             using var listView = new DetailsListView();
373             using var cache = new TimelineListViewCache(listView, tab, settingCommon);
374
375             var post = this.CreatePost() with
376             {
377                 IsDm = true,
378                 IsOwl = true,
379             };
380
381             // DM の場合は設定に関わらず ColorOWL を使う
382             settingCommon.OneWayLove = false;
383
384             tab.AddPostQueue(post);
385             tab.AddSubmit();
386
387             var style = cache.GetStyle(0);
388             Assert.Equal(ListItemForeColor.OWL, style.ForeColor);
389         }
390
391         [Fact]
392         public void GetStyle_BackColor_AtToTest()
393         {
394             var tab = new PublicSearchTabModel("tab");
395             using var listView = new DetailsListView();
396             using var cache = new TimelineListViewCache(listView, tab, new());
397
398             var targetPost = this.CreatePost();
399             tab.AddPostQueue(targetPost);
400
401             var basePost = this.CreatePost() with
402             {
403                 InReplyToStatusId = targetPost.StatusId,
404             };
405             tab.AddPostQueue(basePost);
406
407             tab.AddSubmit();
408             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
409
410             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
411             Assert.Equal(ListItemBackColor.AtTo, style.BackColor);
412         }
413
414         [Fact]
415         public void GetStyle_BackColor_SelfTest()
416         {
417             var tab = new PublicSearchTabModel("tab");
418             using var listView = new DetailsListView();
419             using var cache = new TimelineListViewCache(listView, tab, new());
420
421             var targetPost = this.CreatePost() with
422             {
423                 IsMe = true,
424             };
425             tab.AddPostQueue(targetPost);
426
427             var basePost = this.CreatePost();
428             tab.AddPostQueue(basePost);
429
430             tab.AddSubmit();
431             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
432
433             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
434             Assert.Equal(ListItemBackColor.Self, style.BackColor);
435         }
436
437         [Fact]
438         public void GetStyle_BackColor_AtSelfTest()
439         {
440             var tab = new PublicSearchTabModel("tab");
441             using var listView = new DetailsListView();
442             using var cache = new TimelineListViewCache(listView, tab, new());
443
444             var targetPost = this.CreatePost() with
445             {
446                 IsReply = true,
447             };
448             tab.AddPostQueue(targetPost);
449
450             var basePost = this.CreatePost();
451             tab.AddPostQueue(basePost);
452
453             tab.AddSubmit();
454             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
455
456             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
457             Assert.Equal(ListItemBackColor.AtSelf, style.BackColor);
458         }
459
460         [Fact]
461         public void GetStyle_BackColor_AtFromTargetTest()
462         {
463             var tab = new PublicSearchTabModel("tab");
464             using var listView = new DetailsListView();
465             using var cache = new TimelineListViewCache(listView, tab, new());
466
467             var targetPost = this.CreatePost();
468             tab.AddPostQueue(targetPost);
469
470             var basePost = this.CreatePost() with
471             {
472                 ReplyToList = new() { (targetPost.UserId, targetPost.ScreenName) },
473             };
474             tab.AddPostQueue(basePost);
475
476             tab.AddSubmit();
477             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
478
479             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
480             Assert.Equal(ListItemBackColor.AtFromTarget, style.BackColor);
481         }
482
483         [Fact]
484         public void GetStyle_BackColor_AtTargetTest()
485         {
486             var tab = new PublicSearchTabModel("tab");
487             using var listView = new DetailsListView();
488             using var cache = new TimelineListViewCache(listView, tab, new());
489
490             var basePost = this.CreatePost();
491             tab.AddPostQueue(basePost);
492
493             var targetPost = this.CreatePost() with
494             {
495                 ReplyToList = new() { (basePost.UserId, basePost.ScreenName) },
496             };
497             tab.AddPostQueue(targetPost);
498
499             tab.AddSubmit();
500             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
501
502             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
503             Assert.Equal(ListItemBackColor.AtTarget, style.BackColor);
504         }
505
506         [Fact]
507         public void GetStyle_BackColor_TargetTest()
508         {
509             var tab = new PublicSearchTabModel("tab");
510             using var listView = new DetailsListView();
511             using var cache = new TimelineListViewCache(listView, tab, new());
512
513             var targetPost = this.CreatePost();
514             tab.AddPostQueue(targetPost);
515
516             var basePost = this.CreatePost() with
517             {
518                 UserId = targetPost.UserId,
519             };
520             tab.AddPostQueue(basePost);
521
522             tab.AddSubmit();
523             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
524
525             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
526             Assert.Equal(ListItemBackColor.Target, style.BackColor);
527         }
528
529         [Fact]
530         public void GetStyle_BackColor_NormalTest()
531         {
532             var tab = new PublicSearchTabModel("tab");
533             using var listView = new DetailsListView();
534             using var cache = new TimelineListViewCache(listView, tab, new());
535
536             var targetPost = this.CreatePost();
537             tab.AddPostQueue(targetPost);
538
539             var basePost = this.CreatePost();
540             tab.AddPostQueue(basePost);
541
542             tab.AddSubmit();
543             tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
544
545             var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
546             Assert.Equal(ListItemBackColor.None, style.BackColor);
547         }
548
549         [Fact]
550         public void GetStyle_CachedTest()
551         {
552             var tab = new PublicSearchTabModel("tab");
553             using var listView = new DetailsListView();
554             using var cache = new TimelineListViewCache(listView, tab, new());
555
556             var post = this.CreatePost();
557             tab.AddPostQueue(post);
558             tab.AddSubmit();
559
560             cache.CreateCache(startIndex: 0, endIndex: 0);
561
562             post.IsFav = true;
563
564             // IsFav の状態はキャッシュに未反映なので None が返るのが正しい
565             var style = cache.GetStyle(0);
566             Assert.Equal(ListItemForeColor.None, style.ForeColor);
567         }
568     }
569 }