OSDN Git Service

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