OSDN Git Service

敵のスロットの搭載数を埋める
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / QuestInfoTest.cs
1 // Copyright (C) 2017 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;\r
16 using System.Collections.Generic;\r
17 using System.Linq;\r
18 using ExpressionToCodeLib;\r
19 using KancolleSniffer.Model;\r
20 using KancolleSniffer.Util;\r
21 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
22 \r
23 namespace KancolleSniffer.Test\r
24 {\r
25     [TestClass]\r
26     public class QuestInfoTest\r
27     {\r
28         [TestMethod]\r
29         public void ResetQuestCount()\r
30         {\r
31             var queue = new Queue<DateTime>(new[]\r
32             {\r
33                 new DateTime(2017, 11, 1, 5, 0, 0), new DateTime(2017, 11, 6, 5, 0, 0),\r
34                 new DateTime(2017, 12, 1, 5, 0, 0)\r
35             });\r
36             var questInfo = new QuestInfo(() => queue.Dequeue());\r
37             var status = new Status\r
38             {\r
39                 QuestCountList = new[]\r
40                 {\r
41                     new QuestCount {Id = 201, Now = 1}, new QuestCount {Id = 213, Now = 1},\r
42                     new QuestCount {Id = 265, Now = 1}, new QuestCount {Id = 822, Now = 1}\r
43                 },\r
44                 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
45             };\r
46             questInfo.LoadState(status);\r
47             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
48             questInfo.SaveState(status);\r
49             PAssert.That(() =>\r
50                 status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
51                     {new {Id = 213, Now = 1}, new {Id = 822, Now = 1}})); // デイリーとマンスリーが消える\r
52             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
53             questInfo.SaveState(status);\r
54             PAssert.That(() =>\r
55                 status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
56                     {new {Id = 822, Now = 1}})); // ウィークリーが消える\r
57             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
58             questInfo.SaveState(status);\r
59             PAssert.That(() => status.QuestCountList.Length == 0); // クォータリーが消える\r
60         }\r
61 \r
62         [TestMethod]\r
63         public void ResetQuestList()\r
64         {\r
65             var queue = new Queue<DateTime>(new[]\r
66             {\r
67                 new DateTime(2017, 11, 1, 5, 0, 0), new DateTime(2017, 11, 6, 5, 0, 0),\r
68                 new DateTime(2017, 12, 1, 5, 0, 0)\r
69             });\r
70             var questInfo = new QuestInfo(() => queue.Dequeue());\r
71             var status = new Status\r
72             {\r
73                 QuestList = new[]\r
74                 {\r
75                     new QuestStatus {Id = 201, Category = 2}, new QuestStatus {Id = 213, Category = 2},\r
76                     new QuestStatus {Id = 265, Category = 2}, new QuestStatus {Id = 822, Category = 8}\r
77                 },\r
78                 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
79             };\r
80             questInfo.LoadState(status);\r
81             questInfo.InspectQuestList(CreateQuestList(new int[0]));\r
82             questInfo.SaveState(status);\r
83             PAssert.That(() => status.QuestList.Select(q => q.Id).SequenceEqual(new[] {213, 822})); // デイリーとマンスリーが消える\r
84             questInfo.InspectQuestList(CreateQuestList(new int[0]));\r
85             questInfo.SaveState(status);\r
86             PAssert.That(() => status.QuestList.Select(q => q.Id).SequenceEqual(new[] {822})); // ウィークリーが消える\r
87             questInfo.InspectQuestList(CreateQuestList(new int[0]));\r
88             questInfo.SaveState(status);\r
89             PAssert.That(() => status.QuestList.Length == 0); // クォータリーが消える\r
90         }\r
91 \r
92         [TestMethod]\r
93         public void ResetFrom0To5OClock()\r
94         {\r
95             var queue = new Queue<DateTime>(new[]\r
96             {\r
97                 new DateTime(2019, 1, 22, 4, 0, 0)\r
98             });\r
99             var questInfo = new QuestInfo(() => queue.Dequeue());\r
100             var status = new Status\r
101             {\r
102                 QuestCountList = new[] {new QuestCount {Id = 213, Now = 1}},\r
103                 QuestLastReset = new DateTime(2019, 1, 20, 5, 16, 22)\r
104             };\r
105             questInfo.LoadState(status);\r
106             questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
107             questInfo.SaveState(status);\r
108             PAssert.That(() => status.QuestCountList.Length == 0);\r
109         }\r
110 \r
111         [TestMethod]\r
112         public void ResetWeeklyWithoutCount()\r
113         {\r
114             var queue = new Queue<DateTime>(new[]\r
115             {\r
116                 new DateTime(2019, 1, 27, 10, 0, 0),\r
117                 new DateTime(2019, 1, 28, 5, 0, 0)\r
118             });\r
119             var questInfo = new QuestInfo(() => queue.Dequeue());\r
120             var status = new Status\r
121             {\r
122                 QuestLastReset = new DateTime(2019, 1, 27, 5, 0, 0)\r
123             };\r
124             questInfo.LoadState(status);\r
125             questInfo.InspectQuestList( // 2019-1-27 10:00\r
126                 CreateQuestList(new[] {237})); // 【節分拡張任務】南方海域 艦隊決戦\r
127             PAssert.That(() => questInfo.Quests[0].Id == 237);\r
128             questInfo.InspectQuestList(CreateQuestList(new[] {201})); // 2019-1-28 05:00\r
129             PAssert.That(() => questInfo.Quests[0].Id == 201);\r
130         }\r
131 \r
132         private JsonObject Js(object obj) => JsonObject.CreateJsonObject(obj);\r
133 \r
134         private object CreateQuestList(int[] ids) => Js(new\r
135         {\r
136             api_list = ids.Select(id => CreateQuest(id, 2))\r
137         });\r
138 \r
139         private object CreateQuest(int id, int state)\r
140         {\r
141             return new\r
142             {\r
143                 api_no = id,\r
144                 api_category = id / 100,\r
145                 api_type = 1,\r
146                 api_state = state,\r
147                 api_title = "",\r
148                 api_detail = "",\r
149                 api_get_material = new int[0],\r
150                 api_progress_flag = 0\r
151             };\r
152         }\r
153 \r
154         [TestMethod]\r
155         public void NotImplemented()\r
156         {\r
157             var questInfo = new QuestInfo(() => new DateTime(2015, 1, 1));\r
158             questInfo.InspectQuestList(CreateQuestList(new[] {679}));\r
159             PAssert.That(() => questInfo.Quests[0].Count.Spec.Material.Length == 0);\r
160         }\r
161 \r
162         /// <summary>\r
163         /// 状態をロードするときに獲得資材に特殊資材のリストを追加しない\r
164         /// </summary>\r
165         [TestMethod]\r
166         public void LoadStateNotAppendMaterialList()\r
167         {\r
168             var questInfo = new QuestInfo(() => new DateTime(2015, 1, 1));\r
169             var status = new Status\r
170             {\r
171                 QuestList = new[]\r
172                 {\r
173                     new QuestStatus\r
174                     {\r
175                         Id = 854,\r
176                         Category = 8,\r
177                         Name = "",\r
178                         Detail = "",\r
179                         Material = new[] {0, 2000, 0, 0, 0, 0, 0, 4}\r
180                     }\r
181                 },\r
182                 QuestCountList = new[]\r
183                 {\r
184                     new QuestCount {Id = 854, NowArray = new[] {1, 0, 1, 0}}\r
185                 }\r
186             };\r
187             questInfo.LoadState(status);\r
188             PAssert.That(() => questInfo.Quests[0].Material.Length == 8);\r
189         }\r
190 \r
191         /// <summary>\r
192         /// 任務を受領したときにNeedSaveを設定する\r
193         /// </summary>\r
194         [TestMethod]\r
195         public void SetNeedSaveOnStartQuest()\r
196         {\r
197             var questInfo = new QuestInfo(() => new DateTime(2019, 1, 1));\r
198             // _lastResetが未設定だと必ずResetQuestsが動いてNeedSaveがtrueになる\r
199             questInfo.LoadState(new Status {QuestLastReset = new DateTime(2019, 1, 1)});\r
200             questInfo.InspectQuestList(Js(\r
201                 new\r
202                 {\r
203                     api_list = new[]\r
204                     {\r
205                         CreateQuest(213, 1),\r
206                         CreateQuest(214, 1)\r
207                     }\r
208                 }));\r
209             Assert.IsFalse(questInfo.NeedSave);\r
210             questInfo.InspectQuestList(Js(new\r
211             {\r
212                 api_list = new[]\r
213                 {\r
214                     CreateQuest(213, 1),\r
215                     CreateQuest(214, 2)\r
216                 }\r
217             }));\r
218             Assert.IsTrue(questInfo.NeedSave);\r
219         }\r
220     }\r
221 }