OSDN Git Service

Wikipedia翻訳支援ツール Ver1.01時点のソース
[wptscs/wpts.git] / WptscsTest / Logics / MediaWikiTranslatorTest.cs
1 // ================================================================================================\r
2 // <summary>\r
3 //      MediaWikiTranslatorのテストクラスソース。</summary>\r
4 //\r
5 // <copyright file="MediaWikiTranslatorTest.cs" company="honeplusのメモ帳">\r
6 //      Copyright (C) 2010 Honeplus. All rights reserved.</copyright>\r
7 // <author>\r
8 //      Honeplus</author>\r
9 // ================================================================================================\r
10 \r
11 namespace Honememo.Wptscs.Logics\r
12 {\r
13     using System;\r
14     using System.Collections.Generic;\r
15     using System.IO;\r
16     using System.Reflection;\r
17     using NUnit.Framework;\r
18     using Honememo.Tests;\r
19     using Honememo.Utilities;\r
20     using Honememo.Wptscs.Models;\r
21 \r
22     /// <summary>\r
23     /// MediaWikiTranslatorのテストクラスです。\r
24     /// </summary>\r
25     [TestFixture]\r
26     public class MediaWikiTranslatorTest\r
27     {\r
28         #region 定数\r
29 \r
30         /// <summary>\r
31         /// テストデータが格納されているフォルダパス。\r
32         /// </summary>\r
33         private static readonly string testDir = "Data\\MediaWiki";\r
34 \r
35         #endregion\r
36 \r
37         #region テスト支援メソッド\r
38 \r
39         /// <summary>\r
40         /// テスト用の値を設定したMediaWikiオブジェクトを返す。\r
41         /// </summary>\r
42         public MediaWiki GetTestServer(string language)\r
43         {\r
44             // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。\r
45             //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが\r
46             //    あるため、それについては随時期待値を調整して対処。\r
47             MediaWiki server = ObjectUtils.DefaultIfNull<MediaWiki>(\r
48                 TestingConfig.GetInstance("Data\\config.xml").GetWebsite(language) as MediaWiki,\r
49                 new MediaWiki(new Language(language)));\r
50             UriBuilder b = new UriBuilder("file", "");\r
51             b.Path = Path.GetFullPath(testDir) + "\\";\r
52             server.Location = new Uri(b.Uri, language + "/").ToString();\r
53             server.ExportPath = "{0}.xml";\r
54             server.NamespacePath = "_api.xml";\r
55             return server;\r
56         }\r
57 \r
58         #endregion\r
59         \r
60         #region 全体テストケース\r
61 \r
62         /// <summary>\r
63         /// テストデータを用い、Runを通しで実行するテストケース。基本動作。\r
64         /// </summary>\r
65         [Test]\r
66         public void TestExampleIgnoreHeading()\r
67         {\r
68             MediaWiki from = this.GetTestServer("en");\r
69             Translator translate = new MediaWikiTranslator();\r
70             translate.From = from;\r
71             translate.To = this.GetTestServer("ja");\r
72             translate.HeadingTable = new TranslationTable();\r
73             translate.HeadingTable.From = "en";\r
74             translate.HeadingTable.To = "ja";\r
75 \r
76             Assert.IsTrue(translate.Run("example"));\r
77 \r
78             // テストデータの変換結果を期待される結果と比較する\r
79             string expectedText;\r
80             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_定型句なし.txt"))) \r
81             {\r
82                 expectedText = sr.ReadToEnd();\r
83             }\r
84 \r
85             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
86             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Text > " + translate.Text);\r
87             Assert.AreEqual(\r
88                 expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),\r
89                 translate.Text);\r
90 \r
91             // テストデータの変換ログを期待されるログと比較する\r
92             string expectedLog;\r
93             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_定型句なし.log")))\r
94             {\r
95                 expectedLog = sr.ReadToEnd();\r
96             }\r
97 \r
98             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
99             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Log > " + translate.Log);\r
100             Assert.AreEqual(\r
101                 expectedLog.Replace("file:///xxx/Data/MediaWiki/en/", from.Location),\r
102                 translate.Log);\r
103         }\r
104 \r
105         /// <summary>\r
106         /// テストデータを用い、Runを通しで実行するテストケース。基本動作見出しの変換含む。\r
107         /// </summary>\r
108         /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>\r
109         [Test]\r
110         public void TestExample()\r
111         {\r
112             MediaWiki from = this.GetTestServer("en");\r
113             Translator translate = new MediaWikiTranslator();\r
114             translate.From = from;\r
115             translate.To = this.GetTestServer("ja");\r
116 \r
117             // 見出しの変換パターンを設定\r
118             translate.HeadingTable = new TranslationTable();\r
119             IDictionary<string, string> dic = new Dictionary<string, string>();\r
120             dic["en"] = "See also";\r
121             dic["ja"] = "関連項目";\r
122             translate.HeadingTable.Add(dic);\r
123             translate.HeadingTable.From = "en";\r
124             translate.HeadingTable.To = "ja";\r
125 \r
126             Assert.IsTrue(translate.Run("example"));\r
127 \r
128             // テストデータの変換結果を期待される結果と比較する\r
129             string expectedText;\r
130             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example.txt")))\r
131             {\r
132                 expectedText = sr.ReadToEnd();\r
133             }\r
134 \r
135             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
136             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);\r
137             Assert.AreEqual(\r
138                 expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),\r
139                 translate.Text);\r
140 \r
141             // テストデータの変換ログを期待されるログと比較する\r
142             string expectedLog;\r
143             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example.log")))\r
144             {\r
145                 expectedLog = sr.ReadToEnd();\r
146             }\r
147 \r
148             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
149             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);\r
150             Assert.AreEqual(\r
151                 expectedLog.Replace("http://en.wikipedia.org", from.Location),\r
152                 translate.Log);\r
153         }\r
154 \r
155         /// <summary>\r
156         /// テストデータを用い、Runを通しで実行するテストケース。キャッシュ使用。\r
157         /// </summary>\r
158         [Test]\r
159         public void TestExampleWithCache()\r
160         {\r
161             MediaWiki from = this.GetTestServer("en");\r
162             Translator translate = new MediaWikiTranslator();\r
163             translate.From = from;\r
164             translate.To = this.GetTestServer("ja");\r
165 \r
166             // 見出しの変換パターンを設定\r
167             translate.HeadingTable = new TranslationTable();\r
168             IDictionary<string, string> dic = new Dictionary<string, string>();\r
169             dic["en"] = "See also";\r
170             dic["ja"] = "関連項目";\r
171             translate.HeadingTable.Add(dic);\r
172             translate.HeadingTable.From = "en";\r
173             translate.HeadingTable.To = "ja";\r
174 \r
175             // 以下のキャッシュパターンを指定して実行\r
176             TranslationDictionary table = new TranslationDictionary("en", "ja");\r
177             table.Add("Template:Wiktionary", new TranslationDictionary.Item { Word = "Template:Wiktionary" });\r
178             table.Add("example.org", new TranslationDictionary.Item());\r
179             table.Add(".example", new TranslationDictionary.Item { Word = "。さんぷる", Alias = ".dummy" });\r
180             table.Add("Template:Disambig", new TranslationDictionary.Item { Word = "Template:曖昧さ回避" });\r
181             translate.ItemTable = table;\r
182 \r
183             Assert.IsTrue(translate.Run("example"));\r
184 \r
185             // キャッシュに今回の処理で取得した内容が更新されているかを確認\r
186             Assert.IsTrue(table.ContainsKey("example.com"));\r
187             Assert.AreEqual("Example.com", table["example.com"].Word);\r
188             Assert.IsNull(table["example.com"].Alias);\r
189             Assert.IsNotNull(table["example.com"].Timestamp);\r
190             Assert.IsTrue(table.ContainsKey("Exemplum"));\r
191             Assert.IsEmpty(table["Exemplum"].Word);\r
192             Assert.IsNull(table["Exemplum"].Alias);\r
193             Assert.IsNotNull(table["Exemplum"].Timestamp);\r
194             Assert.IsTrue(table.ContainsKey("example.net"));\r
195             Assert.AreEqual("Example.com", table["example.net"].Word);\r
196             Assert.AreEqual("Example.com", table["example.net"].Alias);\r
197             Assert.IsNotNull(table["example.net"].Timestamp);\r
198 \r
199             // テストデータの変換結果を期待される結果と比較する\r
200             string expectedText;\r
201             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_キャッシュ使用.txt")))\r
202             {\r
203                 expectedText = sr.ReadToEnd();\r
204             }\r
205 \r
206             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
207             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Text > " + translate.Text);\r
208             Assert.AreEqual(\r
209                 expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),\r
210                 translate.Text);\r
211 \r
212             // テストデータの変換ログを期待されるログと比較する\r
213             string expectedLog;\r
214             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\example_キャッシュ使用.log")))\r
215             {\r
216                 expectedLog = sr.ReadToEnd();\r
217             }\r
218 \r
219             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
220             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Log > " + translate.Log);\r
221             Assert.AreEqual(\r
222                 expectedLog.Replace("file:///xxx/Data/MediaWiki/en/", from.Location),\r
223                 translate.Log);\r
224         }\r
225 \r
226         /// <summary>\r
227         /// テストデータを用い、Runを通しで実行するテストケース(日本語版→英語版)。\r
228         /// </summary>\r
229         /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>\r
230         [Test]\r
231         public void TestSpaceShipTwo()\r
232         {\r
233             MediaWiki from = this.GetTestServer("ja");\r
234             Translator translate = new MediaWikiTranslator();\r
235             translate.From = from;\r
236             translate.To = this.GetTestServer("en");\r
237             translate.ItemTable = new TranslationDictionary("ja", "en");\r
238 \r
239             // 見出しの変換パターンを設定\r
240             translate.HeadingTable = new TranslationTable();\r
241             IDictionary<string, string> dic = new Dictionary<string, string>();\r
242             dic["en"] = "See Also";\r
243             dic["ja"] = "関連項目";\r
244             translate.HeadingTable.Add(dic);\r
245             dic = new Dictionary<string, string>();\r
246             dic["en"] = "External links";\r
247             dic["ja"] = "外部リンク";\r
248             translate.HeadingTable.Add(dic);\r
249             dic = new Dictionary<string, string>();\r
250             dic["en"] = "Notes";\r
251             dic["ja"] = "脚注";\r
252             translate.HeadingTable.Add(dic);\r
253             translate.HeadingTable.From = "ja";\r
254             translate.HeadingTable.To = "en";\r
255 \r
256             Assert.IsTrue(translate.Run("スペースシップツー"));\r
257 \r
258             // テストデータの変換結果を期待される結果と比較する\r
259             string expectedText;\r
260             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\スペースシップツー.txt")))\r
261             {\r
262                 expectedText = sr.ReadToEnd();\r
263             }\r
264 \r
265             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する\r
266             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);\r
267             Assert.AreEqual(\r
268                 expectedText.Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),\r
269                 translate.Text);\r
270 \r
271             // テストデータの変換ログを期待されるログと比較する\r
272             string expectedLog;\r
273             using (StreamReader sr = new StreamReader(Path.Combine(testDir, "result\\スペースシップツー.log")))\r
274             {\r
275                 expectedLog = sr.ReadToEnd();\r
276             }\r
277 \r
278             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する\r
279             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);\r
280             Assert.AreEqual(\r
281                 expectedLog.Replace("http://ja.wikipedia.org", from.Location),\r
282                 translate.Log);\r
283         }\r
284 \r
285         /// <summary>\r
286         /// Runを通しで実行するテストケース(対象記事なし)。\r
287         /// </summary>\r
288         [Test]\r
289         public void TestPageNothing()\r
290         {\r
291             MediaWiki from = this.GetTestServer("en");\r
292             Translator translate = new MediaWikiTranslator();\r
293             translate.From = from;\r
294             translate.To = this.GetTestServer("ja");\r
295 \r
296             Assert.IsFalse(translate.Run("Nothing Page"));\r
297 \r
298             // 実行ログを期待されるログと比較する\r
299             Assert.AreEqual(\r
300                 ("http://en.wikipedia.org より [[Nothing Page]] を取得。\r\n"\r
301                 + "→ 翻訳元として指定された記事は存在しません。記事名を確認してください。")\r
302                 .Replace("http://en.wikipedia.org", from.Location),\r
303                 translate.Log);\r
304         }\r
305 \r
306         #endregion\r
307 \r
308         #region 整理予定の静的メソッドテストケース\r
309 \r
310         /// <summary>\r
311         /// ChkCommentメソッドテストケース。\r
312         /// </summary>\r
313         [Test]\r
314         public void TestChkComment()\r
315         {\r
316             // TryParseComment互換用の旧メソッド\r
317             string comment;\r
318             Assert.AreEqual(14, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 2));\r
319             Assert.AreEqual("<!-- test -->", comment);\r
320             Assert.AreEqual(15, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test --cd", 2));\r
321             Assert.AreEqual("<!-- test --cd", comment);\r
322             Assert.AreEqual(-1, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 1));\r
323             Assert.IsEmpty(comment);\r
324             Assert.AreEqual(-1, MediaWikiTranslator.ChkComment(out comment, "ab<!-- test -->cd", 3));\r
325             Assert.IsEmpty(comment);\r
326         }\r
327         \r
328         /// <summary>\r
329         /// ChkNowikiメソッドテストケース。\r
330         /// </summary>\r
331         [Test]\r
332         public void TestChkNowiki()\r
333         {\r
334             // TryParseNowiki互換用の旧メソッド\r
335             string nowiki;\r
336             Assert.AreEqual(26, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 2));\r
337             Assert.AreEqual("<nowiki>[[test]]</nowiki>", nowiki);\r
338             Assert.AreEqual(27, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowikicd", 2));\r
339             Assert.AreEqual("<nowiki>[[test]]</nowikicd", nowiki);\r
340             Assert.AreEqual(-1, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 1));\r
341             Assert.IsEmpty(nowiki);\r
342             Assert.AreEqual(-1, MediaWikiTranslator.ChkNowiki(out nowiki, "ab<nowiki>[[test]]</nowiki>cd", 3));\r
343             Assert.IsEmpty(nowiki);\r
344         }\r
345 \r
346         #endregion\r
347     }\r
348 }\r