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 NUnit.Framework;
21 using Honememo.Utilities;
22 using Honememo.Wptscs.Models;
25 /// MediaWikiのテストクラスです。
28 public class MediaWikiTest
33 /// テストデータが格納されているフォルダパス。
35 private static readonly string testDir = "Data\\MediaWiki";
42 /// テスト用の値を設定したMediaWikiオブジェクトを返す。
44 public MediaWiki GetTestServer(string language)
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";
62 /// コンストラクタ(MediaWiki全般)テストケース。
65 public void TestConstructorLanguageLocation()
67 MediaWiki site = new MediaWiki(new Language("en"), "test");
68 Assert.AreEqual("en", site.Language.Code);
69 Assert.AreEqual("test", site.Location);
73 /// コンストラクタ(MediaWiki全般)テストケース(languageがnull)。
76 [ExpectedException(typeof(ArgumentNullException))]
77 public void TestConstructorLanguageLocationByLanguageNull()
79 MediaWiki site = new MediaWiki(null, "test");
83 /// コンストラクタ(MediaWiki全般)テストケース(locationがnull)。
86 [ExpectedException(typeof(ArgumentNullException))]
87 public void TestConstructorLanguageLocationByLocationNull()
89 MediaWiki site = new MediaWiki(new Language("en"), null);
93 /// コンストラクタ(Wikipedia用)テストケース。
96 public void TestConstructorLanguage()
98 MediaWiki site = new MediaWiki(new Language("en"));
99 Assert.AreEqual("en", site.Language.Code);
100 Assert.AreEqual("http://en.wikipedia.org", site.Location);
104 /// コンストラクタ(Wikipedia用)テストケース(languageがnull)。
107 [ExpectedException(typeof(ArgumentNullException))]
108 public void TestConstructorLanguageByLanguageNull()
110 MediaWiki site = new MediaWiki(null);
115 #region 設定ファイルに初期値を持つプロパティテストケース
118 /// NamespacePathプロパティテストケース。
121 public void TestNamespacePath()
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);
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);
137 /// ExportPathプロパティテストケース。
140 public void TestExportPath()
142 MediaWiki site = new MediaWiki(new Language("ja"));
143 // デフォルトでは設定ファイルの値が返される
144 Assert.AreEqual("/wiki/Special:Export/$1", site.ExportPath);
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);
156 /// Redirectプロパティテストケース。
159 public void TestRedirect()
161 MediaWiki site = new MediaWiki(new Language("ja"));
162 // デフォルトでは設定ファイルの値が返される
163 Assert.AreEqual("#REDIRECT", site.Redirect);
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);
175 /// TemplateNamespaceプロパティテストケース。
178 public void TestTemplateNamespace()
180 MediaWiki site = new MediaWiki(new Language("ja"));
181 // デフォルトでは設定ファイルの値が返される
182 Assert.AreEqual(10, site.TemplateNamespace);
184 site.TemplateNamespace = -1;
185 Assert.AreEqual(-1, site.TemplateNamespace);
189 /// CategoryNamespaceプロパティテストケース。
192 public void TestCategoryNamespace()
194 MediaWiki site = new MediaWiki(new Language("ja"));
195 // デフォルトでは設定ファイルの値が返される
196 Assert.AreEqual(14, site.CategoryNamespace);
198 site.CategoryNamespace = -1;
199 Assert.AreEqual(-1, site.CategoryNamespace);
203 /// FileNamespaceプロパティテストケース。
206 public void TestFileNamespace()
208 MediaWiki site = new MediaWiki(new Language("ja"));
209 // デフォルトでは設定ファイルの値が返される
210 Assert.AreEqual(6, site.FileNamespace);
212 site.FileNamespace = -1;
213 Assert.AreEqual(-1, site.FileNamespace);
217 /// MagicWordsプロパティテストケース。
220 public void TestMagicWords()
222 MediaWiki site = new MediaWiki(new Language("ja"));
223 // デフォルトでは設定ファイルの値が返される
224 Assert.IsTrue(site.MagicWords.Contains("SERVERNAME"));
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"));
235 #region それ以外のプロパティテストケース
238 /// Namespacesプロパティテストケース。
241 public void TestNamespaces()
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]);
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]);
260 /// Namespacesプロパティテストケース(null)。
263 [ExpectedException(typeof(ArgumentNullException))]
264 public void TestNamespacesNull()
266 MediaWiki site = new MediaWiki(new Language("ja"));
267 site.Namespaces = null;
271 /// DocumentationTemplatesプロパティテストケース。
274 public void TestDocumentationTemplates()
276 MediaWiki site = new MediaWiki(new Language("ja"));
278 Assert.IsNotNull(site.DocumentationTemplates);
279 Assert.AreEqual(0, site.DocumentationTemplates.Count);
281 site.DocumentationTemplates.Add("Template:Documentation");
282 Assert.AreEqual(1, site.DocumentationTemplates.Count);
283 Assert.AreEqual("Template:Documentation", site.DocumentationTemplates[0]);
287 /// DocumentationTemplateDefaultPageプロパティテストケース。
290 public void TestDocumentationTemplateDefaultPage()
292 MediaWiki site = new MediaWiki(new Language("ja"));
294 Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
296 site.DocumentationTemplateDefaultPage = "/doc";
297 Assert.AreEqual("/doc", site.DocumentationTemplateDefaultPage);
298 site.DocumentationTemplateDefaultPage = null;
299 Assert.IsNullOrEmpty(site.DocumentationTemplateDefaultPage);
303 /// LinkInterwikiFormatプロパティテストケース。
306 public void TestLinkInterwikiFormat()
308 MediaWiki site = new MediaWiki(new Language("ja"));
310 Assert.IsNullOrEmpty(site.LinkInterwikiFormat);
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);
319 /// LangFormatプロパティテストケース。
322 public void TestLangFormat()
324 MediaWiki site = new MediaWiki(new Language("ja"));
326 Assert.IsNullOrEmpty(site.LangFormat);
328 site.LangFormat = ("{{Lang|$1|$2}}");
329 Assert.AreEqual("{{Lang|$1|$2}}", site.LangFormat);
330 site.LangFormat = null;
331 Assert.IsNullOrEmpty(site.LangFormat);
339 /// GetPageメソッドテストケース。
342 public void TestGetPage()
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);
354 /// IsMagicWordメソッドテストケース。
357 public void TestIsMagicWord()
359 MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
360 site.MagicWords = new List<string>();
363 Assert.IsFalse(site.IsMagicWord("CURRENTYEAR"));
364 Assert.IsFalse(site.IsMagicWord("ns:1"));
367 site.MagicWords.Add("CURRENTYEAR");
368 Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
369 Assert.IsFalse(site.IsMagicWord("ns:1"));
371 // コロンが入るものは、その前の部分までで判定
372 site.MagicWords.Add("ns");
373 Assert.IsTrue(site.IsMagicWord("CURRENTYEAR"));
374 Assert.IsTrue(site.IsMagicWord("ns:1"));
378 /// FormatLinkInterwikiメソッドテストケース。
381 public void TestFormatLinkInterwiki()
383 MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
385 // LinkInterwikiFormatが空の場合、nullが返る
386 site.LinkInterwikiFormat = null;
387 Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
388 site.LinkInterwikiFormat = String.Empty;
389 Assert.IsNull(site.FormatLinkInterwiki("記事名", "言語", "他言語版記事名", "表示名"));
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("記事名", "言語", "他言語版記事名", "表示名"));
402 site.LinkInterwikiFormat = "{{仮リンク|$1|$2|$3|label=$4}}";
403 Assert.AreEqual("{{仮リンク||||label=}}", site.FormatLinkInterwiki(null, null, null, null));
407 /// FormatLangメソッドテストケース。
410 public void TestFormatLang()
412 MediaWiki site = new MediaWiki(new Language("en"), "http://example.com");
414 // LangFormatが空の場合、nullが返る
415 site.LangFormat = null;
416 Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
417 site.LangFormat = String.Empty;
418 Assert.IsNull(site.FormatLang("ja", "日本語テキスト"));
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", "日本語テキスト"));
427 site.LangFormat = "{{Lang|$1|$2}}";
428 Assert.AreEqual("{{Lang||}}", site.FormatLang(null, null));
433 #region XMLシリアライズ用メソッドテストケース
436 /// XMLデシリアライズテストケース。
439 public void TestReadXml()
442 using (XmlReader r = XmlReader.Create(
443 new StringReader("<MediaWiki><Location>http://ja.wikipedia.org</Location>"
444 + "<Language Code=\"ja\"><Names /></Language></MediaWiki>")))
446 site = new XmlSerializer(typeof(MediaWiki)).Deserialize(r) as MediaWiki;
449 Assert.IsNotNull(site);
450 Assert.AreEqual("http://ja.wikipedia.org", site.Location);
451 Assert.AreEqual("ja", site.Language.Code);
452 // TODO: プロパティに値が設定されたパターンを追加すべき
453 // TODO: プロパティが空の場合、きちんとデフォルト値が参照されることも確認すべき
460 public void TestWriteXml()
462 Language lang = new Language("ja");
463 MediaWiki site = new MediaWiki(lang);
464 XmlWriterSettings settings = new XmlWriterSettings();
465 settings.OmitXmlDeclaration = true;
467 StringBuilder b = new StringBuilder();
468 using (XmlWriter w = XmlWriter.Create(b, settings))
470 new XmlSerializer(typeof(MediaWiki)).Serialize(w, site);
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: プロパティに値が設定されたパターンを追加すべき