OSDN Git Service

#30244 Visual Studio 2012 Express for Windows Desktop, StyleCop 4.7, WiX 3.6 に合わせたソース...
[wptscs/wpts.git] / WptscsTest / Parsers / MediaWikiPreparserTest.cs
1 // ================================================================================================
2 // <summary>
3 //      MediaWikiPreparserのテストクラスソース。</summary>
4 //
5 // <copyright file="MediaWikiPreparserTest.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 Microsoft.VisualStudio.TestTools.UnitTesting;
18
19     /// <summary>
20     /// <see cref="MediaWikiPreparser"/>のテストクラスです。
21     /// </summary>
22     [TestClass]
23     internal class MediaWikiPreparserTest
24     {
25         #region 定数
26
27         /// <summary>
28         /// 複数のテストケースで使用するテストテキスト(onlyinclude無し)。
29         /// </summary>
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> -->";
36
37         /// <summary>
38         /// 複数のテストケースで使用するテストテキスト。
39         /// </summary>
40         private static readonly string TestData = TestDataWithoutOnlyinclude
41             + "<onlyinclude><noinclude>インクルード時は</noinclude>ここしか</onlyinclude>, <onlyinclude>有効にならない</onlyinclude>";
42
43         #endregion
44
45         #region IParserインタフェーステストケース
46
47         // ※ 2012年2月現在、IParser, ITextParserの各メソッド実装は親クラス側で行われており、
48         //    改造部分はどこかでやればテストされるのでそれで割愛
49
50         /// <summary>
51         /// <see cref="IParser.Parse"/>メソッドテストトケース。
52         /// </summary>
53         [TestMethod]
54         public void TestParse()
55         {
56             IElement element;
57             XmlElement xml;
58             using (MediaWikiPreparser parser = new MediaWikiPreparser())
59             {
60                 element = parser.Parse(TestDataWithoutOnlyinclude);
61             }
62
63             // 解析だけであればincludeonly等の処理は行われない、元の文字列が保持される
64             Assert.AreEqual(TestDataWithoutOnlyinclude, element.ToString());
65
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);
78
79             // 各要素の確認
80             Assert.IsInstanceOfType(list[0], typeof(TextElement));
81
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));
88
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);
97
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);
105         }
106
107         /// <summary>
108         /// <see cref="IParser.Parse"/>メソッドテストトケース(onlyinclude)。
109         /// </summary>
110         [TestMethod]
111         public void TestParseOnlyinclude()
112         {
113             IElement element;
114             XmlElement xml;
115             using (MediaWikiPreparser parser = new MediaWikiPreparser())
116             {
117                 element = parser.Parse(TestData);
118             }
119
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);
129
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);
137         }
138
139         #endregion
140
141         #region 公開メソッドテストケース
142
143         /// <summary>
144         /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース。
145         /// </summary>
146         /// <remarks>
147         /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
148         /// </remarks>
149         [TestMethod]
150         public void TestFilterByInclude()
151         {
152             IElement element;
153             ListElement list;
154             using (MediaWikiPreparser parser = new MediaWikiPreparser())
155             {
156                 element = parser.Parse(TestDataWithoutOnlyinclude);
157                 parser.FilterByInclude(ref element);
158             }
159
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);
170
171             // 各要素の確認
172             Assert.IsInstanceOfType(list[0], typeof(TextElement));
173             Assert.IsInstanceOfType(list[1], typeof(XmlElement));
174
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);
183         }
184
185         /// <summary>
186         /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース(onlyinclude)。
187         /// </summary>
188         /// <remarks>
189         /// <see cref="TestParseOnlyinclude"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
190         /// </remarks>
191         [TestMethod]
192         public void TestFilterByIncludeOnlyinclude()
193         {
194             IElement element;
195             ListElement list;
196             using (MediaWikiPreparser parser = new MediaWikiPreparser())
197             {
198                 element = parser.Parse(TestData);
199                 parser.FilterByInclude(ref element);
200             }
201
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);
209
210             // onlyincludeはListElementに置き換わる
211             Assert.IsInstanceOfType(list[0], typeof(ListElement));
212             Assert.IsInstanceOfType(list[1], typeof(ListElement));
213         }
214
215         /// <summary>
216         /// <see cref="MediaWikiPreparser.FilterByInclude"/>メソッドテストケース(null)。
217         /// </summary>
218         [TestMethod]
219         [ExpectedException(typeof(ArgumentNullException))]
220         public void TestFilterByIncludeNull()
221         {
222             IElement element = null;
223             using (MediaWikiPreparser parser = new MediaWikiPreparser())
224             {
225                 parser.FilterByInclude(ref element);
226             }
227         }
228
229         /// <summary>
230         /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース。
231         /// </summary>
232         /// <remarks>
233         /// <see cref="TestParse"/>と同じデータを使うため、そちらのテストが通っていることを前提とする。
234         /// </remarks>
235         [TestMethod]
236         public void TestFilterByNoinclude()
237         {
238             IElement element;
239             ListElement innerList;
240             using (MediaWikiPreparser parser = new MediaWikiPreparser())
241             {
242                 element = parser.Parse(TestData);
243                 parser.FilterByNoinclude(ref element);
244             }
245
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);
259
260             // 各要素の確認
261             Assert.IsInstanceOfType(list[0], typeof(TextElement));
262             Assert.IsInstanceOfType(list[1], typeof(XmlElement));
263
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);
270
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);
278         }
279
280         /// <summary>
281         /// <see cref="MediaWikiPreparser.FilterByNoinclude"/>メソッドテストケース(null)。
282         /// </summary>
283         [TestMethod]
284         [ExpectedException(typeof(ArgumentNullException))]
285         public void TestFilterByNoincludeNull()
286         {
287             IElement element = null;
288             using (MediaWikiPreparser parser = new MediaWikiPreparser())
289             {
290                 parser.FilterByNoinclude(ref element);
291             }
292         }
293
294         #endregion
295
296         #region 静的メソッドテストケース
297
298         /// <summary>
299         /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース。
300         /// </summary>
301         [TestMethod]
302         public void TestPreprocessByInclude()
303         {
304             // Parse→FilterByIncludeした結果をToStringしたものが返る
305             Assert.AreEqual(
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));
309             Assert.AreEqual(
310                 "ここしか有効にならない",
311                 MediaWikiPreparser.PreprocessByInclude(TestData));
312             Assert.AreEqual(string.Empty, MediaWikiPreparser.PreprocessByInclude(string.Empty));
313         }
314
315         /// <summary>
316         /// <see cref="MediaWikiPreparser.PreprocessByInclude"/>メソッドテストケース(null)。
317         /// </summary>
318         [TestMethod]
319         [ExpectedException(typeof(ArgumentNullException))]
320         public void TestPreprocessByIncludeNull()
321         {
322             MediaWikiPreparser.PreprocessByInclude(null);
323         }
324
325         /// <summary>
326         /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース。
327         /// </summary>
328         [TestMethod]
329         public void TestPreprocessByNoinclude()
330         {
331             // Parse→FilterByNoincludeした結果をToStringしたものが返る
332             Assert.AreEqual(
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));
337         }
338
339         /// <summary>
340         /// <see cref="MediaWikiPreparser.PreprocessByNoinclude"/>メソッドテストケース(null)。
341         /// </summary>
342         [TestMethod]
343         [ExpectedException(typeof(ArgumentNullException))]
344         public void TestPreprocessByNoincludeNull()
345         {
346             MediaWikiPreparser.PreprocessByNoinclude(null);
347         }
348
349         #endregion
350     }
351 }