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 OpenTween.Models;
24 using OpenTween.OpenTweenCustomControl;
29 public class TimelineListViewCacheTest
31 private readonly Random random = new();
33 private PostClass CreatePost()
37 StatusId = new TwitterStatusId(this.random.Next(10000)),
38 UserId = this.random.Next(10000),
41 AccessibleText = "foo",
44 CreatedAt = TestUtils.LocalTime(2022, 1, 1, 0, 0, 0),
50 public void UpdateListSize_Test()
52 var tab = new PublicSearchTabModel("tab");
53 using var listView = new DetailsListView();
54 using var cache = new TimelineListViewCache(listView, tab, new());
56 Assert.Equal(0, listView.VirtualListSize);
57 Assert.False(cache.IsListSizeMismatched);
59 tab.AddPostQueue(this.CreatePost());
62 Assert.True(cache.IsListSizeMismatched);
64 cache.UpdateListSize();
66 Assert.Equal(1, listView.VirtualListSize);
67 Assert.False(cache.IsListSizeMismatched);
71 public void GetItem_Test()
73 var tab = new PublicSearchTabModel("tab");
74 using var listView = new DetailsListView();
75 using var cache = new TimelineListViewCache(listView, tab, new());
77 var post = this.CreatePost();
78 tab.AddPostQueue(post);
81 var item = cache.GetItem(0);
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);
94 public void GetItem_UnreadTest()
96 var tab = new PublicSearchTabModel("tab");
97 using var listView = new DetailsListView();
98 using var cache = new TimelineListViewCache(listView, tab, new());
100 var post = this.CreatePost();
103 tab.AddPostQueue(post);
106 var item = cache.GetItem(0);
107 Assert.Equal("★", item.SubItems[5].Text);
111 public void GetItem_UnreadManageDisabledTest()
113 var tab = new PublicSearchTabModel("tab");
114 using var listView = new DetailsListView();
115 using var cache = new TimelineListViewCache(listView, tab, new());
117 // 未読管理が無効な場合は未読状態に関わらず未読マークを表示しない
118 tab.UnreadManage = false;
120 var post = this.CreatePost();
123 tab.AddPostQueue(post);
126 var item = cache.GetItem(0);
127 Assert.Equal("", item.SubItems[5].Text);
131 public void GetItem_FavoritesTest()
133 var tab = new PublicSearchTabModel("tab");
134 using var listView = new DetailsListView();
135 using var cache = new TimelineListViewCache(listView, tab, new());
137 var post = this.CreatePost();
138 post.FavoritedCount = 1;
140 tab.AddPostQueue(post);
143 var item = cache.GetItem(0);
144 Assert.Equal("+1", item.SubItems[6].Text);
148 public void GetItem_RetweetTest()
150 var tab = new PublicSearchTabModel("tab");
151 using var listView = new DetailsListView();
152 using var cache = new TimelineListViewCache(listView, tab, new());
154 var post = this.CreatePost() with
156 RetweetedId = new TwitterStatusId("50"),
157 RetweetedBy = "hoge",
160 tab.AddPostQueue(post);
163 var item = cache.GetItem(0);
164 Assert.Equal($"test{Environment.NewLine}(RT:hoge)", item.SubItems[4].Text);
168 public void GetItem_DeletedTest()
170 var tab = new PublicSearchTabModel("tab");
171 using var listView = new DetailsListView();
172 using var cache = new TimelineListViewCache(listView, tab, new());
174 var post = this.CreatePost();
175 post.IsDeleted = true;
177 tab.AddPostQueue(post);
180 var item = cache.GetItem(0);
181 Assert.Equal("(DELETED)", item.SubItems[2].Text);
185 public void GetItem_CachedTest()
187 var tab = new PublicSearchTabModel("tab");
188 using var listView = new DetailsListView();
189 using var cache = new TimelineListViewCache(listView, tab, new());
191 var post = this.CreatePost();
192 tab.AddPostQueue(post);
195 cache.CreateCache(startIndex: 0, endIndex: 0);
199 // IsRead の状態はキャッシュに未反映なので既読状態で返るのが正しい
200 var item = cache.GetItem(0);
201 Assert.Equal("", item.SubItems[5].Text);
205 public void GetStyle_Font_ReadedTest()
207 var tab = new PublicSearchTabModel("tab");
208 using var listView = new DetailsListView();
209 using var cache = new TimelineListViewCache(listView, tab, new());
211 var post = this.CreatePost();
214 tab.AddPostQueue(post);
217 var style = cache.GetStyle(0);
218 Assert.Equal(ListItemFont.Readed, style.Font);
222 public void GetStyle_Font_UnreadTest()
224 var tab = new PublicSearchTabModel("tab");
225 using var listView = new DetailsListView();
226 using var cache = new TimelineListViewCache(listView, tab, new());
228 var post = this.CreatePost();
231 tab.AddPostQueue(post);
234 var style = cache.GetStyle(0);
235 Assert.Equal(ListItemFont.Unread, style.Font);
239 public void GetStyle_Font_UnreadStyleDisabledTest()
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);
246 var post = this.CreatePost();
249 settingCommon.UseUnreadStyle = false;
251 tab.AddPostQueue(post);
254 var style = cache.GetStyle(0);
255 Assert.Equal(ListItemFont.Readed, style.Font);
259 public void GetStyle_Font_UnreadManageDisabledTest()
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);
266 var post = this.CreatePost();
269 tab.UnreadManage = false;
271 tab.AddPostQueue(post);
274 var style = cache.GetStyle(0);
275 Assert.Equal(ListItemFont.Readed, style.Font);
279 public void GetStyleItem_ForeColor_Test()
281 var tab = new PublicSearchTabModel("tab");
282 using var listView = new DetailsListView();
283 using var cache = new TimelineListViewCache(listView, tab, new());
285 var post = this.CreatePost();
287 tab.AddPostQueue(post);
290 var style = cache.GetStyle(0);
291 Assert.Equal(ListItemForeColor.None, style.ForeColor);
295 public void GetStyle_ForeColor_FavoritedTest()
297 var tab = new PublicSearchTabModel("tab");
298 using var listView = new DetailsListView();
299 using var cache = new TimelineListViewCache(listView, tab, new());
301 var post = this.CreatePost();
304 tab.AddPostQueue(post);
307 var style = cache.GetStyle(0);
308 Assert.Equal(ListItemForeColor.Fav, style.ForeColor);
312 public void GetStyle_ForeColor_RetweetTest()
314 var tab = new PublicSearchTabModel("tab");
315 using var listView = new DetailsListView();
316 using var cache = new TimelineListViewCache(listView, tab, new());
318 var post = this.CreatePost() with
320 RetweetedId = new TwitterStatusId("100"),
323 tab.AddPostQueue(post);
326 var style = cache.GetStyle(0);
327 Assert.Equal(ListItemForeColor.Retweet, style.ForeColor);
331 public void GetStyle_ForeColor_OWLTest()
333 var tab = new PublicSearchTabModel("tab");
334 using var listView = new DetailsListView();
335 using var cache = new TimelineListViewCache(listView, tab, new());
337 var post = this.CreatePost();
340 tab.AddPostQueue(post);
343 var style = cache.GetStyle(0);
344 Assert.Equal(ListItemForeColor.OWL, style.ForeColor);
348 public void GetStyle_ForeColor_OWLStyleDisabledTest()
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);
355 var post = this.CreatePost();
358 settingCommon.OneWayLove = false;
360 tab.AddPostQueue(post);
363 var style = cache.GetStyle(0);
364 Assert.Equal(ListItemForeColor.None, style.ForeColor);
368 public void GetStyle_ForeColor_DMTest()
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);
375 var post = this.CreatePost() with
381 // DM の場合は設定に関わらず ColorOWL を使う
382 settingCommon.OneWayLove = false;
384 tab.AddPostQueue(post);
387 var style = cache.GetStyle(0);
388 Assert.Equal(ListItemForeColor.OWL, style.ForeColor);
392 public void GetStyle_BackColor_AtToTest()
394 var tab = new PublicSearchTabModel("tab");
395 using var listView = new DetailsListView();
396 using var cache = new TimelineListViewCache(listView, tab, new());
398 var targetPost = this.CreatePost();
399 tab.AddPostQueue(targetPost);
401 var basePost = this.CreatePost() with
403 InReplyToStatusId = targetPost.StatusId,
405 tab.AddPostQueue(basePost);
408 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
410 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
411 Assert.Equal(ListItemBackColor.AtTo, style.BackColor);
415 public void GetStyle_BackColor_SelfTest()
417 var tab = new PublicSearchTabModel("tab");
418 using var listView = new DetailsListView();
419 using var cache = new TimelineListViewCache(listView, tab, new());
421 var targetPost = this.CreatePost() with
425 tab.AddPostQueue(targetPost);
427 var basePost = this.CreatePost();
428 tab.AddPostQueue(basePost);
431 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
433 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
434 Assert.Equal(ListItemBackColor.Self, style.BackColor);
438 public void GetStyle_BackColor_AtSelfTest()
440 var tab = new PublicSearchTabModel("tab");
441 using var listView = new DetailsListView();
442 using var cache = new TimelineListViewCache(listView, tab, new());
444 var targetPost = this.CreatePost() with
448 tab.AddPostQueue(targetPost);
450 var basePost = this.CreatePost();
451 tab.AddPostQueue(basePost);
454 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
456 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
457 Assert.Equal(ListItemBackColor.AtSelf, style.BackColor);
461 public void GetStyle_BackColor_AtFromTargetTest()
463 var tab = new PublicSearchTabModel("tab");
464 using var listView = new DetailsListView();
465 using var cache = new TimelineListViewCache(listView, tab, new());
467 var targetPost = this.CreatePost();
468 tab.AddPostQueue(targetPost);
470 var basePost = this.CreatePost() with
472 ReplyToList = new() { (targetPost.UserId, targetPost.ScreenName) },
474 tab.AddPostQueue(basePost);
477 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
479 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
480 Assert.Equal(ListItemBackColor.AtFromTarget, style.BackColor);
484 public void GetStyle_BackColor_AtTargetTest()
486 var tab = new PublicSearchTabModel("tab");
487 using var listView = new DetailsListView();
488 using var cache = new TimelineListViewCache(listView, tab, new());
490 var basePost = this.CreatePost();
491 tab.AddPostQueue(basePost);
493 var targetPost = this.CreatePost() with
495 ReplyToList = new() { (basePost.UserId, basePost.ScreenName) },
497 tab.AddPostQueue(targetPost);
500 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
502 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
503 Assert.Equal(ListItemBackColor.AtTarget, style.BackColor);
507 public void GetStyle_BackColor_TargetTest()
509 var tab = new PublicSearchTabModel("tab");
510 using var listView = new DetailsListView();
511 using var cache = new TimelineListViewCache(listView, tab, new());
513 var targetPost = this.CreatePost();
514 tab.AddPostQueue(targetPost);
516 var basePost = this.CreatePost() with
518 UserId = targetPost.UserId,
520 tab.AddPostQueue(basePost);
523 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
525 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
526 Assert.Equal(ListItemBackColor.Target, style.BackColor);
530 public void GetStyle_BackColor_NormalTest()
532 var tab = new PublicSearchTabModel("tab");
533 using var listView = new DetailsListView();
534 using var cache = new TimelineListViewCache(listView, tab, new());
536 var targetPost = this.CreatePost();
537 tab.AddPostQueue(targetPost);
539 var basePost = this.CreatePost();
540 tab.AddPostQueue(basePost);
543 tab.SelectPosts(new[] { tab.IndexOf(basePost.StatusId) });
545 var style = cache.GetStyle(tab.IndexOf(targetPost.StatusId));
546 Assert.Equal(ListItemBackColor.None, style.BackColor);
550 public void GetStyle_CachedTest()
552 var tab = new PublicSearchTabModel("tab");
553 using var listView = new DetailsListView();
554 using var cache = new TimelineListViewCache(listView, tab, new());
556 var post = this.CreatePost();
557 tab.AddPostQueue(post);
560 cache.CreateCache(startIndex: 0, endIndex: 0);
564 // IsFav の状態はキャッシュに未反映なので None が返るのが正しい
565 var style = cache.GetStyle(0);
566 Assert.Equal(ListItemForeColor.None, style.ForeColor);