OSDN Git Service

#27314 記事名にコロンを含むページが正しく処理できないの対応(MediaWikiのAPIと設定からウィキ間リンクを判別するよう変更),
[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.Tests;
17     using Honememo.Utilities;
18     using Honememo.Wptscs.Models;
19
20     /// <summary>
21     /// MediaWikiPageのテストクラスです。
22     /// </summary>
23     [TestFixture]
24     public class MediaWikiPageTest
25     {
26         #region モッククラス
27
28         /// <summary>
29         /// Websiteテスト用のモッククラスです。
30         /// </summary>
31         public class DummySite : MediaWiki
32         {
33             #region コンストラクタ
34
35             /// <summary>
36             /// コンストラクタ。
37             /// </summary>
38             /// <param name="lang">ウェブサイトの言語。</param>
39             public DummySite(Language lang)
40                 : base(lang)
41             {
42             }
43
44             #endregion
45
46             #region ダミーメソッド
47
48             /// <summary>
49             /// ページを取得。
50             /// </summary>
51             /// <param name="title">ページタイトル。</param>
52             /// <returns>取得したページ。</returns>
53             /// <remarks>取得できない場合(通信エラーなど)は例外を投げる。</remarks>
54             public override Page GetPage(string title)
55             {
56                 System.Diagnostics.Debug.WriteLine(title);
57                 if (title == "Template:Test/doc")
58                 {
59                     return new MediaWikiPage(
60                         this,
61                         title,
62                         "[[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
63                 }
64
65                 return base.GetPage(title);
66             }
67
68             #endregion
69         }
70
71         #endregion
72
73         // TODO: 試験項目不足
74         
75         #region 公開メソッドテストケース
76
77         /// <summary>
78         /// GetInterlanguageメソッドテストケース(通常ページ)。
79         /// </summary>
80         [Test]
81         public void TestGetInterlanguage()
82         {
83             // 普通のページ
84             MediaWikiPage page = new MediaWikiPage(new DummySite(new Language("en")), "TestTitle", "TestText\n"
85                 + " [[ja:テストページ]]<nowiki>[[zh:試験]]</nowiki><!--[[ru:test]]-->[[fr:Test_Fr]]");
86             Assert.AreEqual("テストページ", page.GetInterlanguage("ja"));
87             Assert.AreEqual("Test_Fr", page.GetInterlanguage("fr"));
88             Assert.IsEmpty(page.GetInterlanguage("de"));
89             Assert.IsEmpty(page.GetInterlanguage("ru"));
90             Assert.IsEmpty(page.GetInterlanguage("zh"));
91         }
92
93         /// <summary>
94         /// GetInterlanguageメソッドテストケース(通常ページ実データ使用)。
95         /// </summary>
96         [Test, Timeout(20000)]
97         public void TestGetInterlanguageDiscoveryChannel()
98         {
99             MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Discovery Channel");
100             Assert.AreEqual("ディスカバリーチャンネル", page.GetInterlanguage("ja"));
101             Assert.AreEqual("Discovery Channel (Italia)", page.GetInterlanguage("it"));
102             Assert.AreEqual("Discovery Channel", page.GetInterlanguage("simple"));
103             Assert.AreEqual("Discovery (телеканал)", page.GetInterlanguage("ru"));
104             Assert.IsEmpty(page.GetInterlanguage("io"));
105         }
106
107         /// <summary>
108         /// GetInterlanguageメソッドテストケース(テンプレートページ実データ使用)。
109         /// </summary>
110         [Test, Timeout(20000)]
111         public void TestGetInterlanguagePlanetboxBegin()
112         {
113             MediaWikiPage page = (MediaWikiPage)new MockFactory().GetMediaWiki("en").GetPage("Template:Planetbox begin");
114             Assert.AreEqual("Template:Planetbox begin", page.GetInterlanguage("ja"));
115             Assert.AreEqual("Шаблон:Planetbox begin", page.GetInterlanguage("ru"));
116             Assert.IsEmpty(page.GetInterlanguage("zh"));
117         }
118
119         /// <summary>
120         /// GetInterlanguageメソッドテストケース(Template:Documentation使用ページ)。
121         /// </summary>
122         [Test]
123         public void TestGetInterlanguageDocumentation()
124         {
125             // Template:Documentation を使ってるページ
126             MediaWiki site = new DummySite(new Language("en"));
127             site.DocumentationTemplates.Add("Template:Documentation");
128             site.DocumentationTemplateDefaultPage = "/doc";
129             MediaWikiPage page = new MediaWikiPage(site, "Template:Test", "TestText{{Documentation}}");
130
131             Assert.AreEqual("テストページ", page.GetInterlanguage("ja"));
132             Assert.AreEqual("Test_Fr", page.GetInterlanguage("fr"));
133             Assert.IsEmpty(page.GetInterlanguage("de"));
134             Assert.IsEmpty(page.GetInterlanguage("ru"));
135             Assert.IsEmpty(page.GetInterlanguage("zh"));
136         }
137
138         /// <summary>
139         /// IsRedirectメソッドテストケース。
140         /// </summary>
141         [Test]
142         public void TestIsRedirect()
143         {
144             MediaWiki site = new DummySite(new Language("en"));
145             MediaWikiPage page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect]]");
146             Assert.IsTrue(page.IsRedirect());
147             Assert.AreEqual("Test Redirect", page.Redirect.Title);
148
149             page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
150             Assert.IsFalse(page.IsRedirect());
151
152             site.Redirect = "#転送";
153             page = new MediaWikiPage(site, "TestTitle", "#転送 [[Test Redirect2]]");
154             Assert.IsTrue(page.IsRedirect());
155             Assert.AreEqual("Test Redirect2", page.Redirect.Title);
156
157             page = new MediaWikiPage(site, "TestTitle", "#REDIRECT [[Test Redirect3]]");
158             Assert.IsTrue(page.IsRedirect());
159             Assert.AreEqual("Test Redirect3", page.Redirect.Title);
160
161             page = new MediaWikiPage(site, "TestTitle", "#redirect [[Test Redirect4]]");
162             Assert.IsTrue(page.IsRedirect());
163             Assert.AreEqual("Test Redirect4", page.Redirect.Title);
164         }
165
166         #endregion
167
168         #region 内部処理用メソッドテストケース
169
170         // 非公開メソッドについてはprotected以上、またはやりたい部分だけ実施
171
172         /// <summary>
173         /// ValidateIncompleteメソッドテストケース(正常系)。
174         /// </summary>
175         [Test]
176         public void TestValidateIncomplete()
177         {
178             // 正常系は例外が発生しなければOK
179             PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
180                 new MediaWikiPage(
181                     new MediaWiki(new Language("en")),
182                     "TestTitle",
183                     "TestText"));
184             acc.SetMethod("ValidateIncomplete", new Type[0]);
185             acc.Invoke(new object[0]);
186         }
187
188         /// <summary>
189         /// ValidateIncompleteメソッドテストケース(異常系)。
190         /// </summary>
191         [Test]
192         [ExpectedException(typeof(InvalidOperationException))]
193         public void TestValidateIncompleteNg()
194         {
195             // 正常系は例外が発生しなければOK
196             PrivateAccessor<MediaWikiPage> acc = new PrivateAccessor<MediaWikiPage>(
197                 new MediaWikiPage(new MediaWiki(new Language("en")), "TestTitle"));
198             acc.SetMethod("ValidateIncomplete");
199             acc.Invoke();
200         }
201
202         #endregion
203     }
204 }