1 // ================================================================================================
3 // MediaWikiLinkParserのテストクラスソース。</summary>
5 // <copyright file="MediaWikiLinkParserTest.cs" company="honeplusのメモ帳">
6 // Copyright (C) 2012 Honeplus. All rights reserved.</copyright>
9 // ================================================================================================
11 namespace Honememo.Wptscs.Parsers
14 using Honememo.Parsers;
15 using Honememo.Wptscs.Models;
16 using Honememo.Wptscs.Websites;
17 using NUnit.Framework;
20 /// MediaWikiLinkParserのテストクラスです。
23 public class MediaWikiLinkParserTest
25 #region インタフェース実装メソッドテストケース
28 /// TryParseメソッドテストケース(基本的な構文)。
31 public void TestTryParseBasic()
35 MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
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);
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);
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);
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);
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());
87 /// TryParseメソッドテストケース(NGパターン)。
90 public void TestTryParseNg()
93 MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
96 Assert.IsFalse(parser.TryParse("testtitle]]", out element));
99 Assert.IsFalse(parser.TryParse("[[testtitle", out element));
102 Assert.IsFalse(parser.TryParse(" [[testtitle]]", out element));
105 Assert.IsFalse(parser.TryParse("[testtitle]", out element));
108 Assert.IsFalse(parser.TryParse("{{testtitle}}", out element));
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));
122 /// TryParseメソッドテストケース(入れ子)。
125 public void TestTryParseNested()
129 MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
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());
138 // 変数の場合、記事名の部分にも入れられる
139 Assert.IsTrue(parser.TryParse("[[{{{title|デフォルトジャンル}}}-stub]]", out element));
140 link = (MediaWikiLink)element;
141 Assert.AreEqual("{{{title|デフォルトジャンル}}}-stub", link.Title);
145 /// TryParseメソッドテストケース(名前空間)。
148 public void TestTryParseNamespace()
152 MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("ja")));
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);
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);
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);
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);
196 /// TryParseメソッドテストケース(サブページ)。
199 public void TestTryParseSubpage()
203 MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
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());
212 Assert.IsTrue(parser.TryParse("[[/subpage]]", out element));
213 link = (MediaWikiLink)element;
214 Assert.AreEqual("/subpage", link.Title);
215 Assert.IsTrue(link.IsSubpage());
218 Assert.IsTrue(parser.TryParse("[[../../subpage]]", out element));
219 link = (MediaWikiLink)element;
220 Assert.AreEqual("../../subpage", link.Title);
221 Assert.IsTrue(link.IsSubpage());
225 /// TryParseメソッドテストケース(ウィキ間リンク)。
228 public void TestTryParseInterwiki()
232 MediaWikiLinkParser parser = new MediaWikiLinkParser(new MediaWikiParser(new MockFactory().GetMediaWiki("en")));
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);
246 Assert.IsTrue(parser.TryParse("[[ja:日本語版記事名]]", out element));
247 link = (MediaWikiLink)element;
248 Assert.AreEqual("日本語版記事名", link.Title);
249 Assert.AreEqual("ja", link.Interwiki);
252 Assert.IsTrue(parser.TryParse("[[commons:コモンズ記事名]]", out element));
253 link = (MediaWikiLink)element;
254 Assert.AreEqual("コモンズ記事名", link.Title);
255 Assert.AreEqual("commons", link.Interwiki);
257 // ウィキ間リンクの構文だが名前空間と被るためそうならないもの
258 Assert.IsTrue(parser.TryParse("[[wikipedia:ウィキペディア記事名]]", out element));
259 link = (MediaWikiLink)element;
260 Assert.AreEqual("wikipedia:ウィキペディア記事名", link.Title);
261 Assert.IsNull(link.Interwiki);
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);