OSDN Git Service

一覧ウィンドウの艦隊表示に速力を表示する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / QuestInfoTest.cs
index cfa68a8..b44d6c1 100644 (file)
@@ -16,6 +16,8 @@ using System;
 using System.Collections.Generic;\r
 using System.Linq;\r
 using ExpressionToCodeLib;\r
+using KancolleSniffer.Model;\r
+using KancolleSniffer.Util;\r
 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
 \r
 namespace KancolleSniffer.Test\r
@@ -78,7 +80,27 @@ namespace KancolleSniffer.Test
         }\r
 \r
         [TestMethod]\r
-        public void AdjestCountNowArray()\r
+        public void AdjustCount80Percent()\r
+        {\r
+            var count = new QuestCount\r
+            {\r
+                Spec = new QuestSpec()\r
+            };\r
+            for (var shift = 0; shift <= 1; shift++)\r
+            {\r
+                for (var max = 2; max <= 6; max++)\r
+                {\r
+                    count.Spec.Max = max;\r
+                    count.Spec.Shift = shift;\r
+                    count.Now = 1;\r
+                    count.AdjustCount(80);\r
+                    PAssert.That(() => count.Now == count.Spec.Max - 1);\r
+                }\r
+            }\r
+        }\r
+\r
+        [TestMethod]\r
+        public void AdjustCountNowArray()\r
         {\r
             var count = new QuestCount\r
             {\r
@@ -95,7 +117,7 @@ namespace KancolleSniffer.Test
         }\r
 \r
         [TestMethod]\r
-        public void ResetQuest()\r
+        public void ResetQuestCount()\r
         {\r
             var queue = new Queue<DateTime>(new[]\r
             {\r
@@ -113,35 +135,68 @@ namespace KancolleSniffer.Test
                 QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
             };\r
             questInfo.LoadState(status);\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                    {new {api_no = 201, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}}\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
             questInfo.SaveState(status);\r
             PAssert.That(() =>\r
                 status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
                     {new {Id = 213, Now = 1}, new {Id = 822, Now = 1}})); // デイリーとマンスリーが消える\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                    {new {api_no = 201, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}}\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
             questInfo.SaveState(status);\r
             PAssert.That(() =>\r
                 status.QuestCountList.Select(qc => new {qc.Id, qc.Now}).SequenceEqual(new[]\r
                     {new {Id = 822, Now = 1}})); // ウィークリーが消える\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                    {new {api_no = 201, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}}\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {201}));\r
             questInfo.SaveState(status);\r
             PAssert.That(() => status.QuestCountList.Length == 0); // クォータリーが消える\r
         }\r
 \r
+        [TestMethod]\r
+        public void ResetQuestList()\r
+        {\r
+            var queue = new Queue<DateTime>(new[]\r
+            {\r
+                new DateTime(2017, 11, 1, 5, 0, 0), new DateTime(2017, 11, 6, 5, 0, 0),\r
+                new DateTime(2017, 12, 1, 5, 0, 0)\r
+            });\r
+            var questInfo = new QuestInfo(null, null, () => queue.Dequeue());\r
+            var status = new Status\r
+            {\r
+                QuestList = new[]\r
+                {\r
+                    new QuestStatus{Id = 201, Category = 2}, new QuestStatus{Id = 213, Category = 2},\r
+                    new QuestStatus{Id = 265, Category = 2}, new QuestStatus{Id = 822, Category = 8}\r
+                },\r
+                QuestLastReset = new DateTime(2017, 10, 31, 5, 0, 0)\r
+            };\r
+            questInfo.LoadState(status);\r
+            questInfo.InspectQuestList(CreateQuestList(new int[0]));\r
+            questInfo.SaveState(status);\r
+            PAssert.That(() => status.QuestList.Select(q => q.Id).SequenceEqual(new []{213, 822}));  // デイリーとマンスリーが消える\r
+            questInfo.InspectQuestList(CreateQuestList(new int[0]));\r
+            questInfo.SaveState(status);\r
+            PAssert.That(() => status.QuestList.Select(q => q.Id).SequenceEqual(new []{822}));  // ウィークリーが消える\r
+            questInfo.InspectQuestList(CreateQuestList(new int[0]));\r
+            questInfo.SaveState(status);\r
+            PAssert.That(() => status.QuestList.Length == 0); // クォータリーが消える\r
+        }\r
+\r
         private JsonObject Js(object obj) => JsonObject.CreateJsonObject(obj);\r
 \r
+        private object CreateQuestList(int[] ids) => Js(new\r
+        {\r
+            api_list =\r
+            ids.Select(id => new\r
+            {\r
+                api_no = id,\r
+                api_category = id / 100,\r
+                api_state = 2,\r
+                api_title = "",\r
+                api_detail = "",\r
+                api_get_material = new int[0],\r
+                api_progress_flag = 0\r
+            })\r
+        });\r
+\r
         /// <summary>\r
         /// 201: 敵艦隊を撃滅せよ!\r
         /// 210: 敵艦隊を10回邀撃せよ!\r
@@ -152,16 +207,7 @@ namespace KancolleSniffer.Test
         public void BattleResult_201_216_210_214()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 201, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 210, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 214, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 216, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {201, 216, 210, 214}));\r
 \r
             questInfo.InspectMapStart(Js(new\r
             {\r
@@ -213,24 +259,13 @@ namespace KancolleSniffer.Test
         /// 218: 敵補給艦を3隻撃沈せよ!\r
         /// </summary>\r
         [TestMethod]\r
-        public void BattleResult_211_212_218_213_220_221()\r
+        public void BattleResult_211_212_213_218_220_221()\r
         {\r
             var battleInfo = new BattleInfo(null, null);\r
             var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1)) {AcceptMax = 6};\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 211, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 212, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 213, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 218, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 220, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 221, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {211, 212, 213, 218, 220, 221}));\r
             // 補給艦1隻と空母2隻\r
-            battleInfo.InjectEnemyResultStatus(new[]\r
+            battleInfo.InjectResultStatus(new ShipStatus[0], new ShipStatus[0], new[]\r
             {\r
                 new ShipStatus {NowHp = 0, MaxHp = 130, Spec = new ShipSpec {Id = 1558, ShipType = 15}},\r
                 new ShipStatus {NowHp = 0, MaxHp = 90, Spec = new ShipSpec {Id = 1543, ShipType = 8}},\r
@@ -258,16 +293,9 @@ namespace KancolleSniffer.Test
         {\r
             var battleInfo = new BattleInfo(null, null);\r
             var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 228, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 230, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {228, 230}));\r
             // 潜水艦3\r
-            battleInfo.InjectEnemyResultStatus(new[]\r
+            battleInfo.InjectResultStatus(new ShipStatus[0], new ShipStatus[0], new[]\r
             {\r
                 new ShipStatus {NowHp = 0, MaxHp = 27, Spec = new ShipSpec {Id = 1532, ShipType = 13}},\r
                 new ShipStatus {NowHp = 0, MaxHp = 19, Spec = new ShipSpec {Id = 1530, ShipType = 13}},\r
@@ -289,13 +317,7 @@ namespace KancolleSniffer.Test
         public void BattleResult_226()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 226, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {226}));\r
 \r
             questInfo.InspectMapStart(Js(new\r
             {\r
@@ -336,13 +358,7 @@ namespace KancolleSniffer.Test
         public void BattleResult_243()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 243, api_category = 2, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {243}));\r
 \r
             questInfo.InspectMapStart(Js(new\r
             {\r
@@ -367,6 +383,253 @@ namespace KancolleSniffer.Test
                     .SequenceEqual(new[] {new {Id = 243, Now = 1}}));\r
         }\r
 \r
+        private ShipStatus ShipStatus(int shipType, int specId = 0) =>\r
+            new ShipStatus {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType}};\r
+\r
+\r
+        /// <summary>\r
+        /// 249: 「第五戦隊」出撃せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_249()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {249}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(5, 319), ShipStatus(5, 192), ShipStatus(5, 194),\r
+                ShipStatus(5, 193), ShipStatus(6, 189), ShipStatus(6, 188)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 2,\r
+                api_mapinfo_no = 5,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 2,\r
+                api_mapinfo_no = 5,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+            questInfo.Quests[0].Count.Now = 0;\r
+\r
+            battleInfo.Result.Friend.Main[1].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "那智改二轟沈");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 257: 「水雷戦隊」南西へ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_257()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {257}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(3), ShipStatus(2), ShipStatus(2),\r
+                ShipStatus(2), ShipStatus(2), ShipStatus(2)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 1,\r
+                api_mapinfo_no = 4,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 1,\r
+                api_mapinfo_no = 4,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+            questInfo.Quests[0].Count.Now = 0;\r
+\r
+            battleInfo.Result.Friend.Main[0].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "軽巡轟沈");\r
+            battleInfo.Result.Friend.Main[0].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 2;\r
+            battleInfo.Result.Friend.Main[1].Spec.ShipType = 3;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "旗艦が駆逐");\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 3;\r
+\r
+            battleInfo.Result.Friend.Main[2].Spec.ShipType = 3;\r
+            battleInfo.Result.Friend.Main[3].Spec.ShipType = 3;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "軽巡が4隻");\r
+\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 3;\r
+            battleInfo.Result.Friend.Main[3].Spec.ShipType = 4;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "駆逐軽巡以外");\r
+        }\r
+\r
+        private ShipStatus ShipStatus(int shipType, int shipClass, int specId) =>\r
+            new ShipStatus {NowHp = 1, Spec = new ShipSpec {Id = specId, ShipType = shipType, ShipClass = shipClass}};\r
+\r
+        /// <summary>\r
+        /// 257: 「水上打撃部隊」南方へ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_259()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {259}));\r
+\r
+            var org = new[]\r
+            {\r
+                ShipStatus(3, 52, 321), ShipStatus(9, 19, 276), ShipStatus(10, 26, 411),\r
+                ShipStatus(10, 26, 412), ShipStatus(5, 29, 193), ShipStatus(5, 29, 194)\r
+            };\r
+            battleInfo.InjectResultStatus(\r
+                org.ToArray(), new ShipStatus[0],\r
+                new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 1,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 1,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+            questInfo.Quests[0].Count.Now = 0;\r
+\r
+            battleInfo.Result.Friend.Main[0].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "軽巡轟沈");\r
+            battleInfo.Result.Friend.Main[0].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[4] = ShipStatus(9, 37, 136);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "戦艦4隻");\r
+            battleInfo.Result.Friend.Main[4] = org[4];\r
+\r
+            battleInfo.Result.Friend.Main[0] = ShipStatus(4, 4, 58);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0, "軽巡なし");\r
+            battleInfo.Result.Friend.Main[0] = org[0];\r
+\r
+            battleInfo.Result.Friend.Main[2] = ShipStatus(10, 2, 553);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "伊勢改二");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 264: 「空母機動部隊」西へ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_264()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {264}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(7), ShipStatus(11), ShipStatus(3),\r
+                ShipStatus(3), ShipStatus(2), ShipStatus(2)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 4,\r
+                api_mapinfo_no = 2,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 4,\r
+                api_mapinfo_no = 2,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+\r
+            battleInfo.Result.Friend.Main[0].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "轟沈あり");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 266: 「水上反撃部隊」突入せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_266()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {266}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(2), ShipStatus(5), ShipStatus(3),\r
+                ShipStatus(2), ShipStatus(2), ShipStatus(2)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 2,\r
+                api_mapinfo_no = 5,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 2,\r
+                api_mapinfo_no = 5,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+\r
+            battleInfo.Result.Friend.Main[1].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "轟沈あり");\r
+            battleInfo.Result.Friend.Main[1].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 3;\r
+            battleInfo.Result.Friend.Main[2].Spec.ShipType = 2;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "旗艦が軽巡");\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 2;\r
+            battleInfo.Result.Friend.Main[2].Spec.ShipType = 3;\r
+\r
+            battleInfo.Result.Friend.Main[3].Spec.ShipType = 3;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "軽巡が2隻");\r
+        }\r
+\r
         /// <summary>\r
         /// 822: 沖ノ島海域迎撃戦\r
         /// 854: 戦果拡張任務!「Z作戦」前段作戦\r
@@ -375,14 +638,7 @@ namespace KancolleSniffer.Test
         public void BattleResult_822_854()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 822, api_category = 8, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 854, api_category = 8, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {822, 854}));\r
 \r
             questInfo.InspectMapNext(Js(new\r
             {\r
@@ -426,26 +682,287 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 861: 強行輸送艦隊、抜錨!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void MapNext_861()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {861}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(10), ShipStatus(22), ShipStatus(2),\r
+                ShipStatus(2), ShipStatus(2), ShipStatus(2)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 1,\r
+                api_mapinfo_no = 6,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 1,\r
+                api_mapinfo_no = 6,\r
+                api_event_id = 8\r
+            }));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+\r
+            battleInfo.Result.Friend.Main[1].NowHp = 0;\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 1,\r
+                api_mapinfo_no = 6,\r
+                api_event_id = 8\r
+            }));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "轟沈あり");\r
+            battleInfo.Result.Friend.Main[1].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[2].Spec.ShipType = 10;\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 1,\r
+                api_mapinfo_no = 6,\r
+                api_event_id = 8\r
+            }));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "補給・航戦が3隻");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 862: 前線の航空偵察を実施せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_862()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {862}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(2), ShipStatus(3), ShipStatus(3),\r
+                ShipStatus(2), ShipStatus(2), ShipStatus(16)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 6,\r
+                api_mapinfo_no = 3,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 6,\r
+                api_mapinfo_no = 3,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "B"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+\r
+            battleInfo.Result.Friend.Main[1].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "轟沈あり");\r
+            battleInfo.Result.Friend.Main[1].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[3].Spec.ShipType = 3;\r
+            battleInfo.Result.Friend.Main[4].Spec.ShipType = 16;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 2, "軽巡3隻水母2隻");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 873: 北方海域警備を実施せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_873()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {873}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(3), ShipStatus(2), ShipStatus(2),\r
+                ShipStatus(2), ShipStatus(2), ShipStatus(2)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 3,\r
+                api_mapinfo_no = 1,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 3,\r
+                api_mapinfo_no = 1,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "B"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.NowArray[0] == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.NowArray[0] == 1);\r
+\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 2;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.NowArray[0] == 1, "軽巡なし");\r
+            battleInfo.Result.Friend.Main[0].Spec.ShipType = 3;\r
+\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 3,\r
+                api_mapinfo_no = 2,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 3,\r
+                api_mapinfo_no = 3,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
+        }\r
+\r
+        /// <summary>\r
+        /// 875: 精鋭「三一駆」、鉄底海域に突入せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_875()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {875}));\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(2, 543), ShipStatus(8, 360), ShipStatus(11, 545),\r
+                ShipStatus(18, 467), ShipStatus(11, 261), ShipStatus(2, 344)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 4,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 4,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1);\r
+\r
+            battleInfo.Result.Friend.Main[5].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "朝霜改轟沈");\r
+            battleInfo.Result.Friend.Main[5].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[0].Spec.Id = 345;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 1, "長波改二なし");\r
+            battleInfo.Result.Friend.Main[0].Spec.Id = 543;\r
+\r
+            battleInfo.Result.Friend.Main[5].Spec.Id = 345;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 2, "高波改");\r
+            battleInfo.Result.Friend.Main[5].Spec.Id = 359;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Now == 3, "沖波改");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 888: 新編成「三川艦隊」、鉄底海峡に突入せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void BattleResult_888()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {888}));\r
+            var count = questInfo.Quests[0].Count;\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(5, 427), ShipStatus(5, 264), ShipStatus(5, 142),\r
+                ShipStatus(5, 417), ShipStatus(2, 144), ShipStatus(2, 195)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 1,\r
+                api_event_id = 4\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 1,\r
+                api_event_id = 5\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "A"}));\r
+            PAssert.That(() => count.NowArray[0] == 0);\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => count.NowArray[0] == 1);\r
+\r
+            battleInfo.Result.Friend.Main[0].NowHp = 0;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => count.NowArray[0] == 1, "轟沈あり");\r
+            battleInfo.Result.Friend.Main[0].NowHp = 1;\r
+\r
+            battleInfo.Result.Friend.Main[0].Spec.Id = 319;\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => count.NowArray[0] == 1, "三川艦隊3隻");\r
+            battleInfo.Result.Friend.Main[0].Spec.Id = 427;\r
+\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 3,\r
+                api_event_id = 5,\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 0}));\r
+\r
+            questInfo.InspectMapNext(Js(new\r
+            {\r
+                api_maparea_id = 5,\r
+                api_mapinfo_no = 4,\r
+                api_event_id = 5,\r
+            }));\r
+            questInfo.InspectBattleResult(Js(new {api_win_rank = "S"}));\r
+            PAssert.That(() => count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
+        }\r
+\r
+\r
+        /// <summary>\r
         /// 302: 大規模演習\r
         /// 303: 「演習」で練度向上!\r
         /// 304: 「演習」で他提督を圧倒せよ!\r
         /// 311: 精鋭艦隊演習\r
+        /// 318: 給糧艦「伊良湖」の支援\r
         /// </summary>\r
         [TestMethod]\r
-        public void PracticeResult_303_304_302_311()\r
+        public void PracticeResult_303_304_302_311_315()\r
         {\r
-            var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 302, api_category = 3, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 303, api_category = 3, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 304, api_category = 3, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 311, api_category = 3, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {302, 303, 304, 311, 315,}));\r
 \r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(2, 543), ShipStatus(3, 488)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
             questInfo.InspectPracticeResult(Js(new {api_win_rank = "C"}));\r
             questInfo.InspectPracticeResult(Js(new {api_win_rank = "A"}));\r
             PAssert.That(() =>\r
@@ -453,10 +970,40 @@ namespace KancolleSniffer.Test
                     .SequenceEqual(new[]\r
                     {\r
                         new {Id = 302, Now = 1}, new {Id = 303, Now = 2}, new {Id = 304, Now = 1},\r
-                        new {Id = 311, Now = 1}\r
+                        new {Id = 311, Now = 1}, new {Id = 315, Now = 1}\r
                     }));\r
         }\r
 \r
+        [TestMethod]\r
+        public void PracticeResult_318()\r
+        {\r
+            var battleInfo = new BattleInfo(null, null);\r
+            var questInfo = new QuestInfo(null, battleInfo, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {318}));\r
+            var q318 = questInfo.Quests[0];\r
+\r
+            battleInfo.InjectResultStatus(new[]\r
+            {\r
+                ShipStatus(2, 543), ShipStatus(3, 488)\r
+            }, new ShipStatus[0], new ShipStatus[0], new ShipStatus[0]);\r
+\r
+            questInfo.InspectPracticeResult(Js(new {api_win_rank = "B"}));\r
+            PAssert.That(() => q318.Count.Now == 0, "軽巡1隻");\r
+            battleInfo.Result.Friend.Main[0] = ShipStatus(3, 200);\r
+            questInfo.StartPractice("api%5Fdeck%5Fid=2");\r
+            questInfo.InspectPracticeResult(Js(new {api_win_rank = "B"}));\r
+            PAssert.That(() => q318.Count.Now == 0, "第2艦隊");\r
+            questInfo.StartPractice("api%5Fdeck%5Fid=1"); // 第一艦隊\r
+            questInfo.InspectPracticeResult(Js(new {api_win_rank = "C"}));\r
+            PAssert.That(() => q318.Count.Now == 0, "敗北");\r
+            questInfo.InspectPracticeResult(Js(new {api_win_rank = "B"}));\r
+            PAssert.That(() => q318.Count.Now == 1);\r
+\r
+            q318.Count.Now = 2;\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {318}));\r
+            PAssert.That(() => q318.Count.Now == 2, "進捗調節しない");\r
+        }\r
+\r
         /// <summary>\r
         /// 402: 「遠征」を3回成功させよう!\r
         /// 403: 「遠征」を10回成功させよう!\r
@@ -468,17 +1015,7 @@ namespace KancolleSniffer.Test
         public void MissionResult_402_403_404_410_411()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 402, api_category = 4, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 403, api_category = 4, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 404, api_category = 4, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 410, api_category = 4, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 411, api_category = 4, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {402, 403, 404, 410, 411}));\r
 \r
             questInfo.InspectDeck(Js(\r
                 new[]\r
@@ -500,21 +1037,68 @@ namespace KancolleSniffer.Test
         }\r
 \r
         /// <summary>\r
+        /// 426: 海上通商航路の警戒を厳とせよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void MissionResult_426()\r
+        {\r
+            var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {426}));\r
+\r
+            questInfo.InspectDeck(Js(\r
+                new[]\r
+                {\r
+                    new {api_id = 2, api_mission = new[] {2, 3}},\r
+                    new {api_id = 3, api_mission = new[] {2, 4}},\r
+                    new {api_id = 4, api_mission = new[] {2, 5}}\r
+                }));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=2", Js(new {api_clear_result = 1}));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=3", Js(new {api_clear_result = 1}));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=4", Js(new {api_clear_result = 1}));\r
+            PAssert.That(() =>\r
+                questInfo.Quests[0].Count.NowArray.SequenceEqual(new[] {1, 1, 1, 0}));\r
+            questInfo.InspectDeck(Js(\r
+                new[]\r
+                {\r
+                    new {api_id = 2, api_mission = new[] {2, 10}}\r
+                }));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=2", Js(new {api_clear_result = 1}));\r
+            PAssert.That(() =>\r
+                questInfo.Quests[0].Count.NowArray.SequenceEqual(new[] {1, 1, 1, 1}));\r
+        }\r
+\r
+        /// <summary>\r
+        /// 428: 近海に侵入する敵潜を制圧せよ!\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void MissionResult_428()\r
+        {\r
+            var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {428}));\r
+\r
+            questInfo.InspectDeck(Js(\r
+                new[]\r
+                {\r
+                    new {api_id = 2, api_mission = new[] {2, 4}},\r
+                    new {api_id = 3, api_mission = new[] {2, 101}},\r
+                    new {api_id = 4, api_mission = new[] {2, 102}}\r
+                }));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=2", Js(new {api_clear_result = 1}));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=3", Js(new {api_clear_result = 1}));\r
+            questInfo.InspectMissionResult("api%5Fdeck%5Fid=4", Js(new {api_clear_result = 1}));\r
+            PAssert.That(() =>\r
+                questInfo.Quests[0].Count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
+        }\r
+\r
+        /// <summary>\r
         /// 503: 艦隊大整備!\r
         /// 504: 艦隊酒保祭り!\r
         /// </summary>\r
         [TestMethod]\r
-        public void Powerup_503_504()\r
+        public void PowerUp_503_504()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 503, api_category = 5, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 504, api_category = 5, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {503, 504}));\r
 \r
             questInfo.CountNyukyo();\r
             questInfo.CountCharge();\r
@@ -535,18 +1119,7 @@ namespace KancolleSniffer.Test
         public void Kousyou_605_606_607_608_609_619()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1)) {AcceptMax = 6};\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 605, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 606, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 607, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 608, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 609, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 619, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {605, 606, 607, 608, 609, 619}));\r
 \r
             questInfo.CountCreateItem();\r
             questInfo.CountCreateShip();\r
@@ -564,17 +1137,22 @@ namespace KancolleSniffer.Test
         /// <summary>\r
         /// 613: 資源の再利用\r
         /// 638: 対空機銃量産\r
+        /// 643: 主力「陸攻」の調達\r
+        /// 645: 「洋上補給」物資の調達\r
+        /// 663: 新型艤装の継続研究\r
         /// 673: 装備開発力の整備\r
         /// 674: 工廠環境の整備\r
         /// 675: 運用装備の統合整備\r
         /// 676: 装備開発力の集中整備\r
         /// 677: 継戦支援能力の整備\r
+        /// 678: 主力艦上戦闘機の更新\r
+        /// 680: 対空兵装の整備拡充\r
         /// </summary>\r
         [TestMethod]\r
-        public void DestroyItem_613_638_673_674_675_676_677()\r
+        public void DestroyItem_613_638_643_645_663_673_674_675_676_677_678()\r
         {\r
-            var itemInfo = new ItemInfo();\r
-            var questInfo = new QuestInfo(itemInfo, null, () => new DateTime(2015, 1, 1)) {AcceptMax = 7};\r
+            var itemInfo = new ItemInfo(new ItemMaster(), new ItemInventory());\r
+            var questInfo = new QuestInfo(itemInfo, null, () => new DateTime(2015, 1, 1)) {AcceptMax = 12};\r
 \r
             itemInfo.InjectItemSpec(new[]\r
             {\r
@@ -586,35 +1164,40 @@ namespace KancolleSniffer.Test
                 new ItemSpec {Id = 75, Name = "ドラム缶(輸送用)", Type = 30},\r
                 new ItemSpec {Id = 7, Name = "35.6cm連装砲", Type = 3},\r
                 new ItemSpec {Id = 25, Name = "零式水上偵察機", Type = 10},\r
-                new ItemSpec {Id = 13, Name = "61cm三連装魚雷", Type = 5}\r
+                new ItemSpec {Id = 13, Name = "61cm三連装魚雷", Type = 5},\r
+                new ItemSpec {Id = 20, Name = "零式艦戦21型", Type = 6},\r
+                new ItemSpec {Id = 28, Name = "22号水上電探", Type = 12},\r
+                new ItemSpec {Id = 31, Name = "32号水上電探", Type = 13},\r
+                new ItemSpec {Id = 35, Name = "三式弾", Type = 18}\r
             });\r
-            itemInfo.InjectItems(new[] {1, 37, 19, 4, 11, 75, 7, 25, 13});\r
-            questInfo.InspectQuestList(Js(new\r
+            var items = new[] {1, 37, 19, 4, 11, 75, 7, 25, 13, 20, 28, 31, 35};\r
+            itemInfo.InjectItems(items);\r
+            questInfo.InspectQuestList(CreateQuestList(new[]\r
+                {613, 638, 643, 645, 663, 673, 674, 675, 676, 677, 678, 680}));\r
+            questInfo.InspectDestroyItem(\r
+                $"api%5Fslotitem%5Fids={string.Join("%2C", Enumerable.Range(1, items.Length))}&api%5Fverno=1", null);\r
+            var scalar = new[]\r
             {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 613, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 638, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 673, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 674, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 675, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 676, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 677, api_category = 6, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
-            questInfo.InspectDestroyItem("api%5Fslotitem%5Fids=1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9&api%5Fverno=1", null);\r
-            PAssert.That(() =>\r
-                questInfo.Quests.Select(q => new {q.Id, q.Count.Now}).Take(4).SequenceEqual(new[]\r
-                {\r
-                    new {Id = 613, Now = 1}, new {Id = 638, Now = 1},\r
-                    new {Id = 673, Now = 1}, new {Id = 674, Now = 1}\r
-                }));\r
-            var q675 = questInfo.Quests[4];\r
-            PAssert.That(() => q675.Id == 675 && q675.Count.NowArray.SequenceEqual(new[] {1, 1}));\r
-            var q676 = questInfo.Quests[5];\r
-            PAssert.That(() => q676.Id == 676 && q676.Count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
-            var q677 = questInfo.Quests[6];\r
-            PAssert.That(() => q677.Id == 677 && q677.Count.NowArray.SequenceEqual(new[] {1, 1, 1}));\r
+\r
+                new {Id = 613, Now = 1}, new {Id = 638, Now = 1}, new {Id = 643, Now = 1}, new {Id = 645, Now = 1},\r
+                new {Id = 663, Now = 1}, new {Id = 673, Now = 1}, new {Id = 674, Now = 1}\r
+            };\r
+            foreach (var e in scalar)\r
+            {\r
+                var c = Array.Find(questInfo.Quests, q => q.Id == e.Id).Count;\r
+                PAssert.That(() => c.Id == e.Id && c.Now == e.Now, $"{c.Id}");\r
+            }\r
+            var array = new[]\r
+            {\r
+                new {Id = 675, NowArray = new[] {2, 1}}, new {Id = 676, NowArray = new[] {1, 1, 1}},\r
+                new {Id = 677, NowArray = new[] {1, 1, 1}}, new {Id = 678, NowArray = new[] {1, 1}},\r
+                new {Id = 680, NowArray = new[] {1, 2}}\r
+            };\r
+            foreach (var e in array)\r
+            {\r
+                var c = Array.Find(questInfo.Quests, q => q.Id == e.Id).Count;\r
+                PAssert.That(() => c.Id == e.Id && c.NowArray.SequenceEqual(e.NowArray), $"{c.Id}");\r
+            }\r
         }\r
 \r
         /// <summary>\r
@@ -622,24 +1205,24 @@ namespace KancolleSniffer.Test
         /// 703: 「近代化改修」を進め、戦備を整えよ!\r
         /// </summary>\r
         [TestMethod]\r
-        public void Powerup_702_703()\r
+        public void PowerUp_702_703()\r
         {\r
             var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
-\r
-            questInfo.InspectQuestList(Js(new\r
-            {\r
-                api_list = new[]\r
-                {\r
-                    new {api_no = 702, api_category = 7, api_state = 2, api_title = "", api_progress_flag = 0},\r
-                    new {api_no = 703, api_category = 7, api_state = 2, api_title = "", api_progress_flag = 0}\r
-                }\r
-            }));\r
-            questInfo.InspectPowerup(Js(new {api_powerup_flag = 1}));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {702, 703}));\r
+            questInfo.InspectPowerUp(Js(new {api_powerup_flag = 1}));\r
             PAssert.That(() =>\r
                 questInfo.Quests.Select(q => new {q.Id, q.Count.Now})\r
                     .SequenceEqual(new[] {new {Id = 702, Now = 1}, new {Id = 703, Now = 1}}));\r
         }\r
 \r
+        [TestMethod]\r
+        public void NotImplemented()\r
+        {\r
+            var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
+            questInfo.InspectQuestList(CreateQuestList(new[] {679}));\r
+            PAssert.That(() => questInfo.Quests[0].Count.Spec.Material.Length == 0);\r
+        }\r
+\r
         /// <summary>\r
         /// 文字列表記にする\r
         /// </summary>\r
@@ -653,7 +1236,11 @@ namespace KancolleSniffer.Test
                 {\r
                     new QuestCount {Id = 211, Now = 2},\r
                     new QuestCount {Id = 214, NowArray = new[] {20, 7, 10, 8}},\r
-                    new QuestCount {Id = 854, NowArray = new[] {2, 1, 1, 1}}\r
+                    new QuestCount {Id = 854, NowArray = new[] {2, 1, 1, 1}},\r
+                    new QuestCount {Id = 426, NowArray = new[] {1, 1, 1, 1}},\r
+                    new QuestCount {Id = 428, NowArray = new[] {1, 1, 1}},\r
+                    new QuestCount {Id = 873, NowArray = new[] {1, 1, 1}},\r
+                    new QuestCount {Id= 888, NowArray = new []{1, 1, 1}}\r
                 }\r
             };\r
             questInfo.LoadState(status);\r
@@ -664,6 +1251,48 @@ namespace KancolleSniffer.Test
             PAssert.That(() => z.ToToolTip() == "2-4 6-1 6-3 6-4");\r
             z.NowArray = new[] {0, 0, 0, 0};\r
             PAssert.That(() => z.ToToolTip() == "");\r
+            var q426 = status.QuestCountList[3];\r
+            PAssert.That(() => q426.ToString() == "4/4");\r
+            PAssert.That(() => q426.ToToolTip() == "警備任務 対潜警戒任務 海上護衛任務 強硬偵察任務");\r
+            var q428 = status.QuestCountList[4];\r
+            PAssert.That(() => q428.ToToolTip() == "対潜警戒任務1 海峡警備行動1 長時間対潜警戒1");\r
+            q428.NowArray = new[] {0, 1, 0};\r
+            PAssert.That(() => q428.ToToolTip() == "海峡警備行動1");\r
+            var q873 = status.QuestCountList[5];\r
+            PAssert.That(() => q873.ToString() == "3/3");\r
+            PAssert.That(() => q873.ToToolTip() == "3-1 3-2 3-3");\r
+            var q888 = status.QuestCountList[6];\r
+            PAssert.That(() => q888.ToString() == "3/3");\r
+            PAssert.That(() => q888.ToToolTip() == "5-1 5-3 5-4");\r
+        }\r
+\r
+        /// <summary>\r
+        /// 状態をロードするときに獲得資材に特殊資材のリストを追加しない\r
+        /// </summary>\r
+        [TestMethod]\r
+        public void LoadStateNotAppendMaterialList()\r
+        {\r
+            var questInfo = new QuestInfo(null, null, () => new DateTime(2015, 1, 1));\r
+            var status = new Status\r
+            {\r
+                QuestList = new[]\r
+                {\r
+                    new QuestStatus\r
+                    {\r
+                        Id = 854,\r
+                        Category = 8,\r
+                        Name = "",\r
+                        Detail = "",\r
+                        Material = new[] {0, 2000, 0, 0, 0, 0, 0, 4}\r
+                    }\r
+                },\r
+                QuestCountList = new[]\r
+                {\r
+                    new QuestCount {Id = 854, NowArray = new[] {1, 0, 1, 0}}\r
+                }\r
+            };\r
+            questInfo.LoadState(status);\r
+            PAssert.That(() => questInfo.Quests[0].Material.Length == 8);\r
         }\r
     }\r
 }
\ No newline at end of file