OSDN Git Service

メイン画面の言語プルダウンに存在しないコードを手入力するとエラーになる問題を修正。
[wptscs/wpts.git] / WptscsTest / Logics / MediaWikiTranslatorTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiTranslatorのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiTranslatorTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Logics
12 {
13     using System;
14     using System.Collections.Generic;
15     using System.IO;
16     using System.Reflection;
17     using NUnit.Framework;
18     using Honememo.Tests;
19     using Honememo.Parsers;
20     using Honememo.Utilities;
21     using Honememo.Wptscs.Models;
22     using Honememo.Wptscs.Parsers;
23     using Honememo.Wptscs.Utilities;
24     using Honememo.Wptscs.Websites;
25
26     /// <summary>
27     /// MediaWikiTranslatorのテストクラスです。
28     /// </summary>
29     [TestFixture]
30     public class MediaWikiTranslatorTest
31     {
32         #region テスト用クラス
33
34         /// <summary>
35         /// MediaWikiTranslatorテスト用のクラスです。
36         /// </summary>
37         public class TestMediaWikiTranslator : MediaWikiTranslator
38         {
39             #region 非公開メソッドテスト用のオーラーライドメソッド
40
41             /// <summary>
42             /// 内部リンクを解析し、変換先言語の記事へのリンクに変換する。
43             /// </summary>
44             /// <param name="link">変換元リンク。</param>
45             /// <param name="parent">サブページ用の親記事タイトル。</param>
46             /// <returns>変換済みリンク。</returns>
47             public new IElement ReplaceLink(MediaWikiLink link, string parent)
48             {
49                 return base.ReplaceLink(link, parent);
50             }
51
52             /// <summary>
53             /// テンプレートを解析し、変換先言語の記事へのテンプレートに変換する。
54             /// </summary>
55             /// <param name="template">変換元テンプレート。</param>
56             /// <param name="parent">サブページ用の親記事タイトル。</param>
57             /// <returns>変換済みテンプレート。</returns>
58             public new IElement ReplaceTemplate(MediaWikiTemplate template, string parent)
59             {
60                 return base.ReplaceTemplate(template, parent);
61             }
62
63             /// <summary>
64             /// 指定された見出しに対して、対訳表による変換を行う。
65             /// </summary>
66             /// <param name="heading">見出し。</param>
67             /// <param name="parent">サブページ用の親記事タイトル。</param>
68             /// <returns>変換後の見出し。</returns>
69             public new IElement ReplaceHeading(MediaWikiHeading heading, string parent)
70             {
71                 return base.ReplaceHeading(heading, parent);
72             }
73
74             #endregion
75         }
76
77         #endregion
78
79         #region 定数
80
81         /// <summary>
82         /// テスト結果が格納されているフォルダパス。
83         /// </summary>
84         private static readonly string resultDir = Path.Combine(MockFactory.TestMediaWikiDir, "result");
85
86         #endregion
87
88         #region 各処理のメソッドテストケース
89
90         /// <summary>
91         /// ReplaceLinkメソッドテストケース。
92         /// </summary>
93         [Test]
94         public void TestReplaceLink()
95         {
96             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
97             MockFactory mock = new MockFactory();
98             translator.From = mock.GetMediaWiki("ja");
99             translator.To = mock.GetMediaWiki("en");
100             translator.To.LinkInterwikiFormat = null;
101
102             // 見出しの変換パターンを設定
103             translator.HeadingTable = new TranslationTable();
104             IDictionary<string, string> dic = new Dictionary<string, string>();
105             dic["en"] = "External links";
106             dic["ja"] = "外部リンク";
107             translator.HeadingTable.Add(dic);
108             translator.HeadingTable.From = "ja";
109             translator.HeadingTable.To = "en";
110             MediaWikiLink link;
111
112             // 記事名だけの内部リンクで言語間リンクあり、変換先言語へのリンクとなる
113             // ※ 以下オブジェクトを毎回作り直しているのは、更新されてしまうケースがあるため
114             link = new MediaWikiLink();
115             link.Title = "ホワイトナイトツー";
116             Assert.AreEqual("[[Scaled Composites White Knight Two|ホワイトナイトツー]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
117
118             // 見出しあり
119             link = new MediaWikiLink();
120             link.Title = "ホワイトナイトツー";
121             link.Section = "見出し";
122             Assert.AreEqual("[[Scaled Composites White Knight Two#見出し|ホワイトナイトツー#見出し]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
123
124             // 変換パターンに該当する見出しの場合
125             link = new MediaWikiLink();
126             link.Title = "ホワイトナイトツー";
127             link.Section = "外部リンク";
128             Assert.AreEqual("[[Scaled Composites White Knight Two#External links|ホワイトナイトツー#外部リンク]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
129
130             // 表示名あり
131             link = new MediaWikiLink();
132             link.Title = "ホワイトナイトツー";
133             link.Section = "外部リンク";
134             link.PipeTexts.Add(new TextElement("母機"));
135             Assert.AreEqual("[[Scaled Composites White Knight Two#External links|母機]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
136
137             // 記事名だけの内部リンクで言語間リンクなし、変換元言語へのリンクとなる
138             translator.From = mock.GetMediaWiki("en");
139             translator.To = mock.GetMediaWiki("ja");
140             translator.To.LinkInterwikiFormat = null;
141             translator.HeadingTable.From = "en";
142             translator.HeadingTable.To = "ja";
143             link = new MediaWikiLink();
144             link.Title = "Exemplum";
145             Assert.AreEqual("[[:en:Exemplum|Exemplum]]", translator.ReplaceLink(link, "example").ToString());
146
147             // 見出しあり
148             link = new MediaWikiLink();
149             link.Title = "Exemplum";
150             link.Section = "Three examples of exempla";
151             Assert.AreEqual("[[:en:Exemplum#Three examples of exempla|Exemplum#Three examples of exempla]]", translator.ReplaceLink(link, "example").ToString());
152
153             // 変換パターンに該当する見出しの場合
154             link = new MediaWikiLink();
155             link.Title = "Exemplum";
156             link.Section = "External links";
157             Assert.AreEqual("[[:en:Exemplum#外部リンク|Exemplum#External links]]", translator.ReplaceLink(link, "example").ToString());
158
159             // 表示名あり
160             link = new MediaWikiLink();
161             link.Title = "Exemplum";
162             link.Section = "External links";
163             link.PipeTexts.Add(new TextElement("Exemplum_1"));
164             Assert.AreEqual("[[:en:Exemplum#外部リンク|Exemplum_1]]", translator.ReplaceLink(link, "example").ToString());
165
166             // 記事名だけの内部リンクで赤リンク、処理されない
167             link = new MediaWikiLink();
168             link.Title = "Nothing Page";
169             Assert.AreEqual("[[Nothing Page]]", translator.ReplaceLink(link, "example").ToString());
170
171             // 見出しあり
172             link = new MediaWikiLink();
173             link.Title = "Nothing Page";
174             link.Section = "Section A";
175             Assert.AreEqual("[[Nothing Page#Section A]]", translator.ReplaceLink(link, "example").ToString());
176
177             // 変換パターンに該当する見出しの場合
178             link = new MediaWikiLink();
179             link.Title = "Nothing Page";
180             link.Section = "External links";
181             Assert.AreEqual("[[Nothing Page#外部リンク]]", translator.ReplaceLink(link, "example").ToString());
182
183             // 表示名あり
184             link = new MediaWikiLink();
185             link.Title = "Nothing Page";
186             link.PipeTexts.Add(new TextElement("Dummy Link"));
187             Assert.AreEqual("[[Nothing Page|Dummy Link]]", translator.ReplaceLink(link, "example").ToString());
188
189             // [[Apollo&nbsp;17]] のように文字参照が入っていても処理できる
190             link = new MediaWikiLink();
191             link.Title = "Fuji&nbsp;(Spacecraft)";
192             Assert.AreEqual("[[ふじ (宇宙船)|Fuji&nbsp;(Spacecraft)]]", translator.ReplaceLink(link, "example").ToString());
193         }
194
195         /// <summary>
196         /// ReplaceLinkメソッドテストケース(カテゴリ)。
197         /// </summary>
198         [Test]
199         public void TestReplaceLinkCategory()
200         {
201             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
202             MockFactory mock = new MockFactory();
203             translator.From = mock.GetMediaWiki("ja");
204             translator.To = mock.GetMediaWiki("en");
205             MediaWikiLink link;
206
207             // 記事名だけの内部リンクで言語間リンクあり、変換先言語でのカテゴリとなる
208             // ※ 以下オブジェクトを毎回作り直しているのは、更新されてしまうケースがあるため
209             link = new MediaWikiLink();
210             link.Title = "Category:宇宙船";
211             Assert.AreEqual("[[Category:Manned spacecraft]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
212
213             // ソートキーあり
214             link = new MediaWikiLink();
215             link.Title = "Category:宇宙船";
216             link.PipeTexts.Add(new TextElement("すへえすしつふつう"));
217             Assert.AreEqual("[[Category:Manned spacecraft|すへえすしつふつう]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
218
219             // 記事名だけの内部リンクで言語間リンクなし、変換元言語へのリンクとなり元のカテゴリはコメントとなる
220             translator.To = mock.GetMediaWiki("it");
221             link = new MediaWikiLink();
222             link.Title = "Category:宇宙船";
223             Assert.AreEqual("[[:ja:Category:宇宙船]]<!-- [[Category:宇宙船]] -->", translator.ReplaceLink(link, "スペースシップツー").ToString());
224
225             // ソートキーあり
226             link = new MediaWikiLink();
227             link.Title = "Category:宇宙船";
228             link.PipeTexts.Add(new TextElement("すへえすしつふつう"));
229             Assert.AreEqual("[[:ja:Category:宇宙船]]<!-- [[Category:宇宙船|すへえすしつふつう]] -->", translator.ReplaceLink(link, "スペースシップツー").ToString());
230
231             // 記事名だけの内部リンクで赤リンク、処理されない
232             link = new MediaWikiLink();
233             link.Title = "Category:xx国の宇宙船";
234             Assert.AreEqual("[[Category:xx国の宇宙船]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
235
236             // ソートキーあり
237             link = new MediaWikiLink();
238             link.Title = "Category:xx国の宇宙船";
239             link.PipeTexts.Add(new TextElement("すへえすしつふつう"));
240             Assert.AreEqual("[[Category:xx国の宇宙船|すへえすしつふつう]]", translator.ReplaceLink(link, "スペースシップツー").ToString());
241         }
242
243         /// <summary>
244         /// ReplaceLinkメソッドテストケース(ファイル)。
245         /// </summary>
246         [Test]
247         public void TestReplaceLinkFile()
248         {
249             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
250             MockFactory mock = new MockFactory();
251             translator.From = mock.GetMediaWiki("en");
252             translator.To = mock.GetMediaWiki("ja");
253             MediaWikiLink link;
254
255             // 画像などのファイルについては、名前空間を他国語に置き換えるだけ
256             // ※ 以下オブジェクトを毎回作り直しているのは、更新されてしまうケースがあるため
257             link = new MediaWikiLink();
258             link.Title = "File:Kepler22b-artwork.jpg";
259             Assert.AreEqual("[[ファイル:Kepler22b-artwork.jpg]]", translator.ReplaceLink(link, "Kepler-22b").ToString());
260
261             // パラメータあり
262             link = new MediaWikiLink();
263             link.Title = "File:Kepler22b-artwork.jpg";
264             link.PipeTexts.Add(new TextElement("thumb"));
265             link.PipeTexts.Add(new TextElement("right"));
266             link.PipeTexts.Add(new TextElement("Artist's conception of Kepler-22b."));
267             Assert.AreEqual("[[ファイル:Kepler22b-artwork.jpg|thumb|right|Artist's conception of Kepler-22b.]]", translator.ReplaceLink(link, "Kepler-22b").ToString());
268
269             // ja→enの場合もちゃんと置き換える(en→jaはFileのままでも使えるが逆は置き換えないと動かない)
270             translator.From = mock.GetMediaWiki("ja");
271             translator.To = mock.GetMediaWiki("en");
272
273             link = new MediaWikiLink();
274             link.Title = "ファイル:Kepler22b-artwork.jpg";
275             Assert.AreEqual("[[File:Kepler22b-artwork.jpg]]", translator.ReplaceLink(link, "ケプラー22b").ToString());
276         }
277
278         /// <summary>
279         /// ReplaceLinkメソッドテストケース(仮リンク)。
280         /// </summary>
281         [Test]
282         public void TestReplaceLinkLinkInterwiki()
283         {
284             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
285             MockFactory mock = new MockFactory();
286             translator.From = mock.GetMediaWiki("en");
287             translator.To = mock.GetMediaWiki("ja");
288
289             // 見出しの変換パターンを設定
290             translator.HeadingTable = new TranslationTable();
291             IDictionary<string, string> dic = new Dictionary<string, string>();
292             dic["en"] = "External links";
293             dic["ja"] = "外部リンク";
294             translator.HeadingTable.Add(dic);
295             translator.HeadingTable.From = "en";
296             translator.HeadingTable.To = "ja";
297             MediaWikiLink link;
298
299             // 記事名だけの内部リンクで言語間リンクなし、変換元言語へのリンクとなる
300             // ※ 以下オブジェクトを毎回作り直しているのは、更新されてしまうケースがあるため
301             link = new MediaWikiLink();
302             link.Title = "Exemplum";
303             Assert.AreEqual("{{仮リンク|Exemplum|en|Exemplum|label=Exemplum}}", translator.ReplaceLink(link, "example").ToString());
304
305             // 見出しあり
306             link = new MediaWikiLink();
307             link.Title = "Exemplum";
308             link.Section = "Three examples of exempla";
309             Assert.AreEqual("{{仮リンク|Exemplum#Three examples of exempla|en|Exemplum#Three examples of exempla|label=Exemplum#Three examples of exempla}}", translator.ReplaceLink(link, "example").ToString());
310
311             // 変換パターンに該当する見出しの場合
312             link = new MediaWikiLink();
313             link.Title = "Exemplum";
314             link.Section = "External links";
315             Assert.AreEqual("{{仮リンク|Exemplum#外部リンク|en|Exemplum#External links|label=Exemplum#External links}}", translator.ReplaceLink(link, "example").ToString());
316
317             // 表示名あり
318             link = new MediaWikiLink();
319             link.Title = "Exemplum";
320             link.Section = "External links";
321             link.PipeTexts.Add(new TextElement("Exemplum_1"));
322             Assert.AreEqual("{{仮リンク|Exemplum#外部リンク|en|Exemplum#External links|label=Exemplum_1}}", translator.ReplaceLink(link, "example").ToString());
323
324             // 言語間リンクありの場合、仮リンクは使用されない
325             link = new MediaWikiLink();
326             link.Title = "Example.com";
327             Assert.AreEqual("[[Example.com|Example.com]]", translator.ReplaceLink(link, "example").ToString());
328
329             // 記事名だけの内部リンクで赤リンクも、使用されない
330             link = new MediaWikiLink();
331             link.Title = "Nothing Page";
332             Assert.AreEqual("[[Nothing Page]]", translator.ReplaceLink(link, "example").ToString());
333         }
334
335         /// <summary>
336         /// ReplaceTemplateメソッドテストケース。
337         /// </summary>
338         [Test]
339         public void TestReplaceTemplate()
340         {
341             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
342             MockFactory mock = new MockFactory();
343             translator.From = mock.GetMediaWiki("en");
344             translator.To = mock.GetMediaWiki("ja");
345             MediaWikiTemplate template;
346
347             // テンプレート名だけで言語間リンクあり、変換先言語でのテンプレートとなる
348             // ※ 以下オブジェクトを毎回作り直しているのは、更新されてしまうケースがあるため
349             template = new MediaWikiTemplate("Citation needed");
350             Assert.AreEqual("{{要出典}}", translator.ReplaceTemplate(template, "example").ToString());
351
352             // パラメータあり
353             template = new MediaWikiTemplate("Citation needed");
354             template.PipeTexts.Add(new TextElement("date=January 2012"));
355             Assert.AreEqual("{{要出典|date=January 2012}}", translator.ReplaceTemplate(template, "example").ToString());
356
357             // テンプレート名だけで言語間リンクなし、変換元言語へのリンクとなり元のテンプレートはコメントとなる
358             template = new MediaWikiTemplate("Wiktionary");
359             Assert.AreEqual("[[:en:Template:Wiktionary]]<!-- {{Wiktionary}} -->", translator.ReplaceTemplate(template, "example").ToString());
360
361             // パラメータあり
362             template = new MediaWikiTemplate("Wiktionary");
363             template.PipeTexts.Add(new TextElement("Sample"));
364             Assert.AreEqual("[[:en:Template:Wiktionary]]<!-- {{Wiktionary|Sample}} -->", translator.ReplaceTemplate(template, "example").ToString());
365
366             // テンプレート名だけで赤リンク、処理されない
367             template = new MediaWikiTemplate("Invalid Template");
368             Assert.AreEqual("{{Invalid Template}}", translator.ReplaceTemplate(template, "example").ToString());
369
370             // パラメータあり
371             template = new MediaWikiTemplate("Invalid Template");
372             template.PipeTexts.Add(new TextElement("parameter=1"));
373             Assert.AreEqual("{{Invalid Template|parameter=1}}", translator.ReplaceTemplate(template, "example").ToString());
374
375             // システム定義変数、処理されない
376             template = new MediaWikiTemplate("PAGENAME");
377             Assert.AreEqual("{{PAGENAME}}", translator.ReplaceTemplate(template, "example").ToString());
378         }
379
380         /// <summary>
381         /// ReplaceTemplateメソッドテストケース(入れ子)。
382         /// </summary>
383         [Test]
384         public void TestReplaceTemplateNested()
385         {
386             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
387             MockFactory mock = new MockFactory();
388             translator.From = mock.GetMediaWiki("en");
389             translator.To = mock.GetMediaWiki("ja");
390             MediaWikiTemplate template;
391             MediaWikiLink link;
392             ListElement list;
393
394             // テンプレート名だけで言語間リンクあり、入れ子も処理される
395             // ※ 以下オブジェクトを毎回作り直しているのは、更新されてしまうケースがあるため
396             template = new MediaWikiTemplate("Citation needed");
397             template.PipeTexts.Add(new TextElement("date=January 2012"));
398             list = new ListElement();
399             list.Add(new TextElement("note=See also "));
400             link = new MediaWikiLink();
401             link.Title = "Fuji (Spacecraft)";
402             list.Add(link);
403             template.PipeTexts.Add(list);
404             Assert.AreEqual("{{要出典|date=January 2012|note=See also [[ふじ (宇宙船)|Fuji (Spacecraft)]]}}", translator.ReplaceTemplate(template, "example").ToString());
405
406             // テンプレート名だけで言語間リンクなし、入れ子は処理されない
407             template = new MediaWikiTemplate("Wiktionary");
408             template.PipeTexts.Add(new TextElement("Sample"));
409             list = new ListElement();
410             list.Add(new TextElement("note=See also "));
411             link = new MediaWikiLink();
412             link.Title = "Fuji (Spacecraft)";
413             list.Add(link);
414             template.PipeTexts.Add(list);
415             Assert.AreEqual("[[:en:Template:Wiktionary]]<!-- {{Wiktionary|Sample|note=See also [[Fuji (Spacecraft)]]}} -->", translator.ReplaceTemplate(template, "example").ToString());
416
417             // テンプレート名だけで赤リンク、入れ子は処理されない
418             template = new MediaWikiTemplate("Invalid Template");
419             template.PipeTexts.Add(new TextElement("parameter=1"));
420             list = new ListElement();
421             list.Add(new TextElement("note=See also "));
422             link = new MediaWikiLink();
423             link.Title = "Fuji (Spacecraft)";
424             list.Add(link);
425             template.PipeTexts.Add(list);
426             Assert.AreEqual("{{Invalid Template|parameter=1|note=See also [[Fuji (Spacecraft)]]}}", translator.ReplaceTemplate(template, "example").ToString());
427         }
428
429         /// <summary>
430         /// ReplaceHeadingメソッドテストケース。
431         /// </summary>
432         [Test]
433         public void TestReplaceHeading()
434         {
435             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
436             MockFactory mock = new MockFactory();
437             translator.From = mock.GetMediaWiki("en");
438             translator.To = mock.GetMediaWiki("ja");
439
440             // 見出しの変換パターンを設定
441             translator.HeadingTable = new TranslationTable();
442             IDictionary<string, string> dic = new Dictionary<string, string>();
443             dic["en"] = "External links";
444             dic["ja"] = "外部リンク";
445             translator.HeadingTable.Add(dic);
446             translator.HeadingTable.From = "en";
447             translator.HeadingTable.To = "ja";
448
449             MediaWikiHeading heading = new MediaWikiHeading();
450
451             // 対訳表に登録されていない見出し
452             // ※ 以下リストを毎回作り直しているのは、更新されてしまうケースがあるため
453             heading.Level = 2;
454             heading.Add(new TextElement(" invalid section "));
455             Assert.AreEqual("== invalid section ==", translator.ReplaceHeading(heading, "example").ToString());
456
457             // 対訳表に登録されている見出し
458             heading.Clear();
459             heading.Add(new TextElement(" External links "));
460             Assert.AreEqual("==外部リンク==", translator.ReplaceHeading(heading, "example").ToString());
461
462             // 一部が内部リンク等になっている場合、対訳表とは一致しない
463             heading.Clear();
464             heading.Add(new TextElement(" External "));
465             heading.Add(new MediaWikiLink("link"));
466             heading.Add(new TextElement("s "));
467             Assert.AreEqual("== External [[link]]s ==", translator.ReplaceHeading(heading, "example").ToString());
468         }
469
470         /// <summary>
471         /// ReplaceHeadingメソッドテストケース(入れ子)。
472         /// </summary>
473         [Test]
474         public void TestReplaceHeadingNested()
475         {
476             TestMediaWikiTranslator translator = new TestMediaWikiTranslator();
477             MockFactory mock = new MockFactory();
478             translator.From = mock.GetMediaWiki("ja");
479             translator.To = mock.GetMediaWiki("en");
480
481             // 見出しの変換パターンを設定
482             translator.HeadingTable = new TranslationTable();
483             IDictionary<string, string> dic = new Dictionary<string, string>();
484             translator.HeadingTable.Add(dic);
485             translator.HeadingTable.From = "ja";
486             translator.HeadingTable.To = "en";
487
488             MediaWikiHeading heading = new MediaWikiHeading();
489
490             // 対訳表に登録されていない見出しの場合、入れ子も処理される
491             // ※ 以下リストを毎回作り直しているのは、更新されてしまうケースがあるため
492             heading.Level = 3;
493             heading.Add(new TextElement(" "));
494             heading.Add(new MediaWikiLink("宇宙旅行"));
495             heading.Add(new MediaWikiTemplate("ref-en"));
496             heading.Add(new TextElement(" "));
497             Assert.AreEqual("=== [[Space tourism|宇宙旅行]]{{En icon}} ===", translator.ReplaceHeading(heading, "スペースシップツー").ToString());
498
499             // 対訳表に登録されている見出しの場合、入れ子は処理されない
500             dic["ja"] = "[[宇宙旅行]]{{ref-en}}";
501             dic["en"] = "[[弾道飛行]]{{ref-en}}";
502             heading.Clear();
503             heading.Add(new TextElement(" "));
504             heading.Add(new MediaWikiLink("宇宙旅行"));
505             heading.Add(new MediaWikiTemplate("ref-en"));
506             heading.Add(new TextElement(" "));
507             Assert.AreEqual("===[[弾道飛行]]{{ref-en}}===", translator.ReplaceHeading(heading, "スペースシップツー").ToString());
508         }
509
510         #endregion
511
512         #region 全体テストケース
513
514         /// <summary>
515         /// テストデータを用い、Runを通しで実行するテストケース。基本動作。
516         /// </summary>
517         [Test]
518         public void TestExampleIgnoreHeading()
519         {
520             MockFactory mock = new MockFactory();
521             MediaWiki from = mock.GetMediaWiki("en");
522             MediaWikiTranslator translator = new MediaWikiTranslator();
523             translator.From = from;
524             translator.To = mock.GetMediaWiki("ja");
525             translator.To.LinkInterwikiFormat = null;
526             translator.HeadingTable = new TranslationTable();
527             translator.HeadingTable.From = "en";
528             translator.HeadingTable.To = "ja";
529             translator.Run("example");
530
531             // テストデータの変換結果を期待される結果と比較する
532             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
533             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Text > " + translate.Text);
534             Assert.AreEqual(
535                 File.ReadAllText(Path.Combine(resultDir, "example_定型句なし.txt")).Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),
536                 translator.Text);
537
538             // テストデータの変換ログを期待されるログと比較する
539             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
540             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleIgnoreHeading Log > " + translate.Log);
541             Assert.AreEqual(
542                 File.ReadAllText(Path.Combine(resultDir, "example_定型句なし.log")).Replace("file:///xxx/Data/MediaWiki/en/", from.Location),
543                 translator.Log);
544         }
545
546         /// <summary>
547         /// テストデータを用い、Runを通しで実行するテストケース。基本動作見出しの変換含む。
548         /// </summary>
549         /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>
550         [Test]
551         public void TestExample()
552         {
553             MockFactory mock = new MockFactory();
554             MediaWiki from = mock.GetMediaWiki("en");
555             MediaWikiTranslator translator = new MediaWikiTranslator();
556             translator.From = from;
557             translator.To = mock.GetMediaWiki("ja");
558             translator.To.LinkInterwikiFormat = null;
559             translator.To.LangFormat = null;
560
561             // 見出しの変換パターンを設定
562             translator.HeadingTable = new TranslationTable();
563             IDictionary<string, string> dic = new Dictionary<string, string>();
564             dic["en"] = "See also";
565             dic["ja"] = "関連項目";
566             translator.HeadingTable.Add(dic);
567             translator.HeadingTable.From = "en";
568             translator.HeadingTable.To = "ja";
569             translator.Run("example");
570
571             // テストデータの変換結果を期待される結果と比較する
572             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
573             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);
574             Assert.AreEqual(
575                 File.ReadAllText(Path.Combine(resultDir, "example.txt")).Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),
576                 translator.Text);
577
578             // テストデータの変換ログを期待されるログと比較する
579             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
580             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);
581             Assert.AreEqual(
582                 File.ReadAllText(Path.Combine(resultDir, "example.log")).Replace("http://en.wikipedia.org", from.Location),
583                 translator.Log);
584         }
585
586         /// <summary>
587         /// テストデータを用い、Runを通しで実行するテストケース。キャッシュ使用。
588         /// </summary>
589         [Test]
590         public void TestExampleWithCache()
591         {
592             MockFactory mock = new MockFactory();
593             MediaWiki from = mock.GetMediaWiki("en");
594             MediaWikiTranslator translator = new MediaWikiTranslator();
595             translator.From = from;
596             translator.To = mock.GetMediaWiki("ja");
597             translator.To.LinkInterwikiFormat = null;
598
599             // 見出しの変換パターンを設定
600             translator.HeadingTable = new TranslationTable();
601             IDictionary<string, string> dic = new Dictionary<string, string>();
602             dic["en"] = "See also";
603             dic["ja"] = "関連項目";
604             translator.HeadingTable.Add(dic);
605             translator.HeadingTable.From = "en";
606             translator.HeadingTable.To = "ja";
607
608             // 以下のキャッシュパターンを指定して実行
609             TranslationDictionary table = new TranslationDictionary("en", "ja");
610             table.Add("Template:Wiktionary", new TranslationDictionary.Item { Word = "Template:Wiktionary" });
611             table.Add("example.org", new TranslationDictionary.Item());
612             table.Add(".example", new TranslationDictionary.Item { Word = "。さんぷる", Alias = ".dummy" });
613             table.Add("Template:Disambig", new TranslationDictionary.Item { Word = "Template:曖昧さ回避" });
614             translator.ItemTable = table;
615             translator.Run("example");
616
617             // キャッシュに今回の処理で取得した内容が更新されているかを確認
618             Assert.IsTrue(table.ContainsKey("example.com"));
619             Assert.AreEqual("Example.com", table["example.com"].Word);
620             Assert.IsNull(table["example.com"].Alias);
621             Assert.IsNotNull(table["example.com"].Timestamp);
622             Assert.IsTrue(table.ContainsKey("Exemplum"));
623             Assert.IsEmpty(table["Exemplum"].Word);
624             Assert.IsNull(table["Exemplum"].Alias);
625             Assert.IsNotNull(table["Exemplum"].Timestamp);
626             Assert.IsTrue(table.ContainsKey("example.net"));
627             Assert.AreEqual("Example.com", table["example.net"].Word);
628             Assert.AreEqual("Example.com", table["example.net"].Alias);
629             Assert.IsNotNull(table["example.net"].Timestamp);
630
631             // テストデータの変換結果を期待される結果と比較する
632             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
633             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Text > " + translate.Text);
634             Assert.AreEqual(
635                 File.ReadAllText(Path.Combine(resultDir, "example_キャッシュ使用.txt")).Replace("<!-- Wikipedia 翻訳支援ツール Ver0.xx", "<!-- " + FormUtils.ApplicationName()),
636                 translator.Text);
637
638             // テストデータの変換ログを期待されるログと比較する
639             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
640             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExampleWithCache Log > " + translate.Log);
641             Assert.AreEqual(
642                 File.ReadAllText(Path.Combine(resultDir, "example_キャッシュ使用.log")).Replace("file:///xxx/Data/MediaWiki/en/", from.Location),
643                 translator.Log);
644         }
645
646         /// <summary>
647         /// テストデータを用い、Runを通しで実行するテストケース。基本動作見出しの変換、{{仮リンク}}への置き換え含む。
648         /// </summary>
649         [Test]
650         public void TestExampleWithLinkInterwiki()
651         {
652             MockFactory mock = new MockFactory();
653             MediaWiki from = mock.GetMediaWiki("en");
654             MediaWikiTranslator translator = new MediaWikiTranslator();
655             translator.From = from;
656             translator.To = mock.GetMediaWiki("ja");
657
658             // 見出しの変換パターンを設定
659             translator.HeadingTable = new TranslationTable();
660             IDictionary<string, string> dic = new Dictionary<string, string>();
661             dic["en"] = "See also";
662             dic["ja"] = "関連項目";
663             translator.HeadingTable.Add(dic);
664             translator.HeadingTable.From = "en";
665             translator.HeadingTable.To = "ja";
666             translator.Run("example");
667
668             // テストデータの変換結果を期待される結果と比較する
669             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
670             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);
671             Assert.AreEqual(
672                 File.ReadAllText(Path.Combine(resultDir, "example_仮リンク有効.txt")).Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),
673                 translator.Text);
674
675             // テストデータの変換ログを期待されるログと比較する
676             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
677             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);
678             Assert.AreEqual(
679                 File.ReadAllText(Path.Combine(resultDir, "example.log")).Replace("http://en.wikipedia.org", from.Location),
680                 translator.Log);
681         }
682
683         /// <summary>
684         /// テストデータを用い、Runを通しで実行するテストケース(日本語版→英語版)。
685         /// </summary>
686         /// <remarks>C++/CLI版の0.73までと同等の動作。</remarks>
687         [Test]
688         public void TestSpaceShipTwo()
689         {
690             MockFactory mock = new MockFactory();
691             MediaWiki from = mock.GetMediaWiki("ja");
692             MediaWikiTranslator translator = new MediaWikiTranslator();
693             translator.From = from;
694             translator.To = mock.GetMediaWiki("en");
695             translator.To.LinkInterwikiFormat = null;
696             translator.ItemTable = new TranslationDictionary("ja", "en");
697             translator.IsContinueAtInterwikiExisted = (string interwiki) => true;
698
699             // 見出しの変換パターンを設定
700             translator.HeadingTable = new TranslationTable();
701             IDictionary<string, string> dic = new Dictionary<string, string>();
702             dic["en"] = "See Also";
703             dic["ja"] = "関連項目";
704             translator.HeadingTable.Add(dic);
705             dic = new Dictionary<string, string>();
706             dic["en"] = "External links";
707             dic["ja"] = "外部リンク";
708             translator.HeadingTable.Add(dic);
709             dic = new Dictionary<string, string>();
710             dic["en"] = "Notes";
711             dic["ja"] = "脚注";
712             translator.HeadingTable.Add(dic);
713             translator.HeadingTable.From = "ja";
714             translator.HeadingTable.To = "en";
715             translator.Run("スペースシップツー");
716
717             // テストデータの変換結果を期待される結果と比較する
718             // バージョン表記部分は毎回変化するため、期待される結果のうち該当部分を更新する
719             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Text > " + translate.Text);
720             Assert.AreEqual(
721                 File.ReadAllText(Path.Combine(resultDir, "スペースシップツー.txt")).Replace("<!-- Wikipedia 翻訳支援ツール Ver0.73", "<!-- " + FormUtils.ApplicationName()),
722                 translator.Text);
723
724             // テストデータの変換ログを期待されるログと比較する
725             // 1行目のパスが一致しないので、期待される結果のうち該当部分を更新する
726             //System.Diagnostics.Debug.WriteLine("TranslateMediaWikiTest.TestExample Log > " + translate.Log);
727             Assert.AreEqual(
728                 File.ReadAllText(Path.Combine(resultDir, "スペースシップツー.log")).Replace("http://ja.wikipedia.org", from.Location),
729                 translator.Log);
730         }
731
732         /// <summary>
733         /// Runを通しで実行するテストケース(対象記事なし)。
734         /// </summary>
735         [Test]
736         public void TestPageNothing()
737         {
738             MockFactory mock = new MockFactory();
739             MediaWiki from = mock.GetMediaWiki("en");
740             Translator translator = new MediaWikiTranslator();
741             translator.From = from;
742             translator.To = mock.GetMediaWiki("ja");
743
744             try
745             {
746                 translator.Run("Nothing Page");
747                 Assert.Fail();
748             }
749             catch (ApplicationException)
750             {
751                 // 実行ログを期待されるログと比較する
752                 Assert.AreEqual(
753                     ("http://en.wikipedia.org より [[Nothing Page]] を取得。\r\n"
754                     + "→ 翻訳元として指定された記事は存在しません。記事名を確認してください。\r\n")
755                     .Replace("http://en.wikipedia.org", from.Location),
756                     translator.Log);
757             }
758         }
759
760         /// <summary>
761         /// Runを通しで実行するテストケース(対象記事がリダイレクトで無し)。
762         /// </summary>
763         [Test]
764         public void TestPageRedirectNothing()
765         {
766             MockFactory mock = new MockFactory();
767             MediaWiki from = mock.GetMediaWiki("en");
768             Translator translator = new MediaWikiTranslator();
769             translator.From = from;
770             translator.To = mock.GetMediaWiki("ja");
771
772             try
773             {
774                 translator.Run("Redirect→Nothing Page");
775                 Assert.Fail();
776             }
777             catch (ApplicationException)
778             {
779                 // 実行ログを期待されるログと比較する
780                 Assert.AreEqual(
781                     ("http://en.wikipedia.org より [[Redirect→Nothing Page]] を取得。\r\n"
782                     + "→ リダイレクト [[Nothing Page]]\r\n"
783                     + "→ 翻訳元として指定された記事は存在しません。記事名を確認してください。\r\n")
784                     .Replace("http://en.wikipedia.org", from.Location),
785                     translator.Log);
786             }
787         }
788         #endregion
789     }
790 }