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 NUnit.Framework;
16 using Honememo.Parsers;
18 using Honememo.Utilities;
19 using Honememo.Wptscs.Models;
20 using Honememo.Wptscs.Parsers;
23 /// MediaWikiPageのテストクラスです。
26 public class MediaWikiPageTest
31 /// Websiteテスト用のモッククラスです。
33 public class DummySite : MediaWiki
40 /// <param name="lang">ウェブサイトの言語。</param>
41 public DummySite(Language lang)
53 /// <param name="title">ページタイトル。</param>
54 /// <returns>取得したページ。</returns>
55 /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
56 public override Page GetPage(string title)
58 if (title == "Template:Test/doc")
60 return new MediaWikiPage(
63 "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
66 return base.GetPage(title);
80 public void TestConstructorWebsiteTitleTextTimestamp()
82 DateTime t = DateTime.Now;
83 MediaWiki s = new DummySite(new Language("en"));
84 MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText", t);
85 Assert.AreSame(s, page.Website);
86 Assert.AreEqual("TestTitle", page.Title);
87 Assert.AreEqual("TestText", page.Text);
88 Assert.AreEqual(t, page.Timestamp);
92 /// コンストラクタテストケース(タイムスタンプ無し)。
95 public void TestConstructorWebsiteTitleText()
97 MediaWiki s = new DummySite(new Language("en"));
98 MediaWikiPage page = new MediaWikiPage(s, "TestTitle", "TestText");
99 Assert.AreEqual(s, page.Website);
100 Assert.AreEqual("TestTitle", page.Title);
101 Assert.AreEqual("TestText", page.Text);
102 Assert.IsNull(page.Timestamp);
106 /// コンストラクタテストケース(本文・タイムスタンプ無し)。
109 public void TestConstructorWebsiteTitle()
111 MediaWiki s = new DummySite(new Language("en"));
112 MediaWikiPage page = new MediaWikiPage(s, "TestTitle");
113 Assert.AreEqual(s, page.Website);
114 Assert.AreEqual("TestTitle", page.Title);
115 Assert.IsNull(page.Text);
116 Assert.IsNull(page.Timestamp);
120 /// コンストラクタテストケース(ウェブサイトがnull)。
123 [ExpectedException(typeof(ArgumentNullException))]
124 public void TestConstructorWebsiteNull()
126 new MediaWikiPage(null, "TestTitle");
130 /// コンストラクタテストケース(タイトルが空)。
133 [ExpectedException(typeof(ArgumentException))]
134 public void TestConstructorTitleBlank()
136 new MediaWikiPage(new DummySite(new Language("en")), " ");
144 /// Redirectプロパティテストケース(正常系)。
147 public void TestRedirect()
151 site = new MockFactory().GetMediaWiki("en");
152 Assert.IsNull(new MediaWikiPage(site, "TestTitle", "[[TestLink]]").Redirect);
153 Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect);
154 Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect.ToString());
155 Assert.IsNull(new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect);
157 site = new MockFactory().GetMediaWiki("ja");
158 Assert.IsNull(new MediaWikiPage(site, "TestTitle", "[[TestLink]]").Redirect);
159 Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect);
160 Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#redirect [[TestLink]]").Redirect.ToString());
161 Assert.IsNotNull(new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect);
162 Assert.AreEqual("[[TestLink]]", new MediaWikiPage(site, "TestTitle", "#転送 [[TestLink]]").Redirect.ToString());
166 /// Redirectプロパティテストケース(Text未設定)。
169 [ExpectedException(typeof(InvalidOperationException))]
170 public void TestRedirectTextNull()
172 MediaWikiLink dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Redirect;
176 /// Elementプロパティテストケース(正常系)。
179 public void TestElement()
181 IElement element = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle", "'''Title''' is [[xxx]].").Element;
182 Assert.IsNotNull(element);
183 Assert.AreEqual("'''Title''' is [[xxx]].", element.ToString());
184 Assert.IsInstanceOf(typeof(ListElement), element);
185 ListElement list = (ListElement)element;
186 Assert.AreEqual(3, list.Count);
187 Assert.AreEqual("'''Title''' is ", list[0].ToString());
188 Assert.AreEqual("[[xxx]]", list[1].ToString());
189 Assert.IsInstanceOf(typeof(MediaWikiLink), list[1]);
190 Assert.AreEqual(".", list[2].ToString());
194 /// Elementプロパティテストケース(Text未設定)。
197 [ExpectedException(typeof(InvalidOperationException))]
198 public void TestElementTextNull()
200 IElement dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Element;
208 /// GetInterlanguageメソッドテストケース(通常ページ)。
211 public void TestGetInterlanguage()
214 MediaWikiPage page = new MediaWikiPage(new DummySite(new Language("en")), "TestTitle", "TestText\n"
215 + " [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
216 Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
217 Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
218 Assert.IsNull(page.GetInterlanguage("de"));
219 Assert.IsNull(page.GetInterlanguage("ru"));
220 Assert.IsNull(page.GetInterlanguage("zh"));
224 /// GetInterlanguageメソッドテストケース(通常ページ実データ使用)。
226 [Test, Timeout(20000)]
227 public void TestGetInterlanguageDiscoveryChannel()
229 MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Discovery Channel");
230 Assert.AreEqual("[[ja:ディスカバリーチャンネル]]", page.GetInterlanguage("ja").ToString());
231 Assert.AreEqual("[[it:Discovery Channel (Italia)]]", page.GetInterlanguage("it").ToString());
232 Assert.AreEqual("[[simple:Discovery Channel]]", page.GetInterlanguage("simple").ToString());
233 Assert.AreEqual("[[ru:Discovery (телеканал)]]", page.GetInterlanguage("ru").ToString());
234 Assert.IsNull(page.GetInterlanguage("io"));
238 /// GetInterlanguageメソッドテストケース(テンプレートページ実データ使用)。
240 [Test, Timeout(20000)]
241 public void TestGetInterlanguagePlanetboxBegin()
243 MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Planetbox begin");
244 Assert.AreEqual("[[ja:Template:Planetbox begin]]", page.GetInterlanguage("ja").ToString());
245 Assert.AreEqual("[[ru:Шаблон:Planetbox begin]]", page.GetInterlanguage("ru").ToString());
246 Assert.IsNull(page.GetInterlanguage("zh"));
250 /// GetInterlanguageメソッドテストケース(Template:Documentation使用ページ)。
253 public void TestGetInterlanguageDocumentation()
255 // Template:Documentation を使ってるページ
256 MediaWiki site = new DummySite(new Language("en"));
257 site.DocumentationTemplates.Add("Template:Documentation");
258 site.DocumentationTemplateDefaultPage = "/doc";
259 MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");
261 Assert.AreEqual("[[ja:テストページ]]", page.GetInterlanguage("ja").ToString());
262 Assert.AreEqual("[[fr:Test_Fr]]", page.GetInterlanguage("fr").ToString());
263 Assert.IsNull(page.GetInterlanguage("de"));
264 Assert.IsNull(page.GetInterlanguage("ru"));
265 Assert.IsNull(page.GetInterlanguage("zh"));
269 /// IsRedirectメソッドテストケース。
272 public void TestIsRedirect()
274 MediaWiki site = new DummySite(new Language("en"));
275 MediaWikiPage page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect]]");
276 Assert.IsTrue(page.IsRedirect());
277 Assert.AreEqual("Test Redirect", page.Redirect.Title);
279 page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
280 Assert.IsFalse(page.IsRedirect());
282 site.Redirect = "#転送";
283 page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
284 Assert.IsTrue(page.IsRedirect());
285 Assert.AreEqual("Test Redirect2", page.Redirect.Title);
287 page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
288 Assert.IsTrue(page.IsRedirect());
289 Assert.AreEqual("Test Redirect3", page.Redirect.Title);
291 page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
292 Assert.IsTrue(page.IsRedirect());
293 Assert.AreEqual("Test Redirect4", page.Redirect.Title);
297 /// Normalizeメソッドテストケース。
300 public void TestNormalize()
302 MediaWiki site = new DummySite(new Language("en"));
303 MediaWikiPage page = new MediaWikiPage(site, "A/b/c");
306 Assert.AreEqual("Normal page", page.Normalize(new MediaWikiLink("Normal page")));
307 Assert.AreEqual("A/b/c/s", page.Normalize(new MediaWikiLink("/s")));
308 Assert.AreEqual("A/b/c/s", page.Normalize(new MediaWikiLink("/s/")));
309 Assert.AreEqual("A/b", page.Normalize(new MediaWikiLink("../")));
310 Assert.AreEqual("A", page.Normalize(new MediaWikiLink("../../")));
311 Assert.AreEqual("A/b/s", page.Normalize(new MediaWikiLink("../s")));
312 Assert.AreEqual("A/b/s", page.Normalize(new MediaWikiLink("../s/")));
313 Assert.AreEqual("A/s", page.Normalize(new MediaWikiLink("../../s")));
314 Assert.AreEqual("A/s", page.Normalize(new MediaWikiLink("../../s/")));
317 Assert.AreEqual("Template:Template page", page.Normalize(new MediaWikiTemplate("Template page")));
318 Assert.AreEqual("Normal page", page.Normalize(new MediaWikiTemplate("Normal page") { IsColon = true }));
319 Assert.AreEqual("Wikipedia:Help page", page.Normalize(new MediaWikiTemplate("Wikipedia:Help page")));
320 Assert.AreEqual("template:Template page", page.Normalize(new MediaWikiTemplate("template:Template page")));
321 Assert.AreEqual("A/b/c/Doc", page.Normalize(new MediaWikiTemplate("/Doc")));
322 Assert.AreEqual("CURRENTYEAR", page.Normalize(new MediaWikiTemplate("CURRENTYEAR")));
327 #region 内部処理用メソッドテストケース
329 // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
332 /// ValidateIncompleteメソッドテストケース(正常系)。
335 public void TestValidateIncomplete()
338 PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
340 new MediaWiki(new Language("en")),
343 acc.SetMethod("ValidateIncomplete", new Type[0]);
344 acc.Invoke(new object[0]);
348 /// ValidateIncompleteメソッドテストケース(異常系)。
351 [ExpectedException(typeof(InvalidOperationException))]
352 public void TestValidateIncompleteNg()
355 PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
356 new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle"));
357 acc.SetMethod("ValidateIncomplete");