1 // ================================================================================================
3 // MediaWikiPreparserのテストクラスソース。</summary>
5 // <copyright file="MediaWikiPreparserTest.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 Microsoft.VisualStudio.TestTools.UnitTesting;
20 /// <see cref="MediaWikiPreparser"/>のテストクラスです。
23 internal class MediaWikiPreparserTest
28 /// 複数のテストケースで使用するテストテキスト(onlyinclude無し)。
30 /// <remarks>タグの大文字小文字は区別されないはずのため、意図的に混入させている。</remarks>
31 private static readonly string TestDataWithoutOnlyinclude = "This template is [[xxx]]<br />\r\n"
32 + "<noWiki><nowiki>sample</nowiki></nowiki>\r\n"
33 + "<inclUdeonly><p>include text<nowiki><includeonly>sample</includeonly></nowiki></p></includeonly>\r\n"
34 + "<noInclude>[[ja:Template:sample/doc]]<!--noinclude only--></noinclude>\r\n"
35 + "<!-- <includeonly>include only comment</includeonly> -->";
38 /// 複数のテストケースで使用するテストテキスト。
40 private static readonly string TestData = TestDataWithoutOnlyinclude
41 + "<onlyinclude><noinclude>インクルード時は</noinclude>ここしか</onlyinclude>, <onlyinclude>有効にならない</onlyinclude>";
45 #region IParserインタフェーステストケース
47 // ※ 2012年2月現在、IParser, ITextParserの各メソッド実装は親クラス側で行われており、
48 // 改造部分はどこかでやればテストされるのでそれで割愛
51 /// <see cref="IParser.Parse"/>メソッドテストトケース。
54 public void TestParse()
58 using (MediaWikiPreparser parser = new MediaWikiPreparser())
60 element = parser.Parse(TestDataWithoutOnlyinclude);
63 // 解析だけであればincludeonly等の処理は行われない、元の文字列が保持される
64 Assert.AreEqual(TestDataWithoutOnlyinclude, element.ToString());
66 // includeonly, noinclude, nowiki, コメントのみ特別な要素として認識する
67 Assert.IsInstanceOfType(element, typeof(ListElement));
68 ListElement list = (ListElement)element;
69 Assert.AreEqual("This template is [[xxx]]<br />\r\n", list[0].ToString());
70 Assert.AreEqual("<noWiki><nowiki>sample</nowiki>", list[1].ToString());
71 Assert.AreEqual("</nowiki>\r\n", list[2].ToString());
72 Assert.AreEqual("<inclUdeonly><p>include text<nowiki><includeonly>sample</includeonly></nowiki></p></includeonly>", list[3].ToString());
73 Assert.AreEqual("\r\n", list[4].ToString());
74 Assert.AreEqual("<noInclude>[[ja:Template:sample/doc]]<!--noinclude only--></noinclude>", list[5].ToString());
75 Assert.AreEqual("\r\n", list[6].ToString());
76 Assert.AreEqual("<!-- <includeonly>include only comment</includeonly> -->", list[7].ToString());
77 Assert.AreEqual(8, list.Count);
80 Assert.IsInstanceOfType(list[0], typeof(TextElement));
82 // nowikiとコメントは再帰的に解析されない
83 Assert.IsInstanceOfType(list[1], typeof(XmlElement));
84 xml = (XmlElement)list[1];
85 Assert.AreEqual("<nowiki>sample", xml[0].ToString());
86 Assert.IsInstanceOfType(xml[0], typeof(XmlTextElement));
87 Assert.IsInstanceOfType(list[7], typeof(XmlCommentElement));
89 // includeonly, noincludeは再帰的に処理
90 Assert.IsInstanceOfType(list[3], typeof(XmlElement));
91 xml = (XmlElement)list[3];
92 Assert.AreEqual("<p>include text", xml[0].ToString());
93 Assert.AreEqual("<nowiki><includeonly>sample</includeonly></nowiki>", xml[1].ToString());
94 Assert.IsInstanceOfType(xml[1], typeof(XmlElement));
95 Assert.AreEqual("</p>", xml[2].ToString());
96 Assert.AreEqual(3, xml.Count);
98 Assert.IsInstanceOfType(list[5], typeof(XmlElement));
99 xml = (XmlElement)list[5];
100 Assert.AreEqual("[[ja:Template:sample/doc]]", xml[0].ToString());
101 Assert.IsInstanceOfType(xml[0], typeof(TextElement));
102 Assert.AreEqual("<!--noinclude only-->", xml[1].ToString());
103 Assert.IsInstanceOfType(xml[1], typeof(XmlCommentElement));
104 Assert.AreEqual(2, xml.Count);
108 /// <see cref="IParser.Parse"/>メソッドテストトケース(onlyinclude)。
111 public void TestParseOnlyinclude()
115 using (MediaWikiPreparser parser = new MediaWikiPreparser())
117 element = parser.Parse(TestData);
120 // onlyincludeが存在するケース、解析時点では特に他のタグと同じ扱い
121 // ※ 前半部分はTestParseと同じデータなので割愛
122 Assert.AreEqual(TestData, element.ToString());
123 Assert.IsInstanceOfType(element, typeof(ListElement));
124 ListElement list = (ListElement)element;
125 Assert.AreEqual("<onlyinclude><noinclude>インクルード時は</noinclude>ここしか</onlyinclude>", list[8].ToString());
126 Assert.AreEqual(", ", list[9].ToString());
127 Assert.AreEqual("<onlyinclude>有効にならない</onlyinclude>", list[10].ToString());
128 Assert.AreEqual(11, list.Count);
130 // onlyincludeも再帰的に処理
131 Assert.IsInstanceOfType(list[8], typeof(XmlElement));
132 xml = (XmlElement)list[8];
133 Assert.AreEqual("<noinclude>インクルード時は</noinclude>", xml[0].ToString());
134 Assert.IsInstanceOfType(xml[0], typeof(XmlElement));
135 Assert.AreEqual("ここしか", xml[1].ToString());
136 Assert.AreEqual(2, xml.Count);
144 /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース。
147 /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
150 public void TestFilterByInclude()
154 using (MediaWikiPreparser parser = new MediaWikiPreparser())
156 element = parser.Parse(TestDataWithoutOnlyinclude);
157 parser.FilterByInclude(ref element);
160 // includeonlyが展開され、noinclude, コメントが削除される
161 Assert.IsInstanceOfType(element, typeof(ListElement));
162 list = (ListElement)element;
163 Assert.AreEqual("This template is [[xxx]]<br />\r\n", list[0].ToString());
164 Assert.AreEqual("<noWiki><nowiki>sample</nowiki>", list[1].ToString());
165 Assert.AreEqual("</nowiki>\r\n", list[2].ToString());
166 Assert.AreEqual("<p>include text<nowiki><includeonly>sample</includeonly></nowiki></p>", list[3].ToString());
167 Assert.AreEqual("\r\n", list[4].ToString());
168 Assert.AreEqual("\r\n", list[5].ToString());
169 Assert.AreEqual(6, list.Count);
172 Assert.IsInstanceOfType(list[0], typeof(TextElement));
173 Assert.IsInstanceOfType(list[1], typeof(XmlElement));
175 // includeonlyはListElementに置き換わる
176 Assert.IsInstanceOfType(list[3], typeof(ListElement));
177 list = (ListElement)list[3];
178 Assert.AreEqual("<p>include text", list[0].ToString());
179 Assert.AreEqual("<nowiki><includeonly>sample</includeonly></nowiki>", list[1].ToString());
180 Assert.IsInstanceOfType(list[1], typeof(XmlElement));
181 Assert.AreEqual("</p>", list[2].ToString());
182 Assert.AreEqual(3, list.Count);
186 /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース(onlyinclude)。
189 /// <see cref="TestParseOnlyinclude"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
192 public void TestFilterByIncludeOnlyinclude()
196 using (MediaWikiPreparser parser = new MediaWikiPreparser())
198 element = parser.Parse(TestData);
199 parser.FilterByInclude(ref element);
202 // onlyincludeが存在する場合、その外側は全て削除され、タグが展開される
203 // ※ onlyincludeの内部にnoinclude等が存在する場合、それはそれで通常と同様処理される
204 Assert.IsInstanceOfType(element, typeof(ListElement));
205 list = (ListElement)element;
206 Assert.AreEqual("ここしか", list[0].ToString());
207 Assert.AreEqual("有効にならない", list[1].ToString());
208 Assert.AreEqual(2, list.Count);
210 // onlyincludeはListElementに置き換わる
211 Assert.IsInstanceOfType(list[0], typeof(ListElement));
212 Assert.IsInstanceOfType(list[1], typeof(ListElement));
216 /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース(null)。
219 [ExpectedException(typeof(ArgumentNullException))]
220 public void TestFilterByIncludeNull()
222 IElement element = null;
223 using (MediaWikiPreparser parser = new MediaWikiPreparser())
225 parser.FilterByInclude(ref element);
230 /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース。
233 /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
236 public void TestFilterByNoinclude()
239 ListElement innerList;
240 using (MediaWikiPreparser parser = new MediaWikiPreparser())
242 element = parser.Parse(TestData);
243 parser.FilterByNoinclude(ref element);
246 // noinclude, onlyincludeが展開され、includeonly, コメントが削除される
247 Assert.IsInstanceOfType(element, typeof(ListElement));
248 ListElement list = (ListElement)element;
249 Assert.AreEqual("This template is [[xxx]]<br />\r\n", list[0].ToString());
250 Assert.AreEqual("<noWiki><nowiki>sample</nowiki>", list[1].ToString());
251 Assert.AreEqual("</nowiki>\r\n", list[2].ToString());
252 Assert.AreEqual("\r\n", list[3].ToString());
253 Assert.AreEqual("[[ja:Template:sample/doc]]", list[4].ToString());
254 Assert.AreEqual("\r\n", list[5].ToString());
255 Assert.AreEqual("インクルード時はここしか", list[6].ToString());
256 Assert.AreEqual(", ", list[7].ToString());
257 Assert.AreEqual("有効にならない", list[8].ToString());
258 Assert.AreEqual(9, list.Count);
261 Assert.IsInstanceOfType(list[0], typeof(TextElement));
262 Assert.IsInstanceOfType(list[1], typeof(XmlElement));
264 // noinclude, onlyincludeはListElementに置き換わる
265 Assert.IsInstanceOfType(list[4], typeof(ListElement));
266 innerList = (ListElement)list[4];
267 Assert.AreEqual("[[ja:Template:sample/doc]]", innerList[0].ToString());
268 Assert.IsInstanceOfType(innerList[0], typeof(TextElement));
269 Assert.AreEqual(1, innerList.Count);
271 Assert.IsInstanceOfType(list[6], typeof(ListElement));
272 innerList = (ListElement)list[6];
273 Assert.AreEqual("インクルード時は", innerList[0].ToString());
274 Assert.IsInstanceOfType(innerList[0], typeof(ListElement));
275 Assert.AreEqual("ここしか", innerList[1].ToString());
276 Assert.IsInstanceOfType(innerList[1], typeof(TextElement));
277 Assert.AreEqual(2, innerList.Count);
281 /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース(null)。
284 [ExpectedException(typeof(ArgumentNullException))]
285 public void TestFilterByNoincludeNull()
287 IElement element = null;
288 using (MediaWikiPreparser parser = new MediaWikiPreparser())
290 parser.FilterByNoinclude(ref element);
299 /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース。
302 public void TestPreprocessByInclude()
304 // Parse→FilterByIncludeした結果をToStringしたものが返る
306 "This template is [[xxx]]<br />\r\n<noWiki><nowiki>sample</nowiki></nowiki>\r\n"
307 + "<p>include text<nowiki><includeonly>sample</includeonly></nowiki></p>\r\n\r\n",
308 MediaWikiPreparser.PreprocessByInclude(TestDataWithoutOnlyinclude));
311 MediaWikiPreparser.PreprocessByInclude(TestData));
312 Assert.AreEqual(string.Empty, MediaWikiPreparser.PreprocessByInclude(string.Empty));
316 /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース(null)。
319 [ExpectedException(typeof(ArgumentNullException))]
320 public void TestPreprocessByIncludeNull()
322 MediaWikiPreparser.PreprocessByInclude(null);
326 /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース。
329 public void TestPreprocessByNoinclude()
331 // Parse→FilterByNoincludeした結果をToStringしたものが返る
333 "This template is [[xxx]]<br />\r\n<noWiki><nowiki>sample</nowiki></nowiki>\r\n\r\n"
334 + "[[ja:Template:sample/doc]]\r\nインクルード時はここしか, 有効にならない",
335 MediaWikiPreparser.PreprocessByNoinclude(TestData));
336 Assert.AreEqual(string.Empty, MediaWikiPreparser.PreprocessByNoinclude(string.Empty));
340 /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース(null)。
343 [ExpectedException(typeof(ArgumentNullException))]
344 public void TestPreprocessByNoincludeNull()
346 MediaWikiPreparser.PreprocessByNoinclude(null);