1 // ================================================================================================
3 // MediaWikiPageのテストクラスソース。</summary>
5 // <copyright file="MediaWikiPageTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Websites
14 using System.Collections.Generic;
15 using Honememo.Parsers;
16 using Honememo.Utilities;
17 using Honememo.Wptscs.Models;
18 using Honememo.Wptscs.Parsers;
19 using NUnit.Framework;
22 /// <see cref="MediaWikiPage"/>のテストクラスです。
25 class MediaWikiPageTest
33 public void TestConstructorWebsiteTitleTextTimestamp()
35 DateTime t = DateTime.Now;
36 Uri uri = new Uri("http://wikipedia.example");
37 MediaWiki s = new MediaWiki(new Language("en"));
38 MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText", t, uri);
39 Assert.AreSame(s, page.Website);
40 Assert.AreEqual("TestTitle", page.Title);
41 Assert.AreEqual("TestText", page.Text);
42 Assert.AreEqual(t, page.Timestamp);
43 Assert.AreSame(uri, page.Uri);
47 /// コンストラクタテストケース(タイムスタンプ無し)。
50 public void TestConstructorWebsiteTitleText()
52 MediaWiki s = new MediaWiki(new Language("en"));
53 MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText");
54 Assert.AreEqual(s, page.Website);
55 Assert.AreEqual("TestTitle", page.Title);
56 Assert.AreEqual("TestText", page.Text);
57 Assert.IsNull(page.Timestamp);
58 Assert.IsNull(page.Uri);
62 /// コンストラクタテストケース(本文・タイムスタンプ無し)。
65 public void TestConstructorWebsiteTitle()
67 MediaWiki s = new MediaWiki(new Language("en"));
68 MediaWikiPage page = new MediaWikiPage(s, "TestTitle");
69 Assert.AreEqual(s, page.Website);
70 Assert.AreEqual("TestTitle", page.Title);
71 Assert.IsNull(page.Text);
72 Assert.IsNull(page.Timestamp);
73 Assert.IsNull(page.Uri);
77 /// コンストラクタテストケース(ウェブサイトがnull)。
80 [ExpectedException(typeof(ArgumentNullException))]
81 public void TestConstructorWebsiteNull()
83 new MediaWikiPage(null, "TestTitle");
87 /// コンストラクタテストケース(タイトルが空)。
90 [ExpectedException(typeof(ArgumentException))]
91 public void TestConstructorTitleBlank()
93 new MediaWikiPage(new MediaWiki(new Language("en")), " ");
101 /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(正常系)。
104 public void TestRedirect()
108 site = new MockFactory().GetMediaWiki("en");
109 Assert.IsNull(new MediaWikiPage(site, "TestTitle", "[[TestLink]]").Redirect);
110 Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect);
111 Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect.ToString());
112 Assert.IsNull(new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect);
114 site = new MockFactory().GetMediaWiki("ja");
115 Assert.IsNull(new MediaWikiPage(site, "TestTitle", "[[TestLink]]").Redirect);
116 Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect);
117 Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect.ToString());
118 Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect);
119 Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect.ToString());
123 /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(Text未設定)。
126 [ExpectedException(typeof(InvalidOperationException))]
127 public void TestRedirectTextNull()
129 MediaWikiLink dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Redirect;
137 /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ)。
140 public void TestGetInterlanguage()
143 MediaWikiPage page = new MediaWikiPage(
144 new MediaWiki(new Language("en")),
146 "TestText\n [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
147 Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
148 Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
149 Assert.IsNull(page.GetInterlanguage("de"));
150 Assert.IsNull(page.GetInterlanguage("ru"));
151 Assert.IsNull(page.GetInterlanguage("zh"));
155 /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ実データ使用)。
157 [Test, Timeout(20000)]
158 public void TestGetInterlanguageDiscoveryChannel()
160 MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Discovery Channel");
161 Assert.AreEqual("[[ja:ディスカバリーチャンネル]]", page.GetInterlanguage("ja").ToString());
162 Assert.AreEqual("[[it:Discovery Channel (Italia)]]", page.GetInterlanguage("it").ToString());
163 Assert.AreEqual("[[simple:Discovery Channel]]", page.GetInterlanguage("simple").ToString());
164 Assert.AreEqual("[[ru:Discovery (телеканал)]]", page.GetInterlanguage("ru").ToString());
165 Assert.IsNull(page.GetInterlanguage("io"));
169 /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(テンプレートページ実データ使用)。
171 [Test, Timeout(20000)]
172 public void TestGetInterlanguagePlanetboxBegin()
174 MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Planetbox begin");
175 Assert.AreEqual("[[ja:Template:Planetbox begin]]", page.GetInterlanguage("ja").ToString());
176 Assert.AreEqual("[[ru:Шаблон:Planetbox begin]]", page.GetInterlanguage("ru").ToString());
177 Assert.IsNull(page.GetInterlanguage("zh"));
181 /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentation使用ページ)。
184 public void TestGetInterlanguageDocumentation()
186 // Template:Documentation を使ってるページ
187 MediaWiki site = new DummySite(new Language("en"));
188 site.DocumentationTemplates.Add("Template:Documentation");
189 site.DocumentationTemplateDefaultPage = "/doc";
190 MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");
192 Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
193 Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
194 Assert.IsNull(page.GetInterlanguage("de"));
195 Assert.IsNull(page.GetInterlanguage("ru"));
196 Assert.IsNull(page.GetInterlanguage("zh"));
200 /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentationにnoincludeで囲まれた言語間リンクが存在)。
203 public void TestGetInterlanguagePartial()
205 MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Partial");
206 Assert.AreEqual("[[ja:Template:Partial]]", page.GetInterlanguage("ja").ToString());
207 Assert.IsNull(page.GetInterlanguage("ru"));
211 /// <see cref="MediaWikiPage.IsRedirect"/>メソッドテストケース。
214 public void TestIsRedirect()
216 MediaWiki site = new MediaWiki(new Language("en"));
217 MediaWikiPage page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect]]");
218 Assert.IsTrue(page.IsRedirect());
219 Assert.AreEqual("Test Redirect", page.Redirect.Title);
221 page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
222 Assert.IsFalse(page.IsRedirect());
224 site.Redirect = "#転送";
225 page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
226 Assert.IsTrue(page.IsRedirect());
227 Assert.AreEqual("Test Redirect2", page.Redirect.Title);
229 page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
230 Assert.IsTrue(page.IsRedirect());
231 Assert.AreEqual("Test Redirect3", page.Redirect.Title);
233 page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
234 Assert.IsTrue(page.IsRedirect());
235 Assert.AreEqual("Test Redirect4", page.Redirect.Title);
239 /// <see cref="MediaWikiPage.Normalize"/>メソッドテストケース。
242 public void TestNormalize()
244 MediaWiki site = new MediaWiki(new Language("en"));
245 MediaWikiPage page = new MediaWikiPage(site, "A/b/c");
248 Assert.AreEqual("Normal page", page.Normalize(new MediaWikiLink("Normal page")));
249 Assert.AreEqual("A/b/c/s", page.Normalize(new MediaWikiLink("/s")));
250 Assert.AreEqual("A/b/c/s", page.Normalize(new MediaWikiLink("/s/")));
251 Assert.AreEqual("A/b", page.Normalize(new MediaWikiLink("../")));
252 Assert.AreEqual("A", page.Normalize(new MediaWikiLink("../../")));
253 Assert.AreEqual("A/b/s", page.Normalize(new MediaWikiLink("../s")));
254 Assert.AreEqual("A/b/s", page.Normalize(new MediaWikiLink("../s/")));
255 Assert.AreEqual("A/s", page.Normalize(new MediaWikiLink("../../s")));
256 Assert.AreEqual("A/s", page.Normalize(new MediaWikiLink("../../s/")));
259 Assert.AreEqual("Template:Template page", page.Normalize(new MediaWikiTemplate("Template page")));
260 Assert.AreEqual("Normal page", page.Normalize(new MediaWikiTemplate("Normal page") { IsColon = true }));
261 Assert.AreEqual("Wikipedia:Help page", page.Normalize(new MediaWikiTemplate("Wikipedia:Help page")));
262 Assert.AreEqual("template:Template page", page.Normalize(new MediaWikiTemplate("template:Template page")));
263 Assert.AreEqual("A/b/c/Doc", page.Normalize(new MediaWikiTemplate("/Doc")));
264 Assert.AreEqual("CURRENTYEAR", page.Normalize(new MediaWikiTemplate("CURRENTYEAR")));
269 #region 内部処理用メソッドテストケース
271 // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
274 /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(正常系)。
277 public void TestValidateIncomplete()
279 // Textが空の場合例外発生、正常系は例外が発生しなければOK
280 MediaWikiPageMock page = new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle");
281 page.Text = "TestText";
282 page.ValidateIncomplete();
286 /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(異常系)。
289 [ExpectedException(typeof(InvalidOperationException))]
290 public void TestValidateIncompleteNg()
293 new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle").ValidateIncomplete();
301 /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
303 private class DummySite : MediaWiki
310 /// <param name="lang">ウェブサイトの言語。</param>
311 public DummySite(Language lang)
321 /// ページを取得。<paramref name="title"/>に応じてテスト用の結果を返す。
323 /// <param name="title">ページタイトル。</param>
324 /// <returns>取得したページ。</returns>
325 /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
326 public override Page GetPage(string title)
328 if (title == "Template:Test/doc")
330 return new MediaWikiPage(
333 "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
336 return base.GetPage(title);
343 /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
345 private class MediaWikiPageMock : MediaWikiPage
351 /// ページの本文, タイムスタンプには<c>null</c>を設定。
353 /// <param name="website">ページが所属するウェブサイト。</param>
354 /// <param name="title">ページタイトル。</param>
355 public MediaWikiPageMock(MediaWiki website, string title)
356 : base(website, title)
362 #region 非公開プロパティテスト用のオーラーライドプロパティ
367 public new string Text
382 #region 非公開メソッドテスト用のオーラーライドメソッド
385 /// オブジェクトがメソッドの実行に不完全な状態でないか検証する。
388 /// <exception cref="InvalidOperationException">オブジェクトは不完全。</exception>
389 public new void ValidateIncomplete()
391 base.ValidateIncomplete();