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 System.Collections.Generic;
15 using Honememo.Parsers;
16 using Honememo.Wptscs.Models;
17 using Honememo.Wptscs.Websites;
18 using Microsoft.VisualStudio.TestTools.UnitTesting;
21 /// <see cref="MediaWikiLinkParser"/>のテストクラスです。
24 internal class MediaWikiLinkParserTest
29 /// 前処理・後処理で生成/解放される言語別の<see cref="MediaWikiParser"/>。
31 private static IDictionary<string, MediaWikiParser> mediaWikiParsers = new Dictionary<string, MediaWikiParser>();
40 /// <param name="context">テスト用情報。</param>
41 /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の生成。</remarks>
43 public static void SetUpBeforeClass(TestContext context)
45 mediaWikiParsers["en"] = new MediaWikiParser(new MockFactory().GetMediaWiki("en"));
46 mediaWikiParsers["ja"] = new MediaWikiParser(new MockFactory().GetMediaWiki("ja"));
52 /// <remarks><see cref="MediaWikiParser.Dispose"/>が必要な<see cref="MediaWikiParser"/>の解放。</remarks>
54 public static void TearDownAfterClass()
56 foreach (IDisposable parser in mediaWikiParsers.Values)
61 mediaWikiParsers.Clear();
66 #region インタフェース実装メソッドテストケース
69 /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(基本的な構文)。
72 public void TestTryParseBasic()
76 MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
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);
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);
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);
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);
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());
128 /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(NGパターン)。
131 public void TestTryParseNg()
134 MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
137 Assert.IsFalse(parser.TryParse("testtitle]]", out element));
140 Assert.IsFalse(parser.TryParse("[[testtitle", out element));
143 Assert.IsFalse(parser.TryParse(" [[testtitle]]", out element));
146 Assert.IsFalse(parser.TryParse("[testtitle]", out element));
149 Assert.IsFalse(parser.TryParse("{{testtitle}}", out element));
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));
162 Assert.IsFalse(parser.TryParse(string.Empty, out element));
163 Assert.IsFalse(parser.TryParse(null, out element));
167 /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(入れ子)。
170 public void TestTryParseNested()
174 MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
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());
183 // 変数の場合、記事名の部分にも入れられる
184 Assert.IsTrue(parser.TryParse("[[{{{title|デフォルトジャンル}}}-stub]]", out element));
185 link = (MediaWikiLink)element;
186 Assert.AreEqual("{{{title|デフォルトジャンル}}}-stub", link.Title);
190 /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(名前空間)。
193 public void TestTryParseNamespace()
197 MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["ja"]);
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);
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);
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);
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);
241 /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(サブページ)。
244 public void TestTryParseSubpage()
248 MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
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());
257 Assert.IsTrue(parser.TryParse("[[/subpage]]", out element));
258 link = (MediaWikiLink)element;
259 Assert.AreEqual("/subpage", link.Title);
260 Assert.IsTrue(link.IsSubpage());
263 Assert.IsTrue(parser.TryParse("[[../../subpage]]", out element));
264 link = (MediaWikiLink)element;
265 Assert.AreEqual("../../subpage", link.Title);
266 Assert.IsTrue(link.IsSubpage());
270 /// <see cref="MediaWikiLinkParser.TryParse"/>メソッドテストケース(ウィキ間リンク)。
273 public void TestTryParseInterwiki()
277 MediaWikiLinkParser parser = new MediaWikiLinkParser(mediaWikiParsers["en"]);
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);
291 Assert.IsTrue(parser.TryParse("[[ja:日本語版記事名]]", out element));
292 link = (MediaWikiLink)element;
293 Assert.AreEqual("日本語版記事名", link.Title);
294 Assert.AreEqual("ja", link.Interwiki);
297 Assert.IsTrue(parser.TryParse("[[commons:コモンズ記事名]]", out element));
298 link = (MediaWikiLink)element;
299 Assert.AreEqual("コモンズ記事名", link.Title);
300 Assert.AreEqual("commons", link.Interwiki);
302 // ウィキ間リンクの構文だが名前空間と被るためそうならないもの
303 Assert.IsTrue(parser.TryParse("[[wikipedia:ウィキペディア記事名]]", out element));
304 link = (MediaWikiLink)element;
305 Assert.AreEqual("wikipedia:ウィキペディア記事名", link.Title);
306 Assert.IsNull(link.Interwiki);
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);