1 // ================================================================================================
3 // MediaWikiのテストクラスソース。</summary>
5 // <copyright file="MediaWikiTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Websites
14 using System.Collections.Generic;
16 using System.Reflection;
19 using System.Xml.Serialization;
20 using Honememo.Models;
21 using Honememo.Utilities;
22 using Honememo.Wptscs.Models;
23 using NUnit.Framework;
26 /// MediaWikiのテストクラスです。
29 public class MediaWikiTest
34 /// テストデータが格納されているフォルダパス。
36 private static readonly string testDir = "Data\\MediaWiki";
43 /// テスト用の値を設定したMediaWikiオブジェクトを返す。
45 /// <param name="language">言語コード。</param>
46 /// <returns>テスト用の値を設定したオブジェクト。</returns>
47 public MediaWiki GetTestServer(string language)
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";
65 /// コンストラクタ(MediaWiki全般)テストケース。
68 public void TestConstructorLanguageLocation()
70 MediaWiki site = new MediaWiki(new Language("en"), "test");
71 Assert.AreEqual("en", site.Language.Code);
72 Assert.AreEqual("test", site.Location);
76 /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。
79 [ExpectedException(typeof(ArgumentNullException))]
80 public void TestConstructorLanguageLocationByLanguageNull()
82 MediaWiki site = new MediaWiki(null, "test");
86 /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。
89 [ExpectedException(typeof(ArgumentNullException))]
90 public void TestConstructorLanguageLocationByLocationNull()
92 MediaWiki site = new MediaWiki(new Language("en"), null);
96 /// コンストラクタ(Wikipedia用)テストケース。
99 public void TestConstructorLanguage()
101 MediaWiki site = new MediaWiki(new Language("en"));
102 Assert.AreEqual("en", site.Language.Code);
103 Assert.AreEqual("http://en.wikipedia.org", site.Location);
107 /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。
110 [ExpectedException(typeof(ArgumentNullException))]
111 public void TestConstructorLanguageByLanguageNull()
113 MediaWiki site = new MediaWiki(null);
118 #region 設定ファイルに初期値を持つプロパティテストケース
121 /// MetaApiプロパティテストケース。
124 public void TestMetaApi()
126 MediaWiki site = new MediaWiki(new Language("ja"));
128 // デフォルトでは設定ファイルの値が返される
129 Assert.AreEqual("/w/api.php?format=xml&action=query&meta=siteinfo&siprop=namespaces|namespacealiases|interwikimap", site.MetaApi);
132 site.MetaApi = "test";
133 Assert.AreEqual("test", site.MetaApi);
135 // 空または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);
143 /// ExportPathプロパティテストケース。
146 public void TestExportPath()
148 MediaWiki site = new MediaWiki(new Language("ja"));
150 // デフォルトでは設定ファイルの値が返される
151 Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
154 site.ExportPath = "test";
155 Assert.AreEqual("test", site.ExportPath);
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);
165 /// Redirectプロパティテストケース。
168 public void TestRedirect()
170 MediaWiki site = new MediaWiki(new Language("ja"));
172 // デフォルトでは設定ファイルの値が返される
173 Assert.AreEqual("#REDIRECT", site.Redirect);
176 site.Redirect = "test";
177 Assert.AreEqual("test", site.Redirect);
179 // 空またはnullの場合、再び設定ファイルの値が入る
180 site.Redirect = null;
181 Assert.AreEqual("#REDIRECT", site.Redirect);
182 site.Redirect = String.Empty;
183 Assert.AreEqual("#REDIRECT", site.Redirect);
187 /// TemplateNamespaceプロパティテストケース。
190 public void TestTemplateNamespace()
192 MediaWiki site = new MediaWiki(new Language("ja"));
194 // デフォルトでは設定ファイルの値が返される
195 Assert.AreEqual(10, site.TemplateNamespace);
198 site.TemplateNamespace = -1;
199 Assert.AreEqual(-1, site.TemplateNamespace);
203 /// CategoryNamespaceプロパティテストケース。
206 public void TestCategoryNamespace()
208 MediaWiki site = new MediaWiki(new Language("ja"));
210 // デフォルトでは設定ファイルの値が返される
211 Assert.AreEqual(14, site.CategoryNamespace);
214 site.CategoryNamespace = -1;
215 Assert.AreEqual(-1, site.CategoryNamespace);
219 /// FileNamespaceプロパティテストケース。
222 public void TestFileNamespace()
224 MediaWiki site = new MediaWiki(new Language("ja"));
226 // デフォルトでは設定ファイルの値が返される
227 Assert.AreEqual(6, site.FileNamespace);
230 site.FileNamespace = -1;
231 Assert.AreEqual(-1, site.FileNamespace);
235 /// MagicWordsプロパティテストケース。
238 public void TestMagicWords()
240 MediaWiki site = new MediaWiki(new Language("ja"));
242 // デフォルトでは設定ファイルの値が返される
243 Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
246 site.MagicWords = new HashSet<string>();
247 Assert.AreEqual(0, site.MagicWords.Count);
249 // nullの場合、再び設定ファイルの値が入る
250 site.MagicWords = null;
251 Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
256 #region サーバーから値を取得するプロパティテストケース
259 /// Namespacesプロパティテストケース。
262 public void TestNamespaces()
264 MediaWiki site = this.GetTestServer("en");
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"));
275 /// InterwikiPrefixsプロパティテストケース。
278 public void TestInterwikiPrefixs()
280 MediaWiki site = this.GetTestServer("en");
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"));
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"));
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"));
306 #region それ以外のプロパティテストケース
309 /// DocumentationTemplatesプロパティテストケース。
312 public void TestDocumentationTemplates()
314 MediaWiki site = new MediaWiki(new Language("ja"));
317 Assert.IsNotNull(site.DocumentationTemplates);
318 Assert.AreEqual(0, site.DocumentationTemplates.Count);
321 site.DocumentationTemplates.Add("Template:Documentation");
322 Assert.AreEqual(1, site.DocumentationTemplates.Count);
323 Assert.AreEqual("Template:Documentation", site.DocumentationTemplates[0]);
327 /// DocumentationTemplateDefaultPageプロパティテストケース。
330 public void TestDocumentationTemplateDefaultPage()
332 MediaWiki site = new MediaWiki(new Language("ja"));
335 Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
338 site.DocumentationTemplateDefaultPage = "/doc";
339 Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);
340 site.DocumentationTemplateDefaultPage = null;
341 Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
345 /// LinkInterwikiFormatプロパティテストケース。
348 public void TestLinkInterwikiFormat()
350 MediaWiki site = new MediaWiki(new Language("ja"));
353 Assert.IsNullOrEmpty(site.LinkInterwikiFormat);
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);
363 /// LangFormatプロパティテストケース。
366 public void TestLangFormat()
368 MediaWiki site = new MediaWiki(new Language("ja"));
371 Assert.IsNullOrEmpty(site.LangFormat);
374 site.LangFormat = "{{Lang|$1|$2}}";
375 Assert.AreEqual("{{Lang|$1|$2}}", site.LangFormat);
376 site.LangFormat = null;
377 Assert.IsNullOrEmpty(site.LangFormat);
385 /// GetPageメソッドテストケース。
388 public void TestGetPage()
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);
400 /// IsMagicWordメソッドテストケース。
403 public void TestIsMagicWord()
405 MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
406 site.MagicWords = new HashSet<string>();
409 Assert.IsFalse(site.IsMagicWord("CURRENTYEAR"));
410 Assert.IsFalse(site.IsMagicWord("ns:1"));
413 site.MagicWords.Add("CURRENTYEAR");
414 Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
415 Assert.IsFalse(site.IsMagicWord("currentyear"));
416 Assert.IsFalse(site.IsMagicWord("ns:1"));
418 // コロンが入るものは、その前の部分までで判定
419 site.MagicWords.Add("ns");
420 Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
421 Assert.IsTrue(site.IsMagicWord("ns:1"));
425 /// IsInterwikiメソッドテストケース。
428 public void TestIsInterwiki()
430 MediaWiki site = this.GetTestServer("en");
431 site.InterwikiPrefixs = new IgnoreCaseSet();
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語版記事"));
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語版記事"));
449 // 名前空間名と被るときはそちらが優先、ウィキ間リンクとは判定されない
450 site.InterwikiPrefixs.Add("File");
451 Assert.IsFalse(site.IsInterwiki("File:zzz語版記事"));
455 /// IsNamespaceメソッドテストケース。
458 public void TestIsNamespace()
460 MediaWiki site = this.GetTestServer("en");
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"));
470 /// FormatLinkInterwikiメソッドテストケース。
473 public void TestFormatLinkInterwiki()
475 MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
477 // LinkInterwikiFormatが空の場合、nullが返る
478 site.LinkInterwikiFormat = null;
479 Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
480 site.LinkInterwikiFormat = String.Empty;
481 Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
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("記事名", "言語", "他言語版記事名", "表示名"));
494 site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
495 Assert.AreEqual("{{仮リンク||||label=}}", site.FormatLinkInterwiki(null, null, null, null));
499 /// FormatLangメソッドテストケース。
502 public void TestFormatLang()
504 MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
506 // LangFormatが空の場合、nullが返る
507 site.LangFormat = null;
508 Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
509 site.LangFormat = String.Empty;
510 Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
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", "日本語テキスト"));
519 site.LangFormat = "{{Lang|$1|$2}}";
520 Assert.AreEqual("{{Lang||}}", site.FormatLang(null, null));
525 #region XMLシリアライズ用メソッドテストケース
528 /// XMLデシリアライズテストケース。
531 public void TestReadXml()
534 using (XmlReader r = XmlReader.Create(
535 new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
536 + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))
538 site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
541 Assert.IsNotNull(site);
542 Assert.AreEqual("http://ja.wikipedia.org", site.Location);
543 Assert.AreEqual("ja", site.Language.Code);
545 //// TODO: プロパティに値が設定されたパターンを追加すべき
546 //// TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき
553 public void TestWriteXml()
555 Language lang = new Language("ja");
556 MediaWiki site = new MediaWiki(lang);
557 XmlWriterSettings settings = new XmlWriterSettings();
558 settings.OmitXmlDeclaration = true;
560 StringBuilder b = new StringBuilder();
561 using (XmlWriter w = XmlWriter.Create(b, settings))
563 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
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());
569 //// TODO: プロパティに値が設定されたパターンを追加すべき