OSDN Git Service

自動テスト用プロジェクトにもStyleCopを適用してその指摘箇所を修正
[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 Honememo.Parsers;
15     using Honememo.Wptscs.Models;
16     using Honememo.Wptscs.Websites;
17     using NUnit.Framework;
18
19     /// <summary>
20     /// MediaWikiLinkParserのテストクラスです。
21     /// </summary>
22     [TestFixture]
23     public class MediaWikiLinkParserTest
24     {
25         #region インタフェース実装メソッドテストケース
26
27         /// <summary>
28         /// TryParseメソッドテストケース(基本的な構文)。
29         /// </summary>
30         [Test]
31         public void TestTryParseBasic()
32         {
33             IElement element;
34             MediaWikiLink link;
35             MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
36
37             // タイトルのみ
38             Assert.IsTrue(parser.TryParse("[[testtitle]]", out element));
39             link = (MediaWikiLink)element;
40             Assert.AreEqual("testtitle", link.Title);
41             Assert.IsNull(link.Section);
42             Assert.AreEqual(0, link.PipeTexts.Count);
43             Assert.IsNull(link.Interwiki);
44             Assert.IsFalse(link.IsColon);
45
46             // タイトルとセクション
47             Assert.IsTrue(parser.TryParse("[[testtitle#testsection]]", out element));
48             link = (MediaWikiLink)element;
49             Assert.AreEqual("testtitle", link.Title);
50             Assert.AreEqual("testsection", link.Section);
51             Assert.AreEqual(0, link.PipeTexts.Count);
52             Assert.IsNull(link.Interwiki);
53             Assert.IsFalse(link.IsColon);
54
55             // タイトルとセクションとパイプ後の文字列
56             Assert.IsTrue(parser.TryParse("[[testtitle#testsection|testpipe1|testpipe2]]", out element));
57             link = (MediaWikiLink)element;
58             Assert.AreEqual("testtitle", link.Title);
59             Assert.AreEqual("testsection", link.Section);
60             Assert.AreEqual(2, link.PipeTexts.Count);
61             Assert.AreEqual("testpipe1", link.PipeTexts[0].ToString());
62             Assert.AreEqual("testpipe2", link.PipeTexts[1].ToString());
63             Assert.IsNull(link.Interwiki);
64             Assert.IsFalse(link.IsColon);
65
66             // タイトルとセクションとパイプ後の文字列とコード
67             Assert.IsTrue(parser.TryParse("[[en:testtitle#testsection|testpipe1|testpipe2]]", out element));
68             link = (MediaWikiLink)element;
69             Assert.AreEqual("testtitle", link.Title);
70             Assert.AreEqual("testsection", link.Section);
71             Assert.AreEqual(2, link.PipeTexts.Count);
72             Assert.AreEqual("testpipe1", link.PipeTexts[0].ToString());
73             Assert.AreEqual("testpipe2", link.PipeTexts[1].ToString());
74             Assert.AreEqual("en", link.Interwiki);
75             Assert.IsFalse(link.IsColon);
76
77             // コメントはどこにあってもOK
78             // TODO: [<!--test-->[タイトル]] みたいなのもMediaWiki上では認識されるが、2012年1月現在未対応
79             Assert.IsTrue(parser.TryParse("[[testtitle<!--仮-->|testpipe1<!--コメントアウト-->]]", out element));
80             link = (MediaWikiLink)element;
81             Assert.AreEqual("testtitle<!--仮-->", link.Title);
82             Assert.AreEqual(1, link.PipeTexts.Count);
83             Assert.AreEqual("testpipe1<!--コメントアウト-->", link.PipeTexts[0].ToString());
84         }
85
86         /// <summary>
87         /// TryParseメソッドテストケース(NGパターン)。
88         /// </summary>
89         [Test]
90         public void TestTryParseNg()
91         {
92             IElement element;
93             MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
94
95             // 開始タグが無い
96             Assert.IsFalse(parser.TryParse("testtitle]]", out element));
97
98             // 閉じタグが無い
99             Assert.IsFalse(parser.TryParse("[[testtitle", out element));
100
101             // 先頭が開始タグではない
102             Assert.IsFalse(parser.TryParse(" [[testtitle]]", out element));
103
104             // 外部リンクタグ
105             Assert.IsFalse(parser.TryParse("[testtitle]", out element));
106
107             // テンプレートタグ
108             Assert.IsFalse(parser.TryParse("{{testtitle}}", out element));
109
110             // 記事名名の部分に < > [ ] { } \n のいずれかの文字が存在する場合、NG
111             // ※ コメントや変数であれば可能、それ以外で存在するのがNG
112             Assert.IsFalse(parser.TryParse("[[test<title]]", out element));
113             Assert.IsFalse(parser.TryParse("[[test>title]]", out element));
114             Assert.IsFalse(parser.TryParse("[[test[title]]", out element));
115             Assert.IsFalse(parser.TryParse("[[test]title]]", out element));
116             Assert.IsFalse(parser.TryParse("[[test{title]]", out element));
117             Assert.IsFalse(parser.TryParse("[[test}title]]", out element));
118             Assert.IsFalse(parser.TryParse("[[testtitle\n]]", out element));
119         }
120
121         /// <summary>
122         /// TryParseメソッドテストケース(入れ子)。
123         /// </summary>
124         [Test]
125         public void TestTryParseNested()
126         {
127             IElement element;
128             MediaWikiLink link;
129             MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
130
131             // テンプレートはパイプ以後にある分には全てOK
132             Assert.IsTrue(parser.TryParse("[[ロシア語|{{lang|ru|русский язык}}]]", out element));
133             link = (MediaWikiLink)element;
134             Assert.AreEqual("ロシア語", link.Title);
135             Assert.AreEqual(1, link.PipeTexts.Count);
136             Assert.AreEqual("{{lang|ru|русский язык}}", link.PipeTexts[0].ToString());
137
138             // 変数の場合、記事名の部分にも入れられる
139             Assert.IsTrue(parser.TryParse("[[{{{title|デフォルトジャンル}}}-stub]]", out element));
140             link = (MediaWikiLink)element;
141             Assert.AreEqual("{{{title|デフォルトジャンル}}}-stub", link.Title);
142         }
143
144         /// <summary>
145         /// TryParseメソッドテストケース(名前空間)。
146         /// </summary>
147         [Test]
148         public void TestTryParseNamespace()
149         {
150             IElement element;
151             MediaWikiLink link;
152             MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("ja")));
153
154             // カテゴリ標準
155             Assert.IsTrue(parser.TryParse("[[Category:test]]", out element));
156             link = (MediaWikiLink)element;
157             Assert.AreEqual("Category:test", link.Title);
158             Assert.AreEqual(0, link.PipeTexts.Count);
159             Assert.IsNull(link.Interwiki);
160             Assert.IsFalse(link.IsColon);
161
162             // カテゴリソート名指定
163             Assert.IsTrue(parser.TryParse("[[Category:test|てすと]]", out element));
164             link = (MediaWikiLink)element;
165             Assert.AreEqual("Category:test", link.Title);
166             Assert.AreEqual(1, link.PipeTexts.Count);
167             Assert.AreEqual("てすと", link.PipeTexts[0].ToString());
168             Assert.IsNull(link.Interwiki);
169             Assert.IsFalse(link.IsColon);
170
171             // カテゴリにならないような指定
172             Assert.IsTrue(parser.TryParse("[[:Category:test]]", out element));
173             link = (MediaWikiLink)element;
174             Assert.AreEqual("Category:test", link.Title);
175             Assert.AreEqual(0, link.PipeTexts.Count);
176             Assert.IsNull(link.Interwiki);
177             Assert.IsTrue(link.IsColon);
178
179             // ファイル、入れ子もあり
180             Assert.IsTrue(parser.TryParse("[[ファイル:test.png|thumb|100px|テスト[[画像]]]]", out element));
181             link = (MediaWikiLink)element;
182             Assert.AreEqual("ファイル:test.png", link.Title);
183             Assert.AreEqual(3, link.PipeTexts.Count);
184             Assert.AreEqual("thumb", link.PipeTexts[0].ToString());
185             Assert.AreEqual("100px", link.PipeTexts[1].ToString());
186             Assert.AreEqual("テスト[[画像]]", link.PipeTexts[2].ToString());
187             Assert.IsInstanceOf(typeof(ListElement), link.PipeTexts[2]);
188             ListElement list = (ListElement)link.PipeTexts[2];
189             Assert.AreEqual(2, list.Count);
190             Assert.AreEqual("テスト", list[0].ToString());
191             Assert.AreEqual("[[画像]]", list[1].ToString());
192             Assert.IsNull(link.Interwiki);
193         }
194
195         /// <summary>
196         /// TryParseメソッドテストケース(サブページ)。
197         /// </summary>
198         [Test]
199         public void TestTryParseSubpage()
200         {
201             IElement element;
202             MediaWikiLink link;
203             MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
204
205             // 全て指定されているケースは通常の記事と同じ扱い
206             Assert.IsTrue(parser.TryParse("[[testtitle/subpage]]", out element));
207             link = (MediaWikiLink)element;
208             Assert.AreEqual("testtitle/subpage", link.Title);
209             Assert.IsFalse(link.IsSubpage());
210
211             // 記事名が省略されているケース
212             Assert.IsTrue(parser.TryParse("[[/subpage]]", out element));
213             link = (MediaWikiLink)element;
214             Assert.AreEqual("/subpage", link.Title);
215             Assert.IsTrue(link.IsSubpage());
216
217             // 記事名が省略されているケース2
218             Assert.IsTrue(parser.TryParse("[[../../subpage]]", out element));
219             link = (MediaWikiLink)element;
220             Assert.AreEqual("../../subpage", link.Title);
221             Assert.IsTrue(link.IsSubpage());
222         }
223
224         /// <summary>
225         /// TryParseメソッドテストケース(ウィキ間リンク)。
226         /// </summary>
227         [Test]
228         public void TestTryParseInterwiki()
229         {
230             IElement element;
231             MediaWikiLink link;
232             MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
233
234             // タイトルとセクションとパイプ後の文字列とウィキ間リンクとコロンの全部入り
235             Assert.IsTrue(parser.TryParse("[[:en:testtitle#testsection|testpipe1|testpipe2]]", out element));
236             link = (MediaWikiLink)element;
237             Assert.AreEqual("testtitle", link.Title);
238             Assert.AreEqual("testsection", link.Section);
239             Assert.AreEqual(2, link.PipeTexts.Count);
240             Assert.AreEqual("testpipe1", link.PipeTexts[0].ToString());
241             Assert.AreEqual("testpipe2", link.PipeTexts[1].ToString());
242             Assert.AreEqual("en", link.Interwiki);
243             Assert.IsTrue(link.IsColon);
244
245             // 普通の言語間リンク
246             Assert.IsTrue(parser.TryParse("[[ja:日本語版記事名]]", out element));
247             link = (MediaWikiLink)element;
248             Assert.AreEqual("日本語版記事名", link.Title);
249             Assert.AreEqual("ja", link.Interwiki);
250
251             // ウィキ間リンク
252             Assert.IsTrue(parser.TryParse("[[commons:コモンズ記事名]]", out element));
253             link = (MediaWikiLink)element;
254             Assert.AreEqual("コモンズ記事名", link.Title);
255             Assert.AreEqual("commons", link.Interwiki);
256
257             // ウィキ間リンクの構文だが名前空間と被るためそうならないもの
258             Assert.IsTrue(parser.TryParse("[[wikipedia:ウィキペディア記事名]]", out element));
259             link = (MediaWikiLink)element;
260             Assert.AreEqual("wikipedia:ウィキペディア記事名", link.Title);
261             Assert.IsNull(link.Interwiki);
262
263             // :が含まれるだけの普通の記事(1.10以前のバージョンでは誤判定されていた)
264             Assert.IsTrue(parser.TryParse("[[Marathon 2: Durandal]]", out element));
265             link = (MediaWikiLink)element;
266             Assert.AreEqual("Marathon 2: Durandal", link.Title);
267             Assert.IsNull(link.Interwiki);
268         }
269
270         #endregion
271     }
272 }