OSDN Git Service

#27312 ..形式のサブページが正しく処理できない問題の対応,
[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 NUnit.Framework;
16     using Honememo.Parsers;
17     using Honememo.Tests;
18     using Honememo.Utilities;
19     using Honememo.Wptscs.Models;
20     using Honememo.Wptscs.Parsers;
21
22     /// <summary>
23     /// MediaWikiPageのテストクラスです。
24     /// </summary>
25     [TestFixture]
26     public class MediaWikiPageTest
27     {
28         #region モッククラス
29
30         /// <summary>
31         /// Websiteテスト用のモッククラスです。
32         /// </summary>
33         public class DummySite : MediaWiki
34         {
35             #region コンストラクタ
36
37             /// <summary>
38             /// コンストラクタ。
39             /// </summary>
40             /// <param name="lang">ウェブサイトの言語。</param>
41             public DummySite(Language lang)
42                 : base(lang)
43             {
44             }
45
46             #endregion
47             
48             #region ダミーメソッド
49
50             /// <summary>
51             /// ページを取得。
52             /// </summary>
53             /// <param name="title">ページタイトル。</param>
54             /// <returns>取得したページ。</returns>
55             /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
56             public override Page GetPage(string title)
57             {
58                 if (title == "Template:Test/doc")
59                 {
60                     return new MediaWikiPage(
61                         this,
62                         title,
63                         "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
64                 }
65
66                 return base.GetPage(title);
67             }
68
69             #endregion
70         }
71
72         #endregion
73
74         #region コンストラクタテストケース
75
76         /// <summary>
77         /// コンストラクタテストケース。
78         /// </summary>
79         [Test]
80         public void TestConstructorWebsiteTitleTextTimestamp()
81         {
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);
89         }
90
91         /// <summary>
92         /// コンストラクタテストケース(タイムスタンプ無し)。
93         /// </summary>
94         [Test]
95         public void TestConstructorWebsiteTitleText()
96         {
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);
103         }
104
105         /// <summary>
106         /// コンストラクタテストケース(本文・タイムスタンプ無し)。
107         /// </summary>
108         [Test]
109         public void TestConstructorWebsiteTitle()
110         {
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);
117         }
118
119         /// <summary>
120         /// コンストラクタテストケース(ウェブサイトがnull)。
121         /// </summary>
122         [Test]
123         [ExpectedException(typeof(ArgumentNullException))]
124         public void TestConstructorWebsiteNull()
125         {
126             new MediaWikiPage(null, "TestTitle");
127         }
128
129         /// <summary>
130         /// コンストラクタテストケース(タイトルが空)。
131         /// </summary>
132         [Test]
133         [ExpectedException(typeof(ArgumentException))]
134         public void TestConstructorTitleBlank()
135         {
136             new MediaWikiPage(new DummySite(new Language("en")), "  ");
137         }
138
139         #endregion
140
141         #region プロパティテストケース
142
143         /// <summary>
144         /// Redirectプロパティテストケース(正常系)。
145         /// </summary>
146         [Test]
147         public void TestRedirect()
148         {
149             MediaWiki site;
150
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);
156
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());
163         }
164
165         /// <summary>
166         /// Redirectプロパティテストケース(Text未設定)。
167         /// </summary>
168         [Test]
169         [ExpectedException(typeof(InvalidOperationException))]
170         public void TestRedirectTextNull()
171         {
172             MediaWikiLink dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Redirect;
173         }
174
175         /// <summary>
176         /// Elementプロパティテストケース(正常系)。
177         /// </summary>
178         [Test]
179         public void TestElement()
180         {
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());
191         }
192
193         /// <summary>
194         /// Elementプロパティテストケース(Text未設定)。
195         /// </summary>
196         [Test]
197         [ExpectedException(typeof(InvalidOperationException))]
198         public void TestElementTextNull()
199         {
200             IElement dummy = new MediaWikiPage(new MockFactory().GetMediaWiki("en"), "TestTitle").Element;
201         }
202
203         #endregion
204
205         #region 公開メソッドテストケース
206
207         /// <summary>
208         /// GetInterlanguageメソッドテストケース(通常ページ)。
209         /// </summary>
210         [Test]
211         public void TestGetInterlanguage()
212         {
213             // 普通のページ
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"));
221         }
222
223         /// <summary>
224         /// GetInterlanguageメソッドテストケース(通常ページ実データ使用)。
225         /// </summary>
226         [Test, Timeout(20000)]
227         public void TestGetInterlanguageDiscoveryChannel()
228         {
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"));
235         }
236
237         /// <summary>
238         /// GetInterlanguageメソッドテストケース(テンプレートページ実データ使用)。
239         /// </summary>
240         [Test, Timeout(20000)]
241         public void TestGetInterlanguagePlanetboxBegin()
242         {
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"));
247         }
248
249         /// <summary>
250         /// GetInterlanguageメソッドテストケース(Template:Documentation使用ページ)。
251         /// </summary>
252         [Test]
253         public void TestGetInterlanguageDocumentation()
254         {
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}}");
260
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"));
266         }
267
268         /// <summary>
269         /// IsRedirectメソッドテストケース。
270         /// </summary>
271         [Test]
272         public void TestIsRedirect()
273         {
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);
278
279             page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
280             Assert.IsFalse(page.IsRedirect());
281
282             site.Redirect = "#転送";
283             page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
284             Assert.IsTrue(page.IsRedirect());
285             Assert.AreEqual("Test Redirect2", page.Redirect.Title);
286
287             page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
288             Assert.IsTrue(page.IsRedirect());
289             Assert.AreEqual("Test Redirect3", page.Redirect.Title);
290
291             page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
292             Assert.IsTrue(page.IsRedirect());
293             Assert.AreEqual("Test Redirect4", page.Redirect.Title);
294         }
295
296         /// <summary>
297         /// Normalizeメソッドテストケース。
298         /// </summary>
299         [Test]
300         public void TestNormalize()
301         {
302             MediaWiki site = new DummySite(new Language("en"));
303             MediaWikiPage page = new MediaWikiPage(site, "A/b/c");
304
305             // サブページの正規化
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/")));
315
316             // テンプレートの正規化
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")));
323         }
324
325         #endregion
326
327         #region 内部処理用メソッドテストケース
328
329         // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
330
331         /// <summary>
332         /// ValidateIncompleteメソッドテストケース(正常系)。
333         /// </summary>
334         [Test]
335         public void TestValidateIncomplete()
336         {
337             // 正常系は例外が発生しなければOK
338             PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
339                 new MediaWikiPage(
340                     new MediaWiki(new Language("en")),
341                     "TestTitle",
342                     "TestText"));
343             acc.SetMethod("ValidateIncomplete", new Type[0]);
344             acc.Invoke(new object[0]);
345         }
346
347         /// <summary>
348         /// ValidateIncompleteメソッドテストケース(異常系)。
349         /// </summary>
350         [Test]
351         [ExpectedException(typeof(InvalidOperationException))]
352         public void TestValidateIncompleteNg()
353         {
354             // 正常系は例外が発生しなければOK
355             PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
356                 new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle"));
357             acc.SetMethod("ValidateIncomplete");
358             acc.Invoke();
359         }
360
361         #endregion
362     }
363 }