OSDN Git Service

自動テスト用プロジェクトにもStyleCopを適用してその指摘箇所を修正
[wptscs/wpts.git] / WptscsTest / Websites / MediaWikiTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Websites
12 {
13     using System;
14     using System.Collections.Generic;
15     using System.IO;
16     using System.Reflection;
17     using System.Text;
18     using System.Xml;
19     using System.Xml.Serialization;
20     using Honememo.Models;
21     using Honememo.Utilities;
22     using Honememo.Wptscs.Models;
23     using NUnit.Framework;
24
25     /// <summary>
26     /// MediaWikiのテストクラスです。
27     /// </summary>
28     [TestFixture]
29     public class MediaWikiTest
30     {
31         #region 定数
32
33         /// <summary>
34         /// テストデータが格納されているフォルダパス。
35         /// </summary>
36         private static readonly string testDir = "Data\\MediaWiki";
37
38         #endregion
39
40         #region テスト支援メソッド
41
42         /// <summary>
43         /// テスト用の値を設定したMediaWikiオブジェクトを返す。
44         /// </summary>
45         /// <param name="language">言語コード。</param>
46         /// <returns>テスト用の値を設定したオブジェクト。</returns>
47         public MediaWiki GetTestServer(string language)
48         {
49             // ※ 下記URL生成時は、きちんとパス区切り文字を入れてやら無いとフォルダが認識されない。
50             //    また、httpで取得した場合とfileで取得した場合では先頭の大文字小文字が異なることが
51             //    あるため、それについては随時期待値を調整して対処。
52             UriBuilder b = new UriBuilder("file", String.Empty);
53             b.Path = Path.GetFullPath(testDir) + "\\";
54             MediaWiki server = new MediaWiki(new Language(language), new Uri(b.Uri, language + "/").ToString());
55             server.ExportPath = "$1.xml";
56             server.MetaApi = "_api.xml";
57             return server;
58         }
59
60         #endregion
61
62         #region コンストラクタテストケース
63
64         /// <summary>
65         /// コンストラクタ(MediaWiki全般)テストケース。
66         /// </summary>
67         [Test]
68         public void TestConstructorLanguageLocation()
69         {
70             MediaWiki site = new MediaWiki(new Language("en"), "test");
71             Assert.AreEqual("en", site.Language.Code);
72             Assert.AreEqual("test", site.Location);
73         }
74
75         /// <summary>
76         /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。
77         /// </summary>
78         [Test]
79         [ExpectedException(typeof(ArgumentNullException))]
80         public void TestConstructorLanguageLocationByLanguageNull()
81         {
82             MediaWiki site = new MediaWiki(null, "test");
83         }
84
85         /// <summary>
86         /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。
87         /// </summary>
88         [Test]
89         [ExpectedException(typeof(ArgumentNullException))]
90         public void TestConstructorLanguageLocationByLocationNull()
91         {
92             MediaWiki site = new MediaWiki(new Language("en"), null);
93         }
94
95         /// <summary>
96         /// コンストラクタ(Wikipedia用)テストケース。
97         /// </summary>
98         [Test]
99         public void TestConstructorLanguage()
100         {
101             MediaWiki site = new MediaWiki(new Language("en"));
102             Assert.AreEqual("en", site.Language.Code);
103             Assert.AreEqual("http://en.wikipedia.org", site.Location);
104         }
105
106         /// <summary>
107         /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。
108         /// </summary>
109         [Test]
110         [ExpectedException(typeof(ArgumentNullException))]
111         public void TestConstructorLanguageByLanguageNull()
112         {
113             MediaWiki site = new MediaWiki(null);
114         }
115
116         #endregion
117
118         #region 設定ファイルに初期値を持つプロパティテストケース
119
120         /// <summary>
121         /// MetaApiプロパティテストケース。
122         /// </summary>
123         [Test]
124         public void TestMetaApi()
125         {
126             MediaWiki site = new MediaWiki(new Language("ja"));
127
128             // デフォルトでは設定ファイルの値が返される
129             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
130
131             // 値を設定するとその値が返る
132             site.MetaApi = "test";
133             Assert.AreEqual("test", site.MetaApi);
134
135             // 空またはnullの場合、再び設定ファイルの値が入る
136             site.MetaApi = null;
137             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
138             site.MetaApi = String.Empty;
139             Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
140         }
141
142         /// <summary>
143         /// ExportPathプロパティテストケース。
144         /// </summary>
145         [Test]
146         public void TestExportPath()
147         {
148             MediaWiki site = new MediaWiki(new Language("ja"));
149
150             // デフォルトでは設定ファイルの値が返される
151             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
152
153             // 値を設定するとその値が返る
154             site.ExportPath = "test";
155             Assert.AreEqual("test", site.ExportPath);
156
157             // 空またはnullの場合、再び設定ファイルの値が入る
158             site.ExportPath = null;
159             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
160             site.ExportPath = String.Empty;
161             Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
162         }
163
164         /// <summary>
165         /// Redirectプロパティテストケース。
166         /// </summary>
167         [Test]
168         public void TestRedirect()
169         {
170             MediaWiki site = new MediaWiki(new Language("ja"));
171
172             // デフォルトでは設定ファイルの値が返される
173             Assert.AreEqual("#REDIRECT", site.Redirect);
174
175             // 値を設定するとその値が返る
176             site.Redirect = "test";
177             Assert.AreEqual("test", site.Redirect);
178
179             // 空またはnullの場合、再び設定ファイルの値が入る
180             site.Redirect = null;
181             Assert.AreEqual("#REDIRECT", site.Redirect);
182             site.Redirect = String.Empty;
183             Assert.AreEqual("#REDIRECT", site.Redirect);
184         }
185
186         /// <summary>
187         /// TemplateNamespaceプロパティテストケース。
188         /// </summary>
189         [Test]
190         public void TestTemplateNamespace()
191         {
192             MediaWiki site = new MediaWiki(new Language("ja"));
193
194             // デフォルトでは設定ファイルの値が返される
195             Assert.AreEqual(10, site.TemplateNamespace);
196
197             // 値を設定するとその値が返る
198             site.TemplateNamespace = -1;
199             Assert.AreEqual(-1, site.TemplateNamespace);
200         }
201
202         /// <summary>
203         /// CategoryNamespaceプロパティテストケース。
204         /// </summary>
205         [Test]
206         public void TestCategoryNamespace()
207         {
208             MediaWiki site = new MediaWiki(new Language("ja"));
209
210             // デフォルトでは設定ファイルの値が返される
211             Assert.AreEqual(14, site.CategoryNamespace);
212
213             // 値を設定するとその値が返る
214             site.CategoryNamespace = -1;
215             Assert.AreEqual(-1, site.CategoryNamespace);
216         }
217
218         /// <summary>
219         /// FileNamespaceプロパティテストケース。
220         /// </summary>
221         [Test]
222         public void TestFileNamespace()
223         {
224             MediaWiki site = new MediaWiki(new Language("ja"));
225
226             // デフォルトでは設定ファイルの値が返される
227             Assert.AreEqual(6, site.FileNamespace);
228
229             // 値を設定するとその値が返る
230             site.FileNamespace = -1;
231             Assert.AreEqual(-1, site.FileNamespace);
232         }
233
234         /// <summary>
235         /// MagicWordsプロパティテストケース。
236         /// </summary>
237         [Test]
238         public void TestMagicWords()
239         {
240             MediaWiki site = new MediaWiki(new Language("ja"));
241
242             // デフォルトでは設定ファイルの値が返される
243             Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
244
245             // 値を設定するとその値が返る
246             site.MagicWords = new HashSet<string>();
247             Assert.AreEqual(0, site.MagicWords.Count);
248
249             // nullの場合、再び設定ファイルの値が入る
250             site.MagicWords = null;
251             Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
252         }
253
254         #endregion
255
256         #region サーバーから値を取得するプロパティテストケース
257
258         /// <summary>
259         /// Namespacesプロパティテストケース。
260         /// </summary>
261         [Test]
262         public void TestNamespaces()
263         {
264             MediaWiki site = this.GetTestServer("en");
265
266             // サーバーからダウンロードした値が返される
267             ISet<string> names = site.Namespaces[6];
268             Assert.IsNotNull(site.Namespaces);
269             Assert.IsTrue(site.Namespaces.Count > 0);
270             Assert.IsTrue(names.Contains("File"));
271             Assert.IsTrue(names.Contains("Image"));
272         }
273
274         /// <summary>
275         /// InterwikiPrefixsプロパティテストケース。
276         /// </summary>
277         [Test]
278         public void TestInterwikiPrefixs()
279         {
280             MediaWiki site = this.GetTestServer("en");
281
282             // デフォルトではサーバーからダウンロードした値+設定ファイルの値が返される
283             Assert.IsNotNull(site.InterwikiPrefixs);
284             Assert.IsTrue(site.InterwikiPrefixs.Count > 0);
285             Assert.IsTrue(site.InterwikiPrefixs.Contains("ja"));
286             Assert.IsTrue(site.InterwikiPrefixs.Contains("w"));
287             Assert.IsTrue(site.InterwikiPrefixs.Contains("wikipedia"));
288             Assert.IsTrue(site.InterwikiPrefixs.Contains("commons"));
289
290             // 値を設定すると設定ファイルの値の代わりにその値が返る
291             IgnoreCaseSet prefixs = new IgnoreCaseSet();
292             prefixs.Add("testtesttest");
293             site.InterwikiPrefixs = prefixs;
294             Assert.IsFalse(site.InterwikiPrefixs.Contains("wikipedia"));
295             Assert.IsTrue(site.InterwikiPrefixs.Contains("testtesttest"));
296
297             // 空の場合、再び設定ファイルの値が入る
298             site.InterwikiPrefixs = null;
299             Assert.AreNotSame(prefixs, site.InterwikiPrefixs);
300             Assert.IsTrue(site.InterwikiPrefixs.Contains("wikipedia"));
301             Assert.IsFalse(site.InterwikiPrefixs.Contains("testtesttest"));
302         }
303
304         #endregion
305
306         #region それ以外のプロパティテストケース
307
308         /// <summary>
309         /// DocumentationTemplatesプロパティテストケース。
310         /// </summary>
311         [Test]
312         public void TestDocumentationTemplates()
313         {
314             MediaWiki site = new MediaWiki(new Language("ja"));
315
316             // デフォルトでは空
317             Assert.IsNotNull(site.DocumentationTemplates);
318             Assert.AreEqual(0, site.DocumentationTemplates.Count);
319
320             // 値を追加
321             site.DocumentationTemplates.Add("Template:Documentation");
322             Assert.AreEqual(1, site.DocumentationTemplates.Count);
323             Assert.AreEqual("Template:Documentation", site.DocumentationTemplates[0]);
324         }
325
326         /// <summary>
327         /// DocumentationTemplateDefaultPageプロパティテストケース。
328         /// </summary>
329         [Test]
330         public void TestDocumentationTemplateDefaultPage()
331         {
332             MediaWiki site = new MediaWiki(new Language("ja"));
333
334             // デフォルトでは空
335             Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
336
337             // 値を設定するとその値が返る
338             site.DocumentationTemplateDefaultPage = "/doc";
339             Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);
340             site.DocumentationTemplateDefaultPage = null;
341             Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
342         }
343
344         /// <summary>
345         /// LinkInterwikiFormatプロパティテストケース。
346         /// </summary>
347         [Test]
348         public void TestLinkInterwikiFormat()
349         {
350             MediaWiki site = new MediaWiki(new Language("ja"));
351
352             // デフォルトでは空
353             Assert.IsNullOrEmpty(site.LinkInterwikiFormat);
354
355             // 値を設定するとその値が返る
356             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
357             Assert.AreEqual("{{仮リンク|$1|$2|$3|label=$4}}", site.LinkInterwikiFormat);
358             site.LinkInterwikiFormat = null;
359             Assert.IsNullOrEmpty(site.LinkInterwikiFormat);
360         }
361
362         /// <summary>
363         /// LangFormatプロパティテストケース。
364         /// </summary>
365         [Test]
366         public void TestLangFormat()
367         {
368             MediaWiki site = new MediaWiki(new Language("ja"));
369
370             // デフォルトでは空
371             Assert.IsNullOrEmpty(site.LangFormat);
372
373             // 値を設定するとその値が返る
374             site.LangFormat = "{{Lang|$1|$2}}";
375             Assert.AreEqual("{{Lang|$1|$2}}", site.LangFormat);
376             site.LangFormat = null;
377             Assert.IsNullOrEmpty(site.LangFormat);
378         }
379
380         #endregion
381
382         #region 公開メソッドテストケース
383
384         /// <summary>
385         /// GetPageメソッドテストケース。
386         /// </summary>
387         [Test]
388         public void TestGetPage()
389         {
390             MediaWiki site = this.GetTestServer("en");
391             Page page = site.GetPage("example");
392             Assert.IsInstanceOf(typeof(MediaWikiPage), page);
393             Assert.AreEqual("Example", page.Title);
394             Assert.AreEqual(DateTime.Parse("2010/07/13 09:49:18"), page.Timestamp);
395             Assert.IsNotEmpty(page.Text);
396             Assert.AreEqual(site, page.Website);
397         }
398
399         /// <summary>
400         /// IsMagicWordメソッドテストケース。
401         /// </summary>
402         [Test]
403         public void TestIsMagicWord()
404         {
405             MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
406             site.MagicWords = new HashSet<string>();
407
408             // 値が設定されていなければ一致しない
409             Assert.IsFalse(site.IsMagicWord("CURRENTYEAR"));
410             Assert.IsFalse(site.IsMagicWord("ns:1"));
411
412             // 値が一致、大文字小文字は区別する
413             site.MagicWords.Add("CURRENTYEAR");
414             Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
415             Assert.IsFalse(site.IsMagicWord("currentyear"));
416             Assert.IsFalse(site.IsMagicWord("ns:1"));
417
418             // コロンが入るものは、その前の部分までで判定
419             site.MagicWords.Add("ns");
420             Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
421             Assert.IsTrue(site.IsMagicWord("ns:1"));
422         }
423
424         /// <summary>
425         /// IsInterwikiメソッドテストケース。
426         /// </summary>
427         [Test]
428         public void TestIsInterwiki()
429         {
430             MediaWiki site = this.GetTestServer("en");
431             site.InterwikiPrefixs = new IgnoreCaseSet();
432
433             // 値が存在しなければ一致しない
434             Assert.IsFalse(site.IsInterwiki("commons:test"));
435             Assert.IsFalse(site.IsInterwiki("commons:"));
436             Assert.IsFalse(site.IsInterwiki("common:"));
437             Assert.IsFalse(site.IsInterwiki("zzz:zzz語版記事"));
438             Assert.IsFalse(site.IsInterwiki("ZZZ:zzz語版記事"));
439
440             // 値が設定されていれば、前方一致で一致する、大文字小文字は区別しない
441             site.InterwikiPrefixs.Add("commons");
442             site.InterwikiPrefixs.Add("zzz");
443             Assert.IsTrue(site.IsInterwiki("commons:test"));
444             Assert.IsTrue(site.IsInterwiki("commons:"));
445             Assert.IsFalse(site.IsInterwiki("common:"));
446             Assert.IsTrue(site.IsInterwiki("zzz:zzz語版記事"));
447             Assert.IsTrue(site.IsInterwiki("ZZZ:zzz語版記事"));
448
449             // 名前空間名と被るときはそちらが優先、ウィキ間リンクとは判定されない
450             site.InterwikiPrefixs.Add("File");
451             Assert.IsFalse(site.IsInterwiki("File:zzz語版記事"));
452         }
453
454         /// <summary>
455         /// IsNamespaceメソッドテストケース。
456         /// </summary>
457         [Test]
458         public void TestIsNamespace()
459         {
460             MediaWiki site = this.GetTestServer("en");
461
462             // 値が設定されていれば、前方一致で一致する、大文字小文字は区別しない
463             Assert.IsFalse(site.IsNamespace("page"));
464             Assert.IsTrue(site.IsNamespace("File:image.png"));
465             Assert.IsTrue(site.IsNamespace("file:image.png"));
466             Assert.IsFalse(site.IsNamespace("画像:image.png"));
467         }
468
469         /// <summary>
470         /// FormatLinkInterwikiメソッドテストケース。
471         /// </summary>
472         [Test]
473         public void TestFormatLinkInterwiki()
474         {
475             MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
476
477             // LinkInterwikiFormatが空の場合、nullが返る
478             site.LinkInterwikiFormat = null;
479             Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
480             site.LinkInterwikiFormat = String.Empty;
481             Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
482
483             // 値が設定されている場合、パラメータを埋め込んで書式化される
484             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
485             Assert.AreEqual("{{仮リンク|記事名1|言語1|他言語版記事名1|label=表示名1}}", site.FormatLinkInterwiki("記事名1", "言語1", "他言語版記事名1", "表示名1"));
486             site.LinkInterwikiFormat = "{{日本語版にない記事リンク|$1|$2|$3}}";
487             Assert.AreEqual("{{日本語版にない記事リンク|記事名2|言語2|他言語版記事名2}}", site.FormatLinkInterwiki("記事名2", "言語2", "他言語版記事名2", "表示名2"));
488             site.LinkInterwikiFormat = "[[:$2:$3|$4]]";
489             Assert.AreEqual("[[:言語3:他言語版記事名3|表示名3]]", site.FormatLinkInterwiki("記事名3", "言語3", "他言語版記事名3", "表示名3"));
490             site.LinkInterwikiFormat = "xxx";
491             Assert.AreEqual("xxx", site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
492
493             // 値がnull等でも特に制限はない
494             site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
495             Assert.AreEqual("{{仮リンク||||label=}}", site.FormatLinkInterwiki(null, null, null, null));
496         }
497
498         /// <summary>
499         /// FormatLangメソッドテストケース。
500         /// </summary>
501         [Test]
502         public void TestFormatLang()
503         {
504             MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
505
506             // LangFormatが空の場合、nullが返る
507             site.LangFormat = null;
508             Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
509             site.LangFormat = String.Empty;
510             Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
511
512             // 値が設定されている場合、パラメータを埋め込んで書式化される
513             site.LangFormat = "{{Lang|$1|$2}}";
514             Assert.AreEqual("{{Lang|ja|日本語テキスト}}", site.FormatLang("ja", "日本語テキスト"));
515             site.LangFormat = "xxx";
516             Assert.AreEqual("xxx", site.FormatLang("ja", "日本語テキスト"));
517
518             // 値がnull等でも特に制限はない
519             site.LangFormat = "{{Lang|$1|$2}}";
520             Assert.AreEqual("{{Lang||}}", site.FormatLang(null, null));
521         }
522
523         #endregion
524
525         #region XMLシリアライズ用メソッドテストケース
526
527         /// <summary>
528         /// XMLデシリアライズテストケース。
529         /// </summary>
530         [Test]
531         public void TestReadXml()
532         {
533             MediaWiki site;
534             using (XmlReader r = XmlReader.Create(
535                 new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
536                     + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))
537             {
538                 site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
539             }
540
541             Assert.IsNotNull(site);
542             Assert.AreEqual("http://ja.wikipedia.org", site.Location);
543             Assert.AreEqual("ja", site.Language.Code);
544
545             //// TODO: プロパティに値が設定されたパターンを追加すべき
546             //// TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき
547         }
548
549         /// <summary>
550         /// XMLシリアライズテストケース。
551         /// </summary>
552         [Test]
553         public void TestWriteXml()
554         {
555             Language lang = new Language("ja");
556             MediaWiki site = new MediaWiki(lang);
557             XmlWriterSettings settings = new XmlWriterSettings();
558             settings.OmitXmlDeclaration = true;
559
560             StringBuilder b = new StringBuilder();
561             using (XmlWriter w = XmlWriter.Create(b, settings))
562             {
563                 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
564             }
565
566             // プロパティはデフォルト値の場合出力しないという動作あり
567             Assert.AreEqual("<MediaWiki><Location>http://ja.wikipedia.org</Location><Language Code=\"ja\"><Names /><Bracket /></Language><MetaApi /><ExportPath /><Redirect /><TemplateNamespace /><CategoryNamespace /><FileNamespace /><MagicWords /><InterwikiPrefixs /><DocumentationTemplates /><LinkInterwikiFormat /><LangFormat /></MediaWiki>", b.ToString());
568
569             //// TODO: プロパティに値が設定されたパターンを追加すべき
570         }
571
572         #endregion
573     }
574 }