OSDN Git Service

遠征ログを出力する
[kancollesniffer/KancolleSniffer.git] / KancolleSniffer.Test / LoggerTest.cs
1 // Copyright (C) 2014 Kazuhiro Fujieda <fujieda@users.sourceforge.jp>\r
2 // \r
3 // This program is part of KancolleSniffer.\r
4 //\r
5 // KancolleSniffer is free software: you can redistribute it and/or modify\r
6 // it under the terms of the GNU General Public License as published by\r
7 // the Free Software Foundation, either version 3 of the License, or\r
8 // (at your option) any later version.\r
9 //\r
10 // This program is distributed in the hope that it will be useful,\r
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
13 // GNU General Public License for more details.\r
14 //\r
15 // You should have received a copy of the GNU General Public License\r
16 // along with this program; if not, see <http://www.gnu.org/licenses/>.\r
17 \r
18 using System;\r
19 using System.Collections.Generic;\r
20 using System.IO;\r
21 using System.Linq;\r
22 using Codeplex.Data;\r
23 using ExpressionToCodeLib;\r
24 using Microsoft.VisualStudio.TestTools.UnitTesting;\r
25 using Moq;\r
26 \r
27 namespace KancolleSniffer.Test\r
28 {\r
29     [TestClass]\r
30     public class LoggerTest\r
31     {\r
32         private IEnumerable<string> ReadLogFile(string name)\r
33         {\r
34             using (var file = SnifferTest.OpenLogFile(name))\r
35             {\r
36                 string line;\r
37                 while ((line = file.ReadLine()) != null)\r
38                     yield return line;\r
39             }\r
40         }\r
41 \r
42         [TestMethod]\r
43         public void InspectMissionResult()\r
44         {\r
45             var sniffer = new Sniffer();\r
46             var result = "";\r
47             var header = "";\r
48             sniffer.SetLogWriter((path, s, h) =>\r
49             {\r
50                 result += s + "|";\r
51                 header = h;\r
52             }, () => new DateTime(2015, 1, 1));\r
53             sniffer.SkipMaster();\r
54             SnifferTest.SniffLogFile(sniffer, "mission_result_001");\r
55             PAssert.That(() => "日付,結果,遠征,燃料,弾薬,鋼材,ボーキ,開発資材,高速修復材,高速建造材" == header);\r
56             PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0|" +\r
57                                "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0|" +\r
58                                "2015-01-01 00:00:00,大成功,MO作戦,0,0,360,420,1,0,0|" +\r
59                                "2015-01-01 00:00:00,失敗,東京急行(弐),0,0,0,0,0,0,0|"\r
60                                == result);\r
61         }\r
62 \r
63         /// <summary>\r
64         /// 出力先に書けないときは一時ファイルに書き込む\r
65         /// </summary>\r
66         [TestMethod]\r
67         public void WriteTmpFileWhenCantWriteTarget()\r
68         {\r
69             var mock = new Mock<LogWriter.IFile>();\r
70             var writer = new LogWriter(mock.Object);\r
71 \r
72             const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0";\r
73             var tmp = "";\r
74             mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))\r
75                 .Callback<string, string>((file, s) =>\r
76                 {\r
77                     if (file.EndsWith(".csv"))\r
78                         throw new IOException();\r
79                     if (file.EndsWith(".tmp"))\r
80                         tmp += s;\r
81                 });\r
82             mock.SetupSequence(l => l.Exists(It.IsAny<string>())).Returns(false).Returns(true);\r
83             writer.Write("遠征報告書", str, "");\r
84             PAssert.That(() => "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" == tmp);\r
85         }\r
86 \r
87         [TestMethod]\r
88         public void MergeTmpFile()\r
89         {\r
90             MergeTmpFileMain(false);\r
91         }\r
92 \r
93         [TestMethod]\r
94         public void FaileToMergeTmpFile()\r
95         {\r
96             MergeTmpFileMain(true);\r
97         }\r
98 \r
99         private void MergeTmpFileMain(bool failToMerge)\r
100         {\r
101             var mock = new Mock<LogWriter.IFile>();\r
102             var writer = new LogWriter(mock.Object);\r
103 \r
104             var tmp = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n";\r
105             var csv = "";\r
106             mock.Setup(l => l.Exists(It.IsAny<string>())).Returns(true);\r
107             mock.Setup(l => l.ReadAllText(It.IsAny<string>()))\r
108                 .Returns((string path) => path.EndsWith(".tmp") ? tmp : "");\r
109             mock.Setup(l => l.AppendAllText(It.IsAny<string>(), It.IsAny<string>()))\r
110                 .Callback<string, string>((file, s) =>\r
111                 {\r
112                     if (file.EndsWith(".tmp"))\r
113                         tmp += s;\r
114                     if (file.EndsWith(".csv"))\r
115                     {\r
116                         if (failToMerge)\r
117                             throw new IOException();\r
118                         csv += s;\r
119                     }\r
120                 });\r
121             const string str = "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0";\r
122             writer.Write("遠征報告書", str, "");\r
123             var result = failToMerge ? tmp : csv;\r
124             PAssert.That(() =>\r
125                 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,0,0\r\n" +\r
126                 "2015-01-01 00:00:00,成功,長距離練習航海,0,100,30,0,0,1,0\r\n" == result);\r
127         }\r
128     }\r
129 }