OSDN Git Service

#30244 Visual Studioの自動テストはテストクラスがinternalだと実行されていなかったので修正,
[wptscs/wpts.git] / WptscsTest / Websites / MediaWikiPageTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiPageのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiPageTest.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 Honememo.Parsers;
16     using Honememo.Utilities;
17     using Honememo.Wptscs.Models;
18     using Honememo.Wptscs.Parsers;
19     using Microsoft.VisualStudio.TestTools.UnitTesting;
20
21     /// <summary>
22     /// <see cref="MediaWikiPage"/>のテストクラスです。
23     /// </summary>
24     [TestClass]
25     public class MediaWikiPageTest
26     {
27         #region コンストラクタテストケース
28
29         /// <summary>
30         /// コンストラクタテストケース。
31         /// </summary>
32         [TestMethod]
33         public void TestConstructorWebsiteTitleTextTimestamp()
34         {
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);
44         }
45
46         /// <summary>
47         /// コンストラクタテストケース(タイムスタンプ無し)。
48         /// </summary>
49         [TestMethod]
50         public void TestConstructorWebsiteTitleText()
51         {
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);
59         }
60
61         /// <summary>
62         /// コンストラクタテストケース(本文・タイムスタンプ無し)。
63         /// </summary>
64         [TestMethod]
65         public void TestConstructorWebsiteTitle()
66         {
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);
74         }
75
76         /// <summary>
77         /// コンストラクタテストケース(ウェブサイトがnull)。
78         /// </summary>
79         [TestMethod]
80         [ExpectedException(typeof(ArgumentNullException))]
81         public void TestConstructorWebsiteNull()
82         {
83             new MediaWikiPage(null, "TestTitle");
84         }
85
86         /// <summary>
87         /// コンストラクタテストケース(タイトルが空)。
88         /// </summary>
89         [TestMethod]
90         [ExpectedException(typeof(ArgumentException))]
91         public void TestConstructorTitleBlank()
92         {
93             new MediaWikiPage(new MediaWiki(new Language("en")), "  ");
94         }
95
96         #endregion
97
98         #region プロパティテストケース
99
100         /// <summary>
101         /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(正常系)。
102         /// </summary>
103         [TestMethod]
104         public void TestRedirect()
105         {
106             MediaWiki site;
107
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);
113
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());
120         }
121
122         /// <summary>
123         /// <see cref="MediaWikiPage.Redirect"/>プロパティテストケース(Text未設定)。
124         /// </summary>
125         [TestMethod]
126         [ExpectedException(typeof(InvalidOperationException))]
127         public void TestRedirectTextNull()
128         {
129             MediaWikiLink dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Redirect;
130         }
131
132         #endregion
133
134         #region 公開メソッドテストケース
135
136         /// <summary>
137         /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ)。
138         /// </summary>
139         [TestMethod]
140         public void TestGetInterlanguage()
141         {
142             // 普通のページ
143             MediaWikiPage page = new MediaWikiPage(
144                 new MediaWiki(new Language("en")),
145                 "TestTitle",
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"));
152         }
153
154         /// <summary>
155         /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(通常ページ実データ使用)。
156         /// </summary>
157         [TestMethod, Timeout(20000)]
158         public void TestGetInterlanguageDiscoveryChannel()
159         {
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"));
166         }
167
168         /// <summary>
169         /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(テンプレートページ実データ使用)。
170         /// </summary>
171         [TestMethod, Timeout(20000)]
172         public void TestGetInterlanguagePlanetboxBegin()
173         {
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"));
178         }
179
180         /// <summary>
181         /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentation使用ページ)。
182         /// </summary>
183         [TestMethod]
184         public void TestGetInterlanguageDocumentation()
185         {
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}}");
191
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"));
197         }
198
199         /// <summary>
200         /// <see cref="MediaWikiPage.GetInterlanguage"/>メソッドテストケース(Template:Documentationにnoincludeで囲まれた言語間リンクが存在)。
201         /// </summary>
202         [TestMethod]
203         public void TestGetInterlanguagePartial()
204         {
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"));
208         }
209
210         /// <summary>
211         /// <see cref="MediaWikiPage.IsRedirect"/>メソッドテストケース。
212         /// </summary>
213         [TestMethod]
214         public void TestIsRedirect()
215         {
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);
220
221             page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
222             Assert.IsFalse(page.IsRedirect());
223
224             site.Redirect = "#転送";
225             page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
226             Assert.IsTrue(page.IsRedirect());
227             Assert.AreEqual("Test Redirect2", page.Redirect.Title);
228
229             page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
230             Assert.IsTrue(page.IsRedirect());
231             Assert.AreEqual("Test Redirect3", page.Redirect.Title);
232
233             page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
234             Assert.IsTrue(page.IsRedirect());
235             Assert.AreEqual("Test Redirect4", page.Redirect.Title);
236         }
237
238         /// <summary>
239         /// <see cref="MediaWikiPage.Normalize"/>メソッドテストケース。
240         /// </summary>
241         [TestMethod]
242         public void TestNormalize()
243         {
244             MediaWiki site = new MediaWiki(new Language("en"));
245             MediaWikiPage page = new MediaWikiPage(site, "A/b/c");
246
247             // サブページの正規化
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/")));
257
258             // テンプレートの正規化
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")));
265         }
266
267         #endregion
268
269         #region 内部処理用メソッドテストケース
270
271         // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
272
273         /// <summary>
274         /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(正常系)。
275         /// </summary>
276         [TestMethod]
277         public void TestValidateIncomplete()
278         {
279             // Textが空の場合例外発生、正常系は例外が発生しなければOK
280             MediaWikiPageMock page = new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle");
281             page.Text = "TestText";
282             page.ValidateIncomplete();
283         }
284
285         /// <summary>
286         /// <see cref="MediaWikiPage.ValidateIncomplete"/>メソッドテストケース(異常系)。
287         /// </summary>
288         [TestMethod]
289         [ExpectedException(typeof(InvalidOperationException))]
290         public void TestValidateIncompleteNg()
291         {
292             // Textが空の場合例外発生
293             new MediaWikiPageMock(new MediaWiki(new Language("en")), "TestTitle").ValidateIncomplete();
294         }
295
296         #endregion
297
298         #region モッククラス
299
300         /// <summary>
301         /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
302         /// </summary>
303         private class DummySite : MediaWiki
304         {
305             #region コンストラクタ
306
307             /// <summary>
308             /// コンストラクタ。
309             /// </summary>
310             /// <param name="lang">ウェブサイトの言語。</param>
311             public DummySite(Language lang)
312                 : base(lang)
313             {
314             }
315
316             #endregion
317
318             #region ダミーメソッド
319
320             /// <summary>
321             /// ページを取得。<paramref name="title"/>に応じてテスト用の結果を返す。
322             /// </summary>
323             /// <param name="title">ページタイトル。</param>
324             /// <returns>取得したページ。</returns>
325             /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
326             public override Page GetPage(string title)
327             {
328                 if (title == "Template:Test/doc")
329                 {
330                     return new MediaWikiPage(
331                         this,
332                         title,
333                         "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
334                 }
335
336                 return base.GetPage(title);
337             }
338
339             #endregion
340         }
341
342         /// <summary>
343         /// <see cref="MediaWikiPage"/>テスト用のモッククラスです。
344         /// </summary>
345         private class MediaWikiPageMock : MediaWikiPage
346         {
347             #region コンストラクタ
348
349             /// <summary>
350             /// コンストラクタ。
351             /// ページの本文, タイムスタンプには<c>null</c>を設定。
352             /// </summary>
353             /// <param name="website">ページが所属するウェブサイト。</param>
354             /// <param name="title">ページタイトル。</param>
355             public MediaWikiPageMock(MediaWiki website, string title)
356                 : base(website, title)
357             {
358             }
359
360             #endregion
361
362             #region 非公開プロパティテスト用のオーラーライドプロパティ
363
364             /// <summary>
365             /// ページの本文。
366             /// </summary>
367             public new string Text
368             {
369                 get
370                 {
371                     return base.Text;
372                 }
373
374                 set
375                 {
376                     base.Text = value;
377                 }
378             }
379
380             #endregion
381
382             #region 非公開メソッドテスト用のオーラーライドメソッド
383
384             /// <summary>
385             /// オブジェクトがメソッドの実行に不完全な状態でないか検証する。
386             /// 不完全な場合、例外をスローする。
387             /// </summary>
388             /// <exception cref="InvalidOperationException">オブジェクトは不完全。</exception>
389             public new void ValidateIncomplete()
390             {
391                 base.ValidateIncomplete();
392             }
393
394             #endregion
395         }
396
397         #endregion
398     }
399 }