--- /dev/null
+// Copyright (C) 2019 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
+//\r
+// Licensed under the Apache License, Version 2.0 (the "License");\r
+// you may not use this file except in compliance with the License.\r
+// You may obtain a copy of the License at\r
+//\r
+// http://www.apache.org/licenses/LICENSE-2.0\r
+//\r
+// Unless required by applicable law or agreed to in writing, software\r
+// distributed under the License is distributed on an "AS IS" BASIS,\r
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+// See the License for the specific language governing permissions and\r
+// limitations under the License.\r
+\r
+using System.Collections.Generic;\r
+using System.Linq;\r
+using KancolleSniffer.Model;\r
+using KancolleSniffer.View;\r
+using Microsoft.VisualStudio.TestTools.UnitTesting;\r
+\r
+namespace KancolleSniffer.Test\r
+{\r
+ [TestClass]\r
+ public class QuestPanelTest\r
+ {\r
+ private const int Lines = 4;\r
+ private const int AcceptMax = 7;\r
+ private readonly QuestPanel _panel = new QuestPanel();\r
+ private readonly QuestCountList _countList = new QuestCountList();\r
+\r
+ [TestInitialize]\r
+ public void Initialize()\r
+ {\r
+ _panel.CreateLabels(Lines, (obj, e) => { });\r
+ }\r
+\r
+ /// <summary>\r
+ /// 行数と同じ任務数\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void ShowAll()\r
+ {\r
+ _panel.Update(CreateQuests(Lines));\r
+ Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 最大の任務数について上から行数分\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void ShowTop()\r
+ {\r
+ _panel.Update(CreateQuests(AcceptMax));\r
+ Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// IDの大きい任務の追加されたら、その表示のためにスクロールする\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void AddBottomWithScroll()\r
+ {\r
+ _panel.Update(CreateQuests(Lines));\r
+ _panel.Update(CreateQuests(Lines + 1));\r
+ Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
+\r
+ SetScrollPosition(1);\r
+ _panel.Update(CreateQuests(Lines + 2));\r
+ Assert.IsTrue(CheckResult(CreateQuests(2, Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// IDの小さい任務が追加されたらそれを表示する\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void AddTop()\r
+ {\r
+ _panel.Update(CreateQuests(2, Lines).ToArray());\r
+ _panel.Update(CreateQuests(1, Lines + 1).ToArray());\r
+ Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 上が隠れているときにIDの小さい任務が追加されたら上スクロールする\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void AddTopWithScroll()\r
+ {\r
+ _panel.Update(CreateQuests(1, Lines + 1));\r
+ SetScrollPosition(1);\r
+ _panel.Update(CreateQuests(Lines + 2).ToArray());\r
+ Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 中間のIDの任務が見える位置に挿入されたらスクロールしない\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void AddMediumWithoutScroll()\r
+ {\r
+ _panel.Update(CreateQuests(new[] {0, 2, 3, 4, 5}));\r
+ SetScrollPosition(1);\r
+ _panel.Update(CreateQuests(new[] {0, 1, 2, 3, 4, 5}));\r
+ Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 中間のIDの任務が見えない位置に挿入されたらスクロールする\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void AddMediumWithScroll()\r
+ {\r
+ _panel.Update(CreateQuests(new[] {0, 2, 3, 4, 5, 6}));\r
+ SetScrollPosition(2);\r
+ _panel.Update(CreateQuests(AcceptMax));\r
+ Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 最後の任務が減る場合\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void RemoveBottom()\r
+ {\r
+ _panel.Update(CreateQuests(AcceptMax));\r
+ _panel.Update(CreateQuests(AcceptMax - 1));\r
+ Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 最後の任務が減った結果上スクロールする\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void RemoveBottomWithScroll()\r
+ {\r
+ _panel.Update(CreateQuests(Lines + 2));\r
+ SetScrollPosition(2);\r
+ _panel.Update(CreateQuests(Lines + 1));\r
+ Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 中間の任務が減る場合\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void RemoveMedium()\r
+ {\r
+ _panel.Update(CreateQuests(AcceptMax));\r
+ var sparse = new[] {0, 1, 3, 4, 5, 6};\r
+ _panel.Update(CreateQuests(sparse));\r
+ Assert.IsTrue(CheckResult(CreateQuests(sparse.Take(Lines))));\r
+ }\r
+\r
+ /// <summary>\r
+ /// 中間の任務が減った結果上スクロールする\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void RemoveMediumWithScroll()\r
+ {\r
+ _panel.Update(CreateQuests(Lines + 2));\r
+ SetScrollPosition(2);\r
+ var sparse = new[] {0, 1, 2, 4, 5};\r
+ _panel.Update(CreateQuests(sparse));\r
+ Assert.IsTrue(CheckResult(CreateQuests(sparse.Skip(1))));\r
+ }\r
+\r
+ /// <summary>\r
+ /// カウントが増えた任務を見える位置にスクロールする\r
+ /// </summary>\r
+ [TestMethod]\r
+ public void ChangeCount()\r
+ {\r
+ var quests = CreateQuests(AcceptMax);\r
+ _panel.Update(quests);\r
+\r
+ quests[AcceptMax - 1].Count.Now = 1;\r
+ _panel.Update(quests);\r
+ Assert.IsTrue(CheckResult(CreateQuests(3, Lines)), "下スクロール");\r
+\r
+ quests[2].Count.NowArray[0] = 1;\r
+ _panel.Update(quests);\r
+ Assert.IsTrue(CheckResult(CreateQuests(2, Lines)), "上スクロール");\r
+\r
+ quests[3].Count.Now = 1;\r
+ _panel.Update(quests);\r
+ Assert.IsTrue(CheckResult(CreateQuests(2, Lines)), "そのまま");\r
+\r
+ _panel.Update(quests);\r
+ Assert.IsTrue(CheckResult(CreateQuests(2, Lines)), "そのまま");\r
+\r
+ quests[0].Count.Now = 1;\r
+ _panel.Update(quests);\r
+ Assert.IsTrue(CheckResult(CreateQuests(Lines)), "上スクロール");\r
+ }\r
+\r
+\r
+ private QuestStatus[] CreateQuests(int length)\r
+ {\r
+ return CreateQuests(0, length);\r
+ }\r
+\r
+ private QuestStatus[] CreateQuests(int start, int count)\r
+ {\r
+ return CreateQuests(Enumerable.Range(start, count));\r
+ }\r
+\r
+ private QuestStatus[] CreateQuests(IEnumerable<int> indexes)\r
+ {\r
+ var quests = new[]\r
+ {\r
+ CreateStatus(210, "敵艦隊を10回邀撃せよ!"),\r
+ CreateStatus(211, "敵空母を3隻撃沈せよ!"),\r
+ CreateStatus(214, "あ号作戦"),\r
+ CreateStatus(216, "敵艦隊主力を撃滅せよ!"),\r
+ CreateStatus(218, "敵補給艦を3隻撃沈せよ!"),\r
+ CreateStatus(403, "「遠征」を10回成功させよう!"),\r
+ CreateStatus(503, "艦隊大整備!")\r
+ };\r
+ return indexes.Select(idx => quests[idx]).ToArray();\r
+ }\r
+\r
+ private QuestStatus CreateStatus(int id, string name)\r
+ {\r
+ return new QuestStatus\r
+ {\r
+ Id = id,\r
+ Name = name,\r
+ Color = _panel.BackColor,\r
+ Count = _countList.GetCount(id)\r
+ };\r
+ }\r
+\r
+ private bool CheckResult(IEnumerable<QuestStatus> expected)\r
+ {\r
+ var labels = (QuestLabels[])new PrivateObject(_panel).GetField("_labels");\r
+ var result = labels.Select(ql => ql.Name.Text);\r
+ return expected.Select(q => q.Name).Concat(Enumerable.Repeat("", Lines)).Take(Lines).SequenceEqual(result);\r
+ }\r
+\r
+ private void SetScrollPosition(int position)\r
+ {\r
+ var scroller = (ListScroller)new PrivateObject(_panel).GetField("_listScroller");\r
+ scroller.Position = position;\r
+ }\r
+ }\r
+}
\ No newline at end of file