OSDN Git Service

タイムライン検索で検索結果を新規タブに表示する場合とカーソル移動のみの場合で検索条件を同一にする
[opentween/open-tween.git] / OpenTween.Tests / TabClassTest.cs
index 845c695..cad1d00 100644 (file)
@@ -26,20 +26,21 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Forms;
 using Xunit;
+using Xunit.Extensions;
 
 namespace OpenTween
 {
     public class TabClassTest
     {
         [Fact]
-        public void OldestUnreadId_Test()
+        public void NextUnreadId_Test()
         {
             var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
 
             tab.UnreadManage = true;
 
             // 未読なし
-            Assert.Equal(-1L, tab.OldestUnreadId);
+            Assert.Equal(-1L, tab.NextUnreadId);
 
             tab.AddPostToInnerStorage(new PostClass
             {
@@ -48,7 +49,7 @@ namespace OpenTween
             });
             tab.AddSubmit();
 
-            Assert.Equal(100L, tab.OldestUnreadId);
+            Assert.Equal(100L, tab.NextUnreadId);
 
             tab.AddPostToInnerStorage(new PostClass
             {
@@ -57,11 +58,11 @@ namespace OpenTween
             });
             tab.AddSubmit();
 
-            Assert.Equal(100L, tab.OldestUnreadId);
+            Assert.Equal(100L, tab.NextUnreadId);
         }
 
         [Fact]
-        public void OldestUnreadId_DisabledTest()
+        public void NextUnreadId_DisabledTest()
         {
             var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
 
@@ -75,7 +76,87 @@ namespace OpenTween
             });
             tab.AddSubmit();
 
-            Assert.Equal(-1L, tab.OldestUnreadId);
+            Assert.Equal(-1L, tab.NextUnreadId);
+        }
+
+        [Fact]
+        public void NextUnreadId_SortByIdAscTest()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+
+            tab.UnreadManage = true;
+
+            // ID の昇順でソート
+            tab.SetSortMode(ComparerMode.Id, SortOrder.Ascending);
+
+            // 画面には上から 100 → 200 → 300 の順に並ぶ
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 200L, IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 300L, IsRead = false });
+            tab.AddSubmit();
+
+            // 昇順/降順に関わらず、ID の小さい順に未読の ID を返す
+            Assert.Equal(100L, tab.NextUnreadId);
+        }
+
+        [Fact]
+        public void NextUnreadId_SortByIdDescTest()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+
+            tab.UnreadManage = true;
+
+            // ID の降順でソート
+            tab.SetSortMode(ComparerMode.Id, SortOrder.Descending);
+
+            // 画面には上から 300 → 200 → 100 の順に並ぶ
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 200L, IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 300L, IsRead = false });
+            tab.AddSubmit();
+
+            // 昇順/降順に関わらず、ID の小さい順に未読の ID を返す
+            Assert.Equal(100L, tab.NextUnreadId);
+        }
+
+        [Fact]
+        public void NextUnreadId_SortByScreenNameAscTest()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+
+            tab.UnreadManage = true;
+
+            // ScreenName の昇順でソート
+            tab.SetSortMode(ComparerMode.Name, SortOrder.Ascending);
+
+            // 画面には上から 200 → 100 → 300 の順に並ぶ
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, ScreenName = "bbb", IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 200L, ScreenName = "aaa", IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 300L, ScreenName = "ccc", IsRead = false });
+            tab.AddSubmit();
+
+            // 昇順/降順に関わらず、ScreenName の辞書順で小さい順に未読の ID を返す
+            Assert.Equal(200L, tab.NextUnreadId);
+        }
+
+        [Fact]
+        public void NextUnreadId_SortByScreenNameDescTest()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+
+            tab.UnreadManage = true;
+
+            // ScreenName の降順でソート
+            tab.SetSortMode(ComparerMode.Name, SortOrder.Descending);
+
+            // 画面には上から 300 → 100 → 200 の順に並ぶ
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, ScreenName = "bbb", IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 200L, ScreenName = "aaa", IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 300L, ScreenName = "ccc", IsRead = false });
+            tab.AddSubmit();
+
+            // 昇順/降順に関わらず、ScreenName の辞書順で小さい順に未読の ID を返す
+            Assert.Equal(200L, tab.NextUnreadId);
         }
 
         [Fact]
@@ -126,14 +207,15 @@ namespace OpenTween
         }
 
         [Fact]
-        public void OldestUnreadIndex_Test()
+        public void NextUnreadIndex_Test()
         {
             var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+            tab.SetSortMode(ComparerMode.Id, SortOrder.Ascending);
 
             tab.UnreadManage = true;
 
             // 未読なし
-            Assert.Equal(-1, tab.OldestUnreadIndex);
+            Assert.Equal(-1, tab.NextUnreadIndex);
 
             tab.AddPostToInnerStorage(new PostClass
             {
@@ -152,17 +234,14 @@ namespace OpenTween
             });
             tab.AddSubmit();
 
-            tab.SortMode = ComparerMode.Id;
-            tab.SortOrder = SortOrder.Ascending;
-            tab.Sort();
-
-            Assert.Equal(1, tab.OldestUnreadIndex);
+            Assert.Equal(1, tab.NextUnreadIndex);
         }
 
         [Fact]
-        public void OldestUnreadIndex_DisabledTest()
+        public void NextUnreadIndex_DisabledTest()
         {
             var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+            tab.SetSortMode(ComparerMode.Id, SortOrder.Ascending);
 
             // 未読表示無効
             tab.UnreadManage = false;
@@ -174,11 +253,26 @@ namespace OpenTween
             });
             tab.AddSubmit();
 
-            tab.SortMode = ComparerMode.Id;
-            tab.SortOrder = SortOrder.Ascending;
-            tab.Sort();
+            Assert.Equal(-1, tab.NextUnreadIndex);
+        }
+
+        [Fact]
+        public void GetUnreadIds_Test()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.UserTimeline };
+            tab.UnreadManage = true;
+
+            Assert.Empty(tab.GetUnreadIds());
+
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, IsRead = false });
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 200L, IsRead = true });
+            tab.AddSubmit();
+
+            Assert.Equal(new[] { 100L }, tab.GetUnreadIds());
+
+            tab.SetReadState(100L, true); // 既読にする
 
-            Assert.Equal(-1, tab.OldestUnreadIndex);
+            Assert.Empty(tab.GetUnreadIds());
         }
 
         [Fact]
@@ -293,5 +387,99 @@ namespace OpenTween
 
             Assert.False(tab.FilterModified);
         }
+
+        [Fact]
+        public void SearchPostsAll_Test()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.PublicSearch };
+
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, TextFromApi = "abcd", ScreenName = "", Nickname = "" }); // 0
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 110L, TextFromApi = "efgh", ScreenName = "", Nickname = "" }); // 1
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 120L, TextFromApi = "ijkl", ScreenName = "", Nickname = "" }); // 2
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 130L, TextFromApi = "abc", ScreenName = "", Nickname = "" });  // 3
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 140L, TextFromApi = "def", ScreenName = "", Nickname = "" });  // 4
+
+            tab.SetSortMode(ComparerMode.Id, SortOrder.Ascending);
+            tab.AddSubmit();
+
+            // インデックス番号 0 から開始 → 0, 1, 2, 3, 4 の順に検索
+            var result = tab.SearchPostsAll(x => x.Contains("a"), startIndex: 0);
+            Assert.Equal(new[] { 0, 3 }, result);
+
+            // インデックス番号 2 から開始 → 2, 3, 4, 0, 1 の順に検索
+            result = tab.SearchPostsAll(x => x.Contains("a"), startIndex: 2);
+            Assert.Equal(new[] { 3, 0 }, result);
+        }
+
+        [Fact]
+        public void SearchPostsAll_ReverseOrderTest()
+        {
+            var tab = new TabClass { TabType = MyCommon.TabUsageType.PublicSearch };
+
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 100L, TextFromApi = "abcd", ScreenName = "", Nickname = "" }); // 0
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 110L, TextFromApi = "efgh", ScreenName = "", Nickname = "" }); // 1
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 120L, TextFromApi = "ijkl", ScreenName = "", Nickname = "" }); // 2
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 130L, TextFromApi = "abc", ScreenName = "", Nickname = "" });  // 3
+            tab.AddPostToInnerStorage(new PostClass { StatusId = 140L, TextFromApi = "def", ScreenName = "", Nickname = "" });  // 4
+
+            tab.SetSortMode(ComparerMode.Id, SortOrder.Ascending);
+            tab.AddSubmit();
+
+            // インデックス番号 4 から逆順に開始 → 4, 3, 2, 1, 0 の順に検索
+            var result = tab.SearchPostsAll(x => x.Contains("a"), startIndex: 4, reverse: true);
+            Assert.Equal(new[] { 3, 0 }, result);
+
+            // インデックス番号 2 から逆順に開始 → 2, 1, 0, 4, 3 の順に検索
+            result = tab.SearchPostsAll(x => x.Contains("a"), startIndex: 2, reverse: true);
+            Assert.Equal(new[] { 0, 3 }, result);
+        }
+    }
+
+    public class TabUsageTypeExtTest
+    {
+        [Theory]
+        [InlineData(MyCommon.TabUsageType.Home,          true)]
+        [InlineData(MyCommon.TabUsageType.Mentions,      true)]
+        [InlineData(MyCommon.TabUsageType.DirectMessage, true)]
+        [InlineData(MyCommon.TabUsageType.Favorites,     true)]
+        [InlineData(MyCommon.TabUsageType.UserDefined,   false)]
+        [InlineData(MyCommon.TabUsageType.Lists,         false)]
+        [InlineData(MyCommon.TabUsageType.UserTimeline,  false)]
+        [InlineData(MyCommon.TabUsageType.PublicSearch,  false)]
+        [InlineData(MyCommon.TabUsageType.Related,       false)]
+        public void IsDefault_Test(MyCommon.TabUsageType tabType, bool expected)
+        {
+            Assert.Equal(expected, tabType.IsDefault());
+        }
+
+        [Theory]
+        [InlineData(MyCommon.TabUsageType.Home,          false)]
+        [InlineData(MyCommon.TabUsageType.Mentions,      true)]
+        [InlineData(MyCommon.TabUsageType.DirectMessage, false)]
+        [InlineData(MyCommon.TabUsageType.Favorites,     false)]
+        [InlineData(MyCommon.TabUsageType.UserDefined,   true)]
+        [InlineData(MyCommon.TabUsageType.Lists,         false)]
+        [InlineData(MyCommon.TabUsageType.UserTimeline,  false)]
+        [InlineData(MyCommon.TabUsageType.PublicSearch,  false)]
+        [InlineData(MyCommon.TabUsageType.Related,       false)]
+        public void IsDistributable_Test(MyCommon.TabUsageType tabType, bool expected)
+        {
+            Assert.Equal(expected, tabType.IsDistributable());
+        }
+
+        [Theory]
+        [InlineData(MyCommon.TabUsageType.Home,          false)]
+        [InlineData(MyCommon.TabUsageType.Mentions,      false)]
+        [InlineData(MyCommon.TabUsageType.DirectMessage, true)]
+        [InlineData(MyCommon.TabUsageType.Favorites,     false)]
+        [InlineData(MyCommon.TabUsageType.UserDefined,   false)]
+        [InlineData(MyCommon.TabUsageType.Lists,         true)]
+        [InlineData(MyCommon.TabUsageType.UserTimeline,  true)]
+        [InlineData(MyCommon.TabUsageType.PublicSearch,  true)]
+        [InlineData(MyCommon.TabUsageType.Related,       true)]
+        public void IsInnerStorage_Test(MyCommon.TabUsageType tabType, bool expected)
+        {
+            Assert.Equal(expected, tabType.IsInnerStorage());
+        }
     }
 }