OSDN Git Service

#30244 Visual Studio 2012 Express for Windows Desktop, StyleCop 4.7, WiX 3.6 に合わせたソース...
[wptscs/wpts.git] / WptscsTest / Parsers / MediaWikiLinkParserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiLinkParserのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiLinkParserTest.cs" company="honeplusのメモ帳">
6 //      Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
7 // <author>
8 //      Honeplus</author>
9 // ================================================================================================
10
11 namespace Honememo.Wptscs.Parsers
12 {
13     using System;
14     using System.Collections.Generic;
15     using Honememo.Parsers;
16     using Honememo.Wptscs.Models;
17     using Honememo.Wptscs.Websites;
18     using Microsoft.VisualStudio.TestTools.UnitTesting;
19
20     /// <summary>
21     /// <see cref="MediaWikiLinkParser"/>のテストクラスです。
22     /// </summary>
23     [TestClass]
24     internal class MediaWikiLinkParserTest
25     {
26         #region private変数
27
28         /// <summary>
29         /// 前処理・後処理で生成/解放される言語別の<see cref="MediaWikiParser"/>。
30         /// </summary>
31         private static IDictionary<string, MediaWikiParser> mediaWikiParsers = new Dictionary<string, MediaWikiParser>();
32
33         #endregion
34
35         #region 前処理・後処理
36
37         /// <summary>
38         /// テストの前処理。
39         /// </summary>
40         /// <param name="context">テスト用情報。</param>
41         /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の生成。</remarks>
42         [ClassInitialize]
43         public static void SetUpBeforeClass(TestContext context)
44         {
45             mediaWikiParsers["en"] = new MediaWikiParser(new MockFactory().GetMediaWiki("en"));
46             mediaWikiParsers["ja"] = new MediaWikiParser(new MockFactory().GetMediaWiki("ja"));
47         }
48
49         /// <summary>
50         /// テストの後処理。
51         /// </summary>
52         /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の解放。</remarks>
53         [ClassCleanup]
54         public static void TearDownAfterClass()
55         {
56             foreach (IDisposable parser in mediaWikiParsers.Values)
57             {
58                 parser.Dispose();
59             }
60
61             mediaWikiParsers.Clear();
62         }
63
64         #endregion
65
66         #region インタフェース実装メソッドテストケース
67
68         /// <summary>
69         /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(基本的な構文)。
70         /// </summary>
71         [TestMethod]
72         public void TestTryParseBasic()
73         {
74             IElement element;
75             MediaWikiLink link;
76             MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
77
78             // タイトルのみ
79             Assert.IsTrue(parser.TryParse("[[testtitle]]", out element));
80             link = (MediaWikiLink)element;
81             Assert.AreEqual("testtitle", link.Title);
82             Assert.IsNull(link.Section);
83             Assert.AreEqual(0, link.PipeTexts.Count);
84             Assert.IsNull(link.Interwiki);
85             Assert.IsFalse(link.IsColon);
86
87             // タイトルとセクション
88             Assert.IsTrue(parser.TryParse("[[testtitle#testsection]]", out element));
89             link = (MediaWikiLink)element;
90             Assert.AreEqual("testtitle", link.Title);
91             Assert.AreEqual("testsection", link.Section);
92             Assert.AreEqual(0, link.PipeTexts.Count);
93             Assert.IsNull(link.Interwiki);
94             Assert.IsFalse(link.IsColon);
95
96             // タイトルとセクションとパイプ後の文字列
97             Assert.IsTrue(parser.TryParse("[[testtitle#testsection|testpipe1|testpipe2]]", out element));
98             link = (MediaWikiLink)element;
99             Assert.AreEqual("testtitle", link.Title);
100             Assert.AreEqual("testsection", link.Section);
101             Assert.AreEqual(2, link.PipeTexts.Count);
102             Assert.AreEqual("testpipe1", link.PipeTexts[0].ToString());
103             Assert.AreEqual("testpipe2", link.PipeTexts[1].ToString());
104             Assert.IsNull(link.Interwiki);
105             Assert.IsFalse(link.IsColon);
106
107             // タイトルとセクションとパイプ後の文字列とコード
108             Assert.IsTrue(parser.TryParse("[[en:testtitle#testsection|testpipe1|testpipe2]]", out element));
109             link = (MediaWikiLink)element;
110             Assert.AreEqual("testtitle", link.Title);
111             Assert.AreEqual("testsection", link.Section);
112             Assert.AreEqual(2, link.PipeTexts.Count);
113             Assert.AreEqual("testpipe1", link.PipeTexts[0].ToString());
114             Assert.AreEqual("testpipe2", link.PipeTexts[1].ToString());
115             Assert.AreEqual("en", link.Interwiki);
116             Assert.IsFalse(link.IsColon);
117
118             // コメントはどこにあってもOK
119             // TODO: [<!--test-->[タイトル]] みたいなのもMediaWiki上では認識されるが、2012年1月現在未対応
120             Assert.IsTrue(parser.TryParse("[[testtitle<!--仮-->|testpipe1<!--コメントアウト-->]]", out element));
121             link = (MediaWikiLink)element;
122             Assert.AreEqual("testtitle<!--仮-->", link.Title);
123             Assert.AreEqual(1, link.PipeTexts.Count);
124             Assert.AreEqual("testpipe1<!--コメントアウト-->", link.PipeTexts[0].ToString());
125         }
126
127         /// <summary>
128         /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(NGパターン)。
129         /// </summary>
130         [TestMethod]
131         public void TestTryParseNg()
132         {
133             IElement element;
134             MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
135
136             // 開始タグが無い
137             Assert.IsFalse(parser.TryParse("testtitle]]", out element));
138
139             // 閉じタグが無い
140             Assert.IsFalse(parser.TryParse("[[testtitle", out element));
141
142             // 先頭が開始タグではない
143             Assert.IsFalse(parser.TryParse(" [[testtitle]]", out element));
144
145             // 外部リンクタグ
146             Assert.IsFalse(parser.TryParse("[testtitle]", out element));
147
148             // テンプレートタグ
149             Assert.IsFalse(parser.TryParse("{{testtitle}}", out element));
150
151             // 記事名名の部分に < > [ ] { } \n のいずれかの文字が存在する場合、NG
152             // ※ コメントや変数であれば可能、それ以外で存在するのがNG
153             Assert.IsFalse(parser.TryParse("[[test<title]]", out element));
154             Assert.IsFalse(parser.TryParse("[[test>title]]", out element));
155             Assert.IsFalse(parser.TryParse("[[test[title]]", out element));
156             Assert.IsFalse(parser.TryParse("[[TestMethod]title]]", out element));
157             Assert.IsFalse(parser.TryParse("[[test{title]]", out element));
158             Assert.IsFalse(parser.TryParse("[[test}title]]", out element));
159             Assert.IsFalse(parser.TryParse("[[testtitle\n]]", out element));
160
161             // 空・null
162             Assert.IsFalse(parser.TryParse(string.Empty, out element));
163             Assert.IsFalse(parser.TryParse(null, out element));
164         }
165
166         /// <summary>
167         /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(入れ子)。
168         /// </summary>
169         [TestMethod]
170         public void TestTryParseNested()
171         {
172             IElement element;
173             MediaWikiLink link;
174             MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
175
176             // テンプレートはパイプ以後にある分には全てOK
177             Assert.IsTrue(parser.TryParse("[[ロシア語|{{lang|ru|русский язык}}]]", out element));
178             link = (MediaWikiLink)element;
179             Assert.AreEqual("ロシア語", link.Title);
180             Assert.AreEqual(1, link.PipeTexts.Count);
181             Assert.AreEqual("{{lang|ru|русский язык}}", link.PipeTexts[0].ToString());
182
183             // 変数の場合、記事名の部分にも入れられる
184             Assert.IsTrue(parser.TryParse("[[{{{title|デフォルトジャンル}}}-stub]]", out element));
185             link = (MediaWikiLink)element;
186             Assert.AreEqual("{{{title|デフォルトジャンル}}}-stub", link.Title);
187         }
188
189         /// <summary>
190         /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(名前空間)。
191         /// </summary>
192         [TestMethod]
193         public void TestTryParseNamespace()
194         {
195             IElement element;
196             MediaWikiLink link;
197             MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["ja"]);
198
199             // カテゴリ標準
200             Assert.IsTrue(parser.TryParse("[[Category:test]]", out element));
201             link = (MediaWikiLink)element;
202             Assert.AreEqual("Category:test", link.Title);
203             Assert.AreEqual(0, link.PipeTexts.Count);
204             Assert.IsNull(link.Interwiki);
205             Assert.IsFalse(link.IsColon);
206
207             // カテゴリソート名指定
208             Assert.IsTrue(parser.TryParse("[[Category:test|てすと]]", out element));
209             link = (MediaWikiLink)element;
210             Assert.AreEqual("Category:test", link.Title);
211             Assert.AreEqual(1, link.PipeTexts.Count);
212             Assert.AreEqual("てすと", link.PipeTexts[0].ToString());
213             Assert.IsNull(link.Interwiki);
214             Assert.IsFalse(link.IsColon);
215
216             // カテゴリにならないような指定
217             Assert.IsTrue(parser.TryParse("[[:Category:test]]", out element));
218             link = (MediaWikiLink)element;
219             Assert.AreEqual("Category:test", link.Title);
220             Assert.AreEqual(0, link.PipeTexts.Count);
221             Assert.IsNull(link.Interwiki);
222             Assert.IsTrue(link.IsColon);
223
224             // ファイル、入れ子もあり
225             Assert.IsTrue(parser.TryParse("[[ファイル:test.png|thumb|100px|テスト[[画像]]]]", out element));
226             link = (MediaWikiLink)element;
227             Assert.AreEqual("ファイル:test.png", link.Title);
228             Assert.AreEqual(3, link.PipeTexts.Count);
229             Assert.AreEqual("thumb", link.PipeTexts[0].ToString());
230             Assert.AreEqual("100px", link.PipeTexts[1].ToString());
231             Assert.AreEqual("テスト[[画像]]", link.PipeTexts[2].ToString());
232             Assert.IsInstanceOfType(link.PipeTexts[2], typeof(ListElement));
233             ListElement list = (ListElement)link.PipeTexts[2];
234             Assert.AreEqual(2, list.Count);
235             Assert.AreEqual("テスト", list[0].ToString());
236             Assert.AreEqual("[[画像]]", list[1].ToString());
237             Assert.IsNull(link.Interwiki);
238         }
239
240         /// <summary>
241         /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(サブページ)。
242         /// </summary>
243         [TestMethod]
244         public void TestTryParseSubpage()
245         {
246             IElement element;
247             MediaWikiLink link;
248             MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
249
250             // 全て指定されているケースは通常の記事と同じ扱い
251             Assert.IsTrue(parser.TryParse("[[testtitle/subpage]]", out element));
252             link = (MediaWikiLink)element;
253             Assert.AreEqual("testtitle/subpage", link.Title);
254             Assert.IsFalse(link.IsSubpage());
255
256             // 記事名が省略されているケース
257             Assert.IsTrue(parser.TryParse("[[/subpage]]", out element));
258             link = (MediaWikiLink)element;
259             Assert.AreEqual("/subpage", link.Title);
260             Assert.IsTrue(link.IsSubpage());
261
262             // 記事名が省略されているケース2
263             Assert.IsTrue(parser.TryParse("[[../../subpage]]", out element));
264             link = (MediaWikiLink)element;
265             Assert.AreEqual("../../subpage", link.Title);
266             Assert.IsTrue(link.IsSubpage());
267         }
268
269         /// <summary>
270         /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(ウィキ間リンク)。
271         /// </summary>
272         [TestMethod]
273         public void TestTryParseInterwiki()
274         {
275             IElement element;
276             MediaWikiLink link;
277             MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
278
279             // タイトルとセクションとパイプ後の文字列とウィキ間リンクとコロンの全部入り
280             Assert.IsTrue(parser.TryParse("[[:en:testtitle#testsection|testpipe1|testpipe2]]", out element));
281             link = (MediaWikiLink)element;
282             Assert.AreEqual("testtitle", link.Title);
283             Assert.AreEqual("testsection", link.Section);
284             Assert.AreEqual(2, link.PipeTexts.Count);
285             Assert.AreEqual("testpipe1", link.PipeTexts[0].ToString());
286             Assert.AreEqual("testpipe2", link.PipeTexts[1].ToString());
287             Assert.AreEqual("en", link.Interwiki);
288             Assert.IsTrue(link.IsColon);
289
290             // 普通の言語間リンク
291             Assert.IsTrue(parser.TryParse("[[ja:日本語版記事名]]", out element));
292             link = (MediaWikiLink)element;
293             Assert.AreEqual("日本語版記事名", link.Title);
294             Assert.AreEqual("ja", link.Interwiki);
295
296             // ウィキ間リンク
297             Assert.IsTrue(parser.TryParse("[[commons:コモンズ記事名]]", out element));
298             link = (MediaWikiLink)element;
299             Assert.AreEqual("コモンズ記事名", link.Title);
300             Assert.AreEqual("commons", link.Interwiki);
301
302             // ウィキ間リンクの構文だが名前空間と被るためそうならないもの
303             Assert.IsTrue(parser.TryParse("[[wikipedia:ウィキペディア記事名]]", out element));
304             link = (MediaWikiLink)element;
305             Assert.AreEqual("wikipedia:ウィキペディア記事名", link.Title);
306             Assert.IsNull(link.Interwiki);
307
308             // :が含まれるだけの普通の記事(1.10以前のバージョンでは誤判定されていた)
309             Assert.IsTrue(parser.TryParse("[[Marathon 2: Durandal]]", out element));
310             link = (MediaWikiLink)element;
311             Assert.AreEqual("Marathon 2: Durandal", link.Title);
312             Assert.IsNull(link.Interwiki);
313         }
314
315         #endregion
316     }
317 }