OSDN Git Service

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