1 // Copyright (C) 2017 Kazuhiro Fujieda <fujieda@users.osdn.me>
\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
7 // http://www.apache.org/licenses/LICENSE-2.0
\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
16 using System.Collections.Generic;
\r
18 using ExpressionToCodeLib;
\r
19 using KancolleSniffer.Model;
\r
20 using KancolleSniffer.Util;
\r
21 using Microsoft.VisualStudio.TestTools.UnitTesting;
\r
23 namespace KancolleSniffer.Test
\r
26 public class QuestInfoTest
\r
29 public void ResetQuestCount()
\r
31 var queue = new Queue<DateTime>(new[]
\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
36 var questInfo = new QuestInfo(() => queue.Dequeue());
\r
37 var status = new Status
\r
39 QuestCountList = new[]
\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
44 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)
\r
46 questInfo.LoadState(status);
\r
47 questInfo.InspectQuestList(CreateQuestList(new[] {201}));
\r
48 questInfo.SaveState(status);
\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
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
63 public void ResetQuestList()
\r
65 var queue = new Queue<DateTime>(new[]
\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
70 var questInfo = new QuestInfo(() => queue.Dequeue());
\r
71 var status = new Status
\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
78 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)
\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
93 public void ResetFrom0To5OClock()
\r
95 var queue = new Queue<DateTime>(new[]
\r
97 new DateTime(2019, 1, 22, 4, 0, 0)
\r
99 var questInfo = new QuestInfo(() => queue.Dequeue());
\r
100 var status = new Status
\r
102 QuestCountList = new[] {new QuestCount {Id = 213, Now = 1}},
\r
103 QuestLastReset = new DateTime(2019, 1, 20, 5, 16, 22)
\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
112 public void ResetWeeklyWithoutCount()
\r
114 var queue = new Queue<DateTime>(new[]
\r
116 new DateTime(2019, 1, 27, 10, 0, 0),
\r
117 new DateTime(2019, 1, 28, 5, 0, 0)
\r
119 var questInfo = new QuestInfo(() => queue.Dequeue());
\r
120 var status = new Status
\r
122 QuestLastReset = new DateTime(2019, 1, 27, 5, 0, 0)
\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
132 private JsonObject Js(object obj) => JsonObject.CreateJsonObject(obj);
\r
134 private object CreateQuestList(int[] ids) => Js(new
\r
136 api_list = ids.Select(id => CreateQuest(id, 2))
\r
139 private object CreateQuest(int id, int state)
\r
144 api_category = id / 100,
\r
149 api_get_material = new int[0],
\r
150 api_progress_flag = 0
\r
155 public void NotImplemented()
\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
163 /// 状態をロードするときに獲得資材に特殊資材のリストを追加しない
\r
166 public void LoadStateNotAppendMaterialList()
\r
168 var questInfo = new QuestInfo(() => new DateTime(2015, 1, 1));
\r
169 var status = new Status
\r
179 Material = new[] {0, 2000, 0, 0, 0, 0, 0, 4}
\r
182 QuestCountList = new[]
\r
184 new QuestCount {Id = 854, NowArray = new[] {1, 0, 1, 0}}
\r
187 questInfo.LoadState(status);
\r
188 PAssert.That(() => questInfo.Quests[0].Material.Length == 8);
\r
192 /// 任務を受領したときにNeedSaveを設定する
\r
195 public void SetNeedSaveOnStartQuest()
\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
205 CreateQuest(213, 1),
\r
206 CreateQuest(214, 1)
\r
209 Assert.IsFalse(questInfo.NeedSave);
\r
210 questInfo.InspectQuestList(Js(new
\r
214 CreateQuest(213, 1),
\r
215 CreateQuest(214, 2)
\r
218 Assert.IsTrue(questInfo.NeedSave);
\r