OSDN Git Service

遠征任務のカウンターのツールチップが表示されないことがあるのを直す
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / QuestPanelTest.cs
1 // Copyright (C) 2019 Kazuhiro Fujieda <fujieda@users.osdn.me>\r
2 //\r
3 // Licensed under the Apache License, Version 2.0 (the "License");\r
4 // you may not use this file except in compliance with the License.\r
5 // You may obtain a copy of the License at\r
6 //\r
7 //    http://www.apache.org/licenses/LICENSE-2.0\r
8 //\r
9 // Unless required by applicable law or agreed to in writing, software\r
10 // distributed under the License is distributed on an "AS IS" BASIS,\r
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
12 // See the License for the specific language governing permissions and\r
13 // limitations under the License.\r
14 \r
15 using System.Collections.Generic;\r
16 using System.Linq;\r
17 using KancolleSniffer.Model;\r
18 using KancolleSniffer.View.MainWindow;\r
19 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
20 \r
21 namespace KancolleSniffer.Test\r
22 {\r
23     [TestClass]\r
24     public class QuestPanelTest\r
25     {\r
26         private const int Lines = 4;\r
27         private const int AcceptMax = 7;\r
28         private readonly QuestPanel _panel = new QuestPanel();\r
29         private readonly QuestCountList _countList = new QuestCountList();\r
30 \r
31         [TestInitialize]\r
32         public void Initialize()\r
33         {\r
34             _panel.CreateLabels(Lines);\r
35         }\r
36 \r
37         /// <summary>\r
38         /// 行数と同じ任務数\r
39         /// </summary>\r
40         [TestMethod]\r
41         public void ShowAll()\r
42         {\r
43             _panel.Update(CreateQuests(Lines));\r
44             Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
45         }\r
46 \r
47         /// <summary>\r
48         /// 最大の任務数について上から行数分\r
49         /// </summary>\r
50         [TestMethod]\r
51         public void ShowTop()\r
52         {\r
53             _panel.Update(CreateQuests(AcceptMax));\r
54             Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
55         }\r
56 \r
57         /// <summary>\r
58         /// IDの大きい任務の追加されたら、その表示のためにスクロールする\r
59         /// </summary>\r
60         [TestMethod]\r
61         public void AddBottomWithScroll()\r
62         {\r
63             _panel.Update(CreateQuests(Lines));\r
64             _panel.Update(CreateQuests(Lines + 1));\r
65             Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
66 \r
67             SetScrollPosition(1);\r
68             _panel.Update(CreateQuests(Lines + 2));\r
69             Assert.IsTrue(CheckResult(CreateQuests(2, Lines)));\r
70         }\r
71 \r
72         /// <summary>\r
73         /// IDの小さい任務が追加されたらそれを表示する\r
74         /// </summary>\r
75         [TestMethod]\r
76         public void AddTop()\r
77         {\r
78             _panel.Update(CreateQuests(2, Lines).ToArray());\r
79             _panel.Update(CreateQuests(1, Lines + 1).ToArray());\r
80             Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
81         }\r
82 \r
83         /// <summary>\r
84         /// 上が隠れているときにIDの小さい任務が追加されたら上スクロールする\r
85         /// </summary>\r
86         [TestMethod]\r
87         public void AddTopWithScroll()\r
88         {\r
89             _panel.Update(CreateQuests(1, Lines + 1));\r
90             SetScrollPosition(1);\r
91             _panel.Update(CreateQuests(Lines + 2).ToArray());\r
92             Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
93         }\r
94 \r
95         /// <summary>\r
96         /// 中間のIDの任務が見える位置に挿入されたらスクロールしない\r
97         /// </summary>\r
98         [TestMethod]\r
99         public void AddMediumWithoutScroll()\r
100         {\r
101             _panel.Update(CreateQuests(new[] {0, 2, 3, 4, 5}));\r
102             SetScrollPosition(1);\r
103             _panel.Update(CreateQuests(new[] {0, 1, 2, 3, 4, 5}));\r
104             Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
105         }\r
106 \r
107         /// <summary>\r
108         /// 中間のIDの任務が見えない位置に挿入されたらスクロールする\r
109         /// </summary>\r
110         [TestMethod]\r
111         public void AddMediumWithScroll()\r
112         {\r
113             _panel.Update(CreateQuests(new[] {0, 2, 3, 4, 5, 6}));\r
114             SetScrollPosition(2);\r
115             _panel.Update(CreateQuests(AcceptMax));\r
116             Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
117         }\r
118 \r
119         /// <summary>\r
120         /// 最後の任務が減る場合\r
121         /// </summary>\r
122         [TestMethod]\r
123         public void RemoveBottom()\r
124         {\r
125             _panel.Update(CreateQuests(AcceptMax));\r
126             _panel.Update(CreateQuests(AcceptMax - 1));\r
127             Assert.IsTrue(CheckResult(CreateQuests(Lines)));\r
128         }\r
129 \r
130         /// <summary>\r
131         /// 最後の任務が減った結果上スクロールする\r
132         /// </summary>\r
133         [TestMethod]\r
134         public void RemoveBottomWithScroll()\r
135         {\r
136             _panel.Update(CreateQuests(Lines + 2));\r
137             SetScrollPosition(2);\r
138             _panel.Update(CreateQuests(Lines + 1));\r
139             Assert.IsTrue(CheckResult(CreateQuests(1, Lines)));\r
140         }\r
141 \r
142         /// <summary>\r
143         /// 中間の任務が減る場合\r
144         /// </summary>\r
145         [TestMethod]\r
146         public void RemoveMedium()\r
147         {\r
148             _panel.Update(CreateQuests(AcceptMax));\r
149             var sparse = new[] {0, 1, 3, 4, 5, 6};\r
150             _panel.Update(CreateQuests(sparse));\r
151             Assert.IsTrue(CheckResult(CreateQuests(sparse.Take(Lines))));\r
152         }\r
153 \r
154         /// <summary>\r
155         /// 中間の任務が減った結果上スクロールする\r
156         /// </summary>\r
157         [TestMethod]\r
158         public void RemoveMediumWithScroll()\r
159         {\r
160             _panel.Update(CreateQuests(Lines + 2));\r
161             SetScrollPosition(2);\r
162             var sparse = new[] {0, 1, 2, 4, 5};\r
163             _panel.Update(CreateQuests(sparse));\r
164             Assert.IsTrue(CheckResult(CreateQuests(sparse.Skip(1))));\r
165         }\r
166 \r
167         /// <summary>\r
168         /// カウントが増えた任務を見える位置にスクロールする\r
169         /// </summary>\r
170         [TestMethod]\r
171         public void ChangeCount()\r
172         {\r
173             var quests = CreateQuests(AcceptMax);\r
174             _panel.Update(quests);\r
175 \r
176             quests[AcceptMax - 1].Count.Now = 1;\r
177             _panel.Update(quests);\r
178             Assert.IsTrue(CheckResult(CreateQuests(3, Lines)), "下スクロール");\r
179 \r
180             quests[2].Count.NowArray[0] = 1;\r
181             _panel.Update(quests);\r
182             Assert.IsTrue(CheckResult(CreateQuests(2, Lines)), "上スクロール");\r
183 \r
184             quests[3].Count.Now = 1;\r
185             _panel.Update(quests);\r
186             Assert.IsTrue(CheckResult(CreateQuests(2, Lines)), "そのまま");\r
187 \r
188             _panel.Update(quests);\r
189             Assert.IsTrue(CheckResult(CreateQuests(2, Lines)), "そのまま");\r
190 \r
191             quests[0].Count.Now = 1;\r
192             _panel.Update(quests);\r
193             Assert.IsTrue(CheckResult(CreateQuests(Lines)), "上スクロール");\r
194         }\r
195 \r
196 \r
197         private QuestStatus[] CreateQuests(int length)\r
198         {\r
199             return CreateQuests(0, length);\r
200         }\r
201 \r
202         private QuestStatus[] CreateQuests(int start, int count)\r
203         {\r
204             return CreateQuests(Enumerable.Range(start, count));\r
205         }\r
206 \r
207         private QuestStatus[] CreateQuests(IEnumerable<int> indexes)\r
208         {\r
209             var quests = new[]\r
210             {\r
211                 CreateStatus(210, "敵艦隊を10回邀撃せよ!"),\r
212                 CreateStatus(211, "敵空母を3隻撃沈せよ!"),\r
213                 CreateStatus(214, "あ号作戦"),\r
214                 CreateStatus(216, "敵艦隊主力を撃滅せよ!"),\r
215                 CreateStatus(218, "敵補給艦を3隻撃沈せよ!"),\r
216                 CreateStatus(403, "「遠征」を10回成功させよう!"),\r
217                 CreateStatus(503, "艦隊大整備!")\r
218             };\r
219             return indexes.Select(idx => quests[idx]).ToArray();\r
220         }\r
221 \r
222         private QuestStatus CreateStatus(int id, string name)\r
223         {\r
224             return new QuestStatus\r
225             {\r
226                 Id = id,\r
227                 Name = name,\r
228                 Color = _panel.BackColor,\r
229                 Count = _countList.GetCount(id)\r
230             };\r
231         }\r
232 \r
233         private bool CheckResult(IEnumerable<QuestStatus> expected)\r
234         {\r
235             var result = _panel.QuestNameList;\r
236             return expected.Select(q => q.Name).Concat(Enumerable.Repeat("", Lines)).Take(Lines).SequenceEqual(result);\r
237         }\r
238 \r
239         private void SetScrollPosition(int position)\r
240         {\r
241             var scroller = (ListScroller)new PrivateObject(_panel).GetField("_listScroller");\r
242             scroller.Position = position;\r
243         }\r
244     }\r
245 }