OSDN Git Service

バージョン12.11の準備
[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                 new DateTime(2018, 8, 1, 5, 0, 0), new DateTime(2018, 9, 1, 5, 0, 0)\r
37             });\r
38             var questInfo = MakeQuestInfo(() => queue.Dequeue());\r
39             var status = new Status\r
40             {\r
41                 QuestCountList = new[]\r
42                 {\r
43                     new QuestCount {Id = 201, Now = 1},\r
44                     new QuestCount {Id = 265, Now = 1},\r
45                     new QuestCount {Id = 213, Now = 1},\r
46                     new QuestCount {Id = 822, Now = 1},\r
47                     new QuestCount {Id = 904, NowArray = new[] {1, 1, 1, 1}},\r
48                     new QuestCount {Id = 436, NowArray = new[] {1, 1, 1, 1, 0}},\r
49                     new QuestCount {Id = 437, NowArray = new[] {1, 1, 1, 1}},\r
50                     new QuestCount {Id = 438, NowArray = new[] {1, 1, 1, 1}},\r
51                 },\r
52                 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
53             };\r
54             var ids = status.QuestCountList.Select(qc => qc.Id).ToArray();\r
55             questInfo.LoadState(status);\r
56             CheckQuestCountList(questInfo, status, ids.Skip(2)); // デイリーとマンスリーが消える\r
57             CheckQuestCountList(questInfo, status, ids.Skip(3)); // ウィークリーが消える\r
58             CheckQuestCountList(questInfo, status, ids.Skip(4)); // クォータリーが消える\r
59             CheckQuestCountList(questInfo, status, ids.Skip(5)); // イヤーリー2月が消える\r
60             CheckQuestCountList(questInfo, status, ids.Skip(6)); // イヤーリー3月が消える\r
61             CheckQuestCountList(questInfo, status, ids.Skip(7)); // イヤーリー5月が消える\r
62             CheckQuestCountList(questInfo, status, ids.Skip(8)); // イヤーリー8月が消える\r
63         }\r
64 \r
65         private void CheckQuestCountList(QuestInfo questInfo, Status status, IEnumerable<int> quests)\r
66         {\r
67             InspectQuestList(questInfo, new[] {201});\r
68             questInfo.SaveState(status);\r
69             PAssert.That(() =>  status.QuestCountList.Select(qc => qc.Id).SequenceEqual(quests));\r
70         }\r
71 \r
72         [TestMethod]\r
73         public void ResetFrom0To5OClock()\r
74         {\r
75             var queue = new Queue<DateTime>(new[]\r
76             {\r
77                 new DateTime(2019, 1, 22, 4, 0, 0)\r
78             });\r
79             var questInfo = MakeQuestInfo(() => queue.Dequeue());\r
80             var status = new Status\r
81             {\r
82                 QuestCountList = new[] {new QuestCount {Id = 213, Now = 1}},\r
83                 QuestLastReset = new DateTime(2019, 1, 20, 5, 16, 22)\r
84             };\r
85             questInfo.LoadState(status);\r
86             InspectQuestList(questInfo, new[] {201});\r
87             questInfo.SaveState(status);\r
88             PAssert.That(() => status.QuestCountList.Length == 0);\r
89         }\r
90 \r
91         [TestMethod]\r
92         public void ResetWeeklyWithoutCount()\r
93         {\r
94             var queue = new Queue<DateTime>(new[]\r
95             {\r
96                 new DateTime(2019, 1, 27, 10, 0, 0),\r
97                 new DateTime(2019, 1, 28, 5, 0, 0)\r
98             });\r
99             var questInfo = MakeQuestInfo(() => queue.Dequeue());\r
100             var status = new Status\r
101             {\r
102                 QuestLastReset = new DateTime(2019, 1, 27, 5, 0, 0)\r
103             };\r
104             questInfo.LoadState(status);\r
105             InspectQuestList(questInfo, // 2019-1-27 10:00\r
106                 new[] {237}); // 【節分拡張任務】南方海域 艦隊決戦\r
107             PAssert.That(() => questInfo.Quests[0].Id == 237);\r
108             InspectQuestList(questInfo, new[] {201}); // 2019-1-28 05:00\r
109             PAssert.That(() => questInfo.Quests[0].Id == 201);\r
110         }\r
111 \r
112         [TestMethod]\r
113         public void NotImplemented()\r
114         {\r
115             var questInfo = MakeQuestInfo(() => new DateTime(2015, 1, 1));\r
116             InspectQuestList(questInfo, new[] {679});\r
117             PAssert.That(() => questInfo.Quests[0].Count.Spec.Material.Length == 0);\r
118         }\r
119 \r
120         private JsonObject Js(object obj) => new JsonObject(obj);\r
121 \r
122         private object CreateQuestList(int[] ids) => Js(new\r
123         {\r
124             api_list = ids.Select(id => CreateQuest(id, 2))\r
125         });\r
126 \r
127         private object CreateQuest(int id, int state)\r
128         {\r
129             return new\r
130             {\r
131                 api_no = id,\r
132                 api_category = id / 100,\r
133                 api_type = 1,\r
134                 api_state = state,\r
135                 api_title = "",\r
136                 api_detail = "",\r
137                 api_get_material = new int[0],\r
138                 api_progress_flag = 0\r
139             };\r
140         }\r
141 \r
142         private void InspectQuestList(QuestInfo questInfo, int[] ids)\r
143         {\r
144             questInfo.InspectQuestList("api_tab_id=0", CreateQuestList(ids));\r
145         }\r
146 \r
147 \r
148         /// <summary>\r
149         /// 状態をロードするときに獲得資材に特殊資材のリストを追加しない\r
150         /// </summary>\r
151         [TestMethod]\r
152         public void LoadStateNotAppendMaterialList()\r
153         {\r
154             var questInfo = MakeQuestInfo(() => new DateTime(2015, 1, 1));\r
155             var status = new Status\r
156             {\r
157                 QuestList = new[]\r
158                 {\r
159                     new QuestStatus\r
160                     {\r
161                         Id = 854,\r
162                         Category = 8,\r
163                         Name = "",\r
164                         Detail = "",\r
165                         Material = new[] {0, 2000, 0, 0, 0, 0, 0, 4}\r
166                     }\r
167                 },\r
168                 QuestCountList = new[]\r
169                 {\r
170                     new QuestCount {Id = 854, NowArray = new[] {1, 0, 1, 0}}\r
171                 }\r
172             };\r
173             questInfo.LoadState(status);\r
174             PAssert.That(() => questInfo.Quests[0].Material.Length == 8);\r
175         }\r
176 \r
177         private QuestInfo MakeQuestInfo(Func<DateTime> nowFunc)\r
178         {\r
179             return new QuestInfo(new QuestCountList(), nowFunc);\r
180         }\r
181     }\r
182 }